From 8da5d996a7746f0b41ed409eb0000cb6be8c54c7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 30 Oct 2026 12:53:07 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=A4=20Sync=202026-10-30=2012:53:07?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 7z/Makefile | 6 +- 7z/patches/010-flags.patch | 4 +- gately/Makefile | 4 +- luci-app-open-box/Makefile | 4 +- luci-app-passwall/Makefile | 2 +- .../luasrc/passwall/util_xray.lua | 22 +- luci-app-passwall2/Makefile | 2 +- .../luasrc/passwall2/util_xray.lua | 22 +- luci-app-smartsafehub/CHANGELOG.md | 772 +++++++++++++++++ luci-app-smartsafehub/Makefile | 6 +- luci-app-smartsafehub/README.md | 2 + luci-app-smartsafehub/docs/APPS.md | 105 +++ luci-app-smartsafehub/docs/DEVELOPMENT.md | 22 + luci-app-smartsafehub/docs/OPERATIONS.md | 17 + luci-app-smartsafehub/docs/ROUTER_DEMO.md | 3 +- .../docs/assets/dashboard-dark.png | Bin 237029 -> 618468 bytes .../docs/assets/dashboard-white.png | Bin 232968 -> 594200 bytes .../frontend/demo-dist/demo.css | 2 +- .../frontend/demo-dist/demo.js | 5 +- .../frontend/package-lock.json | 185 ++--- luci-app-smartsafehub/frontend/package.json | 10 +- luci-app-smartsafehub/frontend/src/api/rpc.ts | 52 +- .../frontend/src/api/rpcDiagnostics.ts | 112 +++ .../frontend/src/api/rpcScheduler.ts | 52 ++ .../frontend/src/api/safeshield.ts | 13 +- .../frontend/src/api/smartsafehub.ts | 62 +- .../frontend/src/app/App.tsx | 83 +- .../frontend/src/app/routes.ts | 10 +- .../src/components/AppsCategoryIcon.tsx | 32 + .../src/components/AppsStorageCard.tsx | 39 + .../frontend/src/components/Icons.tsx | 53 ++ .../src/components/ProductNavigation.tsx | 42 +- .../frontend/src/demo/data.ts | 92 ++- .../frontend/src/demo/main.tsx | 23 +- .../frontend/src/hooks/useAsyncResource.ts | 22 +- .../src/hooks/useDeviceRegistration.ts | 13 +- .../frontend/src/hooks/useHashRoute.ts | 1 + luci-app-smartsafehub/frontend/src/main.tsx | 2 +- .../frontend/src/pages/AppsPage.tsx | 436 ++++++++++ .../frontend/src/pages/HomePage.tsx | 119 ++- .../src/pages/SafeShieldRulesPage.tsx | 107 ++- .../src/pages/SmartSafeHubAccountPage.tsx | 38 +- .../frontend/src/styles/app.css | 113 +++ .../frontend/src/types/apps.ts | 74 ++ .../frontend/src/types/rules.ts | 2 + .../frontend/src/types/status.ts | 3 + .../frontend/src/utils/appsJobNotice.ts | 32 + .../frontend/src/utils/appsStorage.ts | 37 + .../frontend/src/utils/appsWebUi.ts | 7 + .../frontend/src/utils/errors.ts | 4 +- .../frontend/src/utils/ruleLists.ts | 56 ++ .../iface/98-smartsafehub-apps-restore | 16 + .../root/lib/upgrade/keep.d/smartsafehub-apps | 2 + .../root/usr/libexec/smartsafehub-apps | 49 ++ .../usr/libexec/smartsafehub-apps-manager | 776 ++++++++++++++++++ .../usr/libexec/smartsafehub-apps-metrics | 74 ++ .../usr/libexec/smartsafehub-apps-restore | 165 ++++ .../root/usr/libexec/smartsafehub-device | 3 + .../root/usr/libexec/smartsafehub-firmware | 11 + .../libexec/smartsafehub-recommended-rules | 197 +++-- .../root/usr/libexec/smartsafehub-rpc-jobs | 121 +++ .../rpcd/acl.d/luci-app-smartsafehub.json | 6 + .../root/usr/share/rpcd/ucode/smartsafehub.uc | 38 + .../rpcd/ucode/smartsafehub/apps-manager.uc | 162 ++++ .../rpcd/ucode/smartsafehub/apps-storage.uc | 41 + .../usr/share/rpcd/ucode/smartsafehub/apps.uc | 119 +++ .../ucode/smartsafehub/device-registration.uc | 50 +- .../share/rpcd/ucode/smartsafehub/rpc-jobs.uc | 39 + .../share/rpcd/ucode/smartsafehub/system.uc | 24 + .../ucode/luci/template/smartsafehub/login.ut | 6 +- .../root/www/luci-static/smartsafehub/app.css | 2 +- .../root/www/luci-static/smartsafehub/app.js | 5 +- luci-app-smartsafehub/spec/contracts_spec.sh | 177 ++++ .../tests/apps-storage-test.uc | 27 + .../runtime/apps-operation-notice.test.mjs | 50 ++ .../tests/runtime/apps-storage.test.mjs | 61 ++ .../runtime/recommended-sync-stages.test.mjs | 2 +- .../tests/runtime/router-demo.test.mjs | 97 +++ .../tests/runtime/rpc-scheduler.test.mjs | 50 ++ .../tests/runtime/rule-origin.test.mjs | 12 +- .../tests/runtime/rules-performance.test.mjs | 79 ++ .../tests/test-account-ui-contract.sh | 4 +- .../tests/test-activity-idle-polling.sh | 2 +- .../tests/test-apps-contract.sh | 152 ++++ .../tests/test-apps-launch.sh | 72 ++ .../tests/test-apps-manager.sh | 728 ++++++++++++++++ .../tests/test-apps-metrics.sh | 91 ++ .../tests/test-apps-restore.sh | 98 +++ luci-app-smartsafehub/tests/test-apps-ui.sh | 243 ++++++ .../tests/test-changelog-spacing.sh | 28 + .../tests/test-daemon-runtime.sh | 2 +- .../test-dashboard-performance-contract.sh | 6 + .../tests/test-dashboard-ui-contract.sh | 62 ++ .../tests/test-device-registration.sh | 18 +- .../tests/test-navigation-contract.sh | 35 +- .../tests/test-openwrt-commands.sh | 250 ++++++ .../tests/test-package-contract.sh | 2 + .../tests/test-performance-phase1.sh | 10 - .../tests/test-performance-phase2.sh | 9 - .../tests/test-performance-phase3.sh | 7 - .../tests/test-preact11-contract.sh | 8 +- .../tests/test-recommended-rules.sh | 82 +- .../tests/test-reload-safety.sh | 25 +- .../tests/test-router-demo-contract.sh | 35 +- luci-app-smartsafehub/tests/test-rpc-jobs.sh | 92 +++ .../tests/test-rules-performance.sh | 21 + .../tests/test-section-refinement.sh | 35 - .../tests/test-statistics-ui-contract.sh | 4 +- .../tests/test-suite-integrity.sh | 6 + luci-app-smartsafehub/tests/test-ui-polish.sh | 27 - .../tests/test-wifi-qr-contract.sh | 2 +- .../tools/check_openwrt_commands.py | 411 ++++++++++ .../tools/check_test_coverage.py | 242 ++++++ .../tools/openwrt-25.12-commands.txt | 98 +++ .../luci-static/resources/wwand/modemopts.js | 15 + luci-app-wwand/po/templates/wwand.pot | 29 +- maxminddb-dump-country/Makefile | 8 +- ...01-geoip-add-DB-IP-CSV-input-support.patch | 388 +++++++++ .../patches/0002-add-help-CSV-args.patch | 11 + netdata/Makefile | 3 +- node/Makefile | 18 +- node/patches/v24.x/999-v8-icu4c-79.patch | 220 +++++ node/patches/v26.x/999-v8-icu4c-79.patch | 220 +++++ wwand/Makefile | 6 +- 124 files changed, 8650 insertions(+), 562 deletions(-) create mode 100644 luci-app-smartsafehub/docs/APPS.md create mode 100644 luci-app-smartsafehub/frontend/src/api/rpcDiagnostics.ts create mode 100644 luci-app-smartsafehub/frontend/src/api/rpcScheduler.ts create mode 100644 luci-app-smartsafehub/frontend/src/components/AppsCategoryIcon.tsx create mode 100644 luci-app-smartsafehub/frontend/src/components/AppsStorageCard.tsx create mode 100644 luci-app-smartsafehub/frontend/src/pages/AppsPage.tsx create mode 100644 luci-app-smartsafehub/frontend/src/types/apps.ts create mode 100644 luci-app-smartsafehub/frontend/src/utils/appsJobNotice.ts create mode 100644 luci-app-smartsafehub/frontend/src/utils/appsStorage.ts create mode 100644 luci-app-smartsafehub/frontend/src/utils/appsWebUi.ts create mode 100644 luci-app-smartsafehub/frontend/src/utils/ruleLists.ts create mode 100755 luci-app-smartsafehub/root/etc/hotplug.d/iface/98-smartsafehub-apps-restore create mode 100644 luci-app-smartsafehub/root/lib/upgrade/keep.d/smartsafehub-apps create mode 100755 luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps create mode 100755 luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps-manager create mode 100755 luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps-metrics create mode 100755 luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps-restore create mode 100755 luci-app-smartsafehub/root/usr/libexec/smartsafehub-rpc-jobs create mode 100644 luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/apps-manager.uc create mode 100644 luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/apps-storage.uc create mode 100644 luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/apps.uc create mode 100644 luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/rpc-jobs.uc create mode 100644 luci-app-smartsafehub/tests/apps-storage-test.uc create mode 100644 luci-app-smartsafehub/tests/runtime/apps-operation-notice.test.mjs create mode 100644 luci-app-smartsafehub/tests/runtime/apps-storage.test.mjs create mode 100644 luci-app-smartsafehub/tests/runtime/rpc-scheduler.test.mjs create mode 100644 luci-app-smartsafehub/tests/runtime/rules-performance.test.mjs create mode 100755 luci-app-smartsafehub/tests/test-apps-contract.sh create mode 100755 luci-app-smartsafehub/tests/test-apps-launch.sh create mode 100755 luci-app-smartsafehub/tests/test-apps-manager.sh create mode 100755 luci-app-smartsafehub/tests/test-apps-metrics.sh create mode 100755 luci-app-smartsafehub/tests/test-apps-restore.sh create mode 100755 luci-app-smartsafehub/tests/test-apps-ui.sh create mode 100755 luci-app-smartsafehub/tests/test-changelog-spacing.sh create mode 100755 luci-app-smartsafehub/tests/test-openwrt-commands.sh delete mode 100755 luci-app-smartsafehub/tests/test-performance-phase1.sh delete mode 100755 luci-app-smartsafehub/tests/test-performance-phase2.sh delete mode 100755 luci-app-smartsafehub/tests/test-performance-phase3.sh create mode 100755 luci-app-smartsafehub/tests/test-rpc-jobs.sh create mode 100755 luci-app-smartsafehub/tests/test-rules-performance.sh delete mode 100755 luci-app-smartsafehub/tests/test-section-refinement.sh create mode 100755 luci-app-smartsafehub/tests/test-suite-integrity.sh delete mode 100755 luci-app-smartsafehub/tests/test-ui-polish.sh create mode 100644 luci-app-smartsafehub/tools/check_openwrt_commands.py create mode 100644 luci-app-smartsafehub/tools/check_test_coverage.py create mode 100644 luci-app-smartsafehub/tools/openwrt-25.12-commands.txt create mode 100644 maxminddb-dump-country/patches/0001-geoip-add-DB-IP-CSV-input-support.patch create mode 100644 maxminddb-dump-country/patches/0002-add-help-CSV-args.patch create mode 100644 node/patches/v24.x/999-v8-icu4c-79.patch create mode 100644 node/patches/v26.x/999-v8-icu4c-79.patch diff --git a/7z/Makefile b/7z/Makefile index b667cb2d3..2693c9421 100644 --- a/7z/Makefile +++ b/7z/Makefile @@ -1,11 +1,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=7z -PKG_VERSION:=26.04 -PKG_RELEASE:=5 +PKG_VERSION:=26.05 +PKG_RELEASE:=6 PKG_SOURCE:=$(PKG_NAME)$(subst .,,$(PKG_VERSION))-src.tar.xz -PKG_SOURCE_URL:=https://7-zip.org/a/ +PKG_SOURCE_URL:=https://github.com/ip7z/7zip/releases/download/$(PKG_VERSION)/ PKG_HASH:=skip PKG_MAINTAINER:=Tianling Shen diff --git a/7z/patches/010-flags.patch b/7z/patches/010-flags.patch index 8fe3f2a81..ac57333df 100644 --- a/7z/patches/010-flags.patch +++ b/7z/patches/010-flags.patch @@ -24,7 +24,7 @@ $(CFLAGS_DEBUG) -D_REENTRANT -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE \ -fPIC -@@ -169,7 +169,7 @@ endif +@@ -168,7 +168,7 @@ endif @@ -33,7 +33,7 @@ ifdef IS_MINGW -@@ -1361,7 +1361,7 @@ predef_cc: +@@ -1367,7 +1367,7 @@ predef_cc: $(CC) $(CFLAGS) -E $(SHOW_PREDEF) ../../../../C/CpuArch.c > predef_cc_log # $(CC) $(CFLAGS) -E -dM - < /dev/null predef_cxx: diff --git a/gately/Makefile b/gately/Makefile index f92386a14..99fcb8b28 100644 --- a/gately/Makefile +++ b/gately/Makefile @@ -5,8 +5,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=gately -PKG_VERSION:=0.6.0.4 -PKG_RELEASE:=17 +PKG_VERSION:=0.6.1 +PKG_RELEASE:=18 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/wangwanjie/gately/tar.gz/v$(PKG_VERSION)? diff --git a/luci-app-open-box/Makefile b/luci-app-open-box/Makefile index d1aec236a..3d1fe22eb 100644 --- a/luci-app-open-box/Makefile +++ b/luci-app-open-box/Makefile @@ -1,8 +1,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-open-box -PKG_VERSION:=0.1.371 -PKG_RELEASE:=51 +PKG_VERSION:=0.1.374 +PKG_RELEASE:=52 PKG_MAINTAINER:=liandu2024 PKG_LICENSE:=GPL-3.0-or-later diff --git a/luci-app-passwall/Makefile b/luci-app-passwall/Makefile index 2be356d96..947dd5fda 100644 --- a/luci-app-passwall/Makefile +++ b/luci-app-passwall/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall PKG_VERSION:=26.10.29 -PKG_RELEASE:=357 +PKG_RELEASE:=358 PKG_PO_VERSION:=$(PKG_VERSION) PKG_CONFIG_DEPENDS:= \ diff --git a/luci-app-passwall/luasrc/passwall/util_xray.lua b/luci-app-passwall/luasrc/passwall/util_xray.lua index 0d8f7d959..50af41781 100644 --- a/luci-app-passwall/luasrc/passwall/util_xray.lua +++ b/luci-app-passwall/luasrc/passwall/util_xray.lua @@ -303,9 +303,13 @@ function gen_outbound(flag, node, tag, proxy_table) local finalmask = {} local TP = node.transport if TP == "mkcp" then + local s = { type = "mkcp-legacy" } + if node.mkcp_seed and node.mkcp_seed ~= "" then + s.settings = { value = node.mkcp_seed } + end + local udp = { s } local map = {none = "none", srtp = "srtp", utp = "utp", ["wechat-video"] = "wechat", dtls = "dtls", wireguard = "wireguard", dns = "dns"} - local udp = {} if node.mkcp_guise and node.mkcp_guise ~= "none" then local g = { type = "mkcp-legacy" } g.settings = { header = map[node.mkcp_guise] } @@ -314,11 +318,6 @@ function gen_outbound(flag, node, tag, proxy_table) end udp[#udp+1] = g end - local s = { type = "mkcp-legacy" } - if node.mkcp_seed and node.mkcp_seed ~= "" then - s.settings = { value = node.mkcp_seed } - end - udp[#udp+1] = s finalmask.udp = udp elseif TP == "hysteria" then local udp = {} @@ -807,9 +806,13 @@ function gen_config_server(node) finalmask = (function() local finalmask = {} if node.transport == "mkcp" then + local s = { type = "mkcp-legacy" } + if node.mkcp_seed and node.mkcp_seed ~= "" then + s.settings = { value = node.mkcp_seed } + end + local udp = { s } local map = {none = "none", srtp = "srtp", utp = "utp", ["wechat-video"] = "wechat", dtls = "dtls", wireguard = "wireguard", dns = "dns"} - local udp = {} if node.mkcp_guise and node.mkcp_guise ~= "none" then local g = { type = "mkcp-legacy" } g.settings = { header = map[node.mkcp_guise] } @@ -818,11 +821,6 @@ function gen_config_server(node) end udp[#udp+1] = g end - local s = { type = "mkcp-legacy" } - if node.mkcp_seed and node.mkcp_seed ~= "" then - s.settings = { value = node.mkcp_seed } - end - udp[#udp+1] = s finalmask.udp = udp elseif node.transport == "hysteria" then local udp = {} diff --git a/luci-app-passwall2/Makefile b/luci-app-passwall2/Makefile index 6f228e6a2..db85f5f9e 100644 --- a/luci-app-passwall2/Makefile +++ b/luci-app-passwall2/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall2 PKG_VERSION:=26.10.29 -PKG_RELEASE:=158 +PKG_RELEASE:=159 PKG_PO_VERSION:=$(PKG_VERSION) PKG_CONFIG_DEPENDS:= \ diff --git a/luci-app-passwall2/luasrc/passwall2/util_xray.lua b/luci-app-passwall2/luasrc/passwall2/util_xray.lua index f400785bc..bf3d63707 100644 --- a/luci-app-passwall2/luasrc/passwall2/util_xray.lua +++ b/luci-app-passwall2/luasrc/passwall2/util_xray.lua @@ -312,9 +312,13 @@ function gen_outbound(flag, node, tag, proxy_table) local finalmask = {} local TP = node.transport if TP == "mkcp" then + local s = { type = "mkcp-legacy" } + if node.mkcp_seed and node.mkcp_seed ~= "" then + s.settings = { value = node.mkcp_seed } + end + local udp = { s } local map = {none = "none", srtp = "srtp", utp = "utp", ["wechat-video"] = "wechat", dtls = "dtls", wireguard = "wireguard", dns = "dns"} - local udp = {} if node.mkcp_guise and node.mkcp_guise ~= "none" then local g = { type = "mkcp-legacy" } g.settings = { header = map[node.mkcp_guise] } @@ -323,11 +327,6 @@ function gen_outbound(flag, node, tag, proxy_table) end udp[#udp+1] = g end - local s = { type = "mkcp-legacy" } - if node.mkcp_seed and node.mkcp_seed ~= "" then - s.settings = { value = node.mkcp_seed } - end - udp[#udp+1] = s finalmask.udp = udp elseif TP == "hysteria" then local udp = {} @@ -812,9 +811,13 @@ function gen_config_server(node) finalmask = (function() local finalmask = {} if node.transport == "mkcp" then + local s = { type = "mkcp-legacy" } + if node.mkcp_seed and node.mkcp_seed ~= "" then + s.settings = { value = node.mkcp_seed } + end + local udp = { s } local map = {none = "none", srtp = "srtp", utp = "utp", ["wechat-video"] = "wechat", dtls = "dtls", wireguard = "wireguard", dns = "dns"} - local udp = {} if node.mkcp_guise and node.mkcp_guise ~= "none" then local g = { type = "mkcp-legacy" } g.settings = { header = map[node.mkcp_guise] } @@ -823,11 +826,6 @@ function gen_config_server(node) end udp[#udp+1] = g end - local s = { type = "mkcp-legacy" } - if node.mkcp_seed and node.mkcp_seed ~= "" then - s.settings = { value = node.mkcp_seed } - end - udp[#udp+1] = s finalmask.udp = udp elseif node.transport == "hysteria" then local udp = {} diff --git a/luci-app-smartsafehub/CHANGELOG.md b/luci-app-smartsafehub/CHANGELOG.md index a9d050ba4..f8185671a 100644 --- a/luci-app-smartsafehub/CHANGELOG.md +++ b/luci-app-smartsafehub/CHANGELOG.md @@ -1,5 +1,534 @@ # 변경 기록 +## [0.2.31-r1] - 2026-10-30 + +### 추가 + +- SmartSafeHub Apps 출시하였습니다. 더 많은 앱들이 추가될 예정입니다. + +### 개선 +- 디스크 사용량을 대시보드에서 표시하여 파악할 수 있도록 하였습니다. +- 간헐적으로 느려지는 성능 문제를 해결하였습니다. +- 시스템 안정성을 개선하였습니다. + + +## [0.2.30-r40] - 2026-10-30 + +### 개선 +- Apps 메뉴를 별도의 Explore 구역으로 분리해 더 잘 보이도록 정리했습니다. +- Apps 메뉴에 `앱으로 확장` 안내 문구를 추가해 어떤 기능인지 더 쉽게 이해할 수 있습니다. +- 기존 Apps 아이콘은 그대로 유지하면서 메뉴 강조를 더 자연스럽게 보이도록 다듬었습니다. + +### 테스트 +- Apps 메뉴가 Explore 구역에 단독으로 표시되는지 자동 검사에 추가했습니다. +- Apps 보조 문구와 System 메뉴 순서가 유지되는지 함께 확인합니다. + +### 호환성 +- Apps 화면, 앱 설치 방식, 기존 메뉴 링크 주소는 변경하지 않았습니다. + + +## [0.2.30-r39] - 2026-10-29 + +### 개선 +- 기능이 많아져도 화면이 느려지지 않도록, Apps와 계정의 오래 걸리는 작업을 공유기 내부 백그라운드에서 처리합니다. +- 앱 목록과 설치 상태를 빠르게 표시하고, 필요한 데이터는 자동으로 새로 확인합니다. +- 화면 이동 후 불필요한 요청을 중단하고, 중요한 사용자 작업이 먼저 응답하도록 개선했습니다. +- 사용자 규칙은 일시적인 통신 오류가 나도 마지막으로 확인한 목록을 유지합니다. +- 추천 규칙 해제는 요청 접수와 실제 적용 결과를 구분해 안내합니다. + +### 테스트 +- 동시에 여러 화면을 열거나 작업을 반복할 때 중복 실행을 막는지 확인합니다. +- 느린 작업, 연결 실패, 작업 취소, 캐시 재사용 및 OpenWrt 기본 명령어 호환성을 검사합니다. + +### 호환성 +- 기존 앱 설치·제거 및 사용자 규칙 저장 방식은 유지합니다. + + +## [0.2.30-r38] - 2026-10-29 + +### 개선 +- Apps의 '도구' 아이콘을 전원 버튼에서 렌치 모양으로 변경했습니다. +- '기타' 아이콘을 원 안에 점 3개가 있는 모양으로 변경해 네트워크와 쉽게 구분되도록 했습니다. +- 분류되지 않은 앱도 '기타'에 표시하며, 공유기 체험 화면에도 같은 아이콘을 사용합니다. + +### 테스트 +- 도구·기타 아이콘과 기존 앱 카테고리 표시가 유지되는지 확인합니다. +- 공유기와 체험 화면에서 같은 카테고리 아이콘을 사용하는지 검사합니다. + +### 호환성 +- 앱 설치·제거 및 기존 앱 카테고리 데이터는 변경하지 않았습니다. + + +## [0.2.30-r37] - 2026-10-29 + +### 추가 +- SmartSafeHub Apps에서 Wake-on-LAN 앱을 설치하고, 설치 후 컴퓨터 전원 켜기 화면을 열 수 있습니다. +- Apps에 '도구' 카테고리를 추가하여 Wake-on-LAN 같은 유틸리티 앱을 쉽게 찾을 수 있습니다. + +### 개선 +- Wake-on-LAN에 필요한 두 패키지가 모두 승인된 경우에만 설치하도록 확인합니다. +- 설치 또는 제거 후 LuCI 메뉴를 갱신하여 Wake-on-LAN 화면이 바로 반영되도록 개선합니다. +- 공유기 체험 화면에서 Wake-on-LAN 앱 설치 전 상태를 확인할 수 있습니다. + +### 테스트 +- 두 패키지 설치·제거, 승인 목록 위변조 차단 및 실행 화면 확인을 점검합니다. +- 앱 카테고리와 체험 화면의 읽기 전용 동작을 확인합니다. + +### 호환성 +- 기존 Apps 설치기와 OpenWrt 25.12 패키지 관리 방식을 그대로 사용합니다. + + +## [0.2.30-r36] - 2026-10-29 + +### 개선 +- 공유기 체험 화면에서 레트로 아케이드의 업데이트 가능 상태를 확인할 수 있습니다. +- 네트워크 사용량 모니터도 설치된 예시로 표시하고, 두 앱의 설치 용량을 보여줍니다. +- 대시보드와 Apps 화면에서 같은 가상 저장 공간 데이터를 사용합니다. + +### 테스트 +- 체험 화면의 설치·업데이트 상태, 앱별 용량과 읽기 전용 동작을 확인합니다. + + +## [0.2.30-r35] - 2026-10-29 + +### 수정 +- 앱 목록을 새로고침할 때 일시적인 오류로 기존 앱이 제공 중단된 것으로 표시되던 문제를 수정했습니다. + +### 개선 +- 목록을 잠시 불러오지 못하면 마지막으로 확인된 앱 목록을 유지합니다. +- 실제로 제공이 중단된 앱은 공유기에 남아 있는 관리 기록과 설치 상태를 확인한 후 안내합니다. + +### 테스트 +- 일시적인 목록 오류, 수동 APK 설치, 제공 중단 앱의 구분 및 기존 앱 작업을 확인합니다. + + +## [0.2.30-r34] - 2026-10-29 + +### 추가 +- 대시보드 리소스 사용량에서 디스크 사용률과 사용 중인 용량을 확인할 수 있습니다. + +### 개선 +- 리소스 카드를 메모리, 디스크, 시스템 부하, 실행 시간 순서로 보기 좋게 배치했습니다. +- Apps 화면과 같은 저장 공간 기준을 사용하며, 용량 정보를 읽을 수 없더라도 다른 상태는 정상 표시합니다. + +### 테스트 +- 디스크 용량 계산, 카드 표시 순서, 저장 공간 조회 실패 시 화면 표시를 검증합니다. +- 추가 조회 없이 기존 시스템 상태 정보를 재사용하는지 검사합니다. + + +## [0.2.30-r33] - 2026-10-29 + +### 추가 +- README에서 공유기 웹사이트 체험 페이지를 바로 방문할 수 있습니다. +- 공유기 체험 페이지에 SmartSafeHub 계정 및 Apps 메뉴를 추가했습니다. + +### 개선 +- 계정 연결과 앱 설치 상태를 예시로 볼 수 있으며, 체험 중에는 실제 계정이나 공유기의 정보가 변경되지 않습니다. + +### 테스트 +- 데모 메뉴와 가상 데이터, 실제 서버 요청 및 앱 실행 차단을 자동 검사합니다. + + +## [0.2.30-r32] - 2026-10-29 + +### 개선 +- 앱 카드에 네트워크, 보안, 스마트홈, 엔터테인먼트 등 카테고리별 기본 아이콘을 표시합니다. +- 카테고리 선택 버튼에도 같은 아이콘을 추가해 앱 종류를 쉽게 구분할 수 있습니다. +- 새 카테고리의 앱도 기본 아이콘으로 표시되도록 했습니다. + +### 테스트 +- 앱 카드와 카테고리 버튼의 아이콘 표시, 카테고리별 구분 및 기존 필터 동작을 확인합니다. + + +## [0.2.30-r31] - 2026-10-29 + +### 추가 +- SmartSafeHub Apps에서 앱 업데이트가 성공하면 설치 건수와 별도로 업데이트 성공 건수를 보고합니다. + +### 개선 +- 보고에 실패해도 앱 업데이트는 정상 완료되며, 나중에 다시 전송합니다. +- 자동 복원과 실패한 업데이트는 업데이트 건수에 포함하지 않습니다. + +### 테스트 +- 설치·업데이트 성공 건수 분리와 중복 전송, 실패 시 재시도 동작을 검사합니다. + + +## [0.2.30-r30] - 2026-10-29 + +### 수정 +- 앱 업데이트 후 설치 용량이 표시되지 않을 수 있던 문제를 수정했습니다. + +### 개선 +- 저장 공간의 도넛 차트를 조금 키워 가운데 숫자가 더 편안하게 보이도록 했습니다. + +### 테스트 +- 앱 업데이트 전후의 서로 다른 용량 정보가 함께 반환되는 경우를 검사합니다. +- 저장 공간 차트의 크기와 기존 앱 기능을 확인합니다. + + +## [0.2.30-r29] - 2026-10-29 + +### 개선 +- Apps에서 설치 버전과 제공 버전, 설치 용량을 더 간결하게 보여줍니다. +- 저장 공간 카드에서 남은 용량과 함께 사용 중이거나 예약된 공간도 확인할 수 있습니다. + +### 테스트 +- 앱 정보가 중복되지 않고 좁은 화면에서도 표시되는지 확인합니다. +- 저장 공간 사용량 계산과 잘못된 용량 정보 처리를 검사합니다. + + +## [0.2.30-r28] - 2026-10-29 + +### 개선 +- Apps 화면의 저장 공간 카드를 내용에 맞게 줄여 더 간결하게 표시합니다. +- 앱 설치 용량을 정상적으로 표시하므로 임시 용량 진단 파일을 더 이상 만들지 않습니다. + +### 테스트 +- 저장 공간 카드의 화면 너비와 기존 용량 표시를 확인합니다. +- 임시 진단 파일 없이도 앱 설치 용량을 정확하게 계산하는지 검사합니다. + + +## [0.2.30-r27] - 2026-10-29 + +### 수정 +- 여러 패키지로 구성된 앱의 설치 용량이 표시되지 않을 수 있던 문제를 수정했습니다. + +### 개선 +- 설치된 앱의 용량을 각각 확인해 합산하고, 앱 카드에서 보기 쉽게 표시합니다. + +### 테스트 +- 여러 패키지의 용량 합산과 용량 정보를 확인할 수 없는 경우를 검사합니다. + + +## [0.2.30-r26] - 2026-10-29 + +### 수정 +- Apps 화면에서 저장 공간과 앱 설치 용량이 표시되지 않던 문제를 수정했습니다. +- 업데이트가 있을 때 설치된 버전 대신 새 버전이 표시되던 문제를 수정했습니다. + +### 개선 +- 설치 여부는 앱 카드의 오른쪽 위에, 업데이트 알림은 설치 버전 옆에 표시합니다. +- 설치 상태와 업데이트 버튼의 색상을 구분해 알아보기 쉽게 바꿨습니다. + +### 테스트 +- 저장 공간 조회 권한, 실제 설치 버전 표시, 업데이트 상태와 화면 배치를 확인합니다. + + +## [0.2.30-r25] - 2026-10-29 + +### 추가 +- 설치된 앱의 패키지 용량을 앱 카드에서 확인할 수 있습니다. + +### 개선 +- 여러 패키지로 구성된 앱도 용량을 합쳐서 보여줍니다. 용량을 확인할 수 없으면 잘못된 숫자를 표시하지 않습니다. + +### 테스트 +- 패키지 용량 계산, 정보 누락 및 설치 상태별 표시를 확인합니다. + + +## [0.2.30-r24] - 2026-10-29 + +### 추가 +- Apps 화면에서 앱을 설치할 수 있는 저장 공간과 남은 용량을 도넛 차트로 확인할 수 있습니다. + +### 개선 +- 검증된 앱 안내 영역을 줄이고 저장 공간 정보를 오른쪽에 배치했습니다. 모바일에서는 위아래로 표시합니다. +- 앱을 설치·업데이트·제거한 후 저장 공간 정보도 함께 새로고침됩니다. + +### 테스트 +- 남은 용량 계산, 저장 공간 정보가 없을 때의 표시, 작은 화면 및 다크 모드 동작을 확인합니다. + + +## [0.2.30-r23] - 2026-10-28 + +### 추가 +- SmartSafeHub Apps에서 설치한 앱의 새 승인 버전이 나오면 `업데이트` 버튼으로 직접 업데이트할 수 있습니다. + +### 개선 +- 업데이트 전 설치된 버전과 앱 소유권을 확인하고, 승인된 앱 패키지만 변경하도록 보호합니다. +- 업데이트 후 기존 앱 제거 및 펌웨어 업데이트 복원 기록을 새 버전에 맞게 유지합니다. +- 앱 업데이트는 신규 설치 건수에 포함하지 않습니다. + +### 테스트 +- 새 버전 표시, 다른 패키지 변경 방지, 검증 실패 차단 및 설치 기록 유지 여부를 확인합니다. + + +## [0.2.30-r22] - 2026-10-28 + +### 수정 +- Apps에서 설치 또는 제거 버튼을 눌러도 작업이 시작되지 않는 일부 공유기 문제를 수정했습니다. +- 앱 작업의 완료 상태와 오류 알림이 정확하게 표시되도록 개선했습니다. + +### 테스트 +- 일부 공유기에 없는 명령을 사용하지 않고도 앱 설치·제거가 시작되는지 확인합니다. +- 기존 작업 알림과 새로운 설치·제거 작업 ID를 모두 인식하는지 확인합니다. + + +## [0.2.30-r21] - 2026-10-28 + +### 추가 +- SmartSafeHub Apps에서 앱을 정상 설치하면 내부 다운로드 통계에 자동으로 기록합니다. + +### 개선 +- 인터넷 연결이 끊겨도 설치 기록을 안전하게 보관하고 다시 전송합니다. 설치 작업 자체에는 영향을 주지 않습니다. +- 펌웨어 업데이트 후 자동 복원, 설치 실패, 제거는 다운로드 횟수에 포함하지 않습니다. +- 앱 다운로드 수는 아직 공유기 화면에 표시하지 않습니다. + +### 테스트 +- 설치 성공·실패·자동 복원별 집계, 전송 재시도, 중복 방지를 확인합니다. + + +## [0.2.30-r20] - 2026-10-28 + +### 개선 +- Apps에서 작업 오류 알림을 닫으면 새로고침하거나 화면을 다시 열어도 같은 알림이 나타나지 않습니다. +- 새로운 앱 설치·제거 작업에서 오류가 발생하면 이전과 같은 오류 코드라도 다시 알려줍니다. + +### 테스트 +- 앱 작업 알림의 닫기 기록 보존과 새 작업 구별, 브라우저 저장소 사용 제한 상황을 확인합니다. + + +## [0.2.30-r19] - 2026-10-28 + +### 수정 +- Apps에 여러 앱이 등록된 경우 두 번째 이후 앱의 설치가 E22 오류로 실패하던 문제를 수정했습니다. +- 설치된 앱을 확인할 때 첫 번째 앱만 표시되어 다른 앱이 설치되지 않은 것처럼 보이던 문제를 수정했습니다. + +### 테스트 +- Retro Arcade와 네트워크 사용량 모니터가 함께 등록되어도 설치 상태와 설치·제거가 정확하게 처리되는지 확인합니다. + + +## [0.2.30-r18] - 2026-10-28 + +### 개선 +- 오래된 화면 배치와 이전 성능 개선 단계를 확인하던 중복 테스트를 정리했습니다. +- 변경된 기능을 확인하는 테스트가 자동 검사에서 빠지지 않도록 점검 기능을 추가했습니다. + +### 테스트 +- 기기 등록, 관리자 비밀번호 복구, 네트워크 설정, 펌웨어 등 주요 검증을 자동 검사에 포함했습니다. +- 사용자 규칙, 세션 만료, 화면 새로고침 등 브라우저 동작 테스트 전체를 실행하도록 개선했습니다. +- 이미 실행한 브라우저 동작 테스트를 중복 실행하지 않도록 정리했습니다. + +### 호환성 +- 공유기의 실제 기능과 화면 구성은 변경하지 않았습니다. + + +## [0.2.30-r17] - 2026-10-28 + +### 개선 +- 내부에서 사용하는 패키지를 업데이트 하였습니다. + + +## [0.2.30-r16] - 2026-10-28 + +### 추가 +- SmartSafeHub Apps에 엔터테인먼트 분류를 추가하고 Retro Arcade를 설치한 후 새 탭으로 실행할 수 있습니다. + +### 개선 +- 공유기 내부에서 실행되는 Retro Arcade 주소만 허용하고, 임의의 외부 주소는 열리지 않도록 보호합니다. + +### 테스트 +- Retro Arcade APK 1개 설치·제거, 웹 파일 확인, 잘못된 패키지 목록과 실행 주소 차단을 검증합니다. + +### 호환성 +- 네트워크 사용량 모니터의 기존 실행 방식은 그대로 유지합니다. + + +## [0.2.30-r15] - 2026-10-28 + +### 수정 +- Apps 설치 전 패키지 확인 과정에서 저장소 목록을 찾지 못해 E34 오류가 발생하던 문제를 수정했습니다. +- 검증한 패키지 파일과 서명된 목록만 사용하도록 설치 과정을 개선했습니다. + +### 테스트 +- 패키지 목록 준비, 설치 사전 확인, 서명 검증 유지와 실패 시 안전한 중단을 확인했습니다. + + +## [0.2.30-r14] - 2026-10-27 + +### 수정 +- 공식 인증 앱이 기존 SmartSafeHub 패키지 저장소 주소에서 승인된 릴리스를 다운로드하도록 수정했습니다. + +### 테스트 +- 네트워크 사용량 모니터의 설치와 제거, 패키지 해시 검사를 다시 확인했습니다. + + +## [0.2.30-r13] - 2026-10-27 + +### 개선[text](../../Downloads/retro-r.patch) +- 공식 인증 앱을 SmartSafeHub가 직접 빌드한 패키지로만 설치하도록 변경했습니다. +- 네트워크 사용량 모니터의 세 패키지를 검증된 동일 릴리스에서 설치하도록 단순화했습니다. + +### 수정 +- 외부 OpenWrt 저장소 백업과 자동 대체 설치 경로를 제거했습니다. + +### 테스트 +- 고정 릴리스에서 세 패키지의 설치·제거 및 변조된 해시 차단을 확인합니다. + +### 호환성 +- 기존 외부 저장소 승인과 이전 설치 상태는 승계하지 않습니다. 새로운 앱 승인 이후 테스트 기기에서 재설치해야 합니다. + + +## [0.2.30-r12] - 2026-10-27 + +### 개선 +- 공식 인증 앱 설치 시 SmartSafeHub에 보관한 OpenWrt 패키지가 있으면 보관본을 우선 사용합니다. +- 보관본이 없으면 기존 공식 저장소를 사용하며, 확인된 패키지 해시가 다르면 설치하지 않습니다. + +### 호환성 +- 기존 승인 정보와 앱 설치 기록은 그대로 유지됩니다. 보관본에도 OpenWrt 원본 서명을 사용합니다. + +### 테스트 +- 보관본을 이용한 설치, 원본 저장소 대체, 손상된 보관본 차단을 검사합니다. + + +## [0.2.30-r11] - 2026-10-26 + +### 추가 +- 펌웨어 업데이트 뒤 기존에 설치했던 Apps가 사라지면 인터넷 연결과 새 펌웨어의 승인 정보를 확인해 자동으로 복원합니다. +- 기존 펌웨어 관리 서비스에서 복원을 한 번만 시작하므로 별도의 daemon이나 init 서비스를 추가하지 않습니다. +- Apps 화면에서 자동 복원 진행 상태와 실패 원인을 확인할 수 있습니다. + +### 개선 +- 사용자가 제거한 앱이나 다른 방법으로 설치한 패키지는 자동 복원하지 않습니다. +- 연결이 잠시 끊긴 경우 재시도하지만, 검증된 패키지와 저장소 정보가 맞지 않으면 안전하게 중단합니다. + +### 호환성 +- 펌웨어 업데이트 시 앱 설치 기록을 보존해야 하며, 새 펌웨어에 유효한 Apps 승인이 있어야 복원할 수 있습니다. +- 공식 OpenWrt 저장소 버전이 바뀌면 재승인 없이 자동 설치하지 않습니다. + +### 테스트 +- 앱 설치 기록 보존, 자동 복원·재시도·승인 실패·중복 설치 방지를 검증합니다. + + +## [0.2.30-r10] - 2026-10-26 + +### 추가 +- 검증된 네트워크 사용량 모니터 앱에서 공식 OpenWrt 웹 화면을 함께 설치할 수 있도록 지원합니다. +- 기존에 사용량 수집 앱만 설치했다면 Apps의 `설치 마무리`로 웹 화면을 추가할 수 있습니다. + +### 개선 +- 이미 다른 앱이 사용하는 공통 라이브러리는 유지하고, SmartSafeHub가 직접 설치한 패키지만 제거합니다. + +### 호환성 +- 공식 웹 화면 설치에는 현재 펌웨어와 일치하는 OpenWrt LuCI 저장소 및 관리자가 검증한 패키지 승인이 필요합니다. +- 공식 저장소가 변경되었거나 다른 시스템 패키지를 업그레이드해야 한다면 설치하지 않습니다. + +### 테스트 +- 공식 패키지 검증, 설치 마무리, 소유권 보호, 시스템 패키지 교체 차단을 확인합니다. + + +## [0.2.30-r9] - 2026-10-25 + +### 추가 +- 설치된 앱에 웹 화면이 있으면 `열기` 버튼으로 새 탭에서 사용할 수 있습니다. 기존 SmartSafeHub 화면은 그대로 유지됩니다. + +### 개선 +- 앱 작업 완료 알림은 7초 후 자동으로 닫히며, 직접 닫을 수도 있습니다. 실패 알림은 확인할 때까지 유지됩니다. +- 네트워크 사용량 모니터에 공식 LuCI 화면을 연결할 수 있도록 설치 상태를 확인합니다. +- 검증된 앱에 새 패키지가 추가되면, 기존 설치를 안전하게 유지하면서 추가 패키지를 설치할 수 있습니다. + +### 호환성 +- 네트워크 사용량 모니터의 웹 화면은 `luci-app-nlbwmon` 패키지가 설치되어야 열 수 있습니다. 함께 설치하려면 두 패키지 모두 SmartSafeHub 승인 목록에 등록되어 있어야 합니다. + +### 테스트 +- 새 탭 실행 경로 검증, 앱 알림 표시, 승인된 패키지 추가 설치 및 기존 패키지 보호를 확인합니다. + + +## [0.2.30-r8] - 2026-10-25 + +### 수정 +- Apps 설치 시 공식 저장소에 같은 앱이 있더라도 SmartSafeHub에서 검증한 패키지만 선택하도록 수정했습니다. + +### 개선 +- 앱 설치에 별도의 로컬 저장소를 만들지 않고 SmartSafeHub 서명 저장소를 직접 사용합니다. +- 의존성이 부족해 설치하지 못한 경우 패키지 관리자의 오류 로그를 확인할 수 있도록 개선했습니다. + +### 테스트 +- 원격 저장소에서만 설치하는지, 같은 버전의 다른 패키지가 선택되지 않는지, 의존성이 없을 때 안전하게 중단하는지 검증합니다. + + +## [0.2.30-r7] - 2026-10-25 + +### 개선 +- Apps에서 승인된 패키지를 SmartSafeHub 저장소에서 직접 내려받아 설치할 수 있도록 연결했습니다. 공유기 펌웨어에 저장소 인덱스를 별도로 복사할 필요가 없습니다. +- 다른 방법으로 설치한 앱은 계속 보호하고, 설치 오류를 더 쉽게 이해할 수 있도록 안내합니다. + +### 수정 +- 앱을 제거할 때 네트워크 및 시스템 필수 패키지가 함께 제거될 위험이 있으면 작업을 차단합니다. + +### 테스트 +- 승인된 저장소·APK의 해시 확인, 설치·제거, 위험한 제거 방지 기능을 검증합니다. + + +## [0.2.30-r6] - 2026-10-23 + +### 테스트 +- 테스트를 위해서 revision을 올렸습니다. + + +## [0.2.30-r5] - 2026-10-23 + +### 개선 +- 사용자 규칙에서 검색과 추천 규칙 분류를 더 효율적으로 처리해 화면이 불필요하게 다시 그려지는 일을 줄였습니다. +- 추천 규칙 상태를 자동 확인할 때 목록 내용이 같다면 기존 화면을 유지합니다. + +### 추가 +- 공유기 웹사이트에서 간헐적으로 느린 요청을 확인할 수 있도록 RPC 처리 시간 진단을 추가했습니다. 진단 정보는 브라우저에만 일시 보관됩니다. + +### 테스트 +- 규칙 검색 및 분류, 추천 규칙 상태 갱신, RPC 지연 기록과 개인정보 비수집을 검증합니다. + + +## [0.2.30-r4] - 2026-10-20 + +### 추가 +- Apps에서 검증된 앱을 설치하고 제거할 수 있습니다. +- 설치 진행 상태와 실패 원인을 확인할 수 있습니다. + +### 개선 +- 공유기와 펌웨어에 맞는 앱만 설치되도록 확인합니다. +- 앱 제거 시 사용자가 별도로 설치한 패키지는 보호합니다. + +### 호환성 +- 현재는 OpenWrt APK 앱을 지원합니다. 스마트홈 및 로컬 AI 앱은 향후 추가될 예정입니다. +- 앱을 설치하려면 해당 펌웨어에 승인된 패키지와 고정된 패키지 저장소가 필요합니다. + +### 테스트 +- 설치·제거, 승인 철회, 패키지 검증, 사용자 설치 패키지 보호를 확인합니다. + + +## [0.2.30-r3] - 2026-10-20 + +### 추가 +- 공유기 메뉴의 '업데이트' 바로 위에 **Apps**를 추가했습니다. +- SmartSafeHub에서 검증한 앱만 현재 공유기의 펌웨어에 맞춰 표시하는 화면을 추가했습니다. + +### 개선 +- 앱 목록이 비어 있거나 서버에 연결할 수 없을 때 이유를 구분해 안내합니다. + +### 호환성 +- 이번 버전은 검증된 앱 목록 조회만 지원합니다. 실제 앱 설치·삭제는 아직 지원하지 않습니다. +- 앱을 표시하려면 Hub의 앱 카탈로그 API와 공유기의 펌웨어 식별 정보가 필요합니다. + +### 테스트 +- PC·모바일 메뉴 순서와 화면 이동을 확인합니다. +- 다른 기기나 펌웨어에 승인된 목록이 나타나지 않도록 확인합니다. + + +## [0.2.30-r2] - 2026-10-20 + +### 개선 +- 추천 사용자 규칙을 처리할 때 공유기의 불필요한 작업과 설정 저장 횟수를 줄여 화면이 더 빠르게 열리도록 개선했습니다. +- 추천 규칙 적용 상태만 바뀌면 사용자 규칙 목록을 다시 불러오지 않도록 했습니다. + +### 수정 +- 추천 규칙 동기화와 SafeShield 목록 갱신이 겹칠 때 발생할 수 있는 지연을 줄였습니다. + +### 테스트 +- 추천 규칙을 추가하거나 해제할 때 기존 사용자 규칙이 보존되는지와 중복 조회가 줄었는지 확인합니다. + + ## [0.2.30-r1] - 2026-10-18 ### 개선 @@ -8,6 +537,7 @@ ### 수정 - 추천 사용자 규칙 해제가 안되던 문제를 수정하였습니다. + ## [0.2.29-r14] - 2026-10-18 ### 개선 @@ -45,6 +575,7 @@ - Cloud 설정이 활동 목록 위에 있는지, 접기·펼치기와 활동 더 보기가 동작하는지 확인합니다. - 계정 연결 안내, 전송 오류, 로컬 활동 기록 유지 안내가 사라지지 않았는지 확인합니다. + ## [0.2.29-r11] - 2026-10-18 ### 개선 @@ -58,6 +589,7 @@ - 메뉴별 제목 배치와 기존 조작 버튼, 설정 저장 안내가 유지되는지 확인합니다. + ## [0.2.29-r10] - 2026-10-18 ### 개선 @@ -69,6 +601,7 @@ - 허용 목록 확인 결과의 전송, 최신 규칙 비교 및 중복 보고 방지를 검증합니다. + ## [0.2.29-r9] - 2026-10-18 ### 수정 @@ -87,6 +620,7 @@ - SafeShield 갱신 중 규칙 변경 보류, 재시도, 기존 사용자 규칙 보존 및 상태 표시를 검증합니다. + ## [0.2.29-r8] - 2026-10-17 ### 수정 @@ -98,6 +632,7 @@ - 갱신 실패 후 재할당, 기존 직접 허용 규칙 보존, 동기화 확인서가 사라진 경우의 복구를 검증합니다. + ## [0.2.29-r7] - 2026-10-17 ### 추가 @@ -112,6 +647,7 @@ - 해제 확인, 기기 인증, 공유기 동기화와 데모 접근 차단을 확인합니다. + ## [0.2.29-r6] - 2026-10-17 ### 수정 @@ -130,6 +666,7 @@ - 다크모드 추천 규칙, 비밀번호 자동 완성, 설정 탭의 카드 배치를 점검합니다. + ## [0.2.29-r5] - 2026-10-17 ### 개선 @@ -142,6 +679,7 @@ - 기존 사용자 규칙과 추천 규칙의 구분, 삭제 권한, 접기·펼치기 및 데모 격리를 검증합니다. + ## [0.2.29-r4] - 2026-10-17 ### 개선 @@ -179,6 +717,7 @@ - 추천 사용자 규칙을 적용하지 못하는 문제를 수정하였습니다. + ## [0.2.29-r1] - 2026-10-17 ### 추가 @@ -190,6 +729,7 @@ - 펌웨어 정보에 관리 소프트웨어의 버전을 표시합니다. + ## [0.2.28-r9] - 2026-10-17 ### 추가 @@ -207,6 +747,7 @@ - 기존 허용 규칙 판정, 동기화 실패·재시도 및 잘못된 확인 응답을 검증합니다. + ## [0.2.28-r8] - 2026-10-16 ### 추가 @@ -228,6 +769,7 @@ - 추천 규칙 추가·해제, 직접 등록한 허용 규칙 보존, 동기화 실패 및 잘못된 응답 처리를 확인합니다. + ## [0.2.28-r7] - 2026-10-16 ### 개선 @@ -258,6 +800,7 @@ - 기본 탭, 주소 직접 접속, 이전 주소 호환성, 입력 상태 보존과 모바일 탭 구조를 확인합니다. + ## [0.2.28-r5] - 2026-10-16 ### 추가 @@ -274,6 +817,7 @@ - 펌웨어의 포함 버전 전달과 동일·신규·이전 버전 비교 및 정보 누락 처리를 확인합니다. + ## [0.2.28-r4] - 2026-10-13 ### 수정 @@ -293,6 +837,7 @@ - DNS 적용을 기다리는 동안에도 입력창을 초기화하고, 저장 실패 시 입력을 유지하는 동작을 확인합니다. - 여러 규칙을 연속 등록해도 진행 안내가 뒤섞이지 않는지 확인합니다. + ## [0.2.28-r3] - 2026-10-11 ### 수정 @@ -313,6 +858,7 @@ - 추가한 데모 메뉴와 데이터 및 실제 공유기 통신 차단을 확인합니다. + ## [0.2.28-r2] - 2026-10-10 ### 추가 @@ -329,6 +875,7 @@ - 데모 화면에 실제 로그인 및 공유기 통신 코드가 포함되지 않도록 검사합니다. - 데모를 새로 빌드했을 때 저장소에 등록된 파일과 일치하는지 확인합니다. + ## [0.2.28-r1] - 2026-10-10 ### 추가 @@ -346,12 +893,14 @@ - SafeShield의 최소 버전을 0.3.25 이상으로 강제합니다. + ## [0.2.27-r27] - 2026-10-10 ### 수정 - SafeShield의 최소 버전을 0.3.25 이상으로 강제합니다. + ## [0.2.27-r26] - 2026-10-09 ### 수정 @@ -364,6 +913,7 @@ - PRO 라이선스 할당·해제 및 변경 없는 상태에서의 중복 갱신 방지를 확인합니다. - 일시적인 갱신 실패 후 재시도와 잘못된 요금제 응답 처리를 검증합니다. + ## [0.2.27-r25] - 2026-10-09 ### 수정 @@ -375,6 +925,7 @@ - 실패한 단계가 남아 있어도 다시 갱신할 수 있는지 확인하는 테스트를 추가했습니다. + ## [0.2.27-r24] - 2026-10-09 ### 추가 @@ -391,6 +942,7 @@ - 게스트 Wi-Fi의 기본 설정, 네트워크 격리, API 권한 및 화면 연결을 확인하는 테스트를 추가했습니다. + ## [0.2.27-r23] - 2026-10-09 ### 개선 @@ -402,6 +954,7 @@ - 라이브러리 버전과 변경된 타입 사용 방식이 일치하는지 확인하는 테스트를 추가했습니다. + ## [0.2.27-r22] - 2026-10-09 ### 개선 @@ -414,6 +967,7 @@ - 토큰 다운로드, 잘못된 토큰 거부, 기존 다운로드 링크 사용을 검증하는 테스트를 추가했습니다. + ## [0.2.27-r21] - 2026-10-09 ### 개선 @@ -426,6 +980,7 @@ - 유휴 상태의 조회 간격, 활동 알림 처리 및 오류 재시도 동작을 확인하는 테스트를 추가했습니다. + ## [0.2.27-r20] - 2026-10-09 ### 개선 @@ -442,6 +997,7 @@ - 실행 진단 정보 기록 및 CLI 호환성 테스트를 추가했습니다. + ## [0.2.27-r19] - 2026-10-09 ### 추가 @@ -456,6 +1012,7 @@ - QR 코드 다운로드 및 파일명 생성 기능이 유지되는지 확인합니다. + ## [0.2.27-r18] - 2026-10-09 ### 추가 @@ -471,6 +1028,7 @@ - QR 코드 생성과 관리자 인증, 일반 Wi-Fi 조회의 비밀번호 비노출을 확인합니다. + ## [0.2.27-r17] - 2026-10-09 ### 개선 @@ -481,6 +1039,7 @@ - SafeShield 원형 진행 표시의 선 두께가 의도한 값으로 유지되는지 계약 테스트로 확인합니다. + ## [0.2.27-r16] - 2026-10-09 ### 수정 @@ -497,6 +1056,7 @@ - 계정 상태 요청 순서, 캐시 성공 시각, 업데이트 복귀·재시도 계약을 검증합니다. + ## [0.2.27-r15] - 2026-10-09 ### 개선 @@ -507,6 +1067,7 @@ - 계정 메뉴의 접근성 문구와 시각적 알림의 중복 읽기 방지를 확인합니다. + ## [0.2.27-r14] - 2026-10-09 ### 개선 @@ -518,6 +1079,7 @@ - 최근 활동 전용 RPC 권한과 개발용 지연 기록 조건을 검증합니다. + ## [0.2.27-r13] - 2026-10-09 ### 개선 @@ -530,6 +1092,7 @@ - 상태 갱신, 캐시 재사용, 전역 업데이트 조회 계약을 검증합니다. + ## [0.2.27-r12] - 2026-10-09 ### 추가 @@ -545,6 +1108,7 @@ - 미연결 안내, 계정 화면 이동 및 불필요한 서버 동기화 방지 계약을 검증합니다. + ## [0.2.27-r11] - 2026-10-08 ### 개선 @@ -558,6 +1122,7 @@ - 중복 조회 방지, 화면별 폴링 조건 및 기존 데이터 유지 동작에 대한 회귀 테스트를 추가했습니다. + ## [0.2.27-r10] - 2026-10-08 ### 개선 @@ -574,6 +1139,7 @@ - SafeShield `0.3.24-r4`의 `status.entitlement` 스키마를 사용합니다. `status.license` 호환 경로는 유지하지 않습니다. + ## [0.2.27-r9] - 2026-10-08 ### 개선 @@ -587,6 +1153,7 @@ - 연결된 기기의 웹사이트 등록 해제를 감지하면 계정 상태와 Cloud 활동 credential을 정리하고 SafeShield 갱신을 한 번 요청하는지 검증하는 회귀 테스트를 추가했습니다. - 계정 화면이 백그라운드 로컬 상태 변경을 주기적으로 반영하는 UI 계약을 추가했습니다. + ## [0.2.27-r8] - 2026-10-08 ### 개선 @@ -599,6 +1166,7 @@ - 계정에 연결된 Free 기기의 7일 Cloud 활동 업로드, Pro의 90일 보관, 계정 미연결 기기의 전송 차단을 검증하는 테스트를 보강했습니다. + ## [0.2.27-r7] - 2026-10-08 ### 개선 @@ -610,6 +1178,7 @@ - 연결 코드 유효 시간 강조와 SafeShield 플랜 배지 스타일 재사용을 검증하는 계정 UI 계약 테스트를 보강했습니다. + ## [0.2.27-r6] - 2026-10-08 ### 개선 @@ -626,6 +1195,7 @@ - 로컬 상태 우선 표시, 백그라운드 동기화, 중복 요청 방지와 연결된 기기의 지연 안내 문구를 검증하는 계정 UI 계약 테스트를 보강했습니다. + ## [0.2.27-r5] - 2026-10-08 ### 개선 @@ -637,6 +1207,7 @@ - 활성 연결 코드가 계정 등록으로 소비되면 SafeShield 갱신을 한 번만 요청하고, 이후 기기 동기화에서는 같은 갱신을 반복하지 않는 회귀 테스트를 추가했습니다. + ## [0.2.27-r4] - 2026-10-08 ### 추가 @@ -653,6 +1224,7 @@ - 계정 메뉴 라우팅, 연결 코드 polling, 등록 완료 후 코드 숨김, device registration RPC 동기화와 SafeShield 화면 분리를 검증하는 계약 테스트를 추가·보강했습니다. + ## [0.2.27-r3] - 2026-10-08 ### 개선 @@ -664,6 +1236,7 @@ - 연결 코드 강조 표시와 복사 기능이 SafeShield 화면에 유지되는지 UI 계약 테스트를 보강했습니다. + ## [0.2.27-r2] - 2026-10-03 ### 추가 @@ -689,6 +1262,7 @@ - 서버의 기존 라이선스 API는 전환 기간 동안 그대로 유지되므로 이전 버전 기기와 새 기기 등록 방식을 함께 운영할 수 있습니다. + ## [0.2.27-r1] - 2026-10-03 ### 개선 @@ -696,6 +1270,7 @@ - 일부 UI를 개선하여 더 명확하게 정보를 표현하도록 하였습니다. - 첫 설치 시 브라우저의 시간대를 기본 시간대로 사용할 수 있도록 개선하였습니다. + ## [0.2.26-r4] - 2026-10-01 ### 개선 @@ -711,6 +1286,7 @@ - 보호 데이터 카드가 보호 도메인, 보호 수준, 마지막 업데이트, 상태 안내와 접힌 세부 정보를 제공하고 기존 영어 내부 필드를 기본 화면에 직접 노출하지 않는지 UI 계약 테스트를 추가했습니다. - 패키지 revision과 로그인/프론트엔드 asset version이 `0.2.26-r4`로 일치하는지 기존 패키지 계약 테스트로 함께 검증합니다. + ## [0.2.26-r3] - 2026-10-01 ### 개선 @@ -724,6 +1300,7 @@ - 원격 상태 보고 화면에 개인정보 보호 설명과 전송/비전송 정보 분류가 유지되는지 UI 계약 테스트를 보강했습니다. - DNS 요청 내용과 시스템 로그 원문이 서버에 전송되지 않는다는 안내가 계속 표시되는지 Health 계약 테스트를 추가했습니다. + ## [0.2.26-r2] - 2026-09-30 ### 추가 @@ -739,12 +1316,14 @@ - 신규 설치의 1회 시간대 자동 설정, 기존 장치 시간대 보존, 지원하지 않는 브라우저 시간대 처리와 `SmartRouter` hostname 강제 적용을 검증하는 회귀 테스트를 보강했습니다. + ## [0.2.26-r1] - 2026-09-30 ### 수정 - 펌웨어를 업데이트한 뒤에도 이전 펌웨어 버전으로 인식되어 같은 업데이트가 다시 표시되던 문제를 수정했습니다. + ## [0.2.25-r2] - 2026-09-29 ### 수정 @@ -765,6 +1344,7 @@ - 이 버전부터 생성한 설정 백업에는 SmartSafeHub 기기 코드가 `/etc/config/smartsafehub`에 포함됩니다. 기기 코드가 없는 이전 백업은 다른 모델 백업의 오적용을 막기 위해 복원이 거부될 수 있습니다. + ## [0.2.25-r1] - 2026-09-29 ### 개선 @@ -772,6 +1352,7 @@ - 관리자 비밀번호 변경 UI를 개선하였습니다. - 내부 모듈을 정리하였습니다. + ## [0.2.24-r5] - 2026-09-29 ### 개선 @@ -782,6 +1363,7 @@ - 비밀번호 요구 사항 안내 다음의 확인 입력 영역에 추가 여백이 유지되는지 UI 계약 테스트를 보강했습니다. + ## [0.2.24-r4] - 2026-09-29 ### 수정 @@ -793,6 +1375,7 @@ - 패키지 설치 과정에서 Cloud 전송을 강제로 켜는 레거시 migration이 남아 있지 않은지 검증하고, RPC·이벤트 기록·동기화·라이선스 경로 모두 명시적으로 ON인 경우에만 Cloud 기능을 사용하도록 계약 테스트를 보강했습니다. + ## [0.2.24-r3] - 2026-09-29 ### 수정 @@ -806,6 +1389,7 @@ - 기존 사용자 system/NTP 설정 보존, 새 설치 기본값 적용, `compat_version` 비변경을 검증하는 system-defaults 회귀 테스트를 보강했습니다. - 같은 `device_code` 백업 허용, 다른 장치 및 식별 metadata 없는 백업 거부, 성공/실패 복원 후 현재 `firmware.json` 보존을 검증하는 백업 회귀 테스트를 추가했습니다. + ## [0.2.24-r2] - 2026-09-29 ### 개선 @@ -817,12 +1401,14 @@ - 사용 가능한 펌웨어 요약에 OpenWrt 기반 버전이 다시 노출되지 않고 SmartSafeHub 펌웨어 버전과 이미지 크기가 유지되는지 UI contract 테스트를 추가했습니다. + ## [0.2.24-r1] - 2026-09-28 ### 수정 - 내부 설정 충돌을 해결하였습니다. + ## [0.2.23-r2] - 2026-09-28 ### 수정 @@ -834,6 +1420,7 @@ - system/NTP 섹션이 이미 존재할 때 섹션을 재생성하지 않는지, `compat_version`을 수정하거나 삭제하지 않는지, 누락된 섹션만 방어적으로 생성하는지 검증하는 회귀 테스트를 추가했습니다. + ## [0.2.23-r1] - 2026-09-28 ### 개선 @@ -845,6 +1432,7 @@ - 다크 모드에서 일부 UI의 가독성이 떨어진 부분을 수정하였습니다. + ## [0.2.22-r14] - 2026-09-28 ### 개선 @@ -856,6 +1444,7 @@ - 관리 소프트웨어 업데이트 수가 여러 개여도 사이드바 badge에서는 1개 유형으로만 계산하고 펌웨어와 합산해 최대 2가 되는 계약을 검증하도록 업데이트 UI 회귀 테스트를 보강했습니다. + ## [0.2.22-r13] - 2026-09-28 ### 개선 @@ -868,6 +1457,7 @@ - recovery bridge의 marker/빈 root 비밀번호 조건, 제한 RPC grant, 일반 로그인보다 우선하는 복구 진입 순서와 production asset version 계약을 검증하는 회귀 테스트를 추가했습니다. + ## [0.2.22-r12] - 2026-09-28 ### 추가 @@ -886,6 +1476,7 @@ - Reset 5~9초/10초 경계, 구형 펌웨어 업그레이드 차단 계약, 비밀번호 복구 marker, Dropbear 보호/복원, 실패 rollback과 복구 전용 UI를 검증하는 회귀 테스트를 추가했습니다. + ## [0.2.22-r11] - 2026-09-28 ### 추가 @@ -904,6 +1495,7 @@ - 관리자 비밀번호 변경 RPC, ACL, 현재 비밀번호 검증, 세션 폐기, 공통 비밀번호 정책과 설정 UI 재로그인 흐름을 검증하는 회귀 테스트를 추가했습니다. + ## [0.2.22-r10] - 2026-09-28 ### 수정 @@ -915,6 +1507,7 @@ - 업데이트 UI 계약 테스트에 설치 진행 패널의 `text-sky-800` 및 `text-sky-950` 다크 모드 매핑 회귀 검증을 추가했습니다. + ## [0.2.22-r9] - 2026-09-28 ### 개선 @@ -927,6 +1520,7 @@ - 사이드바 업데이트 badge가 관리 소프트웨어 업데이트 수와 펌웨어 `updateAvailable` 상태를 합산하는지, 펌웨어 상태 조회가 전역에서 활성화되는지 검증하는 회귀 조건을 추가했습니다. + ## [0.2.22-r8] - 2026-09-28 ### 개선 @@ -940,6 +1534,7 @@ - WAN 고정 IPv4의 주소/게이트웨이/DNS가 공용 octet 입력을 사용하는지, LAN도 같은 컴포넌트를 재사용하는지와 `네트워크` 메뉴명을 검증하는 회귀 조건을 추가했습니다. + ## [0.2.22-r7] - 2026-09-28 ### 개선 @@ -954,6 +1549,7 @@ - 네트워크 설정 단일 route, 기존 WAN/LAN hash 호환, 메뉴 통합, 대시보드 링크 및 WAN/LAN 동시 새로고침을 검증하는 회귀 테스트를 추가했습니다. - 기존 WAN, LAN, IPTV와 내비게이션 계약 테스트를 새 통합 메뉴 구조에 맞게 갱신했습니다. + ## [0.2.22-r6] - 2026-09-28 ### 추가 @@ -974,6 +1570,7 @@ - WAN RPC/ACL, UCI 저장, 입력 검증, PPPoE 비밀번호 비노출/보존, WAN-only 재연결, 메뉴/화면/최근 활동 연결을 검증하는 계약 테스트를 추가했습니다. - OpenWrt ucode 런타임 fixture에서 PPPoE `/32` 주소, gateway/DNS 상태 해석과 기존 비밀번호를 노출하지 않는 무변경 저장을 검증합니다. + ## [0.2.22-r5] - 2026-09-28 ### 정리 @@ -985,6 +1582,7 @@ - 이벤트 테스트가 새 SafeShield observer 상태 파일명을 사용하도록 갱신하고, 패키지/Cloud activity 계약에서 존재하지 않는 legacy 서비스의 stop/disable migration 요구사항을 제거했습니다. + ## [0.2.22-r4] - 2026-09-28 ### 개선 @@ -996,6 +1594,7 @@ - 대시보드 계약 테스트에 최근 활동 액션의 제목 행 배치, 모바일 줄바꿈 방지, SafeShield 집계 상대 시간과 1분 주기 갱신 연동을 검증하는 회귀 조건을 추가했습니다. + ## [0.2.22-r3] - 2026-09-28 ### 수정 @@ -1009,6 +1608,7 @@ - Health Reporter에서 `pro` + `ACTIVE`가 `PRO` + `active`로 정규화되고 유료 권한으로 판정되는지 검증합니다. - Cloud 최근 활동 동기화가 POSIX 문자 클래스 기반 `tr` 대소문자 변환을 다시 사용하지 않는지 검증합니다. + ## [0.2.22-r2] - 2026-09-28 ### 수정 @@ -1021,6 +1621,7 @@ - LAN 계약 테스트에 모바일 IPv4 4열 그리드와 입력 폭 제한 회귀 검증을 추가했습니다. - IPTV 계약 테스트에 공통 스위치 geometry 사용과 모바일 제목 행 배치 회귀 검증을 추가했습니다. + ## [0.2.22-r1] - 2026-09-27 ### 개선 @@ -1028,6 +1629,7 @@ - 신규 기기 지원을 위해서 내부 모듈을 업데이트 하였습니다. - 가독성을 위해서 최근 활동의 UI를 개선하였습니다. + ## [0.2.21-r3] - 2026-09-27 ### 개선 @@ -1041,6 +1643,7 @@ - A3004T와 AX3000SE가 펌웨어 메타데이터와 board-name fallback 양쪽에서 올바른 장치 코드로 식별되는지 검증하는 회귀 테스트를 추가했습니다. - rpcd 펌웨어 모듈이 두 신규 장치 코드와 OpenWrt board name 매핑을 포함하는지 계약 테스트를 추가했습니다. + ## [0.2.21-r2] - 2026-09-25 ### 개선 @@ -1051,12 +1654,14 @@ - 최근 활동 UI 계약 테스트에 대시보드 compact 타임라인의 항목 간격을 검증하는 회귀 테스트를 추가했습니다. + ## [0.2.21-r1] - 2026-09-25 ### 수정 - 모바일 기기에서 자동 업데이트 시간 설정의 UI가 깨지는 문제를 수정하였습니다. + ## [0.2.20-r5] - 2026-09-25 ### 수정 @@ -1069,6 +1674,7 @@ - 업데이트 UI와 설정 UI 계약 테스트에서 native `type="time"` 재도입을 금지하고 공통 `TimeSelect` 사용 및 실제 배포 `app.js`/`app.css` 반영 여부를 검증하도록 보강했습니다. + ## [0.2.20-r4] - 2026-09-25 ### 수정 @@ -1080,6 +1686,7 @@ - 업데이트 UI 계약 테스트가 소스 코드뿐 아니라 실제 패키지에 포함되는 `app.js`/`app.css`에도 iPad 레이아웃 보정이 들어갔는지 확인하도록 확장했습니다. + ## [0.2.20-r3] - 2026-09-25 ### 수정 @@ -1092,6 +1699,7 @@ - 업데이트 UI 계약 테스트에 자동 업데이트 설정의 container-width 반응형 Grid와 iPadOS/WebKit 시간 입력 폭 제한을 검증하는 회귀 테스트를 추가했습니다. + ## [0.2.20-r2] - 2026-09-23 ### 개선 @@ -1108,6 +1716,7 @@ - 펌웨어 helper/RPC 계약 테스트에 "패키지 저장소가 Beta여도 설치된 펌웨어 채널은 Stable로 유지된다"는 회귀 검증과 "펌웨어 채널은 저장소 파일이 아니라 펌웨어 metadata에서 읽는다"는 계약 검증을 추가했습니다. - README의 업데이트 섹션에 펌웨어 채널과 패키지 채널을 분리한 규칙을 문서화했습니다. + ## [0.2.20-r1] - 2026-09-22 ### 기능 @@ -1123,6 +1732,7 @@ - SafeShield refresh 로딩바를 다듬었습니다. + ## [0.2.19-r21] - 2026-09-22 ### 수정 @@ -1135,6 +1745,7 @@ - SafeShield UI contract에 refresh donut의 반지름과 container 크기를 고정하는 회귀 검증을 추가해 이후 스타일 수정으로 전체 ring 크기가 다시 커지지 않도록 했습니다. - README의 SafeShield 갱신 단계 설명을 현재의 약간 더 컴팩트한 ring 규칙에 맞게 갱신했습니다. + ## [0.2.19-r20] - 2026-09-22 ### 수정 @@ -1147,6 +1758,7 @@ - 첫 확인 실패 후 두 번째 확인에서 복구되는 transient dnsmasq 상태는 critical/event를 만들지 않고, 3회 연속 실패는 실제 critical 및 `health.issue.started`로 기록되는 회귀 테스트를 추가했습니다. - README의 로컬 Health 진단 설명에 dnsmasq 연속 확인/debounce 정책을 추가했습니다. + ## [0.2.19-r19] - 2026-09-21 ### 기능 @@ -1168,6 +1780,7 @@ - Cloud OFF에서 local history만 남고 outbox/wake/credential/network 호출이 생기지 않는지, license status-sync가 Cloud OFF에서도 라이선스 상태를 유지하면서 activity credential을 저장하지 않는지 회귀 테스트를 추가했습니다. - UI/RPC/ACL 계약에 유료 entitlement, 접근 가능한 switch semantics, 신규 설치 기본 OFF와 구버전 upgrade 호환 정책을 고정하고 README의 Cloud 활동 기록 데이터 흐름을 갱신했습니다. + ## [0.2.19-r18] - 2026-09-21 ### 수정 @@ -1181,6 +1794,7 @@ - SafeShield UI contract에 track/arc stroke 폭과 라이트/다크 모드 shadow 강도를 고정하는 회귀 검증을 추가해 이후 Tailwind border/shadow 변경이 진행 ring의 시각 두께를 다시 키우지 않도록 했습니다. - README의 SafeShield 갱신 단계 설명에 얇은 progress ring 시각 규칙을 추가했습니다. + ## [0.2.19-r17] - 2026-09-21 ### 수정 @@ -1196,6 +1810,7 @@ - license status-sync가 paid 응답의 activity credential을 실제 runtime cache에 저장하고 revoke/clear 시 제거하는 계약을 추가했습니다. Activity Sync는 license API를 직접 호출하지 않고 `smartsafehub-license status-sync` 경계만 사용하며, cached credential 재사용·paid credential 누락·Free/revoked 처리·Cloud upload/ack·backoff가 유지되는지 회귀 테스트로 고정했습니다. - README의 Cloud 활동 기록 구조를 `license = entitlement/credential owner`, `activity-sync = upload/ack consumer` 책임 분리와 향후 agent module 경계에 맞게 갱신했습니다. + ## [0.2.19-r16] - 2026-09-21 ### 수정 @@ -1211,6 +1826,7 @@ - Activity Sync가 `/licenses/status`만 호출하고 `/licenses/resolve`를 호출하지 않는 계약, status body가 최소 identity만 포함하는 계약, 구 Hub paid 응답의 outbox 보존, revoked/Free outbox 정리, status 장애 backoff를 회귀 테스트로 고정했습니다. - README의 Cloud 활동 기록 동기화 설명을 Hub 1.4.86의 조회 전용 status credential 구조와 단계적 배포 호환 정책에 맞게 갱신했습니다. + ## [0.2.19-r15] - 2026-09-21 ### 수정 @@ -1224,6 +1840,7 @@ - status RPC가 선택적 limit 인자에 의존하지 않고 최대 128건을 반환하는 계약과 Cloud resolve 실패의 15/30/60분 bounded backoff를 검증하는 회귀 테스트를 추가했습니다. - README에 Cloud Activity API 장애/미배포 시 재시도 정책과 로컬 이벤트 기록이 Cloud 통신과 독립적이라는 점을 보강했습니다. + ## [0.2.19-r14] - 2026-09-21 ### 수정 @@ -1237,6 +1854,7 @@ - PID 파일이 아직 없는 초기화 중 lock을 경쟁 writer가 탈취하지 않는지 검증하는 회귀 테스트를 추가했습니다. 기존 동시 writer 및 local history/outbox 분리 테스트와 함께 여러 producer가 겹쳐도 이벤트가 덮어써지지 않는 계약을 검증합니다. - README에 lock owner 게시 전 구간을 stale로 간주하지 않는 소유권 규칙과 event emit 실패 로그 정책을 문서화했습니다. + ## [0.2.19-r13] - 2026-09-21 ### 수정 @@ -1251,6 +1869,7 @@ - Hub API 미배포/통신 실패, legacy paid resolve, plan 미확인 응답에서 outbox가 삭제되지 않고, 명시적인 Free 응답에서만 정리되는 계약을 추가했습니다. - README에 로컬 history와 Cloud 전송 실패의 독립성, bounded lock wait, Cloud API rollout 이전의 retry 정책을 문서화했습니다. + ## [0.2.19-r12] - 2026-09-21 ### 기능 @@ -1272,6 +1891,7 @@ - 유료 Cloud batch 업로드/ack, Free entitlement, 유료 credential 누락 시 outbox 보존, 직접/관찰 이벤트 소유권을 검증하는 `tests/test-activity-cloud-sync.sh`를 추가하고 ShellSpec/패키지/static validation 계약에 연결했습니다. - README의 이벤트 생산 경로를 direct mutation과 observer transition으로 구분하고 Cloud 활동 기록 동기화/유료 entitlement/로컬 history 보존 정책을 문서화했습니다. + ## [0.2.19-r11] - 2026-09-21 ### 수정 @@ -1287,6 +1907,7 @@ - 최근 활동 UI 계약 테스트에 부팅, 인터넷 연결, SafeShield 보호, 라이선스, Health 상태의 사용자 문구와 관측 기반 장애 시간 표현을 고정하고, 오해를 유발하던 기존 문구가 다시 들어오지 않는 회귀 검사를 추가했습니다. - README에 최근 활동은 관측 데이터가 실제로 보장하는 범위만 표현하고 오류 코드는 사용자용 설명 뒤의 진단 정보로 노출한다는 정책을 문서화했습니다. + ## [0.2.19-r10] - 2026-09-21 ### 수정 @@ -1306,6 +1927,7 @@ - 최근 활동 계약 테스트에 `status` RPC가 인자 없이 유지되는지, 프론트엔드가 신규 status 인자를 전송하지 않는지, 이전 handler 응답을 안전하게 처리하는지, 생략된 limit이 `NaN`으로 흐르지 않는지 검증을 추가했습니다. - README의 최근 활동 조회 구조를 인자 없는 기존 `status` RPC를 사용하는 현재 동작에 맞게 갱신했습니다. + ## [0.2.19-r9] - 2026-09-21 ### 기능 @@ -1326,6 +1948,7 @@ - 기존 event queue 테스트를 확장해 outbox와 local history가 함께 bounded retention을 적용하고, Cloud ack가 로컬 표시 history를 제거하지 않는지 검증합니다. - README의 활동 이벤트 문서를 공유기 `최근 활동` UI와 Cloud outbox/local history 분리 구조에 맞게 갱신했습니다. + ## [0.2.19-r8] - 2026-09-21 ### 기능 @@ -1348,6 +1971,7 @@ - Health 회귀 테스트에 첫 관측 무이벤트, WAN down 반복 polling 중복 방지, 인터넷 복구 중단 시간, SafeShield `last_success` 기반 갱신 이벤트를 검증하는 실행형 시나리오를 추가했습니다. - 패키지 계약에 event helper/init script 실행 권한과 postinst 강제 enable을 추가하고 README에 이벤트 schema, 현재 source 범위, 휘발성 보관 정책과 향후 Cloud 연결 경계를 문서화했습니다. + ## [0.2.19-r7] - 2026-09-21 ### 개선 @@ -1360,6 +1984,7 @@ - 대시보드와 SafeShield 통계 계약 테스트에 최근 24시간 차단 수만 `text-teal-700` 강조를 사용하고, DNS 요청 및 차단율은 기본 텍스트 색상을 유지하는 회귀 검증을 추가했습니다. - README에 대시보드/SafeShield 차단 수치 강조 정책을 문서화했습니다. + ## [0.2.19-r6] - 2026-09-20 ### 수정 @@ -1371,6 +1996,7 @@ - IPTV/내비게이션 계약 테스트에 접힌 사이드바가 반드시 단일 `β` 문자를 사용하고 `20x20px` 배지와 `13px` 글꼴을 유지하는지 검증하는 회귀 테스트를 추가했습니다. 기존의 `8px` 크기로 다시 작아지는 회귀도 차단합니다. - README의 IPTV Beta 배지 설명을 접힌 사이드바의 단일 `β` 원형 배지 동작에 맞게 갱신했습니다. + ## [0.2.19-r5] - 2026-09-20 ### 수정 @@ -1382,6 +2008,7 @@ - IPTV/내비게이션 계약 테스트에 접힌 사이드바의 Beta 배지가 더 이상 `8px` 단일 문자 스타일을 사용하지 않고, 더 큰 pill 크기를 유지하는지 검증하는 회귀 테스트를 추가했습니다. - README의 IPTV Beta 설명을 접힌 사이드바에서도 읽기 쉬운 Beta 배지를 유지하는 동작에 맞게 갱신했습니다. + ## [0.2.19-r4] - 2026-09-20 ### 개선 @@ -1395,6 +2022,7 @@ - IPTV UI 계약 테스트에 `enabled`와 `provider`를 모두 포함한 dirty-state 판정, amber 경고 아이콘/`저장되지 않음` 표시, 저장된 런타임 기준 안내, SKB/LG U+ 공통 프로파일 설명을 고정하는 회귀 검증을 추가했습니다. - README의 IPTV Beta 설명을 현재 provider/profile UI와 저장되지 않은 설정 경고 동작에 맞게 갱신했습니다. + ## [0.2.19-r3] - 2026-09-20 ### 수정 @@ -1408,6 +2036,7 @@ - 패키지 계약 테스트에 rpcd reconcile helper 사용을 고정하고 ShellSpec 전체 계약에 새 회귀 테스트를 연결했습니다. - README에 패키지 업그레이드 시 rpcd self-heal 정책을 문서화했습니다. + ## [0.2.19-r2] - 2026-09-20 ### 기능 @@ -1428,6 +2057,7 @@ - IPTV RPC/ACL, IGMP Proxy·IGMP snooping 구성, rollback, 서비스 lifecycle, Beta UI, SKB/LG U+ 선택 제한을 검증하는 회귀 테스트를 추가했습니다. - README에 IPTV Beta 기능, 의존성, 적용 방식과 현재 지원 범위를 문서화했습니다. + ## [0.2.19-r1] - 2026-09-20 ### 개선 @@ -1438,6 +2068,7 @@ - 예약 재부팅 기능이 시작되지 않던 버그를 수정하였습니다. + ## [0.2.18-r4] - 2026-09-20 ### 수정 @@ -1450,6 +2081,7 @@ - 패키지 계약 테스트에 `smartsafehub-maintenance enable`이 항상 포함되고 `PKG_UPGRADE` 또는 기존 enabled 상태에 따라 조건부로 생략되지 않는지 검증하는 회귀 테스트를 추가했습니다. - README에 maintenance 서비스의 업그레이드 복구 정책과 postinst 서비스 enable 동작을 문서화했습니다. + ## [0.2.18-r3] - 2026-09-20 ### 개선 @@ -1464,6 +2096,7 @@ - 기존 Wi-Fi, 시스템 시간, 업데이트 UI 계약을 native select 스타일 검사 대신 공통 `CustomSelect` 사용 여부를 검증하도록 갱신했습니다. - README의 선택 컨트롤 설명을 공통 커스텀 드롭다운 동작에 맞게 갱신했습니다. + ## [0.2.18-r2] - 2026-09-20 ### 수정 @@ -1474,6 +2107,7 @@ - 다시 border 관련 문제가 발생하지 않도록 회귀 테스트 코드를 추가하였습니다. + ## [0.2.18-r1] - 2026-09-20 ### 개선 @@ -1485,6 +2119,7 @@ - Updater가 시작되지 않던 버그를 수정하였습니다. + ## [0.2.17-r9] - 2026-09-20 ### 개선 @@ -1498,6 +2133,7 @@ - `tests/test-safeshield-page-contract.sh`에 정적 ULTIMATE/PRO/기타 유료 플랜 surface, glow·shine 제거, 다크 모드 ULTIMATE 규칙 단일 정의를 검증하는 소스 스타일 계약을 추가했습니다. - README의 유료 플랜 표시 설명을 정적인 premium chip 디자인에 맞게 갱신했습니다. + ## [0.2.17-r8] - 2026-09-20 ### 개선 @@ -1511,6 +2147,7 @@ - `tests/test-navigation-contract.sh`에 데스크톱 제품 헤더와 사이드바 브랜드 영역이 정확히 `72px`를 사용하고, 사이드바 토글 기준선도 같은 `72px`에 맞는지 검증하는 회귀 계약을 추가했습니다. - README에 데스크톱 application shell의 공통 `72px` 헤더 규칙과 유지되는 시각적 강조 요소를 문서화했습니다. + ## [0.2.17-r7] - 2026-09-20 ### 안정성 @@ -1523,6 +2160,7 @@ - 패키지 계약 테스트에 `SMARTSAFEHUB_DEV_ROUTER`가 `defineConfig` callback 안에서만 읽히는지, production build base가 기존 `/luci-static/smartsafehub/`로 유지되는지 검증하는 회귀 계약을 추가했습니다. - README에 production build에서는 개발용 router 환경 변수를 읽거나 검증하지 않는다는 점을 명시했습니다. + ## [0.2.17-r6] - 2026-09-20 ### 수정 @@ -1536,6 +2174,7 @@ - 패키지 계약 테스트에 Vite serve/build base 분리, 개발용 stylesheet root 경로, `/cgi-bin` proxy 계약을 추가했습니다. - README의 로컬 개발 접속 주소를 `http://localhost:5173/`로 갱신하고 production base가 유지된다는 점을 명시했습니다. + ## [0.2.17-r5] - 2026-09-20 ### 개발 환경 @@ -1549,6 +2188,7 @@ - 패키지 계약 테스트에 개발용 Shadow DOM stylesheet 경로, `SMARTSAFEHUB_DEV_ROUTER` 기반 proxy, `/cgi-bin` 전달, production base 유지 계약을 추가했습니다. - README에 실제 공유기 API를 사용한 로컬 Vite 개발 방법과 최종 장치 검증이 필요한 범위를 문서화했습니다. + ## [0.2.17-r4] - 2026-09-20 ### 수정 @@ -1562,6 +2202,7 @@ - `tests/test-navigation-contract.sh`에서 라이트/다크 및 hover 상태의 상단 액션 테두리 색상이 Cloud Console 토큰과 일치하는지 검증합니다. - README에 공유기 웹사이트와 Cloud Console의 상단 액션 테두리 색상 통일 정책을 반영했습니다. + ## [0.2.17-r3] - 2026-09-20 ### 개선 @@ -1573,6 +2214,7 @@ - 내비게이션 계약에 본문 최대 폭 유지/대화면 왼쪽 정렬, 헤더 전체 폭 사용, 오른쪽 액션 정렬, Cloud Console형 버튼 크기와 다크 모드 대비가 유지되는지 검증하는 회귀 테스트를 추가했습니다. + ## [0.2.17-r2] - 2026-09-20 ### 수정 @@ -1586,6 +2228,7 @@ - 대시보드와 업데이트 페이지가 동일한 관리 소프트웨어 freshness helper를 사용하는지, 지연 상태에서 초록색 최신 상태를 표시하지 않는지 검증하는 UI 계약을 추가했습니다. - 패키지 post-install hook이 `smartsafehub-updater enable`을 항상 수행하고 자기 업데이트 중 서비스 강제 재시작을 하지 않는지 검증하는 패키지 계약을 추가했습니다. + ## [0.2.17-r1] - 2026-09-19 ### 개선 @@ -1597,12 +2240,14 @@ - SafeShield의 최소 버전을 0.3.24 이상으로 올렸습니다. + ## [0.2.16-r15] - 2026-09-19 ### 수정 - SafeShield의 최소 버전을 0.3.24 이상으로 강제합니다. + ## [0.2.16-r14] - 2026-09-19 ### 개선 @@ -1617,6 +2262,7 @@ - `tests/test-settings-ui-contract.sh`에 백업 카드의 전체 폭 제거, compact 세로 레이아웃, 통합 시스템 도구 카드와 재부팅/고급 도구 접근성 계약을 추가했습니다. - README의 설정 화면 설명을 새 시스템 관리 2열 레이아웃에 맞게 업데이트했습니다. + ## [0.2.16-r13] - 2026-09-19 ### 개선 @@ -1628,6 +2274,7 @@ - `tests/test-update-ui-contract.sh`에 수동 펌웨어 펼침 본문의 컴팩트한 상단 여백 계약을 추가했습니다. - README의 수동 펌웨어 설치 UI 설명에 펼친 상태의 간격 정책을 반영했습니다. + ## [0.2.16-r12] - 2026-09-19 ### 개선 @@ -1639,6 +2286,7 @@ - `tests/test-update-ui-contract.sh`에 수동 펌웨어 안전 안내의 데스크톱 한 줄 표시와 불필요한 `max-w-3xl` 제한 제거 계약을 추가했습니다. - README의 수동 펌웨어 설치 UI 설명에 넓은 화면 한 줄 표시 동작을 반영했습니다. + ## [0.2.16-r11] - 2026-09-19 ### 개선 @@ -1651,6 +2299,7 @@ - `tests/test-update-ui-contract.sh`에 두 업데이트 카드의 간결한 문구와 데스크톱 한 줄 표시 계약을 추가했습니다. - README의 업데이트 UI 설명에 넓은 화면에서 소개 문구를 한 줄로 유지하는 동작을 반영했습니다. + ## [0.2.16-r10] - 2026-09-19 ### 개선 @@ -1665,6 +2314,7 @@ - 자동 업데이트, LAN/DHCP, Wi-Fi의 저장 전 변경 상태·원래 값 복원·저장 버튼 활성 조건·접근 가능한 경고 표시를 검증하는 계약 테스트를 보강했습니다. - README의 LAN/DHCP, Wi-Fi, 업데이트 설명에 저장되지 않은 변경사항 표시 동작을 반영했습니다. + ## [0.2.16-r9] - 2026-09-19 ### 개선 @@ -1678,6 +2328,7 @@ - 예약 재부팅 dirty state와 경고 아이콘/문구가 연결되어 있는지, 접근성 상태와 다크 모드 amber 토큰 계약이 유지되는지 테스트를 보강했습니다. - README에 저장되지 않은 예약 재부팅 변경사항의 표시 동작을 추가했습니다. + ## [0.2.16-r8] - 2026-09-19 ### 개선 @@ -1691,6 +2342,7 @@ - `tests/test-settings-ui-contract.sh`와 `tests/test-scheduled-reboot.sh`에 예약 재부팅이 독립 시스템 관리 카드가 아니라 시간 및 시간대 카드 내부의 접근 가능한 하위 섹션으로 렌더링되는 계약을 추가했습니다. - README에 예약 재부팅 설정의 새 배치와 반응형 동작을 반영했습니다. + ## [0.2.16-r7] - 2026-09-18 ### 기기별 통계 TOP 3 인지성 개선 @@ -1704,6 +2356,7 @@ - `tests/test-statistics-ui-contract.sh`에 TOP 3 배지와 차단 수 기준 안내 계약을 추가했습니다. - README의 기기별 통계 설명에 TOP 3 표시와 선정 기준 안내를 반영했습니다. + ## [0.2.16-r6] - 2026-09-18 ### 기기별 통계 목록 압축 @@ -1717,6 +2370,7 @@ - `tests/test-statistics-ui-contract.sh`에 기본 3개 미리보기, 전체 보기 토글, 접근성 속성, 펼친 상태에서만 페이지네이션을 제공하는 계약을 추가했습니다. - README에 기기별 통계의 미리보기/전체 보기 동작을 반영했습니다. + ## [0.2.16-r5] - 2026-09-18 ### 라이선스 daemon 종료 안정성 @@ -1735,6 +2389,7 @@ - `tests/test-license.sh`에 daemon 장기 sleep 중 SIGTERM 종료, Hub HTTP 진단 상태, activation 결과/오류 보존 계약을 추가했습니다. - README와 아키텍처 문서에 daemon 종료 경계와 새 진단 필드 의미를 반영했습니다. + ## [0.2.16-r4] - 2026-09-18 ### 라이선스 활성화 안정성 @@ -1754,6 +2409,7 @@ - `tests/test-license.sh`에 rpcd 경로에서 SafeShield 동기 호출 금지, detached helper의 device payload 구성, identity 조회 실패 시 fail-closed 동작, 카드 내부 feedback routing과 완화된 polling 계약을 추가했습니다. - README와 아키텍처 문서에 비동기 activation 경계와 라이선스 카드 피드백 동작을 반영했습니다. + ## [0.2.16-r3] - 2026-09-18 ### 테스트 안정성 @@ -1761,6 +2417,7 @@ - `tests/test-license.sh`의 라이선스 mock 상태를 각 시나리오 시작 전에 명시적으로 초기화하도록 변경해 macOS `/bin/sh`를 포함한 셸 구현 차이로 이전 실패 시나리오의 `MOCK_*` 값이 다음 stale-lock 복구 테스트에 영향을 주지 않도록 했습니다. - stale activation lock 복구 시나리오는 `license_get`과 Hub status mock을 정상 상태로 명시한 뒤 lock 제거, 임시 activation request 정리, `/licenses/status` 재개까지 독립적으로 검증합니다. + ## [0.2.16-r2] - 2026-09-18 ### 라이선스 lifecycle 분리 @@ -1781,6 +2438,7 @@ - Hub activate 성공/거부, active/revoked status, `clear_license`, 서버 장애 fail-open, SafeShield 로컬 조회 실패, 미설정 상태와 activate/status 경쟁 조건을 검증하는 `test-license.sh`를 추가했습니다. - RPC/ACL, 패키지 설치 서비스, shell 정적 검증 계약에 새 라이선스 모듈을 포함하고 README 및 아키텍처 문서를 갱신했습니다. + ## [0.2.16-r1] - 2026-09-18 ### 기능 @@ -1794,6 +2452,7 @@ - 대시보드, 펌웨어 페이지의 UI를 개선하였습니다. - 재부팅 후 진단 기능이 준비가 된 이후에 확인하도록 개선하였습니다. + ## [0.2.15-r29] - 2026-09-18 ### Health Reporter 상태 UI 개선 @@ -1808,6 +2467,7 @@ - Health 계약 테스트에 즉시 optimistic 상태 반영, 실패 시 rollback, 짧은 확인 polling, stale `disabled/never` 상태의 `첫 보고 준비 중` 표시와 명확한 켜짐/꺼짐 안내를 검증하는 회귀 계약을 추가했습니다. - README와 아키텍처 문서에 Reporter 토글의 즉시 UI 반영과 첫 보고 확인 흐름을 반영했습니다. + ## [0.2.15-r28] - 2026-09-18 ### Health Reporter 라이선스 인증 수정 @@ -1820,6 +2480,7 @@ - Health 테스트의 `license_get` mock을 실제 SafeShield 중첩 응답과 동일하게 변경하고, 중첩 키가 `X-SafeShield-License-Key` 인증 헤더까지 전달되는 기존 통합 시나리오와 실제 응답 경로 계약을 회귀 검증합니다. - README와 아키텍처 문서에 `license_get` 응답 구조와 Health Reporter 인증 경로를 반영했습니다. + ## [0.2.15-r27] - 2026-09-18 ### 새로고침 경로 유지 @@ -1833,6 +2494,7 @@ - 내비게이션 계약 테스트에 `sessionStorage` 기반 유효 route 저장, Navigation Timing의 reload 판별, History API 복원, 일반 navigation 초기화 계약을 추가했습니다. - README와 아키텍처 문서에 hash route 새로고침 보존 정책을 반영했습니다. + ## [0.2.15-r26] - 2026-09-18 ### 루트 URL 진입 @@ -1847,6 +2509,7 @@ - exact-root rewrite JSON 계약, `index_page` 비변경, 기존 `json_script` 보존, 중복 설치/제거 idempotency, 선택적 uHTTPd reload를 검증하는 `test-root-url-rewrite.sh`를 추가했습니다. - 패키지 설치/제거 hook과 공식 public URL 정규화에 대한 회귀 계약을 보강하고 README/아키텍처 문서를 갱신했습니다. + ## [0.2.15-r25] - 2026-09-17 ### UI 개선 @@ -1867,6 +2530,7 @@ - 테스트용 `jsonfilter` stub이 JSON boolean `false`를 누락하지 않도록 수정해 실제 OpenWrt jsonfilter 동작에 더 가깝게 만들었습니다. - 대시보드 계약 테스트에 정상 `자세히 보기` 문구와 장치 진단 `준비 중` 렌더링 계약을 추가하고 README/아키텍처 문서를 갱신했습니다. + ## [0.2.15-r24] - 2026-09-17 ### 수정 @@ -1877,6 +2541,7 @@ - 대시보드 계약 테스트에 사설 WAN 판별이 undefined-safe octet 변수를 사용하고 직접 배열 인덱스 비교를 다시 도입하지 않는 회귀 검사를 추가했습니다. 프런트엔드 CI의 기존 `npm run build`(`tsc --noEmit` 포함)와 함께 strict TypeScript 타입 오류를 차단합니다. + ## [0.2.15-r23] - 2026-09-17 ### UI 개선 @@ -1890,6 +2555,7 @@ - 대시보드 계약 테스트에 LAN 상태 조회/전달/새로고침, 정상·충돌 Internet 카드 문구, 상위/LAN 네트워크 상세, 사설 WAN 표시와 LAN 설정 이동 계약을 추가했습니다. - README와 아키텍처 문서에 대시보드 Internet/LAN 상태 통합 방식을 반영했습니다. + ## [0.2.15-r22] - 2026-09-17 ### 개선 @@ -1903,6 +2569,7 @@ - LAN 계약 테스트에 4-octet 공유기 주소 입력, 각 octet 3자리 제한, DHCP prefix 잠금, 공유기 주소 변경 시 DHCP 시작/종료 prefix 자동 동기화 계약을 추가했습니다. - README와 아키텍처 문서에 LAN/DHCP 입력 UX와 동일 prefix 유지 원칙을 반영했습니다. + ## [0.2.15-r21] - 2026-09-17 ### 수정 @@ -1919,6 +2586,7 @@ - GitHub Actions에서는 기존 `SMARTSAFEHUB_REQUIRE_UCODE=1` 계약에 의해 이 런타임 호환성 테스트도 ucode 없이 skip할 수 없도록 했습니다. - README와 아키텍처 문서에 OpenWrt 25.12의 LAN list/CIDR 저장 형식과 호환성 테스트를 반영했습니다. + ## [0.2.15-r20] - 2026-09-17 ### 수정 @@ -1937,6 +2605,7 @@ - 정적 검증에 회귀 계약을 추가해 다른 기능별 테스트가 다시 raw `ucode -c`를 추가하지 못하도록 했습니다. - README의 ucode 진단 및 배포 전 검사 절차를 새 CI 컴파일 계약에 맞게 갱신했습니다. + ## [0.2.15-r19] - 2026-09-17 ### 수정 @@ -1952,6 +2621,7 @@ - 프런트엔드가 LAN 전용 ubus 객체를 직접 사용하는지, LAN 객체 자체에 관리자 비밀번호 gate와 최소 ACL이 적용되는지 검증하도록 테스트를 보강했습니다. - README와 아키텍처 문서의 LAN RPC 호출 흐름 및 진단 명령을 실제 구현과 일치하도록 갱신했습니다. + ## [0.2.15-r18] - 2026-09-17 ### 수정 @@ -1965,6 +2635,7 @@ - LAN 구현 모듈이 공개 RPC 진입점에 직접 import되지 않는지, 내부 LAN RPC가 기존 canonical 모듈 경로를 사용하는지, 내부 객체가 브라우저 ACL에 노출되지 않는지 회귀 테스트를 보강했습니다. - LAN RPC 격리 구조와 `ucode -c` 진단 방법을 README 및 아키텍처 문서에 반영했습니다. + ## [0.2.15-r16] - 2026-09-17 ### 기능 @@ -1985,6 +2656,7 @@ - LAN RPC 등록/ACL, UCI 변경·롤백·지연 재적용, WAN/LAN 충돌 거부, 추천 대역 적용, 프런트엔드 route/API/hook/UI 계약을 검증하는 `test-lan-settings.sh`를 추가했습니다. - 내비게이션/RPC/정적 검증 계약을 새 LAN 기능에 맞게 보강하고 README와 아키텍처 문서를 최신화했습니다. + ## [0.2.15-r15] - 2026-09-17 ### 수정 @@ -1996,6 +2668,7 @@ - 대시보드 계약 테스트에 정상/주의/이상 장치 진단 배경과 세부 항목 배경·테두리의 다크 테마 매핑이 유지되는지 확인하는 회귀 검사를 추가했습니다. + ## [0.2.15-r14] - 2026-09-17 ### 수정 @@ -2008,6 +2681,7 @@ - 연결 기기 목록 확인 시각이 오래되어도 `metaWarning`이나 stale 기반 warning 상태를 적용하지 않는 계약을 추가했습니다. - 연결 기기의 최근 확인 시각은 `목록 확인: 상대 시간` 형식으로 계속 표시되는지 검증합니다. + ## [0.2.15-r13] - 2026-09-17 ### UI 개선 @@ -2022,6 +2696,7 @@ - 정상/주의·이상/대기 상태의 장치 진단 요약과 최대 2건의 이상 항목, 설정 페이지 상세 링크가 유지되는지 검증합니다. - 수정한 대시보드 계약 테스트의 설명과 실패 메시지를 가능한 범위에서 한글화했습니다. + ## [0.2.15-r12] - 2026-09-17 ### 수정 @@ -2033,6 +2708,7 @@ - `test-health.sh`에 GNU awk 예약 이름을 다시 `-v load=` 형태로 사용하지 못하도록 회귀 검사를 추가했습니다. - GitHub Actions와 ShellSpec 출력에서 테스트 목적을 바로 확인할 수 있도록 ShellSpec 계약 테스트 이름을 가능한 범위에서 한글 설명으로 통일했고, Health 계약 테스트의 실패/성공 메시지도 한글화했습니다. + ## [0.2.15-r11] - 2026-09-17 ### 수정 @@ -2046,6 +2722,7 @@ - 새 RPC 권한이 아직 반영되지 않은 기존 세션과 실제 만료 세션을 구분하는 런타임 테스트를 보강했습니다. - 패키지 postinst가 LuCI 캐시 정리와 `rpcd reload`를 수행하는 계약 테스트를 추가했습니다. + ## [0.2.15-r10] - 2026-09-17 ### 기능 @@ -2067,6 +2744,7 @@ - 새 Health RPC/ACL, UCI 기본값, procd 서비스, 프런트엔드 API/hook/UI와 패키지 post-install 활성화 계약을 기존 정적/패키지/RPC/UI contract에 추가했습니다. - Health helper가 내부적으로 다른 ubus 객체를 호출하므로 rpcd handler에서 동기 실행하지 않고 detached process로 시작하는 회귀 계약을 추가해 rpcd 이벤트 루프 교착을 방지했습니다. + ## [0.2.15-r9] - 2026-09-17 ### UI 개선 @@ -2080,6 +2758,7 @@ - 설정 페이지가 SmartSafeHub 제품 펌웨어 버전/build ID를 우선 표시하고 OpenWrt fallback 및 runtime kernel을 유지하는지 검증하는 UI contract를 추가했습니다. - 설정 페이지의 전역 새로고침이 펌웨어 상태도 함께 갱신하는지 검증합니다. + ## [0.2.15-r8] - 2026-09-17 ### UI 개선 @@ -2093,6 +2772,7 @@ - Dashboard가 펌웨어 상태 RPC의 커스텀 firmware metadata를 함께 읽고 SmartSafeHub 제품 버전/build ID를 우선 사용하며 OpenWrt fallback과 실제 runtime kernel을 유지하는지 contract를 추가했습니다. - freshness label과 상대 시간이 콜론으로 분리되는 UI 계약을 추가했습니다. + ## [0.2.15-r7] - 2026-09-17 ### UI 개선 @@ -2106,6 +2786,7 @@ - 대시보드에 별도 freshness 섹션이 다시 추가되지 않는지, 세 개의 개요 카드가 상대 시간 메타데이터를 사용하고 stale 상태를 개별 경고하는지 검증하도록 dashboard UI contract를 보강했습니다. - 상대 시간 formatter가 `방금 전`/분/시간/일 단위를 제공하는 계약을 추가했습니다. + ## [0.2.15-r6] - 2026-09-17 ### 개선 @@ -2119,6 +2800,7 @@ - production 소스에 `/tmp/smartsafehub-*` 형태의 최상위 런타임 경로가 다시 추가되지 않는지, 각 helper/init script가 `/tmp/smartsafehub/`를 생성하는지, rpcd/ACL/프런트엔드 업로드 경로가 동일한 디렉터리를 사용하는지 검증하는 runtime path contract를 추가했습니다. - helper를 직접 실행하는 경우에도 지정한 runtime directory가 자동 생성되고 상태 파일이 그 아래에 기록되는지 검증합니다. + ## [0.2.15-r5] - 2026-09-17 ### 개선 @@ -2131,6 +2813,7 @@ - 펌웨어 helper/config/API에 `check_enabled` 의존성이 다시 추가되지 않는지 검증하고, 동시에 관리 소프트웨어의 `check_enabled`가 유지되는지 확인하는 회귀 테스트를 추가했습니다. + ## [0.2.15-r4] - 2026-09-17 ### 수정 @@ -2142,6 +2825,7 @@ - package contract에 runtime post-install hook이 `smartsafehub-firmware enable`을 포함하고, `PKG_UPGRADE`나 기존 enabled 상태에 따라 실행을 건너뛰지 않는지 검증하는 회귀 테스트를 추가했습니다. + ## [0.2.15-r3] - 2026-09-17 ### UI 개선 @@ -2153,6 +2837,7 @@ - 사이드바 토글이 지정된 좌/우 chevron SVG 경로와 동일한 크기를 유지하고, 기존 패널 외곽선 SVG가 다시 사용되지 않는지 검증하는 navigation contract를 추가했습니다. + ## [0.2.15-r2] - 2026-09-17 ### 개선 @@ -2167,6 +2852,7 @@ - 펌웨어와 관리 소프트웨어의 부팅 초기 확인이 두 번째 시도에서 성공하면 즉시 중단되고, 연속 실패 시 정확히 3회에서 멈추는 회귀 테스트를 추가했습니다. - 관리 소프트웨어 확인 실패 후 `last_attempt_at`이 기록되고, 일반 확인 주기가 지나기 전에는 추가 저장소 갱신을 실행하지 않는 회귀 테스트를 추가했습니다. + ## [0.2.15-r1] - 2026-09-15 ### 기능 @@ -2180,6 +2866,7 @@ - 일부 성능이 개선되었습니다. + ## [0.2.14-r16] - 2026-09-15 ### 수정 @@ -2191,6 +2878,7 @@ - 초기 비밀번호 설정 RPC가 `username`/`password`를 전달하고 OpenWrt 25.12에 없는 `oldpassword`/`rpcd` 인자를 다시 추가하지 않는 호환성 회귀 테스트를 추가했습니다. + ## [0.2.14-r15] - 2026-09-15 ### UI 개선 @@ -2202,6 +2890,7 @@ - 초기 설정 제목의 고정 2줄 구조와 보안 안내 문구에서 `root` 계정명이 노출되지 않는 계약을 회귀 테스트에 추가했습니다. + ## [0.2.14-r14] - 2026-09-15 ### 기능 @@ -2221,6 +2910,7 @@ - `/etc/shadow` 기반 상태 확인, 서버/프런트엔드 비밀번호 정책, 이미 설정된 비밀번호 덮어쓰기 방지, LuCI `setPassword` 위임과 결과 재검증, 일반 RPC 보안 게이트, 빈 root 로그인 진입, 설정 완료 후 세션 종료/재로그인 계약을 검증하는 전용 회귀 테스트를 추가했습니다. - 새 RPC/ACL, package executable 목록, shell syntax/JSON validation 및 ShellSpec contract suite에 초기 비밀번호 설정 테스트를 연결했습니다. + ## [0.2.14-r13] - 2026-09-15 ### 기능 @@ -2240,6 +2930,7 @@ - 정상 OpenWrt 백업 검증, 잘못된 gzip/설정 없는 archive 거부, `sysupgrade --restore-backup` 위임, 펌웨어 build ID 재동기화, 복원 후 재부팅, 업데이트/펌웨어 busy 차단, 실패 시 백업 보존과 재부팅 금지를 검증하는 shell 회귀 테스트를 추가했습니다. - backup/restore RPC·ACL, `cgi-backup`/`cgi-upload` 경로, 프런트엔드 업로드→검증→최종 확인 계약과 설정 화면 노출을 기존 contract 테스트에 추가했습니다. + ## [0.2.14-r12] - 2026-09-15 ### 기능 @@ -2256,6 +2947,7 @@ - firmware resolve 응답의 `current_version`/`release.version` 보존, RPC의 현재 릴리즈 버전 매핑, UI의 제품 버전 우선 표시와 `firmware.json`에 release version을 의존하지 않는 계약을 회귀 테스트에 추가했습니다. + ## [0.2.14-r11] - 2026-09-14 ### 수정 @@ -2273,6 +2965,7 @@ - 수동 업로드 검증이 단발성 400ms refresh에 의존하지 않고 `ready`/`error` terminal state까지 추적하는지, stale error grace와 prepared image 확인 후 성공 처리 정책이 유지되는지 update UI contract 테스트를 보강했습니다. + ## [0.2.14-r10] - 2026-09-14 ### 수정 @@ -2288,6 +2981,7 @@ - 수동 펌웨어 업로드가 `luciUrl('/cgi-upload')`를 다시 사용하지 않는지, `/cgi-bin` CGI base를 통해 업로드하는지와 업로드 실패 진단 로그가 유지되는지 update UI contract 테스트를 보강했습니다. + ## [0.2.14-r9] - 2026-09-14 ### 기능 @@ -2308,6 +3002,7 @@ - 예약 재부팅 비활성화 기본값, due schedule 실행, 동일 minute 중복 실행 방지, 최근 부팅 보호, 관리 소프트웨어/펌웨어 작업 중 연기, 연기 후 재시도, 2시간 timeout, UCI 입력 검증을 mock 기반 shell 테스트로 추가했습니다. - scheduled reboot RPC/ACL, frontend hook/API, 시스템 관리 UI, maintenance init/helper 실행 권한과 시간대 변경 연동을 기존 contract 테스트에 추가했습니다. + ## [0.2.14-r8] - 2026-09-14 ### 기능 @@ -2325,6 +3020,7 @@ - `system_time_sync` RPC/ACL, NTP 비활성화 차단, `sysntpd restart`, 동기화 후 장치 시간 재조회와 UI 동작을 검증하도록 시스템 시간 contract를 확장했습니다. - 공통 select 스타일이 native appearance를 제거하고 일관된 우측 inset 화살표와 padding을 유지하는지 네트워크/시간 설정 contract에 회귀 검증을 추가했습니다. + ## [0.2.14-r7] - 2026-09-14 ### 기능 @@ -2345,6 +3041,7 @@ - 시간대 목록 조회, 지원하지 않는 시간대 차단, `zonename`/`timezone` 동시 저장, 시스템 reload, 실패 시 rollback, 자동 업데이트 일정 marker 초기화와 updater 재시작을 검증하는 전용 contract 테스트를 추가했습니다. - 설정 페이지에서 중복 업데이트 진입점이 제거되고 시간대/진단/재부팅/고급 설정 영역이 유지되는지 검증하도록 UI contract와 RPC/ACL 검증을 보강했습니다. + ## [0.2.14-r6] - 2026-09-14 ### 개선 @@ -2357,6 +3054,7 @@ - 수동 펌웨어 입력이 시각적으로 숨겨진 실제 file input과 별도의 SmartSafeHub 파일 선택 컨트롤을 사용하는지, 한국어 파일 선택 상태와 업로드 검증 동작이 유지되는지 UI contract 테스트를 추가했습니다. + ## [0.2.14-r5] - 2026-09-14 ### 개선 @@ -2371,6 +3069,7 @@ - 관리 소프트웨어가 하나의 카드로 렌더링되는지, 현재 상태와 자동 업데이트 설정이 그 카드 내부에 함께 존재하는지, 이전 범위 경고와 `SmartSafeHub 자동 업데이트` 명칭이 다시 노출되지 않는지 contract 테스트를 보강했습니다. - 펌웨어와 관리 소프트웨어의 고객용 제목 및 업데이트 페이지 설명 용어를 회귀 검증하도록 관련 UI contract를 갱신했습니다. + ## [0.2.14-r4] - 2026-09-14 ### 개선 @@ -2384,6 +3083,7 @@ - 수동 펌웨어 설치가 펌웨어 카드 내부의 inset subsection으로 유지되는지, SmartSafeHub 자동 업데이트 범위 문구가 존재하는지, 최신/미확인 상태 안내가 SmartSafeHub 업데이트 카드 밖으로 분리되지 않는지 contract 테스트를 보강했습니다. + ## [0.2.14-r3] - 2026-09-14 ### 개선 @@ -2403,6 +3103,7 @@ - 펌웨어 카드가 소프트웨어 카드보다 먼저 렌더링되는지, 수동 펌웨어 설치가 같은 카드 내부의 접이식 영역인지, 넓은 화면에서 소프트웨어 상태와 자동 업데이트 설정이 2열로 구성되는지 contract 테스트를 추가했습니다. - 고객용 펌웨어 제목에 `OpenWrt 펌웨어` 표현이 다시 노출되지 않고, build ID 누락 시 기술 상세가 disclosure 안에 유지되는지 회귀 검증을 추가했습니다. + ## [0.2.14-r2] - 2026-09-13 ### 기능 @@ -2424,6 +3125,7 @@ - Hub resolve 요청, 온라인 다운로드 무결성 검증, OpenWrt 이미지 검증, 수동 업로드, 준비 파일 정리와 강제 업그레이드 금지 동작을 mock 기반 shell 테스트로 추가했습니다. - firmware RPC/ACL, 패키지 의존성, 업데이트 UI, 재부팅 후 reconnect/reload 안전성, Stable/Beta 자동 설치 기본값을 contract 테스트에 추가했습니다. + ## [0.2.14-r1] - 2026-09-13 ### 개선 @@ -2435,6 +3137,7 @@ - 업그레이드 시에 잘못된 로직을 수정하였습니다. + ## [0.2.13-r8] - 2026-09-13 ### 개선 @@ -2447,6 +3150,7 @@ - SafeShield 페이지와 체크인된 `app.js`/`app.css`에서 유료 플랜의 `멤버십 활성` 문구와 관련 status-caption 스타일이 다시 노출되지 않는지 회귀 검증을 추가했습니다. + ## [0.2.13-r7] - 2026-09-13 ### 개선 @@ -2460,6 +3164,7 @@ - SafeShield 페이지 계약 테스트에 refined 라이선스 summary/editor 클래스와 정적 자산 반영 여부를 추가하고, `unlicensed`/`active` 같은 raw 상태 텍스트가 다시 노출되지 않도록 회귀 검증을 강화했습니다. + ## [0.2.13-r6] - 2026-09-12 ### 개선 @@ -2472,6 +3177,7 @@ - SafeShield 페이지 계약 테스트에 premium badge의 high-contrast 색상, ULTIMATE shine keyframe, tier별 활성 caption 및 reduced-motion 대응이 소스와 체크인된 CSS에 유지되는지 검증을 추가했습니다. + ## [0.2.13-r5] - 2026-09-12 ### 수정 @@ -2485,6 +3191,7 @@ - SmartSafeHub와 SafeShield가 각각 로컬 APK identity pin 상태여도 `apk add --upgrade --latest`를 호출하지 않고 world 항목만 정규화한 뒤 target-only 업그레이드가 수행되는지 검증합니다. - unrelated package의 버전 constraint와 identity pin이 그대로 보존되는지, updater 소스에 광범위한 `--latest`/`--available` 업그레이드 경로가 다시 추가되지 않는지 회귀 테스트를 강화했습니다. + ## [0.2.13-r4] - 2026-09-12 ### 개선 @@ -2498,6 +3205,7 @@ - SafeShield UI 계약 테스트에 전용 플랜 컴포넌트, FREE 전용 CTA 조건, pricing URL, 안전한 새 탭 링크 속성, 체크인된 `app.js`/`app.css` 멤버십 UI 포함 여부를 추가했습니다. + ## [0.2.13-r3] - 2026-09-12 ### 수정 @@ -2511,6 +3219,7 @@ - SafeShield UI 계약 테스트에 상태/통계 timer 독립성, 성공 메시지 자동 닫기, 오류 지속 정책, README 최소 버전 일치 여부를 추가했습니다. + ## [0.2.13-r2] - 2026-09-12 ### 수정 @@ -2522,6 +3231,7 @@ - SafeShield UI 계약 테스트에서 수동 갱신의 일시적인 시작/진행 안내 문구가 소스와 배포 `app.js`에 다시 포함되지 않는지 검증합니다. + ## [0.2.13-r1] - 2026-09-10 ### 개선 @@ -2530,6 +3240,7 @@ - 로그인 세션이 만료 되었을때, 사용자에게 안내를 하고 로그인 페이지로 이동하도록 하였습니다. - 일부 UI에 대한 시인성을 개선하였습니다. + ## [0.2.12-r13] - 2026-09-10 ### 개선 @@ -2542,6 +3253,7 @@ - SafeShield 페이지 계약 테스트를 보강해 외곽 진행 띠 마크업, 회전 애니메이션 스타일, reduced-motion 대응이 체크인된 소스와 `app.css`에 모두 존재하는지 검증합니다. + ## [0.2.12-r12] - 2026-09-10 ### 수정 @@ -2554,6 +3266,7 @@ - SafeShield가 identity pin된 상태에서 최신 SmartSafeHub가 더 새로운 SafeShield를 요구하는 실제 실패 조건을 회귀 테스트로 추가했습니다. pin이 제거되고 SafeShield 의존성이 갱신된 뒤 SmartSafeHub 설치가 완료되는지 검증합니다. - SafeShield identity pin 해제가 실패하면 `UPDATES_INSTALL_FAILED`로 남고 SmartSafeHub 설치를 진행하지 않는지, 다른 패키지의 world constraint 및 identity pin은 변경되지 않는지 검증합니다. + ## [0.2.12-r11] - 2026-09-10 ### 테스트 @@ -2565,6 +3278,7 @@ - LuCI session endpoint의 401/403, `X-LuCI-Login-Required`, plain `Access denied`, HTML 로그인 응답, redirect, 올바른 session ID, HTTP 500 및 잘못된 payload를 각각 실행해 인증/만료/통신 오류가 혼동되지 않도록 검증합니다. 같은 세션에서 동시에 여러 RPC가 실패해도 session-expired 이벤트가 한 번만 발생하고, 새 로그인 lifecycle에서는 다시 정상적으로 발생할 수 있는지도 실제 `sessionEvents.ts` 모듈로 검증합니다. - ShellSpec 계약에 reload/session 안전 회귀 테스트를 추가하고, 정적 검증 및 패키지 계약에서 새 테스트 실행 파일의 존재와 실행 권한도 확인하도록 보강했습니다. + ## [0.2.12-r10] - 2026-09-10 ### 개선 @@ -2576,6 +3290,7 @@ - 상단 상태 배지가 유지되고 하단 요약에는 중복 보호 상태 대신 SafeShield 버전이 표시되며, 설명 영역에 중복 버전 텍스트가 남지 않는지 UI contract를 보강했습니다. + ## [0.2.12-r9] - 2026-09-10 ### 수정 @@ -2587,6 +3302,7 @@ - 초기 `data=null`이 self-update reload 기준값으로 사용되지 않는지, 첫 실제 update state는 기준값만 설정하는지, 이후 새로운 `lastInstallAt` 변화에만 자동 새로고침 조건이 열리는지 update UI contract를 보강했습니다. + ## [0.2.12-r8] - 2026-09-10 ### 수정 @@ -2600,6 +3316,7 @@ - RPC `Access denied`가 추가 session probe 없이 즉시 `SESSION_EXPIRED`로 전환되는지 contract를 보강했습니다. - 초기 로드의 단순 asset/version mismatch는 reload하지 않고, 새 `lastInstallAt`을 관찰한 updater 완료 시점에만 한 번 reload하는 contract를 추가했습니다. + ## [0.2.12-r7] - 2026-09-10 ### 수정 @@ -2613,6 +3330,7 @@ - Access denied 처리 시 probe된 session ID와 bootstrap session ID를 정확히 비교하는지, 동시 probe deduplication과 stale-session race guard가 유지되는지 로그인 UI contract를 보강했습니다. + ## [0.2.12-r6] - 2026-09-10 ### 수정 @@ -2625,6 +3343,7 @@ - 6단계 갱신 stage 매핑, 사용자용 진행 도넛, 내부 stage 비노출, 갱신 중 보호 상태 분리, 오류 코드의 사용자용 설명 contract를 추가했습니다. + ## [0.2.12-r5] - 2026-09-10 ### 수정 @@ -2636,6 +3355,7 @@ - 모바일 `button` 최소 높이 규칙보다 switch 전용 geometry selector가 우선하도록 CSS contract를 보강하고, track/thumb에 최대 크기 제한까지 존재하는지 검증합니다. + ## [0.2.12-r4] - 2026-09-10 ### 수정 @@ -2649,6 +3369,7 @@ - RPC 접근 거부 시 세션을 재확인한 뒤에만 만료 이벤트를 발생시키는지, 로그인 화면 전환 및 toast 표시가 연결되는지 UI contract를 추가했습니다. - 업데이트 polling이 더 이상 `Access denied`를 별도로 reload하지 않고 전역 세션 만료 처리에 맡기는지 검증합니다. + ## [0.2.12-r3] - 2026-09-09 ### 수정 @@ -2660,6 +3381,7 @@ - SafeShield 통계 및 업데이트 설정 토글이 공용 고정 geometry와 theme-safe thumb 스타일을 사용하는지 UI contract를 추가했습니다. + ## [0.2.12-r2] - 2026-09-09 ### 수정 @@ -2671,6 +3393,7 @@ - 기기별 통계가 10개 단위로 분할되고 이전/다음 페이지 컨트롤을 제공하는 UI contract를 추가했습니다. + ## [0.2.12-r1] - 2026-09-09 ### 수정 @@ -2678,6 +3401,7 @@ - 업데이트 기능을 개선하였습니다. - 성능 개선이 포함되었습니다. + ## [0.2.11-r3] - 2026-09-09 ### 추가 @@ -2690,6 +3414,7 @@ - `updates_status`가 SmartSafeHub 저장소 파일에서 업데이트 채널을 읽어 반환하는 contract를 추가했습니다. - 업데이트 화면이 `Stable`/`Beta` 채널을 표시하면서 저장소 hostname 같은 내부 구현 정보는 노출하지 않는지 UI contract로 검증합니다. + ## [0.2.11-r2] - 2026-09-08 ### 수정 @@ -2703,18 +3428,21 @@ - self-update 완료 경로가 `rpcd restart`를 사용하지 않고 `rpcd reload`만 예약하는지 검증합니다. - 업데이트 설치 중 `Access denied`가 발생하면 페이지 reload 복구 경로가 존재하고, 설치 완료 후 package/asset version 불일치에서도 새 frontend asset을 위한 reload가 수행되는지 UI contract로 검증합니다. + ## [0.2.11-r1] - 2026-09-08 ### 수정 - SafeShield의 최소 버전을 0.3.20 이상으로 설정하였습니다. + ## [0.2.10-r5] - 2026-09-08 ### 수정 - 내부에서 사용하는 패키지를 업데이트 하였습니다. + ## [0.2.10-r4] - 2026-09-08 ### 수정 @@ -2730,6 +3458,7 @@ - 로컬 APK identity pin이 있는 경우 SmartSafeHub 하나에 대해서만 `apk add --upgrade --latest`를 사용해 pin을 제거하고 목표 버전으로 올라가는지 검증합니다. - updater가 `apk upgrade --available`을 사용하지 않는 contract를 추가해 다른 OpenWrt 패키지의 광범위한 업그레이드가 다시 도입되지 않도록 방지합니다. + ## [0.2.10-r3] - 2026-09-08 ### 수정 @@ -2741,6 +3470,7 @@ - 업데이트 확인 단계가 1초 polling을 사용하고 설치 단계의 3초 polling 및 idle 상태의 5분 polling과 구분되는지 UI contract에서 검증합니다. + ## [0.2.10-r2] - 2026-09-08 ### 수정 @@ -2758,6 +3488,7 @@ - updater가 자동 설치 성공 시에만 날짜 marker를 기록하고 실패 재시도에는 15분 cooldown marker를 사용하는 contract를 검증합니다. - 자동 설치 최대 시도 횟수(`3`), 15분 retry cooldown, lock 경합 제외, 성공 시 retry marker 정리, 날짜 변경 시 retry count 초기화 contract를 검증합니다. + ## [0.2.10-r1] - 2026-09-07 ### 변경 @@ -2765,6 +3496,7 @@ - 새로고침 아이콘을 개선하고 전체적으로 통일성 있게 적용하였습니다. - 업데이트를 확인하는 로직을 수정하였습니다. + ## [0.2.9-r9] - 2026-09-07 ### 수정 @@ -2779,6 +3511,7 @@ - 마지막 업데이트 확인 이후 로컬 패키지 버전이 변경된 상태에서 APK 인덱스 갱신이 실패해도 `INSTALLED`가 실제 로컬 버전으로 갱신되고 이전 릴리즈 노트 캐시는 제거되는지 검증합니다. - 새로고침/로딩 상태가 공통 `ReloadIcon`을 사용하고 기존 `LoaderIcon`/`RefreshIcon` 변형이 다시 섞이지 않는지 UI contract에서 검증합니다. + ## [0.2.9-r8] - 2026-09-07 ### 수정 @@ -2791,6 +3524,7 @@ - APK 인덱스 갱신 실패 경로에서도 기존 package state로 beta/stable 릴리즈 노트를 다시 생성할 수 있는지 검증합니다. - 릴리즈 노트 서버의 일시적인 장애에서는 같은 버전 범위의 정상 캐시가 유지되고, 버전 범위가 달라진 캐시는 제거되는지 검증합니다. + ## [0.2.9-r7] - 2026-09-07 ### 개선 @@ -2803,6 +3537,7 @@ - 설치 중 spinner/indeterminate progress, 자동 갱신 안내, repository 오류 요약/상세 정보 분리와 기존 수동 새로고침 문구 제거를 update UI contract에서 검증합니다. + ## [0.2.9-r6] - 2026-09-07 ### 수정 @@ -2814,6 +3549,7 @@ - 첫 업데이트 확인 전에는 최신 상태 success UI가 표시되지 않고 `AVAILABLE` 값이 `미확인`으로 유지되는 contract를 추가했습니다. + ## [0.2.9-r5] - 2026-09-07 ### 수정 @@ -2825,6 +3561,7 @@ - 대시보드 contract에서 메모리 progress bar가 메모리 카드 내부에 존재하고 별도의 `메모리 사용률` 블록이 다시 추가되지 않는지 검증합니다. + ## [0.2.9-r4] - 2026-09-07 ### 수정 @@ -2836,6 +3573,7 @@ - 별도의 repository 파일에 stable URL이 먼저 존재하고 `smartsafehub.list`는 beta를 가리키는 전환 시나리오에서 beta 릴리즈 노트 경로만 사용하는 회귀 테스트를 추가했습니다. + ## [0.2.9-r3] - 2026-09-06 ### 변경 @@ -2848,6 +3586,7 @@ - 업데이트 polling 주기, 설치 단계 전용 3초 polling, visibility/focus 갱신과 이벤트 listener cleanup을 update UI contract에서 검증합니다. + ## [0.2.9-r2] - 2026-09-06 ### 테스트 @@ -2857,6 +3596,7 @@ - 기존 package, navigation, document, login, dashboard, network input, update, settings, ucode import, RPC, rules, SafeShield, statistics, updater contract를 개별 ShellSpec example로 유지합니다. - GitHub Actions에서는 ShellSpec 0.28.1을 고정 설치해 테스트 프레임워크 업데이트에 따른 비결정적 실패를 방지합니다. + ## [0.2.9-r1] - 2026-09-03 ### 변경 @@ -2864,6 +3604,7 @@ - 전체 레이아웃 구조를 변경하여 사용성과 메뉴 접근성을 향상시켰습니다. - 다크 모드에 대한 지원을 추가하였습니다. + ## [0.2.8-r16] - 2026-09-03 ### 변경 @@ -2877,6 +3618,7 @@ - 업데이트/설정 route 분리, 메뉴 순서, 시스템 상태/관리 이동, 사이드바의 독립 고급 설정 링크 제거와 설정 화면 내부 LuCI fallback을 검증하는 UI contract를 보강했습니다. + ## [0.2.8-r15] - 2026-09-03 ### 변경 @@ -2889,6 +3631,7 @@ - 데스크톱/모바일 새로고침 버튼의 위치, 아이콘 전용 표현, loading/refreshing 비활성화와 회전 상태를 navigation contract에서 검증합니다. + ## [0.2.8-r14] - 2026-09-03 ### 변경 @@ -2901,6 +3644,7 @@ - 데스크톱 헤더와 모바일 상단 내비게이션의 테마 토글 위치, 사이드바/모바일 drawer 내부의 중복 테마 액션 제거를 navigation contract에서 검증합니다. + ## [0.2.8-r13] - 2026-09-03 ### 변경 @@ -2915,6 +3659,7 @@ - 사용자 이름/비밀번호 필드, autocomplete, form submit, 비밀번호 표시 토글, 공통 theme 저장/복원, 로그인 Dark Mode와 form-control 스타일을 검증하는 로그인 UI contract 테스트를 추가했습니다. + ## [0.2.8-r12] - 2026-09-03 ### 추가 @@ -2931,6 +3676,7 @@ - Dashboard 차트 재사용, SafeShield statistics one-shot 조회, 통합 새로고침과 polling 비활성화 계약을 검증하도록 Dashboard UI contract 테스트를 보강했습니다. + ## [0.2.8-r11] - 2026-09-03 ### 변경 @@ -2945,6 +3691,7 @@ - Dashboard의 SafeShield/연결 기기/업데이트 요약, 일회성 기기 조회와 통합 새로고침 동작을 검증하는 UI contract 테스트를 추가했습니다. + ## [0.2.8-r10] - 2026-09-03 ### 추가 @@ -2962,6 +3709,7 @@ - LoadingPanel의 compact layout과 필수 document metadata 및 theme-color 동기화를 contract 테스트로 검증합니다. + ## [0.2.8-r9] - 2026-09-03 ### 변경 @@ -2976,6 +3724,7 @@ - 업데이트 요약 카드, 명확한 update action, form control, switch와 페이지 정보 계층을 검증하는 UI contract 테스트를 추가했습니다. + ## [0.2.8-r8] - 2026-09-03 ### 수정 @@ -2987,6 +3736,7 @@ - 허용/차단 목록 검색창의 돋보기 아이콘을 transform 기반 위치 계산 대신 고정 폭 flex 래퍼로 수직 중앙 정렬해 LuCI 환경에서 아이콘이 비뚤어져 보이던 문제를 수정했습니다. - 검색 입력 필드도 새 도메인 입력과 동일한 제품형 input surface로 통일했습니다. + ## [0.2.8-r7] - 2026-09-02 ### 변경 @@ -3001,6 +3751,7 @@ - SafeShield 제품형 페이지 계층과 최근 24시간 통계 표시 계약, 사이드바 경계 토글의 위치와 저강도 기본 스타일을 검증합니다. + ## [0.2.8-r6] - 2026-09-02 ### 수정 @@ -3008,6 +3759,7 @@ - 데스크톱 사이드바 접기/펼치기 버튼을 화면 중앙에서 브랜드 헤더 하단과 사이드바 오른쪽 경계선이 만나는 위치로 이동했습니다. - 토글 버튼에 SmartSafeHub 포인트 컬러 배경과 흰색 아이콘, 강조 shadow를 적용해 라이트/다크 모드 모두에서 더 쉽게 식별할 수 있도록 개선했습니다. + ## [0.2.8-r5] - 2026-09-02 ### 수정 @@ -3015,6 +3767,7 @@ - 데스크톱 사이드바 접기/펼치기 버튼을 확장/축소 상태와 관계없이 오른쪽 경계선 중앙에 걸쳐 표시하도록 변경했습니다. - 경계형 토글을 원형 버튼으로 통일해 사이드바 너비 전환 동작을 더 명확하게 표시합니다. + ## [0.2.8-r4] - 2026-09-02 ### 추가 @@ -3025,6 +3778,7 @@ - 저장된 테마가 없으면 브라우저의 `prefers-color-scheme` 설정을 초기값으로 사용합니다. - 모바일 메뉴에도 동일한 테마 전환 기능을 제공합니다. + ## [0.2.8-r3] - 2026-09-02 ### 추가 @@ -3035,6 +3789,7 @@ - 사용자가 선택한 사이드바 상태를 브라우저 `localStorage`에 저장해 페이지 이동과 다음 접속에서도 유지합니다. - 모바일 navigation drawer는 기존 동작을 그대로 유지합니다. + ## [0.2.8-r2] - 2026-09-02 ### 수정 @@ -3043,6 +3798,7 @@ - ProductNavigation이 콘텐츠 `
` 내부에서 전체 너비를 차지해 Dashboard가 아래로 밀리던 레이아웃 회귀를 수정했습니다. - 헤더와 Dashboard를 우측 workspace에 함께 배치해 사이드바가 화면 왼쪽에 고정되는 구조를 복원했습니다. + ## [0.2.8-r1] - 2026-09-02 ### 변경 @@ -3054,10 +3810,12 @@ - Dashboard를 KPI 중심 System overview, System health, Device details 구조로 재설계했습니다. - 기존 상태/업데이트 RPC 계약은 변경하지 않고 현재 로드되는 데이터만 재구성해 저사양 장비의 추가 호출을 만들지 않습니다. + ## [0.2.7-r1] - 2026-09-02 safeshield의 최소 버전을 0.3.19 이상으로 설정하였습니다. + ## [0.2.6-r3] - 2026-08-30 ### 변경 @@ -3065,14 +3823,17 @@ safeshield의 최소 버전을 0.3.19 이상으로 설정하였습니다. - backend CI에서 개별적으로 실행하던 shell syntax, JSON, package/RPC/ucode/statistics/updater 검증을 `tests/run.sh` 하나로 통합했습니다. - 로컬에서도 `./tests/run.sh`로 GitHub Actions backend job과 동일한 테스트 흐름을 실행할 수 있습니다. + ## [0.2.6-r2] - 2026-08-30 safeshield의 최소 버전을 0.3.17 이상으로 설정하였습니다. + ## [0.2.6-r1] - 2026-08-30 safeshield의 최소 버전을 0.3.15 이상으로 설정하였습니다. + ## [0.2.5-r5] - 2026-08-30 ### 변경 @@ -3087,6 +3848,7 @@ safeshield의 최소 버전을 0.3.15 이상으로 설정하였습니다. - statistics reconciliation 응답, spinner/wait cursor, 목표 상태 표시와 statistics-only 후속 polling 계약을 테스트합니다. + ## [0.2.5-r4] - 2026-08-29 ### 추가 @@ -3102,6 +3864,7 @@ safeshield의 최소 버전을 0.3.15 이상으로 설정하였습니다. - 통계 토글의 ACL, RPC payload, collector 상태 정규화와 접근성 switch 계약을 테스트에 추가합니다. + ## [0.2.5-r3] - 2026-08-29 ### 추가 @@ -3118,6 +3881,7 @@ safeshield의 최소 버전을 0.3.15 이상으로 설정하였습니다. - 통계 RPC의 `devices`, `device_limit`, `devices_truncated` 정규화와 기기별 통계 UI 연결을 계약 테스트에 추가합니다. + ## [0.2.5-r2] - 2026-08-29 ### 변경 @@ -3128,6 +3892,7 @@ safeshield의 최소 버전을 0.3.15 이상으로 설정하였습니다. - 운영체제의 `prefers-reduced-motion` 설정을 존중하여 모션 감소 사용자는 차트 애니메이션을 사용하지 않습니다. - 기존 24시간 범위, 3시간 간격 시간 라벨과 차단/DNS 요청 tooltip 정보를 유지하면서 Y축 눈금을 추가했습니다. + ## [0.2.5-r1] - 2026-08-29 ### 추가 @@ -3142,10 +3907,12 @@ safeshield의 최소 버전을 0.3.15 이상으로 설정하였습니다. - 통계 collector lifecycle 수정이 포함된 SafeShield `0.3.14-r2` 이상을 최소 의존성으로 요구합니다. - APK dependency 문법에 맞게 `EXTRA_DEPENDS`의 버전 조건에서 연산자 뒤 공백을 제거합니다. + ## [0.2.4-r2] - 2026-08-30 빌드 오류를 수정하였습니다. + ## [0.2.4-r1] - 2026-08-28 safeshield의 성능 개선 버전인 0.3.13 버전을 기본 버전으로 설정하였습니다. @@ -3154,6 +3921,7 @@ safeshield의 성능 개선 버전인 0.3.13 버전을 기본 버전으로 설 - safeshield의 최소 버전을 0.3.13로 올렸습니다. + ## [0.2.3-r2] - 2026-08-28 설치된 SmartSafeHub가 여러 릴리즈를 건너뛰어 업데이트될 때 그 사이의 릴리즈 노트를 함께 확인할 수 있도록 누적 릴리즈 노트 표시를 추가했습니다. @@ -3176,6 +3944,7 @@ safeshield의 성능 개선 버전인 0.3.13 버전을 기본 버전으로 설 - mock release index를 기준으로 `0.2.1-r1`에서 최신 버전으로 업데이트할 때 중간 릴리즈 노트를 모두 선택하는지 검증합니다. - 릴리즈 메타데이터 전체 다운로드 실패가 업데이트 확인과 설치를 막지 않는 기존 fail-open 계약을 유지합니다. + ## [0.2.3-r1] - 2026-08-28 SmartSafeHub 업데이트 화면에서 새 버전의 릴리즈 노트를 함께 확인할 수 있도록 저장소 릴리즈 메타데이터 연동을 추가했습니다. @@ -3200,6 +3969,7 @@ SmartSafeHub 업데이트 화면에서 새 버전의 릴리즈 노트를 함께 - 릴리즈 노트 다운로드 실패가 업데이트 확인 실패로 전파되지 않는 fail-open 동작을 검증합니다. - 설치 완료 후 이전 릴리즈 노트 cache가 제거되는지 검증합니다. + ## [0.2.2-r1] - 2026-08-28 GitHub Actions CI에서 SmartSafeHub 패키지 계약과 배포 산출물 회귀를 더 일찍 감지하도록 자동 검증 범위를 확장했습니다. @@ -3218,6 +3988,7 @@ GitHub Actions CI에서 SmartSafeHub 패키지 계약과 배포 산출물 회귀 - `npm run build`가 이미 TypeScript typecheck를 포함하므로 중복된 별도 typecheck step을 제거했습니다. - Vite production output에 `app.js`와 `app.css`가 존재하고 배포용 `index.html`이 생성되지 않는 계약을 검증합니다. + ## [0.2.1-r1] - 2026-08-28 `luci-app-smartsafehub` 업데이트를 감지하고, 사용자가 선택한 경우 공유기에서 예약 자동 설치할 수 있는 SmartSafeHub 업데이트 관리 기능을 추가했습니다. @@ -3242,6 +4013,7 @@ GitHub Actions CI에서 SmartSafeHub 패키지 계약과 배포 산출물 회귀 - 자동 설치는 기본적으로 꺼져 있으며 기본 예약 시각은 `03:00`, 자동 확인 기본 주기는 6시간입니다. - OpenWrt 펌웨어 업그레이드는 기존 LuCI 펌웨어 관리 화면에 계속 위임합니다. + ## [0.2.0-r1] - 2026-08-21 SmartSafeHub 전용 사용자 화면과 rpcd 백엔드를 처음 정식 배포하는 릴리스입니다. `0.2.0` 개발 과정에서 사용한 중간 package revision은 정식 배포 기준점인 `r1`으로 squash했습니다. diff --git a/luci-app-smartsafehub/Makefile b/luci-app-smartsafehub/Makefile index 138cb6abc..e0714d3cf 100644 --- a/luci-app-smartsafehub/Makefile +++ b/luci-app-smartsafehub/Makefile @@ -6,8 +6,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-smartsafehub -PKG_VERSION:=0.2.30 -PKG_RELEASE:=10 +PKG_VERSION:=0.2.31 +PKG_RELEASE:=11 PKG_MAINTAINER:=Beomjun Kang PKG_LICENSE:=GPL-3.0-or-later @@ -46,6 +46,8 @@ define Package/luci-app-smartsafehub/postinst #!/bin/sh if [ -z "$${IPKG_INSTROOT}" ]; then mkdir -p /tmp/smartsafehub + # Drop the temporary diagnostic created by older Apps size queries. + rm -f /tmp/smartsafehub/apps-size-diagnostics.tsv uci -q delete smartsafehub.firmware.check_enabled >/dev/null 2>&1 || true uci -q commit smartsafehub >/dev/null 2>&1 || true if [ -x /etc/init.d/smartsafehub-events ]; then diff --git a/luci-app-smartsafehub/README.md b/luci-app-smartsafehub/README.md index 84c785c40..b984aa0ad 100644 --- a/luci-app-smartsafehub/README.md +++ b/luci-app-smartsafehub/README.md @@ -7,6 +7,8 @@ SmartSafeHub는 OpenWrt 공유기를 위한 통합 홈 게이트웨이 관리 UI입니다. 네트워크, Wi-Fi, 연결 기기, SafeShield 보안, 업데이트와 시스템 상태를 하나의 사용자 친화적인 인터페이스에서 관리할 수 있습니다. +**[SmartSafeHub 공유기 체험하기](https://www.smartsafehub.com/router-demo/)** + diff --git a/luci-app-smartsafehub/docs/APPS.md b/luci-app-smartsafehub/docs/APPS.md new file mode 100644 index 000000000..b9346357a --- /dev/null +++ b/luci-app-smartsafehub/docs/APPS.md @@ -0,0 +1,105 @@ +# SmartSafeHub Apps — 공유기 웹사이트 + +## 메뉴 및 아키텍처 + +- `System` 영역: `SmartSafeHub 계정 → Apps → 업데이트 → 설정` / 해시 URL `#apps`. +- 앱 목록: `smartsafehub.apps_catalog` RPC → `/usr/libexec/smartsafehub-apps` → Hub 승인 카탈로그. +- 설치 상태: `smartsafehub.apps_status` RPC → 독립된 `smartsafehub-apps-manager`의 로컬 APK 상태와 설치 기록. +- 앱 설치 저장 공간과 설치된 APK의 용량은 별도 `smartsafehub.apps_metrics` 읽기 RPC로 조회합니다. LuCI ACL의 `read.ubus.smartsafehub`에도 `apps_metrics`가 있어야 합니다. 실패하더라도 설치·제거 상태에는 영향을 주지 않습니다. +- 설치된 버전은 `apk list -I`에서 조회한 대표 승인 APK의 실제 설치 버전입니다. Wake-on-LAN은 백엔드 `etherwake`가 아닌 `luci-app-wol` 버전을 표시합니다. 카탈로그의 `version`은 현재 **제공/승인된 앱 버전**이므로 둘을 구분해 표시합니다. 복수 APK 앱은 대표 패키지 버전이 앱 릴리스 버전과 다를 수 있습니다. +- 설치·업데이트·제거: `smartsafehub.apps_install`, `smartsafehub.apps_update`, `smartsafehub.apps_remove` RPC. 앱 ID만 받으며, 실제 작업은 root 전용 백그라운드 매니저에서 진행합니다. 다른 앱 작업이 진행 중이면 거절합니다. +- Phase 2의 IoT/로컬 AI 설치기는 추후 `runtime`에 따라 별도 어댑터로 추가합니다. 현재는 `router + apk`만 가능하며 Hub의 패키지명·URL·명령을 브라우저가 보낼 수 없습니다. + +## 앱 카테고리 아이콘 + +- **네트워크**: 연결된 노드 아이콘 / **도구**(`utilities`): 렌치 아이콘 / **기타**(`other`): 원 안의 점 3개 아이콘. +- 분류되지 않은 앱은 기타로 묶고, 같은 아이콘을 실제 공유기와 읽기 전용 체험 화면에서 사용합니다. 앱 설치·승인 정보와 정렬 순서는 변경하지 않습니다. + +## 설치를 활성화하기 위한 **필수 운영 조건** + +현재 버전은 APK 엔진까지 구현했지만 **아무 OpenWrt 미러에서나 바로 설치하지 않습니다.** + +1. Hub에 `store.patch`의 앱 카탈로그가 배포되고 펌웨어가 `device_code`와 `build_id`로 등록되어 있어야 합니다. +2. 관리자 승인이 특정 펌웨어 빌드, 채널, 패키지 아키텍처 및 **정확한 APK 버전과 SHA-256**에 대해 완료되어야 합니다. +3. 공유기에는 OpenWrt 공식 패키지 관리자(`apk`)와 필요한 시스템 의존성이 설치되어 있어야 합니다. SmartSafeHub가 사용하는 APK 서명 공개 키도 신뢰 저장소에 등록되어 있어야 합니다. +4. 설치기는 고정된 릴리스 ID, 승인된 채널(`beta`/`stable`)과 공유기 아키텍처로 `https://repo.smartsafehub.com/<채널>/packages/<아키텍처>/smartsafehub/<릴리스 ID>/packages.adb`를 조회합니다. 이 인덱스를 새로 다운로드한 뒤 Hub 승인 SHA-256과 비교합니다. 펌웨어에 별도 인덱스 파일을 복사할 필요가 없습니다. +5. 실제 APK는 위 고정 도메인/경로에서 이름과 버전으로만 내려받아 SHA-256을 검증합니다. 임의 URL 입력이나 `--allow-untrusted`는 허용되지 않습니다. +6. `apk`, `sha256sum`, `start-stop-daemon`, `jsonfilter`, `uclient-fetch`가 공유기에 있어야 하며 RAM/overlay 용량이 충분해야 합니다. + +**주의:** 모든 승인은 고정된 SmartSafeHub 릴리스에서 설치합니다. 릴리스 파일 또는 인덱스의 SHA-256이 승인값과 다르면 설치를 차단합니다. + +**의존성 주의:** `nlbwmon`, `luci-app-nlbwmon`, `luci-lib-chartjs`는 동일한 SmartSafeHub 서명 저장소에서만 설치합니다. 이외의 의존성을 자동으로 가져오지 않으며, 새로운 커널 모듈·라이브러리는 별도 검증이 필요합니다. + +OpenWrt 25.12의 패키지 인덱스는 `packages.adb` 형식일 수 있으며, 이전의 `APKINDEX.tar.gz` 형식이라고 가정하면 안 됩니다. + +## Wake-on-LAN 앱 (0.2.30-r37) + +- Hub에서 `wake-on-lan` 앱을 현재 펌웨어와 아키텍처에 승인하면 Apps에 표시됩니다. `utilities` 카테고리는 **도구** 탭에 표시합니다. +- 서명된 고정 릴리스에서 `etherwake`, `luci-app-wol` **두 APK만** 함께 설치합니다. 다른 경로로 설치된 패키지는 Apps가 자동으로 소유하지 않습니다. +- `luci-app-wol`까지 설치된 경우에만 **열기**를 표시하고, 새 탭에서 공유기의 `/cgi-bin/luci/admin/services/wol`로 이동합니다. LuCI 로그인을 추가로 요구할 수 있습니다. +- 지원되는 유선 컴퓨터의 BIOS/UEFI 및 운영체제에서 Wake-on-LAN 기능을 켜야 합니다. 원격 인터넷에서 임의로 전원을 켜는 기능이나 별도 포트 개방을 제공하지 않습니다. +- 패키지를 설치·제거하면 LuCI 메뉴 캐시를 갱신합니다. 공유기 체험 화면의 카드는 예시이며 실제 설치·신호 전송을 하지 않습니다. + +## 설치된 앱 열기 (0.2.30-r9) + +- 웹 화면을 제공하는 앱은 설치 후 `열기`로 **새 탭**에서 공식 LuCI UI를 표시합니다. SmartSafeHub 탭은 그대로 유지합니다. +- 웹 UI는 `web_ui: {"type":"luci","path":"/cgi-bin/luci/admin/…","package":"…"}`로 승인된 카탈로그에서 선언할 수 있습니다. 경로는 **같은 공유기의 LuCI 관리자 화면**으로 제한됩니다. 외부 사이트, 임의 포트, 실행 명령은 허용되지 않습니다. +- `network-usage-monitor`는 기존 카탈로그에도 `admin/services/nlbw/display` 경로를 사용할 수 있지만, **`luci-app-nlbwmon`이 설치되어 있어야만** 열기 버튼이 표시됩니다. `nlbwmon`만 설치된 공유기에는 `웹 UI 미설치`가 표시됩니다. +- 세 APK와 인덱스의 해시를 모두 확인하며, 설치 관리자는 승인된 릴리스 ID를 필수로 요구합니다. +- `luci-app-nlbwmon`은 OpenWrt LuCI 인증을 다시 요구할 수 있습니다. + +## 동작과 제한 + +- 설치 시작 시 **Hub에서 승인 목록을 다시 조회**합니다. 인터넷이 끊겼거나 승인이 취소된 앱은 신규 설치가 불가능합니다. +- SmartSafeHub 저장소에서 승인된 인덱스와 APK를 내려받아 SHA-256을 확인합니다. 확인된 파일만 임시 로컬 저장소로 구성하며, APK의 서명 검증은 그대로 적용합니다. +- 모든 앱 APK는 SmartSafeHub가 빌드하고 서명한 하나의 불변 릴리스에서 설치합니다. `apk --simulate`는 저장소 인덱스를 자동 갱신하지 않으므로, 검증된 임시 로컬 저장소에 대해 `apk update`를 수행한 후 설치 계획을 검사하고 설치합니다. 승인되지 않은 패키지는 자동 설치하지 않습니다. +- `--allow-untrusted`, 전체 `apk upgrade`, 사용자 입력 셸 명령 및 공유기의 영구 저장소 설정 변경은 사용하지 않습니다. 임시 저장소는 검증된 파일로만 구성하며 작업 종료 시 삭제합니다. +- 핵심 시스템 패키지 및 SafeShield 관련 패키지는 앱 패키지 대상에서 제외합니다. 의존성 해석과 설치 스크립트 실행은 APK가 담당하므로, 앱마다 실제 환경 테스트가 필요합니다. +- `/etc/smartsafehub/apps-installed/<앱 ID>`에 **Apps가 직접 설치한 패키지 소유권**을 기록합니다. 기존 Software/SSH로 설치된 동일 패키지는 Apps에서 제거하지 않습니다. +- 테스트 기기의 이전 설치·승인 정보는 승계하지 않습니다. 새 승인으로 설치한 앱만 이 버전에서 관리합니다. +- 펌웨어 변경으로 앱 바이너리가 사라진 경우 소유권 기록과 새 펌웨어 승인에 따라 자동 복원하며, 조건이 일치하지 않으면 안전하게 중단합니다. +- 설치 작업 중 공유기를 재부팅하거나 전원을 끊지 말아야 합니다. APK 실패 후 트랜잭션의 수동 복구가 필요할 수 있으며 **완전한 자동 롤백은 제공하지 않습니다**. +- Apps에서 직접 설치한 앱은 새 펌웨어·기기 모델·아키텍처에 맞게 승인된 **더 높은 버전**이 나타날 때 `업데이트` 버튼을 표시합니다. 외부에서 설치한 앱은 업데이트하거나 자동 인수하지 않습니다. +- 사용자가 명시적으로 업데이트를 선택해야 하며, 업데이트 전 카탈로그와 서명된 불변 저장소·파일 해시를 다시 검증합니다. +- 앱별 APK의 **같은 패키지 집합**에서 버전만 올릴 수 있습니다. 패키지 추가·제거, 다운그레이드, 같은 버전의 해시 변경, 기존 설치 버전 불일치, 다른 패키지 변경을 요구하는 계획은 거부합니다. +- OpenWrt 전체 `apk upgrade`를 실행하지 않습니다. 기존 패키지를 대상으로 `apk add --upgrade`를 정확한 버전으로 한정하고 사전 계획을 검증합니다. OpenWrt는 펌웨어의 시스템 패키지를 무분별하게 업그레이드하는 것을 권장하지 않습니다. +- 업데이트가 성공해야 소유권 파일의 버전·해시를 교체합니다. 실패 시 원본 소유권 기록은 유지되며, 부분적으로 변경된 APK를 자동으로 롤백하지 않습니다. 이 경우 관리자 확인이 필요할 수 있습니다. +- 업데이트는 새로운 설치 성공 다운로드 통계에 포함하지 않습니다. 펌웨어 갱신 후 자동 복원은 기존대로 소유권 기록을 활용하며 업데이트를 자동 수행하지 않습니다. + +## 장애 확인 + +- `E21`: 서버에서 새 카탈로그를 조회하지 못함 / `E22`: 승인 앱 없음 / `E23`, `E24`: 런타임 또는 기기 아키텍처 불일치. +- `E25`: SmartSafeHub 배포 인덱스 다운로드 실패 또는 SHA 불일치 / `E26`: 리소스 부족 / `E27`: 승인 패키지 정보 검증 실패. +- `E51`~`E55`: 소유권 없는 앱 업데이트, 승인 버전 불일치, 변경 범위 초과, APK 업데이트 또는 기록 저장 실패. +- `E29`: 기존 외부 설치 패키지 충돌 / `E31`~`E34`: 다운로드·해시·설치 시뮬레이션 실패 / `E35`: 설치 실패. +- `E41`: Apps가 설치한 앱이 아니라서 제거 불가 / `E44`, `E45`: 제거 시뮬레이션·실행 실패. +- `/tmp/smartsafehub/apps-operation.state`: 최근 작업 상태 및 코드 (재부팅 시 초기화). +- `/etc/smartsafehub/apps-installed/`: Apps가 설치한 패키지 소유권 기록 (설치 바이너리는 포함하지 않음). +- `apk` 작업 로그는 작업 후 임시 디렉터리에서 정리되며, 실패한 경우 최신 패키지 관리자 오류만 최대 4KB까지 `/tmp/smartsafehub/apps-last-error.log`에 보존합니다 (재부팅 시 초기화). + +## 테스트 + +```sh +sh tests/test-apps-contract.sh +sh tests/test-apps-manager.sh +sh tests/test-apps-restore.sh +sh tests/test-apps-ui.sh +sh tests/test-ucode-imports.sh +# 개발 환경에서 (프론트엔드 빌드 결과는 패치 미포함) +cd frontend && npm ci && npm run typecheck && npm run build +``` + + +## 펌웨어 업데이트 후 Apps 복원 + +- `sysupgrade`는 `/etc/smartsafehub/apps-installed/`의 **소유권 기록**을 보관합니다. APK 바이너리 자체는 새 펌웨어에 포함되지 않으면 사라질 수 있습니다. +- 기존 `smartsafehub-firmware` daemon이 부팅 시 **일회성 복원 스크립트**를 실행하여 누락된, SmartSafeHub가 관리한 앱만 복원합니다. 별도의 procd/init 서비스나 상시 실행 daemon은 추가하지 않습니다. 기록이 없거나 이미 설치되어 있으면 아무것도 설치하지 않습니다. +- 복원은 현재 펌웨어의 `device_code`·`build_id`에 일치하는 Hub 카탈로그를 새로 받아 기존 Apps manager의 **서명, SHA-256, 의존성 및 소유권 검사**를 통과해야 합니다. 지난 펌웨어의 승인이나 캐시된 카탈로그로 설치하지 않습니다. +- 네트워크 오류는 제한적으로 다시 시도합니다. 앱 승인이 철회되거나, APK 해시·SmartSafeHub 서명 인덱스·아키텍처·소유권 기록이 맞지 않으면 중단합니다. 다른 방법으로 설치된 패키지를 인수하지 않습니다. +- 공유기에서 `/tmp/smartsafehub/apps-restore.state`와 `logread -e smartsafehub-apps-restore`로 결과를 확인할 수 있습니다. 실패 시 Apps 화면의 **설치 마무리**로 다시 검증할 수 있습니다. 수동 재시도는 `/usr/libexec/smartsafehub-apps-restore run`을 사용합니다. +- 인터넷이 오래 끊겨 재시도 횟수를 넘기면 해당 실행은 종료됩니다. 이후 WAN이 다시 연결되면 hotplug이 네트워크 오류에 한하여 일회성 복원을 재시도하며, 수동 실행이나 다음 부팅으로도 다시 시도할 수 있습니다. +- 주의: 새로운 펌웨어에서 승인된 패키지 pin이 변경되었으면 이전 manifest를 무단으로 덮어쓰지 않고 중단합니다. 이 경우 호환성 확인과 승인 후 별도 마이그레이션이 필요합니다. + +## 설치 성공 건수 수집 (2026-10-28) + +Apps에서 사용자가 새로 설치에 성공하면, 앱 ID·릴리스 버전·작업 ID만 로컬 outbox에 보관했다가 기존 Device 자격증명으로 Hub에 전송합니다. 실패한 설치, 제거, 펌웨어 업데이트에 따른 자동 복원은 집계하지 않습니다. 최대 500건을 보관하고 네트워크 장애 시 5분 간격으로 최대 3건씩 재시도하며, 해당 전송은 앱 설치의 성공 여부에 영향을 주지 않습니다. 수치는 공개 Apps 화면에 표시하지 않습니다. diff --git a/luci-app-smartsafehub/docs/DEVELOPMENT.md b/luci-app-smartsafehub/docs/DEVELOPMENT.md index 584b67f2e..c18e1dc53 100644 --- a/luci-app-smartsafehub/docs/DEVELOPMENT.md +++ b/luci-app-smartsafehub/docs/DEVELOPMENT.md @@ -239,8 +239,30 @@ Health 계약 테스트의 mock 환경은 각 시나리오를 subshell에서 실 sh tests/test-lan-settings.sh SMARTSAFEHUB_REQUIRE_UCODE=1 sh tests/test-ucode-syntax.sh shellspec spec/contracts_spec.sh +# 새 테스트 파일이 ShellSpec 실행 목록에 누락되지 않았는지 확인 +sh tests/test-suite-integrity.sh +# 브라우저 동작 테스트 전체 (Node.js 24+) +node --experimental-strip-types --test tests/runtime/*.test.mjs ``` +### OpenWrt 25.12 셸 명령 성능 검사 + +`sh tests/test-openwrt-commands.sh`는 BusyBox 기본 명령의 존재 여부와 함께 공유기에 배포하는 셸 스크립트의 고비용 패턴을 검사합니다. `root/`의 새 셸 진입점도 자동 포함되고 Backend CI 및 ShellSpec에서 동일한 검사기가 실행됩니다. 다음 패턴은 실패합니다. + +- `find /`, `du /` 또는 `du -a`로 전체 파일시스템/파일 목록을 순회 +- 재귀적 `grep -r/-R/--recursive`, `ls -R`로 넓은 범위를 반복 검색 +- `dd if=/dev/zero` 또는 `dd if=/dev/urandom`에 `count=`가 없는 무제한 읽기 +- `xargs -P0` 또는 `xargs -P 0`의 무제한 병렬 작업 +- `sleep 0`, 명시적 대기·종료 경로가 없는 `while true`/`while :` 무한 루프 + +`grep`, `awk`, `find`, `sort` 자체를 금지하지 않습니다. 가능한 한 처리 디렉터리와 파일 크기, 반복 횟수, 병렬도에 상한을 두세요. 위험 동작이 실제로 필요한 경우 무조건 허용 목록에 넣기보다는 호출 범위를 제한하도록 코드를 수정하고 회귀 테스트를 추가합니다. 이 검사는 *정적 안티패턴 게이트*이며 변수로 전달된 경로, 런타임 실행 빈도, BusyBox 명령 옵션, 실제 CPU/메모리 부하까지 보증하지 않으므로 실기기 프로파일링을 대체하지 않습니다. + +셸 테스트(`tests/**/*.sh`)는 `spec/*_spec.sh`에 각각 한 번씩 등록해야 합니다. GitHub Actions의 Backend 작업은 ShellSpec과 ucode를 설치하기 **전에** `test-suite-integrity.sh`를 독립적으로 실행하므로, 등록되지 않은 테스트가 있으면 즉시 실패합니다. 동일한 파일을 중복 등록하거나 이미 삭제한 테스트를 참조해도 실패합니다. CI가 `shellspec` 전체 실행을 제거하거나 조건부 실행/실패 무시로 변경해도 검사합니다. + +브라우저 동작 테스트는 `tests/runtime/*.test.mjs` 이름으로 추가하면 Frontend CI에서 자동 실행됩니다. CI는 고정된 테스트 파일 목록을 사용하지 않으며, 자동 검색되지 않는 다른 확장자(`*.test.js`, `*.test.ts` 등)나 중첩 폴더에 테스트를 추가하면 누락 검사에서 실패합니다. 새로운 테스트 실행 형식이 필요하면 CI 실행 규칙과 검사기를 함께 수정해야 합니다. 변경하지 않은 배포 파일을 새로 생성하지 않고도 런타임 테스트를 로컬에서 실행할 수 있습니다. + +누락 검사 자체에도 **미등록/중복/삭제된 테스트 참조, 잘못된 파일 확장자, CI 실행 단계 제거·조건부 실행·실패 무시**를 실제로 재현하는 회귀 검증을 포함했습니다. 화면 소스의 특정 공백이나 Tailwind 클래스 이름만 고정하는 일회성 테스트보다는 **보안 경계, 설정 보존, 버전 비교, RPC 계약, 사용자 동작**을 확인하는 테스트를 우선합니다. + ```bash cd frontend npm ci diff --git a/luci-app-smartsafehub/docs/OPERATIONS.md b/luci-app-smartsafehub/docs/OPERATIONS.md index 12c90fd48..70335833e 100644 --- a/luci-app-smartsafehub/docs/OPERATIONS.md +++ b/luci-app-smartsafehub/docs/OPERATIONS.md @@ -176,3 +176,20 @@ rm -f /tmp/luci-indexcache ``` 브라우저에서는 강력 새로고침을 수행하거나 기존 SmartSafeHub 탭을 닫고 다시 접속합니다. 통합 진입 템플릿의 `app.js?v=...`와 Shadow DOM용 `app.css?v=...`에는 현재 패키지의 `PKG_VERSION-rPKG_RELEASE` 값이 사용되므로 패키지 릴리스 변경 시 브라우저 캐시가 함께 무효화됩니다. + +### 공유기 웹사이트 RPC 로딩 지연 확인 + +사용자 규칙 등 화면이 간헐적으로 느릴 때 공유기 웹사이트에 로그인한 브라우저의 +개발자 도구(F12 → Console)에서 아래 명령어를 실행합니다. 느려지는 상황을 재현한 +후 실행하면 가장 오래 걸린 RPC와 실패 요청을 구분할 수 있습니다. + +```js +window.__SMARTHUB_RPC_DIAGNOSTICS__?.snapshot() +// 처음부터 다시 측정할 때 +window.__SMARTHUB_RPC_DIAGNOSTICS__?.reset() +``` + +- `summary`: 메서드별 호출 수(`calls`), 느린 호출(`slow`), 오류(`errors`), 마지막/최대/평균 처리 시간(ms). +- `recent`: **1.5초 이상 걸린 요청** 또는 실패한 요청 최근 최대 60건. `responseMs`는 응답 헤더까지 걸린 시간, `decodeMs`는 본문 JSON 처리 시간입니다. +- 기록은 현재 브라우저 탭의 메모리에만 유지되며 새로고침 시 사라집니다. 서버 업로드나 영구 저장은 하지 않으며, 세션 ID·도메인 규칙·호출 인자·응답 내용·오류 메시지는 기록하지 않습니다. +- `responseMs`가 긴 경우 네트워크/uhttpd/rpcd 경로를, `decodeMs`가 긴 경우 큰 응답 또는 브라우저 메인 스레드 부하를 우선 확인합니다. 수치만으로 원인을 단정할 수는 없습니다. diff --git a/luci-app-smartsafehub/docs/ROUTER_DEMO.md b/luci-app-smartsafehub/docs/ROUTER_DEMO.md index d5ca6543f..19ac71b25 100644 --- a/luci-app-smartsafehub/docs/ROUTER_DEMO.md +++ b/luci-app-smartsafehub/docs/ROUTER_DEMO.md @@ -18,7 +18,8 @@ git add frontend/demo-dist ## 공개 데모 화면 -- 대시보드, 최근 활동, 네트워크(WAN/LAN), Wi-Fi/게스트 Wi-Fi, 연결된 기기, SafeShield, 사용자 규칙, 업데이트를 체험할 수 있습니다. +- 대시보드, 최근 활동, 네트워크(WAN/LAN), Wi-Fi/게스트 Wi-Fi, 연결된 기기, SafeShield, 사용자 규칙, **SmartSafeHub 계정 및 Apps**, 업데이트를 체험할 수 있습니다. +- 계정 연결 상태/플랜, 승인 앱 목록 및 설치 상태는 **가상 데이터**로만 표시합니다. 계정 관리 페이지 열기와 앱 설치·제거·업데이트·실행은 안내만 표시하고 실제 서버나 공유기에 요청하지 않습니다. - 저장, 차단 규칙 수정, WAN 재연결, 업데이트 확인/설치 등은 **실제 요청을 보내지 않고** 안내 메시지만 보여줍니다. - QR 코드도 실제 자격 정보 요청 대신 **데모 전용 예시 Wi-Fi 정보**로 생성합니다. 실제 공유기에서는 기존 인증된 RPC를 계속 사용합니다. - `frontend/src/app/routes.ts`의 `DEMO_ROUTES`는 데모 메뉴 및 허용 경로의 단일 기준입니다. diff --git a/luci-app-smartsafehub/docs/assets/dashboard-dark.png b/luci-app-smartsafehub/docs/assets/dashboard-dark.png index 8fb66b7ca1374f95a219d1427216ffdf109baef3..bfbe3578cff44b145a47a76de302ce917b06ce75 100644 GIT binary patch literal 618468 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%0Dnm{G9v&`FHG`KXGx%vw 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

SaNCImw6e+tkFtqUlPKQ3B2Nh-KJA4 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®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%0AZr5;ge&gS^`{4<|%}{WR{t02OVDJ!_bZ7gVv@z zEL_L{i=%TF*0?BDzA<)c-=>%{Qz-TQZc`)B3rQ(@2p zS#}xWbpUY#?~r#O3hmV^%@SUbV-p+8Z7?X)3Jm3uac&EeNwdEEfevjVn)?y=hAU0Il^m#T9Y-Z*n%vS(~)=u%?**Hp4T z)Dydt4U(BuGM#QT*OQs$d5oF%g7vZS$7_w+sreYdclZ_(32wvCwa^H13scbx7suw7 zwk5Eovb!*b;&7pzS~1gTl*`2wg1&Zle=Xsi&9B{?9VQn+x4>yv*s>`--)9i;Dl)3c zo;0F%QQ?6oQ-u>$NP`r(Fgk6cJ(c&CZj*k2SMjB4CvU2uqa$Wz2W-0@Mu>NhC~*Qq z63(GPs!(6mJz@9V8-gl$oMT8Vo#h_(>h8Ef`H5h2M1Mp;)t&I$5vs(3i^T7@=*zM3 zI&)=N_KLY?EYG5)ku-{}qvNPWUXI5`!@zMut~vNl+-zh?_1mS4d3u+W3SY5q&@)*3 zI3^Vu4s~YXHTK@g7;{}K)67E$erKK0tV63_qqZO&e#lqOdVfGVKXTJ*be4sp^%_j` z%wPu^o?H3r>D|K@_g7aYR*#O3R;FhApC7KS9PVG*pSXJO#qr_b#n9t--r3*3I-BVC zM{okK49vnvbqcmutJg&V4_0XAVj=|luD(txVDhqIJA`v5R#Z} zd_Q?38$dS7X~ezGf1qI(VU937UyP*q5$i6!@H)-u9H5+!*hP6TcAuLPc!RqrUWUj5 z0G)`9Ig2O!gcurFgzKOdqQieO4w9~mwQ=az7-e3$*(x+BnGRiuX|G+T3<^7B|Ip&Z z#QPHN`q}#*ee^zLVq)=%aXZkn)q&SZz^jVq#=6p~A2a}IK$gEzcHq_19|^Ct4?tiX zImdK;0odM<3g7Jxyh4=n&yp%nYAU*u08=tcka$V51qh9ziBiFZK1yE|HsaM+c#TlH z`MjtFL=0ZNo$!_$yb?_vUY$BiDP7R;sJ%jF(N7N)5IhA*H!|tU)K?hEFCY&kIyE^2 z4Sl?pN@fc6*4o2*sj*Q?r_-(7d@45;ue5&M3-Xg=pOk~mxv{zHmFl(WThmt_NTxtB zxv{;uy?3#>nY*)=%I?iBx2r<@KG#lX){BVNO15JkkF?9_{CY8)Zhab`Cf$}gp5>WR zkyIGO8$vbDy;>Y8i=Wy?pr&VX6Esw-G-@SB6<&q9$n#`n;zdSJ&=nJhR~vGxVx_r* z6jJ&TUI|4w0nEDdh@GB;j0@(N_a36@)<9QrMf@9)Fo%tpv3kH7<1BVZHN9e&fFI&3 z?h9`Xop{s-srErst)p_PNtTxBLsiD$mDh^(u1~T-I{UYszFneqN6Kg@hfxJq%L|}; zqNr9$V=#oM?+4{*!b^~Lv@a#X@vcOLp|Mn1`J5DqTmhzimGH`OtsaME5PNxgG$jHB zKkUA6|KQ-+i)X{J+p#PA#|JAtiJ9MzV12zGos1`L{eJK~e)$}@hCYk;UB(&Nz?;XQ z_R3ao@M;_Q{E@PKVLl&xHy1nIGctVcdc0CBH6W!%Gm5OOGY=4c_;_a*L0bbCD@elG z%N4V=RCfMdc|VEL7;RZeUWiNpu&T_PRk=&^Myzz18wVU-apkYWE1ogCQfJ@slT~{v ziOC4B*pH;(Fk!=XMO!u=pRkCzalzr0%}q23mS8h}bg?zcCsvOl8n~ZvDTZwL6i0hP zqp@^~^@LX~1_L?cwpOPm?1&>TZLgZ6N+MxKGIgn{iUTDy+4ill2MJ(FsI5)#GmU6f z4)rcBGyRKduvl`<`-KHoQ^G9+mg>=99Ew7>MQcNwC6he_+u65!%(~{M z6J9MOYk-6<>_ZR@q3{}(CTd}0NT5#4)V9{@K*bzhk=*Hjwu;ll^H%JQ}0k=ane zvJ4(hqV(4Fe2^cBEma3l9cDC&z^s|~J}zZ9tJUR))d!cLz243TCzAZOgh1@9*kZFm zVdv`3?CBpf#YSOcqp@C#e*$;G+Vss&e+;q@VmA?VLHi}+#aN&SK2~_H&By$T$B7|U zUD}8(wcW;;Qd&s}*oXzJjfb0puA2;^RB+w;iJrY5>rZviRXqlbpoe|JV1e(f4xaTW z*eJ>d2kKTA34JaC=sLSOnd2;YJvS7yAvNJ z@yG(7X@`{x6hcrcl{Vs^uk5cb{vf%Mi;wPpbNlkOukWs|K8p86u0(DxK6-RJ5<$lh zAG|y`D8uk>X^mo?>mN3FecRww62b&R80v-u_{mG9AYUjHwhCKI*WwjuuN(0CZq%Yf z?+(Y7VK8g&wTr=8Ph_m8XYBM$IoM05M#AR*3y~*UkPPm5D(T8aEBn^ExucyR` zm3+m%_XN->0k9z-`Pos91~C&6IX`;#{3v*zr6V_7eN}t)T3bL-&DW9{MrT=C0Y}w} zxU?vDDZHMv>0aWin^NUH@-#qMz;+XU;T*kADzb*)%iu+9)eFJ($(Kn)NbMCHFss@u z8$+0tmmtaq%66wcn3-+7rG&W*cxAyb7r^UDcC2f!9xVn*oQsK!#pmv2f=cve19+HC zL!sU385&9?a@!*9+B`~a&BSZ1@5hG52Clt(?ZfzFJt)WjW$WC2T?nHnPTN!&r9<1O zIyf#-iMZA+@jxOTJP7{*9wZVW?m^rl9*95MTED%wme}F+bWW$8nSS4z{q4(I4{p7_ z`Q({)c=qtl1GV}7{PN`sJAD21>)yv#uY}xRUg`g*`QG!6V?BBN_U+TRPrfXVsiO9& z{DHSOKX;F92wfR4)i|AsS54@?Kwg@<*d-l-+o%hbWNOoXPW)lQ>$FU(WR36=J59O& zSymrZQ)}#$s_)_Ef$R)Gs6gVIhb2(O93U+4>b%lF<*gC#s#aUq?Di90GjcWyw}$EE zy1H8QRlJpF%3)TK)+l0mbRvYihu2==w&;yacqRM*?^hJ}Re6{97rp?m)v~qjy;t69 zmWsSXeFkk)DQ`wxLczm>=}Y!=C%jl_B4V`~?ig8qJp)4WvSxP#gSV4X{#9!w3$9-% zT`{%3(={6*i+oY+1lY=?@76zjR%wL=gdY!<%Ui08JhyA#k-g`d-70!so?7bgH3nQ@ zE@Y6}Cvxj1iYRz>$gJR%2^hMP`(&gI+ulSyR zJ-QrE$G!bKkAMCA{Nb~sGt$tgT*i^wpG=J~tx*Bq3au8k4$Th0tDgHA_vH$$_tv_h zq3@xUpx~7v3QjSWY7Ji@t;R&l6OvQxfn{Nz{styjih`rxTXYsA;|3V#0D&`_HRORN zV_iEEOC!5;*?S7a;l1wL`zO3wKCGSuyn?zZo060+?ler2eE-xEosbwX*)(w!;BDNY zbwmJbS!;mDeU3mulkkexc83s$Vbej=!HCOdC>7N1(Ic7+G8HWOTy%bdV!T(J6m8bF zwRt^`OE5nZl>-pG5`*Odq}>*r19(8HK&KvZKEAbB>~0P$Z@+wTck|lM&#!)b{w!F0 zzLea>WNGYOiZs9)F(-%T&o<|jMiRN@{#!p^yqul9_3PD-u-hj!$OXZ+3#T?Ww@Lp{ zuzg`EvY{QD3#o7J`}9G+>j(Y#H9xVq`0M4H7cX9Zys_MvoYYC!g#z)BqktyAX-w*d z47!dNsumDdegA4&;|F<(+gahnQMcBn>3UPorPu&e$RCv=2kpk8B zx1y-n=vQuQ_piFwf~l1kYounJ_aWdXu$6iNeZakmJ~g{7)kXlkMgXq(2%@c&Omy%j zR=yY)zl67wv?G&#;lJ{Tr-N$*`uW(s z%(Q>iFSphA92XgK_T}=IaCx?Y1;I$Dicw+~yBUrd$R3be9TUP?S4EulsWKv*l#l*c z5Mf|A((>!vRx1pin22BCm}xvzb-rJmL;LkNS#Lg=>cKh$rquQFcpY9HHlt`!b+3C| zqhujTF1wCk*4}^r{+sOmqmAbH)#tKzviFNgD|yc4jc@Nhy?b-hQk z^LOn|C8JqGxF(M@QAua%H(~_E`NLhFy699;EMFF}c9$prxqS8Aasvw;+NxCv`N63N zFH$okbm`pkwJsIVU=*i73&#}+Ti?rI_gJHs;qylWf^P$zgI)nOFTM+=gG4ozC0j-d zgs!SuT4`;C0+rDRPxen!Y&~bqMrO@~Tzb4AX8Sr}9RB;MIm8H!w>$ zc83PiU}&Btf)f;yiBeFMSh`KL7w;cECL#>64$Z{aVszCDhO^#yqQN_H0(W^zFli|* zeRJcZ_b;_#Ry?$j4G$gO594hQ(jsZm_C~uG0@_8IvS^D%bG|vS@%_N}@89Q>6N?MI zjiVdQ=5oL9K3fZ3J6=8W*rgb4QHsOH3KRpUV9o{)r|2Fhm8-VEAA%AWRDZD; z%7jfM_z~L3LLpoOjL?*TFvU5Nr**^^%{RprtP)yW>x#i9SYaH6mH%XkV?Mm}UOkT; z=vwn$y++d`o-HdR&Z4P0T)H0c@O@64K2w)jm-A5w5j*iJ7}z5vKd`tE@QQV15%pV7 zM|Ucfh1XS}4!lNS1$Y%o;Ww{(H%;Ky^=DDt_96FWLNy$jc=WteW zYx!6|W8px%0nO&g?!`zU&&j4yv`CuC0Vu)aFbw+?Xj_4X@p<4qobQ)`!~J7ZsbT4UjdE4D787OX2Q=TWK2K*3op~uM>Wf z)Uu1I6rgV`jam&ChtKXkwRi94DGkMOJ2^2y>wB_auKGl?j3jxg4BJ9k6K&BxD|1K) zidR&SXk(e_@#N6GDTM5b@|tRA?HF~1+hhaq|Cq5}YES)pd7O+&2NSSpgPGyL)?y5) z(ac5a5MU$ZwE<)WuW}%OQ;>Z~l4iJqS9;HM9^k#Bsw4Am+WdY6uZ*WG|F`c>2!JyW zZsx9G*7Gx|U4U1iZ(x65kwCw6!|=cdcvV?U1}VF7xSWGovN2eTOtZCaEG6?Qj4F09 z!z)oS{+{FBsXoQBLNH1e$=H(7O{QK9fHUrJUDuLrSiWQw^=Q6=Q?BH}gRmN^&uGf+ zM0toYfgG!)&bE#PtH&_rnq~oSW$B7=;0W)IDZ+`^>##jwA#TkOp`>O-RGT!MfRB~(Um7W@S%DD_274Se2tY9S z>Tw(1)Ue<+QX^E+0o5v|mW@MTTMtv;;^zm>9F=Z?_P`EEjL~6~-C^rgHl3+C-t@1L(Dw#Xv;yu}OMR{V@>Q{5$z=3xnp6d{cs&K1={7LXxrwLf zdu4S4hPC%J^5|5!rYP#3!Af!w)Gfg)nH^F6Mr8ojr}H(rQL0%XoftPdW7;Jv2Qn2O zZ#8yCGbkxFGg7k#a*u4mclta}40H?`7Z5onA0g7Jyu>pU-SabRfSu^gmaoYli zgsWCM>_nh~#u{BWzJsZ(V};h_(Qb(a?$M!uBivXJS}`tH_{Q+MA$Z+F4tSg4RZ>|@ zGrNy5Wo50uVC1wg>miNWd2)(M=R?s6k8+%7x$c}XHd?8^Qpi`s@1N2VDA3omdnx0h zA6bCaSz#U}?=&1&MRmXSA&d?4hNnuriL2!-Wq`XsBn?R62h8+QcbK@FG)YY^sCZ)w zONF8VAprvLMrCdYIId%)RIl_LizHn{1!>S}Cvi&=N^SX{1-y22iZqPC1ELjz-I@R!OYA%MuG_Eo8 zhtg#QuR04z6xQK&>*2ojO@UX23h>G>w1&Ik5|a?jq}%K+ltdT~#(w={S7Woh1#>Of zbO?}4B)qaC`*l<^SsOb|d1dv&a4^GmX4$mM02E#HXo~hogj_U$2pSQK1gXFhm@_~@ zXGo(eGkOYE5dxB>w&+i>@!Xzn=Db7LNCxZ@gN-NSfY%Y81`30Tu3!}q!&~I~9yY+R zSfnLQ2S2kBiN6A`$!F0E3s<-*VKH3HK2CJOYrn}#RGl8QUQmPKd=vUlc*V7k)2=S9 z%1vYWf$394kN^8A zQ-Ie_z$?o}$kQ{Gwi9^O2bP|f-9%P65TD9_ove}2IT(mmO2BK=fVCOUr1wUZ1ARux2H>|-3mao_|TD>qC_Qc1(YIQ`31Zp@vB+un;F|&rcG?0_}uo{d+phCS)=o5x#mjr0j~pyo8;XhRC{Vg z;=uza0{6VA_2WlINip1Ylmy~Fm|07b$O3;jf^!`GwU3^dPkQHUr(}j9XdKo&BX!VCuTOpN6(N3T( zfAqxx5ovR6qNZ&UbQ*IxM==->rKJ}THQ|+;#WBR26?lbI5sXzAvM8Xp;I)AfXJeth z>K(ymJE{|Fs&6V8QYZHF&mX(WmX+2HNT!Za~6tBS6fqOohHVUxQiufqPT}-=eF5WJm(LdrLGfa` zsice4`a4_HxG&m{M;GvFOw=VUOSe}iE5WqNJc&7t)tVufq7Xc!tP!6HA?Wqq&58)$ z>Zehn?FYW$Sn8N{8EKfaA|Voj6EI0PMr=R!{8e~0nZrjFY>xo5{KnM<;;LKfY@x1} z!HHqnjf_p?E5za56dr0pH*EY*8!UkXtHPfASWteO>J@rAVRxNS(~>j;s%=|Pas1Z| zVb3JXO1~jO7xdoUS76rajTO9VJ~1~COgvpLO|QT!23UjU!Doh70PBl4lNSG_vW5_mPwZ`NX=1WZ3`;3Wf) zBl@7Q!W7<%BN7P|;OeIUx}p^OaNt8@b^rtel!RA5 ziLiPy6(qcB57@3*rvtCheqjuuX}VOZ;9H)0G-7=yct!7A5~A=MEgy36v{@iw6{n=D zhqztg-WJ^yd=1#DWLbQBbY}FE^p@Gg0NBT}UcZKz#<@W(b!nxsd4ok#_*;rj$yXR_ ztt_8Q$Z!!Pv}mtutMKY&6#hRILD3?WtdR|S-iBf7%3d{0gxvIrvYrk)GGXY|G~T4v zp&RoE$JytW@S3^p`N)9R9@tm)(q8#i?|>I1F2)8I|rLsBY_Uvt)B+YQt;~45Cu*pLpE$ClE(Ce+STLM zQ(l8bAWQ^?lWssvA@Ev4V>n)G0k6%*{u+@35=;cB;$#>Eypq_!@)Og5@l^lyb0Cq? zK5J$l$fad;JwnvK)_a@bz4GP9&Gbq}iEUoNeLUn5reGbIHO$Qp+oq2M>pf5$EcnLQ zaQ}}Xai8%to8pxU9tuKJ;bCs6X8=$DLY)VWw`ymI7R_-v1#%!@5A!XlJ_JzX9cv^3 z(rWqau|-~_FLM6$gMs-?ixoA(c0vyX0CSqF5PM%!=7ohu(JrW|hiP~n;kZI;Arr*F z=LV|)nOyckB8022&>1si&$p|9H3LQy5rZ=|PkfqI)({7>Sxa92OgG?l83P7gk=Nwh zBwMqrlknBHIxSK0kWqzf%CN0u${LO4Z5pd*!V*>=pQz@WUVzGFhg&LgU$W&IehD-`YsmBuoR4RQ#KN>7m zeLAbxJCkgXNinC<7Vr;OE_FZ5=C;6B-bQCwAeAZLIiWTSk`E(p%@tA5OVw8@$;&*y zJahXd^b<6@NiSjh5hNOD${s`*%7V2#^O1Y4LkDKA`Oz5RjDeV72278dk#t{+$bl@p z{Q=&sMOLgaX(g>doLTP7nN=PHBW=KI7%eS8EUAZm25#H+Sze$~aDjs6L*lKj+! z=4#~+c%_gbRL4+&2E1yL0A2?LuPiB$$&%Qm(@8PSFX1&^bxTQjt?~y_UJb8@hx>r4Z$w)SWN$qNF!Vlt;M z5@*7~t;#1)hXt>&;)BIn*Z2KE0g7QUS(4+rjpLmXTRJ0)M;)8xIwOYwSWYavq)!he z2)SIt=u_TTyHylQ@Q-wcSFKvqCx2F*jvh-x`%(w&2i z2(>aiyNSRPKgqUeY{p3@*+X@;OHH>4yp~r-ux^d7EqEpQ33#=@XI4=XEH}t(0$wHS z!0Vb3fWWLla`P=}%JM7b(o|gg<*f_}cy(%v-Y_Aww%1cuy*K7hQ^RW#U)$njqjKkn zyakhX8dz{|PKqBQvx{jH{%4){MUpHa`%ic^FnO9qH(8;8g}B9=X23b_DZ;R`6c`*y zBtqatOO7%<(ehmadN~?rx=_IqofzED)dx%KmB;}k;q`+hye`ACfLAKfm};~kuc8fk z@Ug0%y6nr2;T7#v3bJ(|5ZLip%$uG|H~4!htbXeaEG)bMyi}`lR|G6}y-X)?D(r-j zT4vjB3&hO^|+B!60uJ0!}kV zI^L4q4RP@GK(n+ATW=I4tBJ1pc zSNZ6)gY#k05dc7KlYx@?`L2eQjW^4kwpQ1$}ZIU@I z3Wb6C#P5?*#y}?3X5!P99n{WWNAJR~OcE;Lv{R?rVj7^*7%7&JlM6V!Inv^a7yxZ8 zk{@`D$TO3IWwtv6Oe|gS4yQ$?6ksQL2fZnjoRJls#r?)smUVr6rgpdCmB@yrWm48o zce3g$Eg|X>TP6fLPApfxj&CiS7>YnY-GJ8*g#eLOFmRg^`eoaSb`JZVNl2wgN@b{U zTsLq>2OoJ|2@P}<7u5$x0uxk*8=u^6&s;No$$`OiuUW>O8P<|Pr3)7kH-&Mee3a`s z?ZE?F(Swx+AFt61C_Ye(0vZuez48IKX3V<&awRcj_*D>*RQJ>fN~-=dwbz^jsCDddd%7I@t|c{QJ(zqq*k;j8_Z&rV;T9ydF~2QT)H z_7BfbKmGCi>gMv<_~_B|SFg^VpIsjB3to+{DBx6hhDIT}bP(bJa0#!CrJOr(KT)Eg zsxz;`D^7g^6jn-HHIeWPb^egmHBNHv<_RzJm7_YT4hk8(9+Y+&SEV7H!tZU2f|M}f z^^?e!L3fLkswKSQf{ItKl!P=ot6(}-t69sBw33dykD3V?)0I>(kkxPyg%(EF%yoK%_`7YP^20DT172BhO8l5oQ7n_v zWD-+E#ufXr3>pxNb3eRb2gf&0{@XY+B*^L|8a-guYTE){tC|_3o>f8+4M>($;Gti} z;;plvwcynl57)MVT*v~vT4u@C5CjFuRAaquHpG9(y5Cany(p<95xinwb4UmKYQiaa z1qVJ%c-0Ng=#|E8#&2e2V$>WHQ5Gg3_z)ZH0}g%n%VQT)+yvdLyN>uRzQ@t%bAjY+em4rW=uz1 z33mLE*mgsl!y&69YUI8Eh>ngkgNCb>hYs=U1JsKBu zySw|zrH#O+{h1EUDnb$#Gdgv8zm{0KQNeU6-hz3YrNSgefWXHYTUIS#RT_DT7`PRF zEnuNMS|b8uX=dOx<6cuC=RSRxWT7P?;UQ`djPe_syBj-)kI&xz_Uq~O-Luzk=C^O& zz5e3K;P~iz{`&Ux&G{EEUSGU^d-3VcqsyP}?k?}=4_|6lNq7Z{JW7ZS8RMZ9)R68U z>Z7NmurBGXzDu@VDwswkToQhj7+$e|Ng~mC=EJ3<%Aip`=`rvsO!fFg?>A$#emc7R zs0tF3AD9g7Q)(aSBGuzv|1?~wb|-+S!Y-JsD=x7ZS;k3CJuEhD4|?6JCk|ke=T1cp zpAQ7(K)OaUV&Qhm;K!~96&#-f?Z{=tRMBNr1UED`d0eolq92U$Y5}hilLlye!e^a6 zoUw?bg04i(GC@TuBmE#eKDqB0`cY$k~vvH!hz# zkD7y^4+$d+n2G0V9NE9>nk3q!dKIxh0dtL=SmfwZn+A(O(L%Nh{_reH*$Z?XV>^dJ z4Mb1+UnU5(3y>6nJL$lb9jbzfI|;2t5K_B@S1VEGdwsJ1Nf0c|azW6MU7Ur?@Qe9& zlB6kZP$-!#V=^g0;43Btf{9eJS~|;NhQlzxU;qhtWEJW>9Ozz3A*HpkHqdB#i{gpI z+GCPjl61+SbMk&^%WC`JxhV{aPZdVW4x^1Pv*0ygI3dIrP$k;16Vs$nUB)ONs-GOw zP|}HyWhG>I-6wLOtdf3>f)J>CYek-glO1>+IT(^hk7N9(zi(j8QZOaY4h5sOh$p;y zxg!n%!)Su3blj5IKrU0p=mmUQozNRMo8FNo>t+~4+&RRxC?Q?IYtrxz(!S(P`p76+ zg;#);=xKl20$wMKVWziDXZYAKG z$@R^5pMCRW{_EMRcQ;Q3ufo^V#e?R={9O?%NtXv+H43STRPfr;yQL>uRq}i5mtmO= z9ZYZNOS3fEhB1wA;2z^Jm9vSPsUi6cq6dlJN-yC72vjvH*6n8|3YHp2Fg}qc0K6K^ zibPV|46kj%tH%#c+kn@c$A!ev6AiB|OT>&u z??hVo7uG&Nqe~AF25B2WX8Nw})d(oX%0e$XJE6&?vRlLF;^o@Pt3H~wzVVy zdyFvLEFPQniX2cTyy11?ZEAO>c<&gGooUnE&x=w56Crs9!^VPF)|ZA?iaoKYK`V71 zX-Q#Q!0QwrDYcuZu@0m$$Z;bfnBDpgh!EAz&RG(hLL zvOI91SHFZBI-p8~A5RYVf1ba)y?k?Z zYb#iS?=iNOe2s1X^wtqG8bcM=HTGy-$b zXJ=!NefIZu_mZNe87~VN`Iwn8yX?tEh%PV0!x44a=$MCqa3@#FxGsPcTGhI-?}Uao z`uHos`ELp5TSxL#xYIo%I(@>dMha?VXGa}Y&v41~8fH&tlY0A*+FMiLwanT;JAuW9 zS9G)@`tCE%3tq!xNj<*gX57Xf=;yEQ+$6l}!r;#}1h6o*xa+%%vQqIz6ludSLe?=s z@u~Q^S!`9@UvRsz2an$?poRj`Z7!XH#$RXQ^RmuNfH_x@%^7KW)o&d$>K_gvVo7_= z`~Yxmp}k_1T&8UC86lS-f%(WD|lUt z+wl*AzMihFL$WXluy+vI#+MJzug}iU?&l|G_qTWV_ZQ#n{{HCUv-8`#^Z752=XY1K z%s$=w?CSpXugkaBPY($ls8j;~6p0g*RX`+oNq|SG8HQKZD48WqRzM1G8*9DZHDb9^ zjKK|X3cOm-Ev&k-%!ySGNMkEzpfCF&@K>;oLyGZ`w}3r+b3uu%u$cp-*>lGMw2T_G zU7Ed(EH{7(M8+@Qt6+8`h2B;^RLX>oP9F_;)#o@nv@+!1xaoXE#z&Ug@;AU;7H^mV zZ4u=LXb&DJt>Cw6XigL3E3>paoXvL9A~98KFSJs2%vY}~$DSkG(e%0zyt*3GnFKbtfU{6@+lEAC$M7!kPhZN$T*h-~;Od+k6OfH=+ z$>0kLlTDYPqL;D0h!`{0E&}i(0}2y_M;a>sFyWPGAeNe=NfKar)+FnW*5cZ+a2C8y zdfQ?bMF-Z(xf_pcK2jpujbp~Hox#4PV< zH)HwXdfF2O+%`)Bh78GEOA!)Uf*GsOwcz!AK45%Jc$EQ=^4BB^jh<768$o+5dG#_h z)KR;D*EUMQ7+evls|m0A5xgol`YWaJW!kJ=@T0J&7)?hQ1+-xWUSke!VvS;9LIVU6 z88V^6@Vb_h#0QuMmhk$a2?@iOQd?%Uf)(mXGXS-b;8p}oFmiaf=={!QH3{zS1~aa>sLvbazWD8ho6@Ip-k2``M80P&)=)~DR$##XCd?j=5_HP={Q^{xMF&-ZiAVODA% z)3it2nVp@Tncr{c_nq@Q58ng4qPLppM$?obGOI#az}_hpvxj`Kr<}tEYU%HhNV|7ETqh&&rhr$?2n46Bx$f#z+Cc3I z+(Dte>X@Pf5I!`Q6JBj)YHYc{*Ol4nQ5gV;lGDg5FP3Xv#`$3IN)Q+R_U3%OSKf}g zQTnK0x8;;7uZs>Od<|Y#-Ecg=eTn5v%v$h_nn;xrEl(t=5Z&WZ>ItudG^!_f2i!Q| z4m?Q5R@22p<3?CG7q+}eF_w%4)A8#jNweev6?XL>g8?p@rzJ+^Xp_xj$=ou09| z#hW+RHm+V=A8+E+io6N^*T5T+DPAK0102IMG%X^R9Ya${?~i(PeZB$MWM3b@#M*ew zKy0@cykCB=%1kPb2Ms{m<|-d&A>xwnpiX-bIPsvJ3hiL(fEluyI1yAxjSIwK&z(ff>~? z6#dUBvLH0tH2DjJ%MzMXf?v>Us3Q*S{IJ2Q5N@Xmi5OIBa8h#a=S*ITD|9Dm2P&wZ zAd2>dsi*A!6wE<7pIXlhI;5AnYY1K@5X3DafF$!?H8x#a?b>TuGDI~)odamaFw^TP zCXI%rb9FTWUI{A<%){7)Zig_R5_2QQFs(cNIVopJG7dJj3sbJl2Vp}AmTe4zHJOtI zl?bySV%Z7?cY5{B{PDR8Bi1`s=4-BGfSkl$@(X&HOK0VR;2bzsz-tzL?H`p&$LpgBIeDu$@3OJlQRqel2^{AL!M|BJ4MQckB&b@iJi2U;G+-auEt ztNdGO92g+US?_2v4!%e_P*gRji#ev2lr9FZsgLuZaPCFWR@y6NM`}Uz)z{J4oV<4X z*Eb)2JHIr4XJhx)wcg*XESx#FyS;mNXKD4uw_Ce6_j*R>=5O5Fxv_H{a#kS^s%yY& z2lu`Ql@J&iL_6-L%Dh1gaj2)jYox`xX2~$-p73?h6?pA+sElJ^>?Fejc%_y+<538z z`5=eEZyRAY9>qhlAxE~^q}j<*4;8$20*LW2hm9oJg@IT3gCuCAp5XzmmvE`+3t@*%lw7wqs2NgWnT?P`h1)BbSDn~{7&Ai*EXGVR z!B3Bd8wtI+{xbJ7b>GwZt~USO!)bh(SwgiX}gB4V1xx z7=B!)61_oyQ_T#vAvFv;5NuAmBFoCMyUp%3es$87{mzTzU)hm}3iVtEkJqf}4d#k8 z$R^c;Q!lEclI5L8N{P8t?5lSeGvFhz!*K0*a49oikPpY{2>dHMtB?J&O(yp0(;?Y4 z#dKB>5}J6hKuC8ifmedzfLDsa;Ddu_uwU?s7`k4(dH??1&2y>Cu8bPI`lNYo;e4|- zXf%8+i^w0I8y{IW_J{da%Mf;Uy{E@&1THmdBTJ{($LAKhx(Lrt7A(U^nOPt_r#dq5 zTK@uG?G3b&C7&qRF7OkOaNvns2Cp>jIHWb;tJYA?f!AK()u&6APTe^-zIlCf^P&;C z%-=b;JT-Uh%*npi`sUS*=1i-3{rcv`=1h70&bf_E+v${I$vhw|{aaDDl>|B|DxTb_ zxTFc6Imd~_yXpj`82(XI83`zCln~(CicbZhT~`W&u3NuJi3MIOz$<%!bHTYC8h}8_ zoLPpi!a43P0xCVYv@^oC!(mj0J-A*6Mj0Z&r)IaHqT)E@Pb3qNFOg7h&5cwcV&PN$ z25Q~m15dI$z~zDR=nmpvu}T1=avf>m^#akeF>0E4x(s8SoLriKwb7PQX$YvV?~E zSnDE~L8yi?MIIYX=Gm{Fe3uapfS1xQ4c*?pqf1rL0UD=-9e~#g@31v?W=gKtMGbAP zE?Dwdp7P0|Aw?=HRktCsYPZqW_0&svbzJqd(L~s+M}t$(aPKgrpR;0j?>*UGW+|pootJ1e%HDiZc)${dw zYtm${t8;=!Rwr2r6l#>-gVB-4HfDcO#1W$;>5YlLZO-cUCEqceMX&&PB^H)xNMjJ<8vBq25`phzPOM5J z8ge5X$~EB!I)*Uc4vDLY27zWO)>!teTAdGc=JK6mu!{dhOzS*Ngoa&;g7=~q_%^)! zQ(5{j^9Fy2*-_kQ@9_wj1}$(Cq$O9wNhW~TC>moTrd!d$XiF442@YCfa3}Bs;qxvP zQi(Cv8RB`jjCBb1X$Ax-=7Oh&l=4_)9Mzp;y;6i=+EF~r`(pl&eE#g-+FXdI3}FOWoL^M4PjM}v+zm{dF2}&TEG@@chun- zB1bIZQ0f}XOla7mseF)g4#FMNUO96jnbEn?3JMDZ zD?>djzPLNSg!nKZZ2(N*v zf>%Hluss5=UJS;Zfut4&yc)P}NLH>s+-gm3-oHMr!~((VJRDNZ{_)A59&TNDvHzP3 zo3H+G_x|%2OD|tpJ-?UFUrnxEx^wlD$@4$7?)>=n;MH$_e6+DXn(*2|H7$iMqn|3N z1`BINISs(P!>b2Y3{a+)%02^lOa~-29SV3gp(S6M2!c2m&M5<9Cdqm*cTG2qdcd9# z^Yg|{*oV}bwyN?3#sa%|zOP&vHx`2NiXP@nJe<1LJvKsp;MENdOmUf?2i4~gbo2Oa z94he__<9AAnuq_wlTK=|vP(0QCV}{uI)Z9I@T$=jR;8R%j*J|ZwUkT{FsA!+LLmzi zx+X!Rh8qDW66Qb{sM5!%M;4Q%NR1KD;swr1dJ~SWz^huwG|y?TMfz-w&Zejw*ALoi1Wb*pznIv5oCvT95H?e%F0ejn-Ve1|~b zl2j`#1W6Tpt+c_bbk~5_-a2|JBJD4I(B<=zQv)L5oR-Y?^J9k7ly0sOU4@}Syn({p zOmZMf2FMh=VyZ3Rl}1YRaHezsVG{)QIFkvX%;>%($qOK*u+kQgLcq=}iyn7wN3Nbb zDt$M#B){<}@52Z$j{q}II$?757!E&~l=xG9tIg^FH087N4b_cQX@+vCuMD;B>?oD0 zN>%yV)xrIJqhn_rUTw0BHPSO+m9Ql^LgQl-1_LJ~lun3o0C+_<*Y@sjTwLC~y*2Le zy1drU)M2$UHT>hF4_971+q|;(=xJ;3$*ZLwKkonP&Ew}UE-YWVw6VLl_nX(x*2h2W zzj?d;_{nl(v>)RD)otuq1iY?l?w0UMS}cPS2VeRR6*VDv?Vxjjh9mHbz8dJ7@Y<8` z+NG!jkvaxng+Ql4sz90Fs!s~2aB5L3!ZRmNX_(fuFMA7}YQSso9SIT=UYSe^dYE=k zIPi9o9}A>9A3L^TBm zJ0-ZQNv3Ti0IP~U)@%OS7pjL@GTbFm%SBIW4H3=8(ozY$Ql>`~F)|>NWktp#nCaa5 z%2%@IgPl&-3Y$K&T}87K^28T))|l1u5t+d@lf^ym#{pjLg`_84IgQluBB>ywO0`v2 z#1Xv=PF1J~f>z~ffwj}E#uaJi>OVXZLdBYn==M0Gs5D6BtXDJe5vqSMz}U42UN!wd zs?wDwf)$Luz$%dZ3NiqaK%6C^-FV{s@suyDtDlKmc8(NNrGjiGl9Xlcr3ayM)&-E% zV139^ENoP{wyRRlv#VQFFo`ID-#S;({+{p>Pfz<@D}>mL0I%IA5?<@T>rgz)YX&RR zV@7W@GB;zDk18cYmagepxv2Y3Rk|!H(8*Oj#+Z>LXCv_Hf&SF)55r2(Jn%qd@|hm2 zdX2dtmDUBXofX)H^uveoN(ZUdFi-h|30t6iTyl6(VH!TzU}z!s_zO+~Xrd_n%AAJ} zxYx-KP%jd6h1uy(pI^>i z+h3UOB0(rFi!Z>_lr zuceZ#5T1_cX{XF6c@{?Y{1Ej;4~x1Oq6)g}y#dB1=&dH`c?<$(LI7TrQyxMW!t*RG zF9Ku{Sdv|cuJQ>f6Dov4bPSl>O~VFl&X;(qBlcbz8?5=bX&t*Nk>nsi%v68E1fpI5 zN3o?OsDlXnlLVbs7u^o=XR5X}jT{o^bvB1rbQ3gh9X5CdlC={;B0h{NiKYokv_|Q0 zNHenPB03wN3UdqQ&@8gVCo%J;1=OR>Tzfp%QF0JMDi1Cz$vYIpZxY)o`-Oa_C4`nq zm#6YO0Pdx|=>8}M#nVczElkf5q~Q$LJQRspkDs%X2D1;JS6y++Y_7VqQDvxy|BN&o zk}^p5kto4z{aRIte!76XdRQl&ir+S~Z`4hQvI#+e5Bme#tlc*MrH%09g!T#w2wukw zUaM72fO(!xgHek| z3jP^*4)qOY3*mX00~f!r9^K;_1Q0 zWsl_k+lUOAp*{NGOYffDC7UJaw+B;UTCX;*Uj0zhu605Upr^$ zN~XbO)AFoz-(qv&%-!#wUf6x~hnIT~pTGa~m%Be*oc{d7?Cin!zrHwo^~1}ZyWf8P z{POzllc%q*?d@N-`M9wXM7_)k|7ov*CuH+(*EWMZ(OI^w?sjPPgq~;^mQe)@NfL953{e*TGC|H-UBCbYZ4xJ{9wKD}jU+^4=b|B%E zJgZ*DSL!NK8+8tbFCJ%)Ruam=xymdFR(Ety`d!>9Xs%#9dM%&$Bm@me##teK8@$3( z;HgS#FD6^@ncM$_SJ%90v_j-mn}Wxt|Ev?C7NW!RD?5kngy5C)mlboGA-K5D6f@)% z{hgJ!4PHy`(!&t0CMGv`mnY|@0C+%$zb;pn zHh0(7$1a&Fw|Qf8VN|mp;1!Y!=WXi^cDgt=ghmytH;I-m-SMsnqF5FEw zz^gM5%Ik`WNh2RMG<^Y{i!D1rS^_BM6Q$?G>yOEs(!uyFxX-k7E=_0&SY?a#4;7*; zapL^=y9W>6{qe_-Gc(o4m*=*A-kceoUAp|>H30e)#ls>+a3&y9ZZaottkmBd_62 z;WXU*l%&;)yE)Zrgm5|A33D0Rl(vB;(rW`=&kc5eL9fWdBL}cDjbLdv(7qU-?1Tz=$qaJBMEg}f-DG!L?@tOen!A@evO3}ZLrM5_j&lMgOLEwZt4vU9&e=Y0p@1#Q4~;J3 zs6c=a?^Flr+!PEB#W%u8nE|-b9YC;h*zx|zBny%wIV%B;!f21uRE^-~BCgA3HzCpL zG-L&&d1#fWITBub9A4FlsKZnnY2F#zxp#l3b>r!|<(t30z0=zJw7hY1WqoUB=l->x zF%$`Sh9}C-@=(c^=~0GwxLB9#tcSsh8AzAncK9Ivj$y`%pnzI|5}pZ&LZzrNon5J) z)S;ZYEw>)Za9mOeanm=F=OFkm62FAxHPkpctea;ZJbLuQ^B;fMUl@M({kscqe)UuN z+{{mJzx(dRyWj5r^39{?zk2@X?+<2L-rN8D{Pxw0FZOq~pWXZX@WRTa zv5U9%H(u_qFD-4|{`Sqod+(rHs|0Y)tm zlc-9s*(mmV23l}>*qT>frBE{_^NxVmD7XzaK)+ppC8Ly$0kA+C;mP!jzW|K|yi)Fy zFM-s)gW}uRx%LIT63K@^$*S5x39mi{VsvY}jvn_)`cJh%W;J(QB)pnSxEFXOvPR*G zV@aoNra;@Fe{6F1)8no8TYGQjwm)6FdVTWx!?msV=UTTO8tKvCm>FO6jLH(xRnL}? z5IO2bCNFT4R&6rvOwd+SaQ8dB@&(V%bPSY*5G_h~9==xoM3rbM1z>^z08?xUs0=pW zxZP{)K`)1I)PKfsGPu77W!e5=f^gz1OW;5MruD+0>uojeRAp$XFiUP&U@ ze!qQg_R`AE{jIePhu2Q3{f$p<-o7@u{L|C@>%%vm+}_yv!|mCTzWn0uhpnIYFW+fc{|H{O@%haUMTFk_9j^#iR_b(1MQ^aTGAKj{1X{Mi z>*YcBh^j>bR|M`XX|LzxuLNEt419`RMBQMMtV<|(jdH9d{Fb4Z;#!9Ix)4oMC82wI za=+FhZz_t9@`qIU)Hwr8xJwD~AyWv`tUl)z2;_S(H2E8rl>%N-Ize@=jt7ADfdt9F z14N^C7t`^QCbdMk;-pe+lw#^l_zH%UHccaxR{&U?TwbHvTdze?h$`L@&V`p95m2%( z*G{Pe6OQ1Gv~?QCt2W>mL0Ebp<_?0_Q*^v$&@7^#{BZOg51tiCv~AFtr}d;^Si|{5}oOYg6l!hhOO2`=jW?gp{pax;Beu7=^T(YBdo+VXg`7m zh|@E{SDKyVMiVyT7}R>)HJLZ&lW&c$R0eySW_yM9sE10i@V$cj;t6R^4ez}F)9}OX z>%X4eefrbpwW~YtS03EoT>kdf&h6`yQw%|}wXE?;CR4*y3Ozt?+k>POkJv+-RHWG= z^f{4TT0zUmBGZ~HN|DA+U5FPmG-Mbr}8M{&$s)=6S z5(ipqm#+M{|I^v6zue!u`~2zZT=&S@aP{Ef@RV^5{Q61j!?Vkm#^=tSJw3en?BaTZ z21gGZ!s`Gw7hp5&F)(!dZ>rdA@KyZ00j~=EjT*!C{>zq$*6r~6MfiXl2QGKnQR)4! z!z=dnqLQn@tEN7pMwBZ8Ce~`eYlK-v@~RQ33SNuRC)1{^x?l|;i5M+|-Td<8 zjd2cHiqp|({TSKV4t^A-(%_5PJkB~z9|K zf_e1a~^!qiYfg=H^7 ztCU>87{#<;uSmS9lGd8=TFqbE*=i&(oS*<#;kY2tsX6o0qi0W_{rTy$cL(3Uc=GD$ zcfV<^v|jw~)&6&{zuPar`t9?Vdyk*Lo@tGqv|B>Awc5Gr@OtcofW|5M(h`6GukB1) zGSXLsH4143Ufs~Td2j2S0qy46?n75!H&*)V4a#aM_36@`2RkcEt(6b=-dtO1S=89* z?8^4FrDnCfe(gr<>a8)0BpVwYZH(QWTJIVWs`{j$1FAMPo?M!$11nt-w4)H)$C?y* z(gPeOyA(eL%dWxeu`ea!2gE!OoCDayC4_AEA+~^-J`zHGYYc<|_p+6RiKwTZnC-xT zSCX`P#<)%A@nhQlC}VK$lnyH!W>jSu+z7>&I1RicT+`Ydw`9;BVg|?fNQ9^@NJhd1 zP5G$_C{cnC6r`UJGy%0F?s{#4WV?s*0-v=HWQA0dYM{^!rt%Iy1J>{g&j?+L7p)h# z0v%Gx;==h=-0T6vrt=-wYPN_P@tO<93>qICgWelWLv?KXG;JUH7Pd@fp@C=tkeNR@ zB3MIzjhF=wKJZx6DDx~KFw2!yr-AiU6)8suME6w*;}IX636&)k1PKvA8eQGipnwGG zXJcpyjIli=9snyxmwkaY`IBqJ+KQvj)hA+P{fk&5BFa~clwhS(1NN%nRKsD{bg()2 zss?zP;QNXa8U8Blm{8+EJJHl56mc9Gy)w;HLS%e%yJ}8p`JjHf3!K{rYthPm!MNIjUG=I?T?#aWp z;EYC4jW{X_T$#SYREmz3@M>{CDk6mmn~$7ID_iKm4cou~?6A(M1QB8>nF?fk7l=e0 zf)K&hjBRT6%;P`2TYdBK=NHRQA7A+R`swpO&91HWe0+59a^~6o;=31res%EYKYUzh zHBVAKBARko4CWX(9_7K2gbVfg6|wO5mKo4cErl}xa9_2%^z;8j^$O>t(; zT5R0>^xWiJrEBSQ&*|ZGdbC5Gz5*Mp4quc)kwEv_KqBz>oWC+mZ^ylDhy~; zC}~UWPSTd5a-K;*ZruygM!J!2F9NgLrKf;b_+Hh?H8(YAy#oNsIb>nk%=eUPLO@s- zk_AI1q*fp-(3PC?dO}!iYpkXfA!l!HOm#mP&so5u6UpP~o1y?=?Ui+alrwDiO;~FZ_+f zfg~hg)aA<#(<3cJ;*1Du231TY*jU&eyp5o1Z<$L;HJ(?!D|qIqV7!6F;<8zc@({<5cNqR{#(-lNLsz zrXbGyhy$>$g-;ut%QG^QLdgFg9SeBv33%1V;;4s3banL1%HH|2r>}oly8i0L&h5Ru zdmG(z7fx^QtX*4PA2;thM*=4qw9KO@dmaH+L{V|`;8ZK%Rh`MaA*M<62Wt>kNs*Cg zBFk<(?9)4E@G9XJ<|s-q26>YYE%yso7t>VhUiD+Q!*03^Ip0A^}!g{lSihXAi8PCuyJx!TFa=D0YqelcMY%B7BG zlUnJvZFClRRd4q94-M5!T_oevwO2xlNMJK~l{vK*eMJi}=ER0N$ptJEUg77aQfyES z^mJqT=#IjM4zDu4$+yA1L9VfL01{%w!D2}!Q;3f29J*1goxm9w^r0JfVOe7Z8XQm) zhnZFpzq5P=(b3qOv+4-MLFzvTlJI%I4ulNIX`7#=)Ck_>qB&MEw0T~zzesaE5eq(e zujyspjEE5>fsQ_D*f7iE(-kS~#frBGW3O|@@o9fPi#br`OVLh8BzNYL5q8OUDcOIl z`p0xz6rDyD3`F4o#eQ*BJUc4p6=`@JV8roKHN!5!6O<_NFOE$2e5X{uc0DxDjuM|s z==wswY)5vFF0_4zVn^@6FTY!(<#cnlzF68PQKBxS8V6v(*_gw_96|y)z0C%rbQwDh zynf^Gs;8VVF=#!jqo=Rl+nQdT+E|^v_HujsH(U2M7tS?z-`~DEx;kndwkqeA!|STn z-IP3`2NXp0MDyu3kGw!M#F0n~5ts(KIW&yGDFN?Dz@&eX49#dxmwq>_gtdH5)&?-Y zio-Or5RVA#5^+@i($^U`9l;4ySk!%>ET{SDv6*YX+W+z0_iums;8(wT^V1)GyLD%F zW%9*$k1w{a?yhzpJo@?PSI;eKt8%hWab|pfpn%tITshgdBuTZMbD+Ngwj#<+wvH%wG#b6VP@J1i+1Yo>;I*^XQ0nQt+?SdJBy|vw5%4NZ zP44rW_>F!HW-oJ>Pbl!3>4JYLF#qY=yN&}RN_Pg_1mGc zEE!_fYV~Vzrq|G$5Z%ogkd#7a9!ASx5VKr7GSLxt`~U`Ch&2U`Ins&q)bzPK$<$13 zLpT6mN-MCU>r-cKfTH+P8ciE|`B0;t92}RWoTmuxI0jOXm+Z(N8<|w(ad3*Ep=B?Y?+xLFG*&3JU zi8B9$n63IlADs{c^C0%1ZV8iUi5RA!4bK)5XA-wKMYr1EwQ?9kmBId8Jh00QmP>$+ z-y#VdBRv@=CMBux3Rg_HzabaQj4rFLV!OiJ8t1Z`LzPs<=dS*6@Z!y**Mm({VP8D? zVRLX4RD?r+b4uF(vEgj?QQhf6tb@9I^dDPM9WfsT&bR1->eK%$b8D{LvP; zQ9KA8O&lE7AWafUmauh!8v_ZiwyM$zGW3;*W3OYVaJr|0fwHbY&;y$l@LJejMZ!hQ zeSX1kY;<;L?~O5~RC;G-KKy*}`oV&oczyZho7ZoizBqU0-J3UWKE8R`Y;~FPL=%N^ z0k7&)r^{jv4ZId%qW z_&k?t<1>T96065$|GYow9b0xwI0Awk2@p23CkYQ4@)>J$0Ch3-6eEP4HZ$v?j*#NBq}?Y|^F zlXIaD!=r413qAw0()Q{T7%{>mPv@kKg45k|mBqzHW9S@g{bJ#C>)d#&XRhgPJYK1J z7dmHQKN9LyNlUdA1e8tXlq{lHuN4O20Ju7mob|-P@~*+VLVK-bbfvXQ!M%v*jlfaL zhX~%^aEika6j>yz1D=9k(pt%bCMd8nHrsvr?1i%@o6VuKw(?D-SzYXJUAS`P!j-c_ zm%1-VhELUOeo~~wL||4{p9+$!!nf{LSH!(sGKrEiI1uV~)2qRNuI*xUW+IW{-qlJ& z9Z930)n_aRL8i1?EQE9@79rr(*_k~$0C*(^jfYuksnMBGz54tCcr{3^b-0}!@-2$N zWEJj&SEZpPyn1mW;1!j*x6--r&2T92gT`>-(tUhz@VNa?IUcXwwoA9v;t)uOj_I>w zRDM8gBdogL7$3Z${c&Y-K=RGb{v8kAU~7KMge5u4979W6*n#|WgMNgg`~TzJJwks! zQcA9O=e}7^tyRUH;P85~b!=EM&onI?&eNpFv6dcGYjxp4zusM(C@%%EX8Idlt~FXa zdvkQ%-{e|Rk+_@guzqV7^%uf!I;F0MlXHMv77g?su~V{7N}R@D2hALR=46-P73pf8 z9~{gZmuo+A#V$bu0_|(U30u82UzCAdJ(~qCY%Fm zb5gpX#Z)L`tXrcpK4vo8Z`$nQ$&-s#hrfSzyxAO^ny%C_RpF2#_`lSKud@8F2Kyj9 zO>Oywq0dwizJktZOU3fAfWxUC3FrNenM7F?!W&@{E0~f4+Ie*a7TbIh?m-fRQb)LX znAZI@zNq)%37GF6ogQCXyL4%4yw=%2)~t+H#=)1MrS-k zUX7fzo>t(HgYt^xz0s|qgSrQYmZ5DYcI$NZkf^*Od%zJ{nW~v>3zjZ)YhQY6RWiw> zaGVBLt3PLw#?dS=>P~F07+iVS@q&)ggfJ7)9dO)QNb~aM;6?Bn!g;?Aue{IBj=qc* zfDW-%fM0VSqHxFOpl;PpF$kR@2OYdwOxvf zh_mJI_ceHJzfc~aT$vVZ(&exPc;$+DVad@EKgH1-quB0+@_65Ns~?5eynMaP43urU zEytzXjcWm~#}65^8fp9PMDQPU;p(YW`#KjF`>H3avP+uVgmP?Ak&7YCKxClf7r^aW z@ULVRy9rq9`RhRoSTkW4cd3C4Y|tOyJj}8p(w28v8E|tU!3J9=SBRK9`;d(aJqn!` zG;%^s_Xqm7MGYAT%DAH3h;oT=6 z$hBzOiM$-@{0uIt8+$1WIyn4I0k7S@kkWR-Z;O=Tpn2XSC>H?CyTV%CS!H;#u* zHYTq$-?X7CufS{ZLq-Fc#6*|y!mfxf;?4p11Jg}nJBm=qUV9me4zJ7&fLDVV;@VuqPb7v{sY;L-FRB89dDU%G!YiDwCK2Tjp=8jcf#T?d zDIG{?u}-pvB{m%{{;BVpulYTPlQf%y14u$bq#Z%}9EHqdqs{tRnh0I9Y$5}{>&pXC z_a*SvWY#J|E5J#dd4{aOt74x_?{R~rxhq{ zN&r$VYkdSKD<)%NJ%j3qq!ak0ZI`SM z<378RosU%7u7p?SpeG!23Mfl>rG{wnumw%v5cG;f)X5aRk+O=Cg9=L>bB(fL zwsz+f{K%00LfAiLm@l%=zbVCmj~+djIb;ht?u2Negf8?4qfn_e99WhLdbhPKzy+L2 zB|Qz;htT&=E=%it8+2(CCi{UJwkXzg&;o3jv$kVy+?9Edzuz^y3NG714rBZ9LM5L3 z{pSaJyqRjU<=Oo58~f9bYpu^;+%5px&X|B}?dZ8Nq7}bl0{+ns;l^m&b`<#$znP9o z9{tFH+mF-MBi^Se?a4wj{T&9cz)6r1!8su6`~qG(EChs51UyfQ00m9Esu|Z{$YU6X z0l{OUA-Jf7L(7qE!kNmc?CdW{J=3K!Iz;0B7ecEtdJFNvZE(jobF1u*ERMtqx!VhD zj7^3y+RD!I)Mp$AKXq(muurI?aFMP$*m%gL%`&Pb^qJ|Rb`C}WO)P>g1+~RJt88^Dp20m#T zt?g+Ffhbz2hd0Nx*ZVY86%|GDCC4jvMZ99w24=HkLq71t)d<l4O}qPQJrp;YnjYbGl)Z_goRYA z%m(nv?UJtlfLG^S7L{P<4|gDcV;oZA6W#%if5Iyy-vtqJ!^wxUrEqgzw-f6wPH4B* z_}uy%{uYs2nPp(>DmGGUNL?VvB5!e7AdN$jfpA&lD@}nGPA~fhyz--i4i|qzq zGaz&j(_wCENVqP|+r?KZ`BN$2HOuj;h5^Sbltm~{^aP^29VQCkL|`kWQ<@u4m72-< z)@n7uCh9d^_|2*nh<8U33s1-^LSl-6C{3TVIXF(QFcP=t zE2hmTUg1G1a}d_C_P&bv|AjpQua;yomNLxPLK$pqr504U@o$P_DvL<)D!ThTUtf7j zIqwYI+F~mnAIOADI`RhSy?|)>By&cm2;X4TW;=qnQ0@~Cm*2c38UsXD`^#-gQH)yy zqX69)6|Z!Q2VQZ46krYttUf2itNk2g+j2N)GEFr`VB#n9>Ld!03B3BVR>NfAwax+l zfSrGqjoez3QK!)8jSQdu*bu|+ln`{Ghz%MlfhKH0F{|M<@iFFNK92dkt+sc6Fcb1K zh)f6AfLFf8h8rcAJAhK5EB?!w)f$ajwv%jasct*cFEQx}3`49(7h*GbqIhu254 zWLbY>l`;X zi+s6#n~{bZB8C>T3YNYtGLeMZ6eF=`W*Ci4_iOn!qb_D(Dg0UFFJ@`J2$@HJaEW<= zcs{xyQ0(*zLT_skDU?I+->{l{*&@uH!*UdyCkO27Go28w39_t-&lo1CufBAHLMEk~ z0_FkKfswOiA-s1HFp30olTIhfbP9^~S8CJ+{GNJSEfc(2u$x9SIZG9Th3~lC`*|d4@`T6Jdc7`wlGwC zmA5Mkar1F<@Q`x;W6cb&R`Lh$*~#g5fmdp;;42iF)e)+xgzLKCRTR6XIAsW3mpbio zy^V(}*YSzhLLW_dyoz|W2g%V{PU3nH2J=bz%rw!tWAmNanLWdt<862z6i{n$g3+%r z?MpsO0ox#_1>yMr67GcqY4ksc zFa2-#e#3DtFY|*oPl_zE?2A)I@sakyA&pV+jNDtv@73;K`gR%c(vnp*x(Pb)7AmNi z9h-0^_h6K!sfMw{xqX_ZQYLUm8gp=!|3?{UtsPg)!pjakukfPP>4wI^Qmf6Pm5bnx z2gABo7*~ay4j2_!X25-obeyJfphT(?v1KAG_vZy(348=a%O@KJ?=Fte)QFb;5`5d5 ztL;vEq}}|mQ5NUI57!$XE;h5Pt5uoSI6rPa_^H(_*Y%gIY7%vX62DWQj4PtiHxOQZ=Q?!w%Auw1qO604|mlNOE zTiQApuRp)MdY(O8sV|xvniyu)P{1A_KUQlQnAU{Rzxqv;lfD&{bi#tBZf-Z@3@3(x zgj0MIoIJQ`9!VOL%c-d2YCK>!6Wc;#@8261FHA=a?wcBd!ZZ;d28!Kyj z^UcMLgC`HKYOs&E4Fh*okCD_Q;8bBw%nYi1JPki$5Z>RYx(!!(eI#sa$q>up5S|%?daZ5}x-9Jv?jCLZgh;;4%;j35m$aOo z+p(Mj)=54{%$Utcz#cF$gH{Cw43tSzc`M+KKYo7kA~ z&fi(#!7p@W=SLFEkGTO#EeV`T$zrb$Pdi97V}H{!)UTae$HO{@5vq+M>X#8Vsn260fKS3Fl=k zPQ_+Di%ky6bWiO+4%+9;bf#VUJwI_)ui$Ae-Dr?TpZ8G~Zq zyrs0q@-%#iaRBx{@r-PAuDbo+(Vfom^>59y!_MYmzjwM&|De8d(mQ^1_FZRjdmom-PcewBwpX5B^iB_7)oQ>0a=fwq@+O5^>%fbMTf;W zP*>{Knzj9l{>d*t%(u?Izna~<-futZ?(d#lw3ZrUHMKuuWpjDcdxbwg>{6yKQm$<3 z>0#WC#r5mVo%6z@XEMNVGo-qWBg}S%wd98EK+)vRW|pwb`Hx@(;FY}$S{IBKNw>X@ z8D4Kqv3#cCbrezsw)mJM4oJ#&_=BGq#JNa`B=aq=w)sk-|4K&HbV}}-$Cs8(Vk&hc zzGdoMR4HSIEzP8%xr-PT51&~MYVAmt0AYjx`p5vjcW2&J2i6%W$41*K>ZCCPXJv|w zTlx)9$3&h}q+p>i{kC|7@}k^g+2aZHUa1H|A+oBhh0XCGwyLAto~EuqQ<`ok5uUEAN(*9nzT$bhWH#>=J}N$*Ql~8JOogVXk5k?V02d z3ONDXDBHt&1)8S}pXT}Mj>j4q!tHa4Oc#8kT09I9=0{9F5UEyRO)oDVrY!TQEmn%9 zdR)=iuNmMKpv)Sbjo$tTy;q&>-}~D~KX&%N{qfVit=4*Z{^<4U%99^Dt*1X9Jl+3Z z@VaUqO~k8O2?k)`3S2-2rzFwC3gh|0fn0F~o1-iqoalSIxkK5I?{>`^e;x5=217J_B+mRBEjL+7;-q}X!Fj^%H6_I>1bQdf2JLlTJqKKS zMN*s@DwB#=XnZcz_wqbp)hNI#EPyxSwUY2EGq8Z-RYaZPbyC3VIEyhkUR4raRd<$= zq-9p&JvKMTPJZ}pQLJ&sZx=X0EUWF5r^NNO95q*f8x}Gms4u(*7a)(yJuFB^2Xm*$ zWB(}#B35EmwGg*AJxJ4t*BITy*CFe5uy<(`mxDEN={CsIq9-wuqG@>t$19_FNleA7 zkP_LQG}|MH3C-0sYm#4su*OaKgx8d5x?EW3i8wppmFtnOj@PM4AuL}(<{OM8hJshO zX~viW+P+G}>wBX2Lf_Vts=nD6v6!qz=lJYJ=kaOhxZCUYzw4}g-oJj*kW?<^z5dD3 z#d&A#msg*C{_uyjX0}=%F}%Vs2fl`|(fG{AV&GJ;lIv!qYf@e!8iT}1Q4(Pac#UDf zKAjp?ZPYVl2wvsj%f##R)1NQ5U%tNc@SBTYfBX8f4MzgtRfTvpr>Th7{2&tV(++Pm z>K6c7ctQLPg=0Tg+L230UmS4fIN}O|*X3%&Yh6w}Yd25&D?9y*tM7jAK0A5&+xny4 z(b3tzsC5Kr#4%} zEBmBqI+ag7G5p7+@T|W~CXW$Wl$tUuuv?lD2BO)1HBB{#AVVO(y2hE)0fs$V%W6X) zYb0~pvvC240*nZDW6m>r4yfxfu9xH0y$15&2{u<1uN6rzJ|*{@(Hq1owO8Pz)j95c zb$NEwIq&X0`S!cc?C$Qf-_MsGeAwDNI6HkL{yLw0`ODX@9@gsc(c)87qGo5=0ob7B z2P6ejg{Uj}_RuCLD#rbZ;^V*-DMhnm49N5cuAoKPBNtc{L8f>$r$2UW;ozXdy*jx# zd3@1qFP+@!Ja~0kuSM}NV0uZIM;106aA&S!MF>FrQj}t+xv?mx!*l|_T=oiv-$XZZTIn=rANKP)9%H_l6s7I z5&?H}E4zo7(J)^7q6|236rrEr>#SrP_DgD#UKrd>+Eefyu#HE^Q*gWTPU;-5eCm*g z65q>?*Ad4n43S>MZJdf)lIk?|H^jkO>y_*=yo%YAN~-gc$(f*&Lh#A2Bv@Q)*r%!vBBtis3&A)Ts^5>>?$SG@9tMG1Iyu<}O}?@9`3=UlYRhwQ?5 z*VHggGWf4f#FnbjE5ai~sNl{Vi*wO!@Y++|_1BkGa9}`%@zuN?WD4<$x1fa^ys31h%mS}?_);HynGGec6f41Cnjhbc1F*en6hW)A+3Oxk_r`Abc;))A zv)w)Yq9=G=+&lf^@bKi>PVHg$VE5_umT0e{zGn1XswKRdSur>dc$g|}6J{DscpV9N zHA=;xD7SG&J;yoigYlbFZ6x5e&{ocBcxf}^1@MYa@zty|`{Vfb>x1s|(nsC%o%zj7 zd{Pr!ah^D0kcG;*n~I~2BH~6z{VkEA@WbJHOFj@s^}g5xA5FXV6@RC}MFYnc&$=*( z^@vx<@a#J72GUMt?dM+{?7Tkgo_Eeq&!3C;M05A#=~3_d%WU1PBPAYKevlEbm=>8? z6jC(dHHy2a#gmN+x}Tx!USA~zy!w3qC2`CozT&fB93WkRS9z?YT0zuar=;9DTkT3$ z1i%7Y3ejc3YZZ=@5=Slbl)aoY&1R}YlZvS0RVyesLv75aaYr`Q`euBX$TKxow7NW1 zIFqsX9JXZvm0?jbMIBuRULjJq2zK4~5aFc)3n_Px6cAKw*`QUTS`arE?!OKQfd77pOfoUH_rMQwTbxp&{jyOQt<0ba*h zg@l0>glV31eN+j{OT%hvx3o4BOAJ?#!cnwWEds#0_3ZjWc~_L&@REI_W>=LD#i`df z9@g~AYLKuyfCB+|NnurIX;rRhgmHB`;?>Azc*U4|4pg+qQ&Vy&UeV71yf&6r_CDL6 zZMPrnt~K{|+hd=8@$A#mdZYH~)5nhwo;=>JZ*;p)x)&>oS3DRcC z6VY&Lj`xtPTxjm55U&C(xRz^nX@{Ipus2xGm$z0)1jDOb0{&7PWjbbM8648u?arO< zO7s48@95-cb}7peUYUl#%&%jK21JB+*#**u=xQbk)3;BV-_f>EbO4RU!`RcsRqUep zrbMi3D{jzv{pavh;`Qz2D&_7vwgbMFmPVv0(mC$$cQ(8I$KA87_M_|GS+BoScf1;c zf;A&^<3R9)V#6=MGQRzM#WXkgHrqlszZyJogI$Ygw%4&J1GgY%$5*^MU8UwG9v8uD z@*H5sEO3>n%*nk;VbOxX=8)uwHW`85DK4?qae70H1IKdwn`S`W-Rz_M#h2P=4``Ih3I19^a8pc)3?KrIowOzFb(GC5vL#Ooh?o%>TN zWf;f1iiF_>X$T|(Wx$a^&;_J%N*M+lYfLR|x}AvQ(Qz^_h=Q8;w9)WXGuBVl5A~1s zJm2?y+}9oJIm%vK7IydSXP@`ECS7?>A9yvzaj*Gwl9w1TG^L-S+j6;P7YnKA3&Vm} zwhyp4jET;yMp2{f^=1;gS8V|`#ZXc4>u@xysi~_xP-@KKrCIVyZ!37!ow77u`5UB$ zy-9CyB^j{_v$L}+=>RcAii9b=@~FqlBU$l@KRl!d_qMh&2|~bCn($O`X{HT2>H4?< z+N=qtv{~*r+d808RdV1SART#f{-i`m&+)8p9cG5cgQLSa*E?an%d=EOatqA;CjBo$ zbbDaIE55Kq4!me~L>rIAUI}-;9uD{R_QgBOM67;mw7ox_CiY~~neP5fBI6IT4%n+p zi+~b5Ak_6-sUkii;iZZTZ^13mItcN=D=lMijQ6XqXdOHRrgi7UWMWvR(U8mZjGhi3Ju0d%9hpd;U~gN>DMezd#5#)=9DL2jd7rBO7?R z$w4o-;ch2rA~jam8~}ZgX@gmL*1yJh?WN}qd;8c^_7daOM_F4^%7Y5LdxulQbW^3R zWYS7lX&+_5`c$odI;qJ#1NYSc(G__0lI;w?1Rm3p4RarKRA^ng#uCDcStPuP#ZK%p z2EfWUp+e==Q^Jv|Wd>bhs%WkDEjd%X&Mm2xqIfc1k)7D4@e1oJ>Eka%^O5veDo=WB z-~~QDz?9P_DLO*iUUAG|jrQ_rqJwG@gM~<71wqM8Q@GJop?{cS6R8%Xr}9K{q z=Ie{(@L&om^C`;V(+sJZ_&^Nnx#1G}|I+8b{!#~pP_Z!)osKF0799}Vkg!QD#L>zI znl15_J?H!`j9p)%UDNJ?-bBPx8F=&Riu$LFyqU>X`rdw}I~Y&Ao$DJKN?(3|WxYvy z=VZCBl1n7o`bT5F&~z~IcK`Is)Hfs9N~JPAMfl~$RXzURH?z5P?<%n%v&^jcuQ2 zBcoQ|fWLeC=BQpNXBXyY4-Rr8-7Brri@?!gC6--TsZEl=uPPF&3reZFJOHE!Arod(TWFaDYZ)}fjg9o@qA`rxE5jBgT~u2NJMPuzDCwdmw)RSRg)N;sQ;GI^Uo^_g>F3&3 zK)z#!s}jz}r#mrGP9%NWp@eG04~i2x>lr!1QSUudb^yIIEm_935@R5EHG}5OAbz=g zykw@R$p#A6Vv!TPqBjo}J!Q}*amo6FSRj43ES?5weQK9d*^CZ^9C^(puE-sWy=NrD^8BPYy;(12e6?nNp|PGz#$4BD8SAEcy>Vb& zZ|v62celrv;uXaXbk!bJ6AjlnpQ39`R%b#i z=<4!vw_!e3eO)93R<5lbrzO@^F@Z>ZdijHRJaF>tBYAM0#04hDCM(5j2{E!ygw|dM zUhP9y?`FKB2{>twG_~<+7ze27fQlGpVumC0KdzL2yqn5BU&_zl-OZKDi+?_~;!i%0 zh9iB;i@w!o6N`5X)+B;Md612oA?yu#i_#&%S2hm7Ccu?PjNk#7^j-o*)45vSNC>G^`vJsR;!k3SJ}0-lUjA# zJu&Gz+&rn3j*G!m_I$m1UA)+Ao~)lwv`$WUt2gdkoMmtzb6Gnt=9*{4$W^1Uc)h!J z6&oFEUZ)4o_V!P5gS&^fM;E6TZFAM_(8kT-Ucp*9IG8)A?OnNoqx86%xH$%M;>5-p2!;=$po#ZJmYwmC_caB8D4S)ro+-mt@!>lKx3S=r`05KV zWN_4Aje*zKpwI>acp=QX?4yPH3e-rNl)PZ-aB+zUivdbWyK)$+h1JHPJ>n$L%fe8% zQ->2enSy0s=b#Ff*Tw<+LQ^?kTxd3oq^K+!t;aSr~PlR(k=AGTMGS2wg*Kh=q%dkZn0 z#Mkgx_SwSh>fOS^YQ_8HtIwB5T#I)itY*>Okh4#@1AcP$lI6AT0Xn+XJKWhRzIAZYlJeRV|(W#M{CX9jqG@{xmT<0Uc?vn&i9&?>t-dg zaxr%?Q#-tjgoq$G5)XYV!K={`N;zh{3{;2Ebu&x4c$BeO#9*r~LBNi_ahjnQ7TtFM zoq74Cy$4gVVRK|Zt_0E%5TpTs5-$~e*#p^y9y`6NKo)DfC`iG+EWs;3{<>hy1&sx- zBR;oitwyn7@YSpE${gnpwehOWieQXjCYgj~Af-gC0}$A0mDp_{jr-cfE0)X>_Si_H zMz)aq$02q!JMIG^lb2^SWc1&?^66r4Hfl|ZAgk32;{fp5PY15?Du)dLa0su41f;hJ z{pfxv`0fA=c<>hX7kZq`wDZ8d2{90!(%qnzz%s^1pbMEg0Rh(s3~jyuv~b z%eW-Nx=BpDqRs>x>bNkVP6_QAoP_Na=ZEpytMTe*y!wMLm7gqr_SNcVpDlZ`tMk*( zX7isfFRsph{$;c;J+Zu)UVU=;#q)V<61h!Iyka;{S*y%a44yq`y#>oFCmSHDoo;iQ z1znY>27S6|D<$ zFV{A2BdCh6kuXYASYv3B;M(Re)W7Vwe6DH5F6*Tw8)gkt(48dGT-0Vy`T$YU*xVg2XJXGcTJFxo*nq#VQS+Ua>Xnnyaf-Um zZ_OS*U)#@*MS|Whs)X0lMgDqoK0m$J$bB;rw~p37O=jO-*{$u>E;d`msAu)$uy)>@ z8f{BA>oZeNYq!lp{O0<+d3OEj+h>iP+TO|DUL~66D5CRv#0rsyhQOs4*@`T9RpK&h zDk;*+dKh5u@oM)KU|xciDrE|Mgg|>W`#C6g6_Coipk=|U5&VICIL2$2DiNqMHh?_V zY0(c#h5mErF^JliDh(`M64cNF<)Jx^0*$zZL%N#EeJ=u}6~IeLjfJ?1uLNePDsWz* zt3^LnM3mP&3C&RG5-4=9+|n$FW8W`gb8*QHA>QT(coj~{0_gfsG?u_piO+J1xWH(} ze4B{G9+-6iaeW!DoSl;Cq&5vEUA1y%W@fHnmr06-WHooHe&Hj}^z{-0S0bz0cYjf^oog-=Km2%2!tjbXRXAiNnY0 zKmZ|SZqxK&7n&7HI^0T%gd~Djd=tr;b{Tk;lVw;rKvx5=YVTsW#p@&fE3>kps`ls% z%mQ73S8W`?uHf1ty!IG)^?SmUO7r9F#MgIUSYHude_XacTa6S}@0KEc*2MB>vE{D{ zGv%Q$>8>o|bcO?)n}K+AwiSughQ?oou5GXkqEa-7g2*nZ#s@%T+IJTd!ZxWvyv8eKcDzNQVSE8qNf+&?=it}qFcFjB zI!11*6j7DgiVCpw%4O``wBRBXMR|hzQ=d9TG%;yA!pe1UB0(N(6<3Iux#f+JhkXtm zM1`m{1ZQHB7oZj8k(T%uWX6|JC_>~w2k_c|k5^DNO1hd`@zt_igw!ZMT#76>emrDg zayIOLx*x0r9_fiQh4ax-Ft8#g0oWkCXgaZ(?sywZGD((;W2Vz1dOMp#DgQ|p0O zNH785@xgebc}OwkrsG%hzT|6B;;ff1J~K98w{tOTUm2Ona;fCdF)N70tK4kH;hSzd zgQ9qk*MV*?iE$?F^gd@^f%r@fgNsBCbaWs#m5UF+wWaZ@0<-)ba;Kw#N?R~7`0U3* z5rc1{N0x>!t1loM_0eh4}~eTDWr2Hk+u$fi^F<6Jf5V9#CahP zSLY7V9P(#hfri?n+mo{OfYd7psakMmabYOnmnV#9>;f$hLazO4E8Vx&9FM=ys;<>G znxoenGm-4ZUf<|>X?L^HcU--_Jghc1HWyYluQU1W>UDIcw%Mqj=4Ttbg~SB8wcbd_ z!$W;@^XYIRyLpz%%VAjqO= ztKSx7V&#t|9z)?*)dx@lh9;2=YN%Uk(<`%yF4 z+`y~EqtPGas{yzCZq$24W_r*frjSrRTFSfKx@D>4394Hct@`a{KIuKEABBc}`O4{d z9(-lIN(FB(POzxoCM9iWsuoAcmDh2V&66eKP`bVMWPbHAyy{45BgaEpvMUu} z$KO28172O)0G>iQ?Owqv>zl9m%M0_9<%KVX3SSh4;v@6Z({t^S%|7Rr4}2fYx{+p*4gRl(b>#I z`SiRJJ=&d}{_L~k+x<_M<~lRLD;*ZwkZrs==qgtbln?=4=}hBkX2%Pl-!=#1b88%g zrqd&l4?9E;GF1e@ul!dOY>W;E?c+USDn+FRGSBh`q*Qaj1{1b}sof)`32`E&mm}|q zA6yJo_|9krYzZ*l(iCZa29n}Dy}UpqSmucW@d_TKM*le~l2 zUf+j*{r%5Be|#{U|KK-X`_pjo{l8g${=q$lus4^{e9O!3Q6t~g%-A#(Qn#b0;e&50 z$kZ!&o+q*bB6l?(Vad*Flo)w~6<7%O-A7kFXwl&6 zTOGW$!mHQ^xdj01g5zYKOF*B1EbK;d)Jmqe$^vJ-HwCi zjr&Dj*yIen;+2ZzypqWz+CpvC>z!8lrG6`&PKrDElcv`Cq=S{3(ti z3cG}G$^r|dRu&{7P!e}*IkK>(JVLg%q)M$EmKyH^O%%bfISGl8B!r+w@u)zV^7vu> zM}6P--lLl_`bg&Jp6QvM+5YDBJ3pB`_+(?tK`~4pgIvJHuf$D$&oai!f?w6x;v`G= zP2M(Tgf~sI13ps5-Ig|RigUGK%QZLzo_xyT6{!qk91CUyX@^&|U}&zgSE1(gMEU;R z`R~>*SFdlZR+ny{zgfMk@LIVsf8px#txBzO|H8u6rQ4N@)rIBxJ4Jz4;A=ovXHNpY zD-dFICP|SIb-_-~8*p(W0VSUAdVLH!UhjqjPKmsw=DQ2kmJs3(Q7S@soyb3`KYH+> zUVmd)jOxo@)VCk}`uFx5m7fGrzuJ+F=l}j~aq*YqJtCEDCK=0a{HuRHocu0az7aAv z2J3=EIBq+@DbAR(7ejs9PVwEq+uJGF!Xa8{@Cs_lmF)MBm1)V1)r+fl7B1WOZW3P7dBKn5W<^-A&I{g4tX?ZRJDCF;B0hbj}sCnb8f|=RKTm0 zC9)l`G8qyqUOT*oN9<0q%p*F!0s zf}zo&cA3L>ADM+q)HCq&rv^lERO7b-V0{s?>$$soN{Qh>F`(VCh-Ic4+lT2eV+#OY zwNW$yu>vkeC=g^E$aS_4^h=zTLF9fJN6IbSS=WIs$<@_9dSEa&)H!%~uzzT%KiA&g ze^^-6K}q>CD9dq8Fs?zg)P1(6)ZaClEhFJtNrDc@vN6JTX&j7OE}Ior6x30fS}J&3B?)TjnZ7gScGdz|7pS!Gq(| zePbsMPc{uqpD0aE4Ni}|+&A)6_uSmbk=cR6(#$kIJ6DWdPy&6JOCb3 zL<|H{e(*RANEs_B9|7!Ye3z#MNNHyPNH*+6E?59+yGN1jg8waD9`M6)?p0zAL=0;- z@JDG{4m5Hqk`aj2hPzt`uMB*V-T2|o{mM7hOB?5x7cS=SEM1WZ1oBtAxwLjkxYu-k zZTW}0^S3LvZcbmAznvc~D7<1G?pXty!C!iUEM=vF02swovdLQOxHidcb8H`O-#^>r z!F)|&Unr68hI3|A#u-?4!-6`z;%7_`bNXgcHZW0GTzs)|yuR~BQJk0V?bJ_IUc=&x z`j`1rJAd7)yj}mQ_S(ICPl@7Y8TGW5hy%v>s7^#gB~xcMt}a)Ng#by&bPDrs7Gpv9 z@)Hy|W#Lbm7jtzHDuX|=wbDG<-H7oZtdCt3io1%?t?K1$>ENM_Z`Od|R}1IHoq358-dd3!=od)jAm#@*tp+BbU~3jD zKY2rDU7LW{n0sYx`V2VNj5@{Y=y2KVKA1LYLOe^uE$k9$WaPP2r-T}qnjA$ymzHkH z{3nGB^TK$3NUciueS#tL^FIkQvcC7r) zx#>d#FAse1@Zr0&V{_*oe*RW(^XaY6&z&ue-~%DVC0&SN9E-;(%M3~V6v*OAmFTRn z#pHxdCM1{hf;obD-O>pS`0P?1F#|vbE`wKzIS{_`@o&&92h3kLhF2TzJ%zmJaW=#U zq*7U}t_UYvE7!{TqU@|~Tw7YLq-CT0-Ta+Ox>CC^f2A1U)t%m*kEO(uqd=3QIO0?M zs?_Q-REO8tVAg|h2V3=I%nsj=H6%XBSm_mM9p1Qy0I%d=9bVxSDopylzv@4=<@Xng zZwRv1@_*GA%dh>k{nH=Yr;5VH?(F^JAoa&*9cx6 zHyvQZIRvkODX27X1zAbR1|GC#DA_B&ZUgsMe{*M@etUdPLcBIEA7}YduuFK5v?d};rX!~WD^Z45 ze6_e42OJ~ZYw2T6#sa+VGjUj^Psl>Lv<7%>)QouT^aZedB#=xBiTdg}!5$;Ap=ZR? zTn;g`8aTUj`*`H(*3{ZM!Kbe#$o4o^5lsZf1(s@0)hU5Yoz2rIQpAR)o03Dp)*@1$ z{A)t^E|E@3=#W0~g`iqnp#9*`q#*0$B+-?@vKXcnlkX7#tjUYXNCRH`G_;}wTqJUm zhD5fR0~mWeZ6@QEX1%^s?As7ho8F=p=Fi~O3`Ix|uW+?j`O4xijQdvHc=jyaD(m?b8t3 zz(hc#FIi{%8Ez0>pJsFk*+YI8^0ok0bGPLx1)OYXa?yDTvR8B$Azgx5s8EP|5jn-m zcM~iu`0|z>e#f(5ENY|qudh`vov&=%o?lp5y1rhl)oSI9>kH?vcxuOb^j#y^W4V-hx!=K*&$Zh%)KY~#3i=AU#qkG<(aL|8{)&rlLl`5AL%s-2J@ z!QI6SUO5&Zd?}#TEC)u@g09=g1xnh=FYVM{t+oADUo4*bYvP((+*QbD_64rJwi-Knsu^$AC;s|XqQ+Vk6F}47&f}tiswXmO(%1Q&H zqDs{5O<-+dIz;RR>q^Q%;EHB6dnrPi^jexO6hnPO!nHdAo+5=n3Ka}z2@}(CP-%#X z4{@mmYRBYW#jc4SX+lht#k&yf$e^Rls09oKgicOQHE1VCHXqIu3NJ{~ zjL%;wzjbc9G=Au#&w5U5eo#F5`KKR!G=B8-*17lR#s={syXAG~*$4HC?yk@|?Wmr7#+qu(l#u? zSR{!^=)j}}j-6rXMIn=euz!R3C&fhJrT&>`d;4QfP!5ue1-b3F{dkAcgN*5;mkGBR1QCbqNZgGHe zXAwf`ipYEA-`uM`hY${d@Vd|7m6RGGyy7et&%Wbn$ZMi3&TB7HyhfZ>XvQ=N!J9c7V`bcEwUX_gl)3`Gkl2P71~H3 zDVD(-TGt_Q58<^z?bQrk&u+f?-gJNAozEV=H`IJ=^RxF~e)lUEXSd#ZeXe5=mxmKVfLFwD%y4vPSOxA8JC>d+Bk)TRE#XzOdOw$eECA*P zjh^C5g$0ZoE94nu2(KBaww}m3{}VeGIJ`mvBuzq++l%Y>We#PfG7svhTwJJL`}pJa zsXNu{H^e&m`p1=xp3${=Q7+5>E2~S(OR`bDUe1p$hzVUSuh~&_W}l2)^uO>LnH%w7 zMMzL=Iv#>Ch2#BnFI0Fn3I_iHUS-RDNQDGmTP#gc0W(x~|X#m40WqF}EB#k`^ zggw;g4#{V(KEI8!L8QWk6G1$w(wYOxBoT-=O(a@F|NyT)!liPx&|nx#e~rog@SD!fVy5GFXhW{Ixl zjk{u*Bi1?VA1_p|UKT*DtY5oTyz%2VH^d<8T2F3u{l@xA^^(Bq#!~f)z-!()6thDV z!gfFw+lqMuY; ztSX_}ib526BrZKRIU&YD$>$V^7sCP_C#d@U>2JILoz}pAhsy?c`@60@A^bgB@sHavRtrAf+xCy}%%FhXG#Q5S)}W4+$CP zae3l6^Uvl6Up{vF?0Yk%S58hA&dim@UO9GTaNy339&Bi$3 zUR$(zWpiC7Oz)B79A2+ny>{vD-P`xeXYPs#)}4G&T$n3)@iM+Ij>+X7(K6?6Usx@V zWk;`F{juBzcnzeHKV%gqy-Epqjq1{B!=)^0BB%*RW)fZlWXHpp-F2fNhpzyyR)K3Y zBiGg*cm<{NKR+Tpo8Q@aEnj?9WUh?QB1Pysc3FN;bZ|SB9f({8%lEmXFj} zvKo2IIj$ycU%kilvJ05&_!VZy)*r*@z~=|(b+oYy`*)=^z$=6Un9x!<0H;{Q_Dz>Z zf4KBxTXy*3wOiTYxyvgn*H()?;x%&ZN`9hs_K;jn7tEUONDT$9vbx7$fl!3GaO*8!j%gzXM4 z5Eop~l{RHS=_I@g2@Tl*U_;f z{j+_gl2|x=GSSdDHgdR6jvF(+HDo+&H(a$4puXBcf<*C z^MaBIq=MW6GH6n=c9b4xnAxYZ6{FX7zR2eb<>JKt^8Re=aHZJRR@^Vn2E}4wf4OJ@ z3bj#_j|OmH8M@+5twJbbMMzxmub2bcAD-k*k-Utj@k#ladYl4_DR@*r=&lrYFqRH* ztvyY-MoRW_rB;Pkd@S(Fhg-9drhR_F{wMAvCC8v@M_#^i@6oJaG;fzE()(r zR0I)T;ar|OF>_)My#Sh-;fiEMQNg%VD0|EiTs*dVM#*>ovlad$g?sUfA3iLL=&rq< zi^S!eP{me-WWh2Lo3Ohkji2yS<^K!a(3c_OfH(y2%S7VPS8i%ZJ{Jv0Xp3ZGhi7xB8tj*){Fh^7C)d)hDk|V2xq3h(DPz))m|7T3 zTiIAm`J&%7j}v3WJu8XxC8W58Y!VKy&L>iQ7r0l4R}x{G@T#Z>+yH`(inlZj&QCn3gcQ zhKebwSWXq8>{@lcqVDB7Sk{iUreuGh-mk_-ruG6zjszB9W+HFW9 zcqKj2(*(Aw#o^Vuju0+IiCI%Xz@9Prke0A@s2~GHUV5#NW{+DV2bK8cXm_laUhch( z4@|%-PYKFB{sg=`vG~MK#g^^MGM*3kw~3E>S6>=FLlL|pVZG1VT(z~|EC+zDRCYif z08P+y7N`l^)Me#lzzZoun^D$Ar?%kY0`)n`CaSOiijY{$3MVwq=0Vgyb=%n_+hQ5d zxAur5tP|^4xo@GA6Rl)b#%#yLF6DB@&*$q7{!+siaBT|$klr`0iPxJ7FSfmH=s?Bl@@ zUX^>@!#t!_tO;Qx;Pr&K|2+*UK7!G3rXjM|kb4Cn!#SR;%R+^dAD5*-rqD79)6Cah zpfwf_B)k$}G-)Y0K}19fx$A?8q(f3Hh$Z(L7lMK;&Fl}1xPx=BO`bQ-b7+VnOSgS> zi@OkRMrD$PKK{PNS*65Sr-C2D0-H+ZQ;YYq9_w{D%Q%D<;kFGWfY%`DR8hU+24R=Z z#b&(}P>%hx%nFtm*D2=1cXe?JvayOwNE-<_u3Jg3T3(qK_O!aZODg2sI&%66&y_S{ z79F=VOcvv%%hRaU3PSkoq{Ui*FWH4mS<;>~g`pQ|@1d3J%ZR2O4u{Ufq$9^|51Zwc zAhsa|H0H7TfV-};3{hNoMKZuzhHXBA0Iw}X*e=4zJ`JZWRm#2gYS#NqF9tmh?xhq` zXPjoD)vx#(!e_(eKgH%amG2;RM%1K%;!K_Vj{agDV4SmG8bzCeX1K~$pg z7VAmYkQ*g9VeanqWGbQqw(jTvDvlOjLJxkUSXu@*DyBgEIV3!Jz=$ zUMhlDb!hZirtGR8LF9bHacrht-AWn)kaCV8`D>8Y72iz?Kyc-%Th_GAU{EcJztyZ_ zSK2{S40DO~5_y_oU!JXR24XX|=>qS4crAjo>@3REav(|8F@slqX|UYD?RFJ>Ji3e^ zjWytvPCa01o7+@d(z8oxjpiSXGYv!-XO8{%UBqd!@fRDjVihP@?dn{E3{K=dnV4WZ zl=6GX-jNlZADwEF)=>sE7n(Iqei2@`3HNx@0_#e?sZDl__fUA z&di;;Gdtg$d+vFRRgw}l5u`x$R4d6fBZ@j+pZHTyY06wK+B@69m7`%-Qokw4bR zA#N=sYz{pQU>``8gGTePX<=QQUIe}RBJ)MuMWa`Oy28nJ19q>{T-+O{S8B^ZErzC{ zA;{>J3R0S13As4c3TBZG0Tf2Ik`yFNK*QXx;{!_q?575?W;9jvDHm8Fyb(AxoW8M})rQD35K*%EPol>WOakK=0hPh=~x8DY?R*fc{!^ zK}C`pq7(FLk6OL8#sHi0**Lv2#-P(Hn+AY7_0Fi4o8USJ^suj)OhCs>Eq9^BsD2|U zH0cY#2FNbQb$zA{9FcGaACq9Z(k+|lD45KW9J#9T)JAEjG zQji58CmmFv=1_=}5DMXqZuL_6hj+vEytN^y%qqLZm>t&JHI*>Rasnjpt4VRs!$Zf&G)N6cAG2Tel?iimbm%uaC{N3d9eTSBd*k z9)fHHlnq2|nj_T9psbreR1>45I`9!d9AzD#GBbe&CxwD@J;T6AiqetPo5S}a%T#aV zl=LbH<$y0>ml+Dl0jF23Af#oXC_Po^E)ZT8tt)m!3D7ZW-45G&B=9uTpCJznOYk z`4!F0f;|T8MzWQ8^Wxm;*1>~|r)~G)h(bc0mgNERkPPrLAe0KpT_i zXGB{>tt%n)x&Wm|QzY7ut8?jsHsL7(?Dt_7%W&JnU;b9UVQJiJ1GAEV8M7b^-8O}jY1!r`r9VjgHSf;Cf6eb zzp5mR!(~3YQEM2#cGei}3-TLB$CXkDX_}+!Fj9ww$ zz z0<%tf9hKW~%;>c&*a23z0_lB{T#1Q#**PguT!wwAgHkhJb0nnU)ZyJ`6YjJt0sQI>n40tK>N!SyKVo0?W4Hs^4~YMSTcq zNO_vXTIaL{MFGe+QlFM&cm{{Y%1miP=?&c~5J^wnTs3NpK-#&n2~UEyQtQeJ>9tMT zrM{X6G}Lmy=rxj5NH1h4G_tF5OnNoVO08UcWpCf`n*7Hk14|A0hW`t!Dz9;W?-e1~ zqJR~#)2qJ;k(C-vLfVT{pjXXa$@H{%fc;UE(XgWlZkSM-0kTA&E@_ZulUK=m;J!V} z&!U7~4K*pKAd^`3s$#!notyJKR4Ek>aNQ^nmDKZ z&&7@9W$~|P*c2%PyT16MOs1w7OaSV)3u4Jc_sIa*hN5)z*! zJ^`5l8lk}Gm6sC2E9EW+B`n^di_|l6S}>I!E)9DTmN|--qh~gX_J-qv z%zgl;pn6lHgbBSCjSiS~g?|#8O9lcr;K3#5#lRc~#&|Hh&sx72dPbdH$|8+npo>34 zMRP(o!}-5KMrv6mi0bcD1@OQgoL+RB97tz<9UwD=Jzet6JnDk;Hu>i_K5l~SF%4w- z47p~+*Q2@B%}j5K-|7t38(piH8tYX>IKt@Fb8TttYW9y^8z_<+{Xj+be0XA3`1Qof z%KXY4Y%?X)vzR9?Z!XqBuZ#>(fL_NDWM8PXaF%N-yAmQ%()x>vxdu{mX?Uivg#y10 zdj1?q=dw-+rYzA=ds4YNAt5F#R^6Y0TG(+&uR*VDwfZd7TS$BgxLH0H&~&nEWc(6& z7$O*=gw>Xo=I0r=P_VKDJGJf24dLA;z9yM>;@8La(cz=|Dx9;i0@vG zGHV-rZ`7i)XpC%)`4uU}gxi>!Hg)~{|A<}_@8ie<5*!)7nX1c(vfy+~>Ay!YsY#c6ZP2 zzSrBTi}Z@ID%uH=-B`OjXtSkrx4i^5f6o31)?CR ziNW;Jt6RvFDxpkOIe<}fSi7bGnM#>~>)B>vu$Gn%>lL60bR=}F1yPSrV=3DsjO?%$ z<$`Q~EW(y}ADh$eL3y9^A zvh!WDp}f2j-KLer$&%gT3H6ud{f?YQGxB~d!a2*gSKZ%qon5}_w(!8XP4_~!Pc*3- zc(QqY-ZndH7-$S|Yx*YX|1H9(&`rH!od#`||wi zTZe~-2ZwLYEkFJCFNX&=Z#=fOdvI{=;P98-(cZXlQ_w4EtQGNBP-P)B*kYF)6ZEEO z=_4ddSQuya%W2zM09aQJMrB0X=oK=iqTqq5mtYvg5z=cB^a{$vQeEklWeYMVX#7>s z8cP;cry*-27VKZlPn*-f-?{Vo-Rb_%KYThj`u#WWbozhX`tokS``hPI++W@l@wL7H z%TqF?TMk&-I31rE*1DQevPM%YsNvn7T3p{ht-`3vqwLOC@n}M>)fn2&g(G*?X>~nT zgD>put(uEi?@pSWU0Yi9Op=XS;lOQT0l4;}%NVi_rQD znKC?w0zc7!b!^Nk*bt6r?EYwn1&Vijsv1CozeWITXLc@ifd+0f8xu}u7;up%lydZG z+K2;=6Plk*32-~XFh*vr(c}u&s!L3{lk^V6ugkn|MWcs-pA+#%mz=S_vmQ{JG$M&zXp;1zJ0JQI=yiALCyJJkW~i*XbE zsn+f1HPRXhdZjoGdY!^PJTcBCTKQ)#Na*~Vf8Ji}J@fkRa~Iz~?5$mR|Mt@tUf-SX zow#uI>eU-J&rbJd3vp8@VCPErfrS!%Z#t*r$u7v9z%!Ru32z#jqg0C9)b=3ICEp_& zZlaBCvCrgQ9!a07;2K5Ic7gQ>wb3T>t{bdBkO-W`=z9UI`efG))Vz&L7pHa zai>?4c!)7Z`Oqo5Mczdjb$YFBH+!$`kX;Fq+q(SA+4b@D$Jg&iuK$W&kKUe9@B02L z6CHf=3ZvKHS4ywuBT4C%{Hkv~f|ju}bP|vXT0#|@qO=ysyEaqUH`LubNP74}JIY#s zuTBoqazGgiYJD}pb7k1bxYmxC7mn1*m%So<-vJLlTwuK{-7^@)g(JH{{TMJT5MJsa zJ{;x7I!rk?5cxvVnwU%m?Z3KxmkG70^#@z@nC(*kVkykJv z(6&Mr?Un`*7df1#4ceAct8wQbrKSMmk$6bb%sAbZ3ILX(V)yA0aNT*g$e|nfIQ&p+ zTQy39e=WRGGk_k?r{tF~n8AZ6!3+r*6SnPmYy5aZue9ngdY!QZSxrXppW1%p%JnaISi6YV1S+1x~N@1Hi7d29+XEG={qHQ31W;>MfXy z8Np(?1(>41K3+Vu6#Auh0Ix-9NyH()YuGQ4K(l-6!*?Xr<=ywL|NhC#Kb*OH_rqU* zTK?jL6F+|V?N1;5_|qf3O$KV9L0dcb+9Eh7+)6oo!Bqvay>WVf$7EMbm0#C0@fG9> z(#4)$k`d&N!`GwqAJMDT92h!qZ+&$t==GR8oYG{zI^F2VjfalN!!8+vw2 z<(R|yg!6VOUvEz}M}Zl2a67>^0;!3lUtKgK_I4z^gxbKaUMp9WHxsEcHYxMntL+Kd z1j)E0X|)E1s4o`ra7&Sn@cN6TqWqCeimWZBI&`!IbYIEnb#NWdZR|q~owCT$$S#-r zM!WM{3o_B2GX%Zzkbo8BwSrsPI_}h55F!M<&N{tnGz;opr&=@kLCAk(671A^y-AD_wjcJWA`fE&yB!?+@c>ygvR5ZjTIO=- z3X;0WsQ6bd@BvEsID&GGpw)#~kWwxf!6;NyWLb6~wSZs}Kb+UneKU<8ZA%;7TOU96 z>^s-LyZ!MOzyA8sncH{H+_i+ zE9-QH=1W$pMA9~yR!K+LGlG2&y55B?kX|$C6>ImWS5`RqYzMvOpi-!sUQ6;SD-L?C z7GGnlQ(FPwI2F^Z2dR1Jh-jli>My*87 zeQL+a-HjXlPV0f$X_FMvoJVsbdNP5f#^31Gp3;%@T2#?%HIlZ`e|(5urA0^3YoiFL zHiv4;1y>%m{$lM+d)umlFpTYB40gzku_K&PH!KMOv6F;UN+p&AOA(ErsEN9yfhMJ@ zR5hZ|7O0?5K&S}##8>_+^FA}fy@jxfX=-2J<=nHrXU?2iraFSx!x^ohgjYAkQqia9 z4{!eT)5V{EIXk&>`oh`GQ@bbI-=4U5VS97;`=z7rZ13*uoj$iYIWxv^nG!!DmQnC3 z;U@U1HG7E0>^!V1q4y(RX%CPbgH%}i&1xT5O$w#ggx6dic0-_}LBN=$!cx5AJyU$E z+B6m>H7U$^Cr!vN2=krJ_(-uHsi3>xe(dW0;&UGeUe8~;a%uHz!RsM2P%+`arPa@0 zwh-B&dt|wm?DhHNUR|c0ls4PBHv!_7+^fNB$v>_bJ-bw)6|Phj1`fh{J z7}w)Q=#znW-ehj8)6rDAEO=#<+VCZ94Ko#zw{%Pl50huSR)YZiO&eWEf9<`%Yru2Q z4NDpBUj5ZYi3pU1@@!FZ<5hSiv0f<&@npEUsX7&>C4dhsK~z%kS|meE8zs7?n4(qm zvcsq;;T=>xG@%{(EC{^Te-E$HRrG?Z?1yGsqs678E2GgP%WuB3cj45@w`X5F^y+AP z@9o7y)6biX;Pme9$}`gw_3;UqS2;vc2HLVmRh#S2MWS$z?IGJwxOfF#v3bw%H1vlC z%||aPUF!7%UJ2+Dew?t}CDcj6tDd343TY11+^e@!PBQjtvC~n*mM;y2p7yi~pRN^{ zy3rg4yb53Ik6pj~?dw0Re)z%Vuf8?8>u2Aue*f4jAK!ZP=J{J+e)!V-tT4KH;Wh$LLY8^Aiec9#JRRe2C|AGivYqhwO%#X^LkPRGQjyZL00Oh%j`AXUA& zWu#$Oq*N|JD#V5Ee*yRJI`XLFoMceYCm`MGTuCLoSp2~MxKR$;;Jt-Q<64W6QA@~f zvYZ%|c83ICYeG!*_8?hh*6^t2AwEpy8sQ_6cLYT0tOJWor%$8Y$6`wbJPc(VOPt*T zby^{&bJ3CRmn|`j(e1Wx(jslLq(N z-Mvh*lt0p%>~dvekVlqUZRMe7#qziw={_#_Kd*xn$0r3xrw5pORVZoRH+&L9@AV$3 zcB45UH=V9K>Mo^c*UxO7Jb7wsYh&ZgXme+MSB$cI>tEJbOT=`Oysx1SKkHZoud|yu!V%-nn)8>a0a%A3pZ+>emZ5 z&fodSVnyFR|K95hwRD6K%+6#5UeR|Iq~iO6T87XeNba>xaS#qTlnGrIMHO%z+5aVH zPlc{e&po|{5H@vU6JFt6|4N+zPV}Er39A)&^`I~Yui>{AWkO04?%ROZZbyTjbpwPP zm7Wmr+I9L3UY7;00ja&6Tb-fDPk2@y_aibm1%bb8heU{@JS0j~<%zyc+< zFc?)f>yG+tFi>$3u{En?Zwy>dip45EM2am{Y~Z^xBz7$sZf`j5WZt4UsOXFMi> z3%-vlilK^B%i*Nzo`QO2 zTf$c!F7zf%vQ>C38Dg~}=}Ni@qb_t66t;XmORFtYdKSE*_ZreyeayeTefq4?&eq1c z3){Qr_I5s7KfAlVyS=@)**x*ng}sXxzuPeGH3;1HrtD}P-mv6Ynv|OqsTC2B;odHN3kj8S z>ziNJ7c|YxOmtuV^7_@QciwyWy_=u*AN~B36R&)5^U{r5@4fQn&BaHj)!6_DOF*qr z@tEb-TIs+T;XtCR9dQ~yPDx}_j2oe=eMTel{D z7Aaf3%(G@jw%cs>W1;Kdrnl2RWpnVl+S zxVK;m#mqz^kqT7ka;_(b91e%Hd&q3L7fhuRQH$4Nh3_<_wBJ%xqOkN2<+)H{+uj zbjg_V-j|F^%uaz0Bp@tKLB+`>w#hhj200l_%UFrkbfW!8>J>|+s|fFZCdQbLf^U}|Ya7plde z$_n6(+EEh+#oLEyd82WaBc^TeN;O*j@(|tAb66L}1ZA(8utFb^FDrR@9rSxgW)~Jz z^jRx5@Y+vnGYiB$fl+LjKgKRr0xL%)x+c7u_QUdvbAJY}u&yKfSaQLD$psePxwiVz z@wwyc8yoA-9y>nTIJ3SsckJzxqql(9gDGrd|6btwH}KjwGKYls;~+Jsi86LI4hbJe z!0)Ofv`(_GG!abZa^D?3;?gD-dB`4-8G47!wIaQwA|A~ZpH}a#0xh|s(glr|)0ZUb zpZch)vjw+gv;WjUK7X;;MMTsI-kLWdv1OoBk=`+6LUy6|B)LU3{3EE)WT>{) zdq^`Rr}n-Hm{$_ik|p=^Gj+MaK@91qL&0Lo)F^#4CkG-)fiwB_A%iN0vvN>t!@`m4 zuCNMNi&urxEF7aA$88+Uk8Q4kf(6Y5@VZ$uaYHrX3A}pAyXt>Zgt(V&y9P}-$7JvW zfFeg>@GoYtaczzaiL=3m5F8-ukwyY|!HS|A?HrS(u!6;ETWAe-^Wr+$c8d}OL|M!5 z`sp-Oa^FHI%lwJHsvZ#wNK&kSv<3+&Lc>q;$D}{(WOcWrR23C#o3-mX1rO~g;MGSx z!U2gQtbM>&Xi)TpuaI=Yi@Jd>asH=@zG=qxC(VPN2^_}Ljzl_rFp44pR)ut$3v|zR z$sV-ayn-X$s5+1X;W-^9`gwd|MS(|wA$Sm~IOG*!^MS&kxYgvO=j}%++Csf)KhB<*>B$zSW zYaMt!R)N<*R{IzUTcM>n;C1ckr(ZaC5@88_t-#>q6<-+AFm#>^!`uWC<8z<+F z{}poT@6RviO@9rqM8+AIOBdj^j9bMQVj;2i3ridh-YYo@f9L63RtANR0y>^>o{D}!z}wn;|8xBa0C5Q zsj(g`&5wvq$)caC4tZc%@sTCHPOMudA}Ru!P$hT#X56@#&u|wNdQym;oqh#g^&1;X z;8pC2G=rQHs`Z&_?5bWWMU&f5IZCOg_NXa*$x78!3M1CB$vgTAh9WVX)y5Tgt@|r+ zORS+)fmdcgct6mU`mQq@FvTEka%oTz24zYIVp*+rk6L3RtPE`Dl3#1An&Yd9N7AKB z#wUNs91?b$pcxEoaIb@2?1H4j6Nn;05nnohQMlh7BhIn}K^<^R9SN3wGJN`bk0?Q4^j&ubw^#(CF zG+*>Sn#_%j`eSvm=92n!#*YYIL03B?kjNeDF0r$uFW>CX)JeS;S6<%Rj zZFlRD{>=2^(UnIIKe-g}dQ7~l$p*ez`{m}w)jN-FuiiOx{mR>SRyQ}UT>tR=trNRj z+VQG*fHC5`3a`)pt4*!D&jPPTg4c)e6P`}}?I?Y7NH{Pxqk%7oV8!mn5EUY}7V=@FA56({ls zJ`IQP)rkph;2=p3#mhAjq>#MK+KLmd6MEk)}4-G08nJwICPG9l9XZ}O^p)!AjEG6 zlfz@e5T6D+!Ys_`aD!{#_A8TtFl3QMLjAhFt6>!>RLm<+Tu2E$~uP~7jS}X zsdXjk=}Hts(k}i(aBoa4{4?owrQ^U+z(BQ_Z7QQ^IlNkpkecs@d*clCR-hY!wjNQ% zxoAl+o=#U(MeLR>vq8$T-1$!3p!%jVP@>Qv4ioIa<-)X|#wQ(K+3qY2l zWUx7I7Sm59z27q$41ieF3mjaV<2IbM@IorzgyPW7>5?4-t9CHn)CDR3#eKeaP{87g z=%?}tf)K^V8Pe*ahrrr5DA66ML70Yff44DY@~oo{R`=yo6LwyQg?QB1*K##X7GUH= zlYpY0?U-%c%8Bir)9Xu%39rZo9@w~cd*{;4_s^dH{?QAUwr=fj zynp-Zt9$$Vw@=I+2T?09`Cn`cxbuM1!0VXtF5QIJ3{8#2mI$+gXC5B}yb5_zT<5_s z`+cxUlVZYa3*}8@cqPSZh0lQ3!YCsJ<;{7u#}NY~-Mys^EuVD=<`K(neE$q>4rRR2 zLxkVz`B<)iHbwfXba+({WyxFf74;51D0wdvgnMhPuea3 z(ioyCLKI&hS|z(Yk#BEDpN~(YeW`(w&8Jh0CS5JzEv4V93FimZG$~^HuS+J z*lvSYxK~_=BOK^<03X%UgaQ#jHD3{cGa0_MHZ>uAaoqw2H%ntfZ}uc6aGEs8J+1mj z;%P2usBS;uXY;BHzG!>ql~O=ea1qMy@=3{lMJQb+#Wk9zo^+rwGMbhBKIp1}0~D*k zPBTq-R^Sz{iZ(BW)t1;({ev7{-KAcHcuHNZgxC7-;dS)tsh@W@e>pq4xVLrj+|iYz zixLh9UX2#c?qC1z#+8lD^FJK^=+fI4_rG5M zyv)`Xkv?7{%1wr(eh~W2A>lKRj03MtSH29z<;m&kNpr{k#4xH$(z~SV%Aq) zVwgmd_%_Bv-S5cngLlh|6evd~g#!Y39b|Rik~V=D8kZ%MW1}2ws{2q#cQ5z+6%1h2 z2gH{TzpTmJ<>K|KK$j)L>T36dfe_^wZD&d{HjR!o#D$d}LJ0!eMZi^pVc)X9H zg37JszbK4o1hL?&mde0QWdqEHQU#c*@EU4)G-*-^uZ;uXwMb;;R9-E^6y%R=@yf+K zUp}e|h2lL`=pFkTcx{EE8yH~UUJSw^1kaAePw-`E%qm%2R>(rbg-d!VP6`Y2QkxX&aUy4ODb=z7Dmhx$1LJ*ZXX(N}@Pk~lsp9Ob zC0EIykHB6L#^Vs!8Y2M=6}3*`N>X(Mn@oZbX*+S4dC44cDy?dr!OyEKC@bH+d{0&aBsIS*VK)^t zMal7!6}vB4M}L@a6B;Oi(mdGZ=lVd1)inhYgIBR3_)9mDS^rn+uC2F?A_^0y7#G`k zZR`Zw2@R^-Tp)y$I%=dOO@UCUb<(DxsY-eQC7};d#0wG<4?IOG0tv;y1G3?v|CIB6 z=bX&gF;Ff-;%l>)+1c5dUGF!uXU>HR1|x+4`QR_h9ja0U+h~AXA%ewkm$Rdn(w7S7 za_Ojz*+KN`50%4LZ=B}uWmB$#lC~!KIL4dIXXSbq`gBijspmru*2dV?PO8s2 z%+kYQs(grnMaUt%o=UIj6PtM|yb_#>6`L;x;ts+AQ_iC9+e;_DCwn~Q=Z7$AQhFux zEhxS2J{&u{yL<2PjkkC9H)>7ND~FV`Yl~lhb+k6~^}Vk@|KjU!Z>&H4^8Ve;+36b} zKe|0LYv_{+=mPkMdaqlQy@FmT>`+Gv>`IJXNw1jNf+`%wR`NVZueA%87SDe;Hovqu zl^cGmRCr7Jd;1as)W@%rA)koTCUzX$31Cjo7kXMEZ2Q->4h78_VecF6Bcjkn>q*ux zE1CH?l1ryGgJ<9xey^B|N1R@PeuMYWR;#D2Qx3hH*O6k0es*P2Os`xR@B$kAy5Yj{ zOXy++GEo?VI0n;ek9BIAVCCbtI$V~^Y~*l&@U?rz3iLWCXleY6waBQ8^fvTAeJ%$( z%i_VP)IhHe<}!pj_q%9tKm9^2I8nX6eE8ieZQ%Ml$sC*^_kD#lHD602IqX3j6o z&0U*wECp!7wQGJb;Qa3*%HSJZc|wcVfyz44|K0Aso$Et>vLbtzh?d&bl@2AoKhs_G1DlST=e!xP z=pAa@n|qHv-`_PCY!L%}s%A$X11ld|5ho9VUu}ZGs;6yv%5FVlsJxuSrVTD|LK|xp z#tGp7@+0XHsRHkFUV-D-j;Ev@Gs<5YjL6RdoEwxA?1dOec}d5}?zCaJn<2gVdk3Hf7KHs2U{aLkun2QY1Lfq#bHJU!dQ zpyTHaQMOtiCTkLNY)t-DO6c-LUdE}detHGLs-QK<2Hc-^px0yoy~@AIYYUBqJB#B& zt}(qX&nUlMY|X3-me;P%UYvnGEPcDIJG;iAW&RnhvSL1ZwW+OF(QO2JJ$s@#;KG5N zsNTTcy@_IqS5_bVw0V7h^QFD*`};55*xz`gRzBZc_yaVb`%ts_yLp!c3;#PTq2m8t z)t4d+%+NdqPwUImbI#wWi5K%9|a`{q^}zukUT&*x!8n(f#emXFuEDcxim1p`9~3<39y5Nw+5b z8aIgO@T8#DhkBz?7c>O6@959x8S1s?!%3B_FkGhgoM>o;2EZFoR}_oL$uo#QsgiH_ z338n{$qOD-p%^_i>m3*2Z!k{s%91ByBi?Tmi@bK+aP0X?HcpjE@X2y_AozIer|v`i zyFfzEZ=(TN=HCYn`U#=B4i+8GXNm|v%4KC&%3iBVue6H=y_R7+O2L3Y<-6chBPq=1 z8q`0aLuF?cQ5p)?)GiJpdX2grAu}`xrrYPzXzEtPj@XSbVbO>U_el}zk*Ji~!1)pv zu?H2&5GBG>D+IQ@A@Z~d)e696)fEnHY^}X2-YH>Kma<;95)v9 zn#(3d(kq!vWv`QWpWNM)FX{b-~M`gV6m+w7ZeYn5$_`!`QcWysf zz57&z1JaLH`8CWBP3f&X!nzP5vcKq>#w~O)T2ja&}zULt~+!Qik5?B1@;HCJL^qV;gC-+!$n1UuAZl2DkyB z-;2i5$G#k8yIF|OuaQpl51Rnecu&;TuX$cK_gVo^VFw^~!DAoE+el2^{F72#pFC$nv)j(ZupBJa77+O$yV1~nsKYB{2$RP zt+U6V#!W%NC^ zJ@|HRYVTolcjt`Mps1a+G@2{R#s+OYs+F;HQPE` zyErcXQVoFb?tfd1_lpl>BKM=4j8?vCPdsCi-PUKfwVoohk2gPTRNYOoO{|}a(h*!o1KiXdeVaX<#q~8gkb~tx#Ucx zZ&_7$kuT)uWt}tl3VLaI<4Mc!8|t@3SsTq@E=x94nXNbefYM_~^1z>7qVqz`U3A6~ zYJg2ia!|h$*-*406};GxD)Ari{z}IrN|*c?bvWwcs~$5vUBY8x#)&sHb^eb-@6}awh}8 zl52V(oz}GgI8NCx`F(m#GAE45=P7G#0)IsDD*%2?2GOe%Xsjwhrg!K;mZk@2Gyp-s ziTYio$e5;p4qxT6m=^IVgj5D!Yy@T%hw)D}NjPO&oFKh&PRmFK?5f)uy`V=i%jlJ| zSJIzp4y^7x+1q=%)7W_M;L(ncUTx^wy47vp>UL+3ZnlpPK5A_pw2zMuN3X6NbdC?Y z$1OQ@YpdH@Yq!_B2UCab!>x9=<@EX&WUypa{Poal5%gMVz~=yE$?o+PtC(IzqmP;c za+}MTvTsaHFV0PUI5oF8`RVlJ;?jrZq6nDs9FPPm$hcF;_!}qm?F*CW#dyJl#wTZS`ZhzZaGt25UY_}0r|Wqat=8wJF-R2M)w zJUuAr88UrquT5w}Tpdq{!6Z+QZndq0<&tOakAjP{3|@C#8lidH2+U_?NZs21kY3HK zfF83bYsCXWJ4N>bx~^i#m??42OFnSiOq@@H#(rXv<3rcV71ixk^BN823M*?vGDI_N zb%$EG&c!CFAFn~$xmg*eW*$pIGX<6JfM z5YT}3Bd~ZoiC)U#M>Pj68Pcml#;l&kan|zK(C6;yZ1Jl&83aa8|FHzsU$bsy4mTryPeKQS3Adt-Gi48I_=}1 zJ6Er+w}1JebKHIN)(@TT;g5&ypC$cxt$mE#POr}&C6;yZu`7TLAHAyHtBuZI?87Tc zue2)G;8gqt7N*35<2hMYr>DzP!metZ1VN87lfQ6C0W8`o1x8uI-V1cyd_R~@^C;cH zNr=;lVw_&FR<1&7AHCA`CN`^{M9|T51_uGwhu|nfSvBia#ElRIJPd0Se~r0s21ZEF z8ojb&K1jvE;0KAX5hozj#~+!~*|nhj%B(yM8)g|B(`zrkYN@gJGOSofI*4ICgP|>Q zmy~MQ1Z|Ir3(0c0I;*J;di~Mp%V}P7^#)~w3aAiT$;zrV-fj@8d^4#OC()2IxdK#flR$I$>SK>X0mkkLb-1V zjVVsl-RA(om2dhmHjWevfmASx4fNVv5(O}weQjEbT5Zi99d_E?XF{)s&sy&tcQ9!E zrqkKl+G_v!L#N%j)fJ9yKa+9nap$|vt(Bv0_mK4Z{LZsx`-9AS952u-`cl&COBQWQ zLDg6Ketp@61NNOuv9$OfQ71tR3ZQ*-S;I@E=`a%SwQJ|o)k+kBKF}-0uHX_`8@(zu zYZkX7b((^7z{qGg%eRZ&va*f)mJj1nM!Oubuxwele{(t`bl%r5W^XrnHEr@ES#jK; z*Edrzl!eOU4`8Egfj5{DbL23fWJr1?kQ-!zwIW5s7N=K$?%*7}Z5H5;^-H5VfnFoe z<|HVN{$-g`zBG5ND9F6!ByJ&_HB-?u2`G$gPE$C(k9@lYS!QP)>^2xRveovPl16mX zJZ~h9x}?rnkI~T#MhAL`>}pO!bJk)uh~})4K$772QQvf$q1zRR;dk4-9 zj`p2iIVnId6(i=a6oUf#m8O&)cN!-cE2FbeStA@0Lc<0xyt>o&?jC014GhyTW0;$l z@8_EE>4nRM;!vel%Vcu%Z@qIVTN^(wkSR1#WvXT8FQhZ$V^C*ma3l%W7%4vfEJ{@? zU6c-JLwQ@su57*R*?qDDrr|woA5WxL{zA;hj{s}f0J`_&61rFYZ8+!~LILOX!}M8r z>0Gv+8Lri2PPA64)W)w|g1%fnU8`p+jn%m^VOP+r%$5oxgI+WBj2ILY>b3gV+|t-& zP4qv<>sgLyQ>0gE0H?N`Ud>q4aW?vvmL=F$>D3jpmfayC;i@l-j)jwmt%vgYf7rcx zQyBDFd!_yCxYIe@y1Cwd*6p@`Y#-bbnL+#LxP8$1?#IKUo6l|@bX#D|!I2DE;$Q@J zb$Z?Ep;tP{!s4vbE5TqeNsjay3+q5sB(o8ybweiRe(_#6d7%t=NsOw$5v2ytq zd*VFugM8egT91;2kQFiA5Uj<%u*tnV&NmsK(^@=`H^X<9fpktnu@*$$jG)tiF7u#; z;LlIJbR$Sd7N^SEf~@2?c=oUuBr(*-hqVmnrzaz1j>;t&4h-Jqz%dC2wf6oq;0JcoSs62n%(B7umXC zUJtcHus*Gx2^C6q4G^l8l$g+2=j;*>K*R(z!LLTo56<&o(wqRH17#b{FxcrC++P%k z^Nn6#`;D|~|B9-Nq75@^0B49HM&czp>cr^6LS{r*3kz(379|=6EMB63x=O>Se6}=u zmuXAuH|>}H)6U-e9EZx@M})a|?)~n)-@V_y=R2?63XLk@HH*t3SU`z0>>2Gyba##o zc6KIOUv4aB_U+n}>ZtT*(v`zw-G_^2YO8N8lsa4b+uJLhMGGo!ZL~Fgr7pZX>;!!P z)T;I*^%n9I!cvr&)Qbq0gC#OpV9OyeQ6$I>m$w^=ee+&^gNfC;t=>XT$HNr_52B=@ z#`o+jg>}uHyDa^yQmK?H+0OkHJLkg#dzyB3R!YgXUFXUZ`#M|91~58N=m-4fn;ZJ~ zJ~vP-cI<5(?XL9g?Cvz^?eEVF5MI3wI?HL-DrPDEYKPZvv0vLWV);!iYwOsya@t2+ zo(->uzC8Kl{kNVx?C*c`(WQ5e9v^@B)&^6>Ght~rwG7dBvvOe#XYa#X+fefa-|CKy=B59DT`9g%R zWRRjYUBinWaC{?t^%*+HdXCsfK%}n0dMwZuSPYsgH9%uZF6dODDWb76DYD3?9HM|( z4sbwVTg-)tfVKin8NAvyJlTL(P5ps5HF$;Q0#E|3!k*?<0{6;+QOX8!D&SSjohmw@ z3V3ONr6^)p3xPF<#ZSoECg>QpMs>sXQvI#0;57rVru7BGO7Mzro^mn)fP#uV15ue$ zP4TJBLv@tHOgea$cO`fiZ5iXtK2kMtH8DYW)jbuwdIeCsH$DPr4p5KFqg6{H6?WDM zm)P-M!{I5svQVKzF!$r9bjDMV^CTSLQ=utuozPX>3v`{B*gIgG;hSW+diBCQ$+t49 zpF`!2NCW$p^AUD@_GK21A?R4!E{#|28P& zFjPW&?e17w>dme!Rw~`IXOD_G_WaWP!ot-4bCYxHQ{~yk z!qC*r%=FaM*hC9n4EazmVme}%WN#e4yhBJ|{ODh$hSi`RxFwL#Qp&~^r|`No$^Evd0FgR^}*`_E2~6UCU_JTe z$47mq&GGf{$(N5FJ$c{$Jbv`fmk*zeM^wPSOOM@7>%ARb<=Ub^d;PubRq&b#%2l_8 z`|K|rQ+L6u$g2!?Np%1X_xwvjJlBmUP-|0s@EbJL5 z2GI!i$9I12HU1>7;B+6{Nt%PINH;+f2*D<(*t(UqS-&#Ll=E_lk3;Q*^$lea?VP<7 zqhK14LmcI~h|z#FhT?CiRYyp;ASxsi0~heDsjrNjoTy5T&+uDbP%eY2(;Bowb=3wF zsUgbYs5TjUf&GKi#%eq*wJK2B0}dvDS&ekYegLn0`PP}KLR{f`eNyuUz6dD9y`?w- zT`0<8W0`l-T?48I8zh)45=^p5uSJQ2!YQxI7Bi%7wMknIUOg}i@CwNpK3RbAzKJs{ z#oqJF<&o9Z*>7g1znLs&N^=X1<>~c>jl%H8^6bLg^7P=$H!I5(JN)5P zr4yI#m5$u7FVCmE{%%TEZ8kTI5_NHhqEH&|Zt$Z;C9D)#D{C||Nuq67-jlL$^MG<` zg_|+V13IJTy4{VpKEHl@=tHaczj^nAkFKm;-D+$p75eXA|8#HPt?QRJ?^ew0Tzs%u zz4Gah@immUuC85qP$})Z`rX$bU0%CBRT(MV+x)Jpb%=R*)L#wo177983Pn}Os%0;l zg|%3=J;V0;l&;{J%IlF}**?^E@|T~?_%lym{n_ zNNnTUYQ#XVC%opfU?cErGko25IDPTr$jHVIbMq@R2hPt;9cjs}F8fKiazT z;nCjmz$a^$ukP*Mym9v0=D*&yAiNxqjv5wad3&o~z!zUA=$1`q_cK zH#e)-zOL_5Cbcuz5MKAT5_}Y!wIkq_el1C?b$CrCKxKFg^;|JiAKZ?vPxaT4m%;*i z?8M2FCoi2mIQ~}1`1mn?du;sl$+yN&ynpHBID-sMoIG^w(23Vizj^HS|ADQc^HO{5 z+^L!a?%0x50P$E7m$))ITqIl>*)iEoc%z8 z&(=@agbp!9AfzRvI*(4#)zU8Evq1q;TNa*r96EZ8I3b=vw;pf}7;c!)C}e?)$5~Yw zx{KZbuF3QfNg23qB2KX0i#dnKULXn>&Xs#kJKfczwQ}{K-2FUhD8)x63q($gbw@^^J>XrZ+aGC+Anr zoS&M$I92J~V}^j4#fuB8rOB0r`PunXmL9*nuzY@W`Ap%+(!IIa`HS-guhiXBwE~Ue zM2?=8PN|+^8Y=Fp6jn_lSg}?&jvHg<0UKm8b!#6+ZyK?PlZ)M-T3pcL5e5(5C^qmWpp`QH{Uz{EO|6cT85CcC4D3q(vaK@15o0k1+Zn(e4mY02rX zoOC3%Y)A@TUBhUgkc*wrCn41n5jgU(aT<~iXwy6efF|J;AH^I%X|skg8JBs1zjU}J zH#dZHC!BJm1+ry8oWDrq?S)GoBA!+_ ze*A22~EA)Szw1Yc1XAk68{P+}7N}XT@w@JonO+G7#<+ z2yO!BBpcw$fY->eAONB8cGHW*#z?6YEdFEAM(f3bp1WvaTr-B<3(6 z@$^8)91_`5Ny2Mn5lCl_>;kPKyoT5V0IEYuGHVL0J5RkI!kkT#rVUI9i9uQELn z0ys%wv`|izo5?g>(26?2#boI-an@JGEFq6GlyLm2@i2=l3s(CyiDRg5BSPGc*kLNC z{d9D|0Fsc;!I=Vja5QnUpmVU2^j&F@D2aC8ShFg#V3O7Um8D zvbsQfrlI7+2B_dxCAG4>4mmE-=e#>P*j^1uK{<(AphyH}7&GWYuV|9!(B?u5waz@B z!r6+zpROyrlzfAd9h%YzC*c9Ji4IIz+{}>^Pmqkv{w4&t!nV?r7LnNypa&*NmR*$n zk>+7^3_3AXLAr67Q;@Sy_6vOVf>--bc+G>&FOeoUJ)%N)4-a-OtuC%El!nh=Tt2^e z=9{TX*TnMr^uogG!fNm6!m`Qw(%{rL7uU~htgn_{I9x3D4QxyoT5z|~dBigjeNyk# zjisSdh0*QBkdI3ADnB_iG(@{PgIV*zWFL{PIgOT#vo*p}kk3a!OW1qeKtuvFe1p5% z;#D0Zc{kaXYumv2@k5-8oc2V`RwZRqd{axH0gkyapT z?&$1V=qn!7Ox+6u2TuzeLw*N$_9GFDnh0KP0dOk8dhQ#z_)O?L_Rlfa8;JuuyjrQ7 zXTvK#hW46Bx;lgTRs?<`1`FaOK@^QqY$|xInNJnG?|G$3Sta#ot3rBKSQ;vsl2&8{ zr>DXVoZzbmyoQ^IhCsHIjf7WC?6azPKp-JYiPtfr-4ME9M~(B^4y%(3Y>&uyo;W@N z*qrIbMBzTcr6pq>^j*Pg#*NV42yq*qA{By%@~AZqA8O=1nD=Cvn{-J*=kBL#>(vc`GxiJ{v)HNV+~JDjtnoYPc7PJll!tQ zok!Lu_fSVck2oQ+Y$hggmlV#&#AVf>t&!W%wu&yKalrolHjND?0u!ylR&s&C!6{b= z+Ij|YM4XG)Y3Xdgx%S!7uKQ~@+dFsPz5H=`I&z?9`8+#|KA059}-74O>FnH~| z#*5W2=GS*ku3bBNx4Ly|?RL5HQT4%*{;kcm&CTjZ-Q^Y!h-|_Qd8)nE6Hf&?{Ai#m z;sOU&iQqNyLVEo4tH=HVUX=(ChQpc&ekmXpe+B~c5IIvGicq~P&l@tCMn7(E+w-%^-8zD)2c+biHz<`wHj#WZ!k zJon91Vfu$TbCWNu?=LT1oG$On?(E+6{LICL^HU2OD=X_~RyU?6&Mls)A6eNLS>CY4 z)r~W!DoxE1_ZVc$Dd^b>2mqpzI~=NLKwpD=0EE{>&hI55nz)<~hZuubQ%P3?@E2M> zU7I#0okmM;EYQmG=sFdVudytCuCA;7j=8pGu3Rg07M7~jEAL)?<+IC$a_0Jty?ytq zS1*75!9w-^2Om}6t=`yoyLzwh)9Ur=jjwK3w~pVfRaJAC2R+0WnI>dPmaVfIQZ zJTm3BR}<4<9bWO*USf?z+HG2`bvoeH0!WfWZ6{6~eCZGP`fM>Ig~UeMEfBW`jPcFy z_x>m7Dy3E8TC5pzPq($C2(SACUID8V=;o|RD0t24X^WgC8YGiROoxLm$aGJvK$NFD zsN6~GvphLyLfLUule?-(4#XS*)3c=mi}{C@>j7mf6)DPfTgI5o@En2>M&5Z6ap_ad zKADNo0zjs63L7A%}ZXF3E_&QD~;#LeN&6Q&qhUJ8gy_ zA8JWGeygoO4&djjOyUM4|8@#qOS1PTO zvv03Yj!jKXLk33&7v?Mb&0H{ic5-rZcz9~8gftLQXH!sHil)~Zu_u@1-xHw*oT&s- zvR&v~yn*tr&4=(5hx8GWPw_xHk_W)0NEpiGOQCCssw1GEi^Dgkij((lnLa-C;MARa zTlot&`zw`Ow+f}!Q=i=#D@;8&J27_i{_P7BlMkj__C5Ic_EhECm9vGVdpGYqxV5`b zIJ&h}DW#g}gof1M)sPdVa<=)g-0WHptE{_(LVINrM4hRx2LmYo240_q!Q2Zw{?6n7 z40!!7Hdy;P_Uh?_%{w6nc3Q=(aBT%wK_jzbovk31CAz*qcx8wuv`xB$dXjV{6K7$+ z%q00zg)xg!;(UDh>|z1vDtP6boW?y40_?+-aYt|S@rV1`9z6{|;Rfe-nk?lM{!VLc zS`Z*>tfGbJ2$zNdn8|cctsn6*BX^6U!8g2YaBnNlgJ^X$*z`tr{rmk zc#lVWfzd|>8B|0Q(yeRon$AMO!?MKm3BfDc&O^t}IlStfL$qgKy1P&MYh5i>gqc8%HU}4k;zvM>}s*3*tXr3uEAnoxl)=i88xv4r;)*l zQn_zOYinO$1ynk;sWwPtP|ZYfLUcA}Ca@*vL*h-N+zWq0S%26!wv|8=kjme#-2=C= zM?R=RF~OncO)a*Du1;t~#N{-j&7xdOqX#M_tH`^jP+#BP-rxFif3ecuUM%*vKiA%u zFV$B@C(7lrZB;(^%7KY<=SqW{-*p~1S1Gr)x9+w!iv4?bB6h}tg`1ikUL)?+&{Z7g z4naUyt*TWel@jY`n=((3&Hkz%!E)lIH?Lvp0AlTY-BEdg7NUk7a?*e0yM%9IpX zFrn(Nd&~pN$F{Y(_6jVgS{&J@0xPNG$}a5zPT9vGRTO1vE&*e-*At1@)u$2nyuJ__ zQ8H4GdN`!1!V{RHDx#+8Jp*rDdhd-l-h1yo`)~5?w|LR z;7;_YZtF&Zl{mZd$`hfRoski)vtlxm1MYYoVpW65CTnR0fCIX=5;Yb`v)fqZ>Plfp zYya-%)c%eROJ15d&}l`aEYZH$-``ivG$3Q2*m|IMwD;V^{>~I?oD2+LrfhH?2^M-x zY1z-#+etUjF3r8MfBearrLi7;1c!}@0B8OZK z?6zM?JDc9dsVEGSI)oG_G!03hQ{jw63o{4-6Co5@K!Z>b6(EFQ(Ji~tApQl5k-Fe7 zbDsA-Cr&9J3(j<6``W&~zV>~6?)f~4)Z(WAYe1C0!HC5jtxgUI*z(cG=cdj2<8^zq z_~r3~r-aXgo__Z9-N-ifhD{s8_M$i{u{PgWR5igAyf#LNf z!Ruk&q2cvq;Pp*Hx)@&v2q}YLGHt!dPqJHW1^q~OC$_ObwDF<$c-m>(EZ`Nhf178? z=SGuz?Dz^^k>sb95AT;*D^0Ntujw8%Ff*0#TIg!mN12}XVGT5?9q{ zD6w1pdK2`l=;r2|Zy#-r1K{d+bWisOBNkA>L}oqIgW1^cy+h!;I-rp_A?T5shF~531*F9!E170 zV;J-WZ&Afdgd{0ysT+6=gkgvO(^7xJE#$Q>3wU+RKErVQCC?^P7|%Ogbw)^aXJJ%= z;%X0GAsJ>(2Rk(44`I^Ldb4?Q)Q->IC8q-D8fBZ!W*y~igv)YpzJS=bo<2QWwsE}j zi8;2{j#4Jfq9;1-AGdHJQQ`hB<|#>rS8eat>$T$^Q)?~p)mpDsVedGQY!VS0Y`ksT zxGA7D1XkypHd2f?N+S}nTO5M$DfIC#kztEoAlSe9I93;nVvBHmH)Y|Qycgdj=}QG^DSQn zL`N8k9YhH8jv!F z4W$$LzY8kMJZKz3Aw3Y_HT^HK&F2EfMxia|2sx*BQ(jN0R|wgOf#<{-16U8+pI|p+ zT&iwbzK~qC0@iAeOk6=pHGb%saK?Yu9j0nvt|{)4fPoQ^HUEz1=)>k)!7?s#?ZC1r zK6hoDPp?T9Z%W~Slr4tW5fUr=@|`M5s=)I6$tIAadCcXO#MV|Rrt}fduX5M0VCT^h zPE7Ue!2KjWJc&wo#Hv>yuRtt_bN2U1*6ZkHZcwdi-aooB>8hukFt{r5OK}9zOtSFD z$7FmEpON+X`uyBkIgcg*#Xe~n===a}EEuae+mDAje@zVtidH3lJx+Kn+!3Z0%vwC4 zRa+E<+DF2!w~i;8A-QW$ zcd}Q03to}Drrj&diyRs!sINv~q1-_WJsSU?Ny+0`w1j;)aGUQ$dTD;jsW$rH*Em*M zX4<+Gbux(IgAK1#q48AGejrJ}>X`Wn8f18bR%~|%rVQNy8D6;=S!gv_%O)V2KzNRk z_;sEplyC+#r(>04%leuX(E_fB4I{l86~a%yMa;&4aJPm37)#Kc5d_-|b&a`U!z*;$ zUcI>Z=9`O)fLFNK>+8!K!>jvUI%ZfmiGaaB(LA}-9lV;1OAc!wYYXY?RiueJcO;{F zPcYIqM4hc!Hr4Z-JHhLWrv?=(oX>W_Dh#jnSNqNj<Lkjszv?ph##s#SH7pnOWWJ2oa%)MmUnJ(; z@rd2BiPb+pQjv8^ftv@7eqX=M%nANoKU8#BUFEsXRT@y2x z(Y#tVxi)W8^eE)DgLzc5)vRnA4@U4>_X~{hC33V1auAJ0l4AsHqk~!+#o-*MQh`;)^p?j^n;^tATO+mx?m$MS7=hVow&J8A zDM`0jN8~P31F7{i{mD4e2qKxGbGVF9F}acl$IQGfTydvo;Zh$ zgMHm@uB0!%dhp$Ne0n+y8;l0(CC~QLft^qTsgakU%sTibf z&%KuPl@8X@@v>|NYjh1SMrGuv{cy)x0kI#S2DH&uc4z;7#d$OsU2te!>pui=$ubZWcf zQ30=DEh5BSj0vu(*VM5F888b^Of$BW#Iu$hOoVKx`~|N>spHvLo*MAVrQ(Mqa-bh5 z8<*C(=Fg~gBnHV@03kc2N-ZBK#&!|1;69es&U8vhY|DCta_puR39nW!5YY~~1$7ej z53+EvG1Xfu-fu>&0k5`EJ22q00OAd+Rj^voOM=%<JDr}0Wkq`fyfx`CMon2Umu7<*Ga(1KN7;HRJF3Qk?KtTy zd46(4@4Gc>9qQ33CYPJ|OuD&JqlevvW}Fu>Q0 zi8MeT_oRD+X$0Pg0^_(?HalxPa)J*R4;;f62aG1L4_1c>$0A;Oo;lqnS6EnxvXPRF z!9L67FEDQK#&8a0!q4kM!)5S5F}f`W3&URlM2!M01=7iNOVZIXj5_!wrV|ALgV-rG z4x01dF8_c+J;+Du;_~?qj~wV~90Mbo&84_4H6PeuO5xXx7jANp@XA;ZbS-!t2woi{ zRU(v%D2#luGtjP98rS@%Wqb!xE^1Irvp4##&urwv3c7QTqDDC-`sGF7T}PJ_+k%oR zSI@h$J9Svwcn4flX4~w}F@VIBUf&I?9gUeKLdb~2NlHEj6b$v%wF}355|4E6{SW4X zcc2gHBDXC$Z$YnBrdW}ZJwbt?Tm)V5ycxnDdyt>0B&Qsd(v=Dj}{ffPj@7m z6yItoXQq|{ypt>U7ubDx;6tqk_V;V7f(+MCOe~4j3SJLi172m+D|m(YPD{0gFfQ?_ z;5FG7%|)tiOW!PU4Dx77>vPx%`}~*(PTf3mugWW8eS$)B?nV5qU`-lqMo59jB!Gi5 zLB1?~OjBvOax)(&VqMtn^b+7i2rEz*HmLg@F`%KX*%%uSxVw)=X~pWLRo{(Ap}1|w zOSMswJL@PhKFObgB(}u`=LSla79{f1#2IM&-iyl%2z-@*;E&s@%@P#i;{=ESIWnsC zkZ>kdZn*e+!Iop2R%$Fx1odp5iVPYplf&oQ=KvSFD7A*)zWBwx*4ycf{#2bBxw&70 zXio}X=mp_2E2H9O)f5&IRk+`*)oNW4Ewc6sys@d7L+~lSbDIz~)HKEfz@la@T z#Sokqn_Dgx)-r*}Sw3;vVW*@mSAJWc+0~<1#<8iEsl@jV{q7~e1+MSX*lj7Ktbtxs z74NEGzh?VAmF0lXhf(X{^S;esM6*#7KHqhV`rY@=&;#Jgb2cOLfq-4an?;0cC6Tz%L57R8 zZ=EfdT21>q*&XQ8j+>9w!6^O|mW)S+EY|4i5CpMiqhP0$naRU5d0fo#%73c(H^HFi z(lf-(+hC9E-wDLRamI0rgjX(LeI|xd>vem6dV6!3@EZ6U0DEzJbv{JMf;^Y;i4?y+ z9i43*bV0kQ*mCSF;Po*6#ZWiAj;O#BIKmo!_{o>148$XN( z4D#v|ys+JCqH97aez66wDnbVPs`uyA#3nnjp8hC|LNPNY{PXh&@D0clr21`#_VUF0 zC6fyd;Ay8f9c(e=9Q{9MRC$TG6adG>dHU^1W*GRf&lgf{*;&gZc!kpL6^O_Qu4nWn zPYm{{KIE)vIW};@h3fR83}{{1=t?>Z+19FUP;!;xEY^!@mf6CdH*MFoBi4F3r}#oO zxaAiT{&JlZGjIxLNH%F2d0`0V@|kEwSL0ts?{Wi7h-Jzo*A=#nQFTXZ9C*r3W2s8u zu=@iA-MSFZQJoA|v3=(`fN;4Fub*$pX)N6pCxVI&C!vV+b{^uw+JEqI-w2C=f z`Z_OlUB9a8fl7OYeKEaZz|mwVvx;fOK5e=|8*1XM(CBGp;10-<7c1O&HK`ndZ7p9u zwIWO*EZ$IwFHb*H+U?Excefb0CHo4#UI)Ck(%JW+(`n1t z-m@xKcS<)m*um@T>9r+aM(1R+?1{mB_5hjWsp;&&j@}A-mz5$6L*FvxcF}3k8ASHk ztVf$NJMez?oWOxozn)Wz;s_*cqile3WpOOy8f<=8yB$|J8~Ltn1o znj{?U^+*xS42OkAeXAEtAJ>A{oGOR~o!x;~z0Y%- zz4(L_i_CI<){9&@!|u^$?X(os%SDc05EPVuoS9gzD=E!!8fNk16~rA7xwhU?t>~M46r}a0x|O<3ZfKpL_Pg_JM}zy(?yvSI)nq4 zp&`5!yy|mxb9?pC82!H9414QJKEpFmD;>oMcxB|Zci=Tf{0C%;78}53h17NM5T2 z1PAs4;m1KjM$=AX+qes4Cv)AJ>Ygi9eXDO!aiG0AR0@s~5t*G&+{h@1S)rMt%oPEHu8!A| zQKS@($-;8JPlKz)JW6-$DMFaGeDz$an9F^5-2$&enPKQSdWsA$?zb|RtnkRmFZNzz z)jTv*`AFKhdD;kNry%{+syBAilE7|LdTvV6YS-cN(M`(?kbgy_s{Cx0Qy(kY^*gm? zHrOTr)x*G~uUf=WIcRtV-6r2Mwi7kNAgctTM7phy0$#(pm@YJ38eW4W?V<)h;{LZQ z@jt-Z$vN#o!RxC^Ww@AnYSz<0qIIfm;b)~~T^12kk}@GvU{VzIh6LnmUWCO@e8sEA zbg+xEbnxrqG>KUpd7wUEIY1U1IO??CabfmP^BBkH< z9mK7md&x=Ysy3SaW7X!Esyjg$NtPhtHPN;26(Lr@F4R zjsx(R6$b<81Dyd}9p-GCl*kA6rx(1(SI06*y@tG;@%;~^P?>OwUU12}gd>NjIB$fk zlcUg|ascn=CBp&t&ogk$N=Af~a(w@#JwkZZJ*aC{lka1ZTG-?ytQjC0BoQp+`Q)2w zji+zueq^I&)4(eRui$IK>sOP#HU_V?l2V$7(1WK(e2+hEio;c_Q%X&uF}b{M2n<|i z3Na?^5ye6b8VN?mps0bkpaZ9+;8pp(niKgNi!_w})0-gJ27sdN%**=M*<~B-u!|uT zJ#}9RP}ODsE`Y6RdVE71UYEQ=rcb#L@EZ6k1Gn#YFH|xZFM(GP{iKk1T9c`VVcLdQ zLb~8|m!x0i4OM8wJw_Kg)g)2ILCEiArw*zgI}vKGAeNYnRj;?GUx?9LB5WDINQVZN z9bXO+!#ZQ8k|fiS;ZYcf-;~FF8&f>zLN6H#iaNU?-Mq5{!E4nzxOUyjv8;;^l)kFA zLXpicR+n1;ek?r#C|?$Cp)Up#+^Ys!LB{r?eOT^$I#?yWAK-qWnw+39srb{BTn_B2Y9hcpg_P`Z{og%r{# z&9pe`b%Jr#O=>V?S}Nk)I-7)|~N3cx|`g^$zf= zV5NhwSy&prOe}ExjMGk-`D-91QY3ZN$LQA*j&_>r^g+3##X zZxjx%WA=3fuM^__;g}&%K+Z%_CfiM2*&)FKsx9Dk5%7wq50sE<0U?SK@32{ULrT?J z+?zqnrIn_8d=X)&O#^Gzzi_WDhM`Ld5^=8(!ZO8?iH9ZI6Ss^{l_^2Z3nXAxGVlb= z_yiu&hRZSxbeK4i#Y8m$Q>?TDN zUz$%xtxwA(OSDu_M}z{XePBFuA?}DhxLCOKbz!7a39o?e0`1o<&;W}_8imC@0x{q< zISb6jI_cV%d>x#7^#wuY9b{w;3R@=bG9Pn2V~Uc3$rpsI6%uR!uW3{3z-x7jf0dcb zJhFsMshfs%E8x`{|99cQ8M=fL9yjgzx;%U9*29xKJGU-RXZw#Hwe8;823_t)8P&94 zg4e?<3fVCQoCUP8j{qoamc`+lm)F}0D7 zl*k4I2^7r@V8%X!A`oE*ybAky0`udOVu&&8aVR)>Acm)$d+Lw1S`<)AYUC1@)+f&u z@G532Nbq{`RJ%g4h5b)t0$yGJ9wQ17ybCi1rR7JdI-_S+Q-<~SV>-?IlkggIC|CJu zd5Tm(rEp{ZD@}5tUm4IQ{RXdgF$kbgnF+5^41^ya#}Sw>JduZqVJ?eK9`6Av#K6~1 z*fz0XrPYteLRZY&5?*&J$3&}#VyV&Q5s<$^oOB2u;FUS6hjf|Ew&1l0^t>SwyiRI^ z&r6qD`!|%SOiC%=T+#07!`ANA3a?SPEjmFzOU(7KFezm+A0d^62dr!yqA&^7Lwm^F z3iFCwr4BVftl}PU%=vA2Ey^?wWWbf)splDpu7%FdwxH+CTv*id6}YZj;%;hI3{l3hkUne?)bTI&5a71a zXoiGEVlAUw204XW@?k zb+LWzy^5(E>WIOl+NcvTA54oo`;1#YlokTpj`wIx(~jNPU5b6u5hGnUr&KQS^28)! zN@S~Lr&4LFx3qK%7gUoUXIsypL)Nc!f+QbLqy4Wnw)J3TC(If>+U}PE}^$qavEY z=YTpxPDLbY1|Z>#nT#b?5eaG1cAbh2M({`>j1B~Ig^Z*ix|DB zOQ-ZoV#!-CSqgj%uc)?!cj#~ukg5s5;s7dq-P86#vd-VTr{9f@PPu!!Y?|V23S&)7vk%pL}`o=Hup8k|ceddM_QCAk4t0n!wU%3ky9)Ym7iQdIc{qW(=ty}8V{&Qt<^!j?u z#f`(OsMp5^>xt6A#XyC-JGq&d(6C=yNtWKIfx~cFTIBZVEJ}|Zy3B~I6Zj1xG zQh7mC^s-!^T+geG%vPJ`vmnqHJa_wz_z-GZDz8=KQsjjeY3M!EJ5d z50gaie30o@b?nIA&1PNI^}xBV2JRJdFDnqG{2&3$fO!^r5I=aN4B5Z$ZOeL7AZ5!HG+mYT~!L?^q zBFc8v(~;zL!>L1_1=CjWx?er=4(VeOKe2nQdw7)=#>~>ITTh-`efRe1w`VuMyn6Nd z`0Y``d;aq$oz7nqarA3N zqtdslRZ2fGE>ioy8VV{yb7cgtX;4&T5!*zAw&^!p#6QyS7yp$y+jns*{pf)0A1lv` z)xDfmg!Uu5PB`b3K-I*XrqLPu$BylZ8Uc8?lL~RLtkbgaAF|EOm7W8p8LR3faYT zCIZXf1t_YL(Cw^1E4)PDYY1k8SU^DBW=v9z42xGH6%a8mtL=$MQ<*3)-0wDdg9Ae? zRyfoWjoSCZebJ$zuFwcE-&XWBD;V+&4Rwcu{_e4{mN0SR;r_%>BpxCK*Y@bxP?BJH zC^1N7qJ0Fo$?ixG6n8}%6me4S8h8amC&ZIL62;K4uq2cvXrh-I$q<-ZcZ=R6Pg>ER zFCKHV6xh|-L@!Dbw70hsw1(qM;aK+VY?eb*Fa|pO9h+d#;$^B0;#Jt+bao)Bhl%9i zCt^t~6b5chm`w~*ASxArskRAW*5ME(sB;&ESKK&|2i&1QCdOHjz4ClKU1UsIK*SmB ziWY05^R+EcwYX5}%2#JR;kNLou>?`05NyNJ12!Dad~D#~tc?8%(y|*QTh47wV}%?s z5iteLd4?MZMeqYjyL3~}Az4@|nG=(h3Ii(tupAyGs-J}(;(o^=_(wyvC)zEox$!Lh zOpZNfP)5J__EUvdEI#?>k9UK>4D|PZNQ`m*F$ndX#ywi8bHtq)n(rJQ-C|tMdo)dQyb_=KL$I$=P9ynkEDE;0a$s z&mC(*X&`QbSLR*=1a+_q1bz|AkzXuW1npLSDU%!sE*BzJp_s|V;&XHNCzq?Gjnr_l zTq;*CGXtsFjg`}6{r+FLnhBRKz!Sz5KDESrIZ#Cfa)ttAxW#uT>|C0vYzDiv#msK;qk?;o(+S zuqogfxH=rSt@*=?lgMOj>FLv7---v~fuXI#lR!K+Iq1E*xEe?fCf2W#GlvhaZEM)` z=;EqB*9%EAjGXwZxh>S21iZG0ITQZCu(D?|Cf3q``z&Y1b=0+)zLd|C|CJ9d{(!*ZUfLmP5?n08_i;BS@4yb zNM}Oqb0Xo9A+x0f`;x(!h3~eIK+|yX=#E|z_F>7DXFUpNF%99ZZ6>c{QWP!`a*~tnt%8)8R9^Y zM#BM7C?x9OcIYtEXj6Bf-cd2~W^1{68&tBxQ3sl}vqC{1S#1ffn$;(8NXV>;ZME}}3`bPuY4&rPn6)^SIOFOO?EPHgH)Ln0|4ztvvLnx({Xcw2%tEsKj zE-OjWdF{DV&f7>R;KP#1aY3E8mEo9sW5m6R{)N&v=N~o2$qY(KPv{_;?DmTUnKT;N z;8x+4!|vgm4#9*7wM5)X0<#yhX?puwrN0*J$oS1hs;l@SpUVzcOVN0-R$NKsYt@CN zrS(-iUwbrjlc`*$$Cvl_XO~_sTk#lmfzD<;GG?0%zKVlO7~lxJN>m3TcwuZ7#SP|r zFmue4hhmtBxV%s*gmaR1ZYc1TbDQ9Im0{F`Y33aUUR8Y&Xc4+oc)qrFI`(95d;6!= z;N!jH>7#xtmR>!YUfUl!`DuH1`ZV!mdw1`rEju&M;g zoqg+vt%K>~aeJ73!1~~+mY79fpA%lyQcK{~xYd?yBGG$oMsPJ&<;2uu=DmYt($J2nYoVzG4EHIlGN+Sheoo!>say z@6PMQj_tnuoaaOD@_{K4EVBGg1&P`wjE2KUuaS`oNl%cal2qvfo+mCm@G-%wl7ZKE zk`y$SD&et^4$~G9x`;eIcO!8zlS?Z(R+}k(b_}NDF#PxwJw&`lkX;NDk0Y)N#)0|| z@hGUV720uWZ&RBNjx@|k?^tqA;7Z}@!0@6gU) zS_1Y6KR=w_AG@61TKH-I_w9>;vFCd`N2?aYYbd}t#J{@i6;tZ3%x2x1 zjVi%v%T4eK-xlz%;d?u^RISboOs>yFigR{)rc_xD4lGnl)#X&USY0V*v&G^_a=8?? zL#%R(*wReIr5e>5@hrqdE6l%=wADbQxR)kLEY^Tmc!qVrs~hrGKNn*n*jLjnFumXu z30}MK%|owcLRXK%E3vPb+8Xw&ZlqCh^k(h+@@#Ro_5Si=CU?J3TJE=esw^(}9cTvZ z6LzZ^xtn1g_%DItjBdLst~U_vz>C;?s$heR@Qe^yN#q}@NCQH`xGrIw?=dP@Jp}nu zGpeK2f0OExweydOLJB^3mA?IKkRAvPlL6TlPKc+U0m!JD@d9dgs&WKVT(uW&0*PZM z)PdO)2$lFvJM!^4=32xsTG+nsfTN4=2_e440r+u+%(4=FpB=T zL5zbqX%>27mzYxmWF0mHa16R30`B9 zu%s|@LIZ)FF5IQCzY()Wuc{~`<{Yi*lys*=ssHR;4)=vjYeA{i%c2!y7sSk~pCbxU zS|kG<7-PQoAnlbXnzRWpgJi(vW)DOzi0JX)U`7iln+3f3e9#;~_;zTQd7NEp>53-A zDAqWohAooUXGJ2BM97~`=i-BwofdROG#;^TFzzSmF$75#&{yEq55Klb)DLG`gF1U( zg;z!_99}QV3EHm++5oRu>rMxWrYmXzKsk4D3h(kZI$3>IeBcBAN++t@r#|@pE=kJ_ z4g-sUuUKo!2*F&4tYGYYvy^UxSA}S4rfPH&bT_~&GzWeg;Mf#mo};fO^UhI6#?mt$ zdhC^OQu0=5gjc?kT6>)E+Ea&DcO72c{~)PcBb7Ubm{*#R9D2dAS3>!f&2ss2eKu39Rx9OvsgfL>dsHaQ-ORLxeS>Nl-{EH#3d{^Z5MTh$l5A*4 zSimn9N--lPt`b~$(B;C`Ed=0c9@_n2OL0RQ3l~nqtp|q7i`bzM?ZO5ULGrjt*1+{8 zrmogbrmlC757r(JO`SboyH0i_a*5~_!|U$F!Om6k$@GugyBV84s-lxS$KHw2$dl>o zfrYih#E%DOZ%yq_KR^57_$c~tdo@k)%3pnc_(XR%z^mwB@g|s8q}5jz#Ik@_TrS?| zbcG}HFDi?LSUOYttLS}iqP9_-3HL?|wL(iOQ>!h`r$(!PmFI41{fSUtE5obCsW(9# z2+@Eo%B!*a;ZEbOyA#e_{hc^~HYG|ubi%~!jCt2ic4P!FRZa!)iixc(FBD$s#!({c zG=*2O+WMQVbA4*7ilVqA7}L3lBr!x1N(2OZ(M}B}JUYIh!%#&<#32<56e?}4ui8o< z$XIRbSW(+ge)WHKuirj5#L-ixc_;Utd(Jxh?8jQw;Q+6>MA5X6g4WXti>$k9W+a5V zz=-(;xQFVp4gfF!k|ay`1dnH^-p6BYh?qA{1rh}f)lfkd^3IQ^E*uTat9*i>c|B$T zb!IttXnYWJGSdNo?zg0!ti&HeM{Q>1r0HS4`{kR7U;xcjS>oAL5Aqf|w(e@fFo0nu z@mf9Sr1do4bScrLioBMpTct;gIilJNiKDUP?1VlZtk6w_9LZB-7nw%1PtuF_7FP8M?0%4(YVK6GTGY(beib zfwQz*3*eZWlm;dOsJ;%xf9n~ujYYQeN~n4a3tI{>-EG5punrPGV0wofLBA=+Q9PO&Y9ij^3%Vz zA77hZzIJ};+O@s&6Jv8*du#2DOKaQp*|VQqxOidh{NTm*mCg30teuWEZ+I0w4n zHNhQ9N4w#b)`3^b0c?kynp<1HvQ^t1X+NDB7~fsl*xp;J$18iw!}0kmS2jKwp5DH4 z<uk8>TK-GLUe^*)RSzj5su2qW z&v@T;Or7L@+*uyv1bwtH6kznT^Y!WBT2$4FO;o2FMII{3!ca(JnwNxODx&-VEJk9N z1+yyoN*(&go-x;`X$`;oo>`BdCGe`<t5>9v6zR;hjA{RzV~Huq!xkj5s#X>5(x}W~ zC}Dg>rg7`(_TV0F8F~4#9a=wn7iw5F;1$eZ2wn(8JoRMZ;LOb%3lARresllm`|At)^@+JbLR-$r(?#hb=y4oQwble)-~XoZhBLAUS!-GzctyXu-UI)sUC=(xGPnUP z-C(T0jB`~bm{_p-W0ionP%dV*Qp&7Xgt$XKJo%bmRVUMBk&x@yC<-@Is{^kzgJ-&2 zb0w3um@{xCc+Fx_2KS_zZycQSJcE}&o$m%CpjvjI>x4zKUU}tGSM(k53ayL7YlKQ< zl14=E9nfIyp{D-d@am|N4KjjQ$DYHj-vBARsc#Z^jRK*MZnyy2HzhV1xCFeiN(o*w zul^6bwu(L_1mc2M7no)1RLNHXF2OWh-Y9rUtw5aff>+84^d3r}fY+=!R4-k6d||yE z55(qf-CS+%u5Z7!SX+!6r$^6kt?ezZZf|a>Ek{Fp2Q!PCmvZgR_QuA>di!kL&uC<_ zz$>H?T}S&Et^r2BtDgmO%VT)e<)TYMhXgKP^xcuHKyw|3m%*#fQ7Dn144jlqKls(~ zs_}A~T|nQ+{fCdv+gIhm5JG6iI+oNCWj}GtNJ=%HU z&cjBzc>bZr-_j@4?Le<*Vm@zW4Cqt^N7(;+g%!sgak>_1cg1s$p>)+5$@d zA70hE;k8s!1d7tX+M*@4ZA`_pBg^J^@#+p{2EO_ zE3GYk)Ow!-c9n6~F!gQ7d4yfjUX|S=crCGp0BDp|vr-0X< zTWP(cV186i7S6a5@EY*dg?B0*Eo5Lw8zhA=pyETW&)9EOTVIF}M@{`0;58NDmr#!= zzQOQd)|51X>aLxM#2txQl|iW$$n-c7s&AUv zdC8=|Yj2&uI2}(6>DgMXK6dfy>B;2_ae245cX4=8>uZ%=xkhtBbD-H{qt`l>zO%<% zXpwPnaDLiMKUCjyRrYXx%#po~P&Y=er0ghW4ST!{CTxTcrvzC)RbDV+*oH5Vq>IL* zP#v5ftezgex-;III5}OL9G|r(;>n>MD{pJ=?2I?(nlJyb6OHsu&&LxJOVgG4v%Pc8 z`KxDJXYSprHK%rVc77d-E47whuZ>NJzlNO94!kNsDX_Vyc~QO)D7Xq}C`h_Ci$PdW zBp+&x?6w-iZ;*9U9B$UeS`!A~yOu3dZsq&Sr%o*vza){TVnTHu%YKX`r9;5B2uD``>(cughn8l-qVl@EAj zy0MH1FLK=CH&8bzBT}fUm-8%38A)ZcFLD+u4IgO+qP|*|M*!cTi{e>-5xB&7N@u&_ z6`>Dx2M!qERbav3U~?N-1&PXP(+j=^rs9H7B%SrdY?fuX;h-qPxWqEYaHTF^4ZAO`@WQZ3O-%~q=sw;HXMB>-0Y`{UMRf3;;g zrHjVnt09Bt%&>3f6tW~Qe;BD598pSJmga|TPTIHFG8cB+GevGqL!4r0kEm#s{Se)@_hRfwiQ-k%Cbv=wp)YcX#@fA3hM2(=ns!#}|Rqy2!4{ zga#~gi&!>BZ^lLWGx|-Gy>lFZcD%3;B3{)c#lk*0jL0yg8%{fQ}tTOlr zU8T_F(CQz(_XX%0n$1t()x_O6RqgR|en&YA(Mu_gBsmmizc5R%Obat0!AbBzYikAN_be)f}dkwW2=q*7;6VqGEYTZgQO@ z)9F4_T|eiH_XA!Tzdzvh@%?>o$=yV0O;(FA3g;S*N;g!)so4GmuMr%8v-6391B2;7 zO%M=VuhGb$R^A8z-MxG3W-ztfymhf3R1gG=DrjcxE~-HQFvjaxS_wxj-dYn*T03OtElE^fvQ z4IYAv{l)Q7{Bl=+4Zf8dw}$I+;uONUtF>aUSI_Ayy79rE%5?!rczcFd7*jguKF29q znQn(o$YG5a4S@|0^{G?GmPNqs$SqtX5@>15&f-=?(yud5shHmZK4ceS5!-6L|aRBf-m8%J6 zCaEayu-?))Vrp=k_2C*@ZKuO6O>20SJ9i2W^r^7g3h+6VT(;ZXO~a^m{PK#_Ge&}| z;8lc~=6DN_*&O{n$%U#pAMbzpPF0W&{Pyiv*v~i1197zVR2pV|?>w=Bc&u?f!E4xG z-s>?cB;7zME;&xqq|}v60<;h(J!p>@zDQ5L?uy~HhvQ-wzO9B?k_)}u*Uioee{bU_ zHtln>hL@BATl_Rl!}xKPibWK?#R6XAHA_c}H)N*^yedu(TVfKMv!`vPCFM}ZHjoCqYro;|AyBow6?w$UzUOdqSF?<0$;n059AQw zRTuPmVL62(krLwDf>#qB*?U#3!EAQWO(iME6)md=SmbfG8?{_Sd_XzU*zd^Ac@%zC z0P8)?f-B~OK{TSy;NS}o`K{yYKR?$>IrLUyxI9Jr(*j|0d;9- zfQ4@{A1qlv0KD??ZHjYnI+s$)u-j=Bb}${AT-vcRNITIM*QuGkE+LUOxh_G;KqA3%s7y1WO#8bW|0@Yg`!4 zE^F7$V%OKN>w+NJ;)rP^;d1;X<$2}-(ns7(jA+xMJ&HuH8}38O!DE2|K%pkH--nlB z0)V2xAVA>Au9G>gV(0TBEGckw?R+W66M*$S(?p-mMl^*Cj{SdR)UrAyd|tt;6a*w? zsKLjQkT8M+XVHj0Kaqz9*`;K*T*}~pgVYf0>m+r?c3Yxt^4+alvahW4(JjT%Sm+o}$vL3SZpSvi_cgD`?QH<(gzOwM-I7XG^J88#+n1b6{94Fj|bTVz=)t{zBBFy z{vNynN$3+9*|KNU?woD1jBsqHNjJpb7Nr5)Q+NOigv%USblol+QJIU->I|RQNuu`VoSsva_G^x&0?3KEKjJ>W_p=8Q2UFkA-9&@gZ;liE>EC|frDZ<5Am+nRP zAD6x_cx9zBlRLvJGpMMqiN^I5Cldn${p5{UWD{rJ@H*_sY1-fL*20oJ@r>mUk{=f8 zsH0NM(&aho7D>$DZ$H32X1a?ln^BXMWb+Wt{dIz&Sn z6IKqf;Weh<7}>z56lMXh^ucCMtL*YW@T!54s9#ts8L(b6VG?w@f64GFUv<*BaH-Ar zBnl~GPJ&!<2PJ<)53>*7LH>onGO(1nXY0naK#;+4&$g}S{^S9xFFqdlquhIEA?`90 z*Kl%puUXPvieHdJk|Fs+*U#pFL3|ZF$C5TsQsYqc%2rnNrPHy;3?-*g9wiVUjcTj< zFU>#N{7NjA&NW=2KwBC4a3edl7(EiKWPNg&y`kmRvIwT(8eQM9Q%h!1d4l68czpo8 zCUaHTpWdt1Kwln^o3tQ6?^DxmeHPy99}pQ!`}OB&$YjM*jSG`6S^o;ZT4yot{tvG> zuX5r!S7nLOE|+PoQ&Qdpe5pBW4Jo#rI!!`zT6(A-X~7`Ql4=nQJT`bP4e_&0{x$ku z*o=FRh8N6uGM9l_EY$<_8uO$;*~C~^JD%q4So&GD-pJ6#6UNA5iYHTwTw{CLwwn4J zrqS9R3sH21!BvibfTZA6DGS65&)(}_Vlbn4AE=VPB~}Z(UKQI2 zb+0S=AtOfba?_M(XT7DZW78L^#3yFD&~;7hWviNVeLnYNC+Bt9AJQ3cyvV;a0y~9U z5}I{zm-pB61)bw8!Mu(Txy-VFyu>M~t6M~|t{;e>QOA5%S@TB1-58pM)T2Y+DtKKx z!E2n5yyy_xI>YOJOV`*@ryx6S5?+h%Rq$GtPF~viQ8xmYTdN*5BwLvIyO?BhxB*6j z0xk%#*3*_LhRkfm>AMt*#S{4pUiG|a{M$lSX8s#q)#*68WU!rM0w;XUFMcg}-HUed z!ti=NKa;-dtf=tot`BDw5C;c_d9u7}Y7knk5riOj)B~@Oz__a!BHNT>pf=!)s0zE1 zg|5YUR4~_$;FMiG1&hf~3BFn@KT9L{e7<^bjs>rvIqT#&B)U>FfE%51gJ|WT+n^!o ziFKIgM0J*Hd9O*i$xO7%DB4+#h(F3l;o@`{_k+e;brzdV&=bW2;Vo~@6_~613iR_ z6gp}w8{_+ua#)owN1#+0bE3{Kn-UalEK?#J!T&IBxhlXvM+LH${iiVePq3gGMY3 zjopp*J@^w{`AzjAWGIV}u%?+dsiAs;#B3s?N5%U}IrAVsJC~JAwp|%ARD4hYau-yo ztWB8?g@FtNvfC9)PMiU1*M1Xz2t;FLtV$t2&+z&Xx&~e^+bo$?kAzvW7GgwKiPz;$ zc&%E_sx|t}cULchPYtc`61n&3V60k|$H%a`gI6`;{_^nPc;=+iF%CMkQsl}GOJN35 zGdLi5#LC2pKNzKJAIf^z1wx$xDpO?x51G!oT^e~Vv?5;FpCyGLBa`u-EgcwG_bprh z4c*Z?DcYe;vR)2WJIB2AxZdpscWT!16rVknhRhV}8F;EQ3u`WN~UYqk&;S@y&02~>k=A5SoCJii3!it6eQDE-&C|!Id&Vm*fu~;kS1grfTX@2zQxOkYr^LSU!bQ$likHT{i#|FVMPd<|!bda0 z!#e+Y;Pq;T*I+8h@vzxQeOAJAc%)j|qMoe3(@$#ku}6_tlraidJA7No){# zFG~3rbU5gQtCfEWCI+m`6kcf`m4P!gj1M5)`UCL<-Q8FXZUnD#UD{%%>#K4<+-(6tv0{uypuh->t%qCn#HI&vxm1d-;I$%nlCO%FRjRq^ zsrt2!Fyo*)H_Hxt^c@2jWxhk4h21k%auFAb6yvfNOodl6d^wP8{Q2!G`v(uEi6HQZ z|G&Jtd}U}9Xn1f(dzE|?cpdhOwSO-|7Q&5AIy-a?yf*ME+p8g&U;XvFx2OAdiV@_& z#%o~GK@IqdfL9v_KDvw7t;=)b;T2L3gU1ZkNHX5QvJiJv_l0 zf9lI;t$LiZRf;&7`9vr2aLLge7%%upvcUv`$vrIxX0?s>`Ja{~ZUnd<9iT;(VtC!V zGDW7-;*3c~8n5WKs0UlyT4R$5mLkM6H?zWRrE*T3WjwMup&A>;!t3y4yxR6^yk@kq zM6gsnh^8#_rF$;JX;;j8nricDd%YMBofC_><1J}Q@h_b>kSarae2Z7F-TPOWeV@mF z6_)oug#He-uGxB@_|duC-5~1bKHu|0$hv?2ry0|ASGE-UItw50l&l#^V zaOc!eVG_=BX=&>2X7wZ+#U_Y40!xHf_oUD3MtYoMtd!&DCUYLD+!jPpBBbdslROnO z&Q)GF*tXnPlds{yswh{UTE%zP7I=LYyr$9Bw~v_q4X>?nz3PIl8%R8G;h;k}Fki)} zx&engtm#LE29UK)m;f~M)zSA^E?AzctYCA{k*Y4NXb-(!^roj0HD%3K+?0I@A|x?s zj00VDQPEXB;`qH)8OF#YuTYjMW`RWl+iVPwZuUR?_Q>*^m08c zzkvE9R-$%yL$ft&ZC1939Egw4@%nAxb)nn4MmQS83a_}f2ndKNF2b13@%pgvy4yO+ zRvBij(@zj}^eE!?*~&gSh5uU77yDms(Gt55`9SKw7= zCLGDMdVAJZ`I1rk?NOg)K;*2&rf8mwgoi7-gJTWasP#7NvZBW5Nl8U^6fCpG%}F*P zIkMaF4Z-x-@YI%qoek{nRuKEA@~%pns8%p8NO<)Qt7$Tp+Vg@10=(K10u+V z(1Vm27udk|huH$(eX6Xw@vpD}Xg>HAULo{B`HAQ{h^>CwU5%hElsS+kM}}2rUBFI9 zYcA7_CVF=reb(i{(f!Hr0T~3VOt;tH{SjfQh|>pt`s2GxJa{@DHCqd>KLlRQSAONG*BJv~D*B*NU&?q5gF?}@@Y*#G$*6=} zD-1%7`2TIrpEB7bkS41O-VnmxumfbwmfRg@NRU^dY<6pKh|R%XPx7Fr1-w`0s`dYV zKzJSdz%yds3a}71#|$7E-f=}(y>MuNLB_yj+Vsk1b>y^Met}26?W)B1{iyqUrC z5mq)i9;IV4u%TK7!vXiA1FwC$wvw);y)GH=lGt&)<@$zVU4|V<19ax_UI?#*h6}GR z?Lv2Ts6@vIgk!qqb(Oa&eP(A_GEjDrw2)3hESze#=#{2p$b~8~ZbM>ntX#HL2;nAX z#ryFP2Hlt{Nr}^~kq*0j$9%oJj4$!TueS;_(#6Q~G=o)oRbE0Z>5L?w4!c(y zwc#vz9qEaR&~aQ@7gMo(Jzk#U73q~MZMtAWn1ol-1c~eBW)5`-OfX(i z22Z`L0q6#{#Gk@yHz=;KwXCm9c{;-@aj&SWh1ch@=790KG+u|qtIoy2Z8W9Y2o5Vs z9og8?M)S{6|7^SQImL$YHNeavni=#8uNe&97hd^86Ss|&*pb7~4u#ho&!sC{YO##a z+_?hCIopBPvWUOA0VcU66@an3_^fC`wBwj14;28J1jAJOJonOIq+*Zm zRU_`_gxBSWvdtFAbSGo`kWzzG3*oO3=^DE|GeRIup0zUs(=UIBrsL@55Ii)YE(_b7 z`TaeQ65a@&iPQB~wvbumEG$7aBVXHu%5?rc&XoLU$qBDBiLX8puSiS0D&sa#w?oK; zw!b;x(2opM`pViu914mEuRL(1Lv^+FRYIVj>w|^BBW}F7O(Zm9=g@m}3LRu!jQ^&J z#Z`Nb4Yo6}fYTDB5*C;hk{uZ!nDz+IvsyN^vjfW%Ex2Znab6>~!J@rZDME#yfmh#3 z9QV59u3C6a?}fWoY&*vz0Z{V8k>1kvP8Wx9dL3_Y1*IAk!U^o~U3AtES4a?E2h6hR zRIdOYs=I6swD92A#QS@nMts^qfm$jiXLzh55^Koa1#_remfljp$WBS)5%3UgslI;q~Uy+NqlUT+ts>lzwLoT|34$Dqog+CnfnB>GtGUaKM~m~X9J$&n&ogz#8(RdZp& z=mb$=RHC3P`KvjB!CL+{I_@ekC0`S-8D48C%vUymd&s-9sZ2=~>>-`jRvi^&BgI(| z<qnw2`WNHBHW$Ia&e&(=4j+y6rOI6-k~tngYD?#8%kC>pR9Py98d-YZtT? zUO!jM;f$nmz@4&SHT=q&gSPqo1!Ok|(Wh%yAP-^}s)5WEg*mnGmCfdu)p032oD6>vNe zuMZBS0j0^5Q{5WDffbf6Um?YK@C&aLH5=tg47CWqA$WCBE&N`t^pLSzG64{K!nfHv zgu3m#!kZNW0;x^u-o_FKpTg2jw!yLP+9zL8d#fsyV_j`cDZI9(nPW4-rH%4uF9PmT z!4t}6mPwakcU&?mhY5->QY2lQf(Ems%L%W<4;!y^)oIOU-rCf5sAdX2J2eP8;x$^9 z7G4!Zw^yKw;zQ%F>{bo|iP0nJO!uyRNAnRKOK zU5~+{Adbx;ebIJ4$_Wxnw`RrT~P zYof+a7;vR2JkB%65wCFxF}JV58pk&M=6UCWnb|>!8D!}$dFT@y^}w+{an{CxQ#=;b z#pGJBbwk$t&@Lpk*V+vzEA17!R;O6uwdIj>4#y$O{o7=PXv>T&iP6)QmSIMEoQXE# z%ASLXxUvYa8TCuvkPb{9Mm^__*RE48B{$%R6n#5dxR6@`1Ou;^SD*Zv8feKcg;%-8TUNhVmoy8s1g~E339oMt z#KU9*Bt%U(n(>PE>S2%YT68VEHsjSUP}Cn?XCuo}0l-Yt_s%2QUJHsKm)1%W*n zI;zJxWM;lYzGYWpONce7HUDumnu4d~YG5K6hw0rIbWCLY@)>3$t6qANN#d8spG#~YOy;Wo@ zSxr2GS0o;d)3U)9Ub7iY?E{jII^z}F>qtm$%FvptqdP8MP-Mck8Int?ZQ3P{RRi&E z^@Z1v)Cxk1uDo#Oz11&gUC+E&afCL9n@Jt9KmGKJ*I#(+t+&3vyl%coBqID2h9)If zLkUUCKAVZxrG&G}>nOaMpe~#ZUf0Xvh*uCf8(&7-019#_bH#XNI#09763=aJ9B@X0 z@ap!ll|Dl#wocbH4!G{#UA!u5>$+c;4D67t^>LlMwhBtckR-*!MV`#$NaGOUm0|}; zFSzGLobZ~zkP@J~rN$eyAXEMW;8WUbh?-6$$f_)k47cQDfk*{k)%%0WuOweNZn_j( z^QDIHA~i@zWs5mFs|FiNyGXohzv$Sxnzff=HMT9a%nH&T7hZkrQ|J_{v;rr{v6l4T zb$GYz5fIGK8DuZXtgWZif8W|`7%#!ABkX()QtFC`(#yDgu4Am|3hJLx+~s`J+6^~V zb{QGm`E^Z00vDK+8X3mE5i_u4DF7AoQ z)N#}JMQwqtm}jj~dZSud0^;3>X5+;nyF2E%^`$%zpU(OZ&Zn(%2d+7C4FS z5R#wOIw9i;kV;@yfzgEvD(kf(T2qYAoaN5?^?IkLesRL<(~8~|RZ-8g(4z6`p?L%q zHwQgUX_qpo%u8>lyqi&}TQ-Wc#`?BPkgDifw_iNMT2Qzkph+^eZ?e_H$h}V98{tZ! zINRInA0Mf*-yg{1kneuy^oDLMByN{j4Ype@!Eh%KpPmG;=@Cze!_&d5hs46`{)AW4 z^_R!r_vb@9;Z<`hE!KF&mY$VUoVf)s0Hmu1Bwil|ULQUguS4koEo}<2T&3-Ga4W+T z*1_w=b+^WZhp1w=6El2(9Ersc`skJ6Y*cZa9Er-c$5S$zNwK&%yWrC~uZJj;*X}Q(D&A*E05)=$`d4mbaPNG{IPs)WwMEBs z5Vx`-r|voImWOe~a6n(&sENjfhW)Mj?)Ycl+YnwXjd!I3$EV`a2TFQPH?j=099b_r zZ9=kBA!%8Cp=q@vrT_+5sTxzc0Q+jSrEp?0^O|chQMN`w120D??6{lGy3h&YWZUkL z_(e6Inc)?8;oYdL(py1N;nn8xp(CE2W4HRiK($zd<>jlB4YRFDPsyTuw`nyjkrr2W z#9mX(oaOWfkww?SEBl3bZp}N+FB0Fu>$5b94ZJ>Mi$LvPxwhQc4Y(Sw)>Kb;jn_En zZ1;6#P(&7k9PuA2-i)s(H_jnGihEcoJDfj|v?WzaB_ima&1eghppNeDfB)#uKTqLP z#7}*C+2cg#A_=1I4%`N=E#rm~HkdS1bc0P_8Ao@9*Qok2!)vVI&&S^{U)&sG^>e%y zegAxP@kY5S6}~?Vm8olSouYLHW<3e70P^T6tonr^P*4kN#w&lPR)!bXhlYK2WE~cO zV!S%Asrc6!HXX_tpRl$A)C#YZBEUJAq^qJ5+oWYv27V1hWq2tai1pcV!eZ(pThg7% zF2IZw*=0vLA1xc>6+FOX&MtE46K#Ook*#{Q)jJg=v%y0W3&>F>9<=QHl60;5rkpdz z>wWNAfy;^w5ngpxamN{*-m7O$2xe%s}eI@T(csX zP1V*sMSF#NO46t)=GdycGuch43oyIXO^DsdK=tg@|1-U<;1k@pk>~}+ITu;Kf&zfp z30b?fpO#jFExpU&YvA?r?dPxGSnnT9i>si@+cyDSggc~mt?+7#z+6?$mvg#4bHwYY z8>f!ktHD&jT6jgIzrLJZqzA-y!EoE8qyp-wB*N5aL@*LzwF!>#)6YJMC{chkE#}O< zS3K$oqK`23yTBE}wWaPhCTsR)P=Z0>l?woYiw*$r@<8YzpKv?rFm_+?&V!oqhIW?Phwu8mxxs zYF(b5ZB0t^U!MHtEBsYKg|Pt{1iIM3RdIFe)|ysKgE(u^&>z9XSC%Dtw3(xtwLn#TeP{i4t#XS|@qGfspRd|Xcjs!`1L#%_eF##F|Has^YT(4W(IwMupM zS@+xb-hY0@ra0X1cJGfDlYm!7mNWUue(Y6kTXJCElf>(YB>oXL;Lj8sP<6RurXnM@ z29xtjZ}xL;(VZ-p*0V`oCW)t}cMP#dY)W+KVcM$^jfecr7>4R5>|cdw&qGM}53zWR9D;G*R6*XI3axp_nyj z))ZUI>umbH7ydIdJ{5}Q*01#ON;j5xEvdI6K7TL!cog_Wa zO>t=78zBSe40tIuQ2Wsw+}4_*evD_Wv=WG(6<*DRSG#)>d%WK3;q|711K>DLn1yY8 zkXjW~85Sl1WJLE5fmcS&*voivh(RFm)t<#nX<}*3=Dt4O-aFiwUO(JlTiXA{@cMLR zXY=sKy^WQ|;^E=;{@&h7t?c7zYWVZyPvA2$Xyb`9POn+vFMzQvD&y%LlYD{GYRgzu) zVQ?kDenOr9?#`cY-v0A(_szp=-~4{|*I#GP$81E7>VH)lsk&FiUg^vQyi$YULf?^v z`P3FQe0&*Xu5uo)iVhI3i^-g26WNhn#}$sZIN?eIGX+IkHL)4QE+mdAhhz9h!L-`p zlZ1623I$}mr*CIbDj{pvBQK5w;K4OP0K_}519)ZO*?XZN%i|TZwk-C_)GtSfL`pbX zVU>o_IWtThRTZwCSDr2 zS-fng8l~;OWW!zh3*eP^RtWa)lkQx-B%WcGnIhBX-rM0qd3=#o#k>r3jim4ut{lz7 zl7ONbg!IA{71j5*T%`4h-Ip3Zh*m=hUoT`xX2)te9@F!SY&&s)_829$GENgU**2g< zVR$&}rx>4C^EitSBn-uqjX9%I#fpq!C?e`2!~|jNNJOSWD)L1&sLA7Fyp=-J+(^*X zE*HKCc!dSLrlyb>;zgB;nK@@uY{ADSe6=C;7SPTkypAZRO}x_Qoq}OcoS(R~{YQIq zYj0<7<3?v^r@htbeExJ|W^LzDdwX|xC4Ku~Z*6_;!HwB69S;b)1Fz#|Y}R&Crl*Ih z_U&F~kRP?pACH7rvMemgz0&I-ULXi&@wLQ=W1@VXr6x_Eg}d^Nn5u(`AcR<~%4?S3&(AyKAL z$P{2xkqSK~=NYVHfD%`Av1EC<88ghCuo*L;EBi)rIdf?751I@YXDR@!&vbFs?5Df} zUfH!}2B>QBpran}8sxM!+?7*aA^cUTn2&5X=~259`C~j~3c&UQ5_urkECrLRsFx;P zfKqiLv-3fTtnk{ptKcfH2OD{Px+?8Idvpchm5}Rc%UN?(ek`&l$fcU~))ACf?D9eO z3!PUt?~mh|fj*nAQq+0&GNROIXT-8xH!`a>pvTwK)w!hEbZHFY?&0;`AYRqxEEmp> zkriGiA)YMYMJ}H=ybijr_k`C%fnJgDsx(X_qQt~2UH$kY!>jkX%;>#BkPvea%@8#9 zM%AK7Yy@7V=?$H1?Rg1smSoFEQax768^FpcD-`M|INPuB8PvlM5mot8aIku{Az-fB zUC2qsbz!=nSrq$Bwum2!p%~g!tzQf*>l}0TWFV#h$0Cx`+b_)Ga5OV4r9OuE;2$df2xC59cr{5EOHr_+@xt^~d9R?3;q^n{ z_0eAP>2kZ>UU}5M_DTEju(SO1;>@j;?auze`qSq8<4(KN>8vkI!h6^^lL5isQ)4zEPAfLEL?`^!SI0Qz<^Xj$k*2fin+oxEtZ-kiO7{ngj2FJE<^ zpFKaWm+|Hu8={DaA*|=UYQPrpIzqf6C?Id|-GEm!UjximJ14x#ST#Fc- zb@;U}Pww3nraT0#0JWk&9L4j`j+7r}Un_sFHHi}ma=5H!;j{yq6wcvl&%{?wk9>Q- z01Lbh&q2^mc>S!0SHP8cof}T&d}SFYRPd6P;e461$R|C#26P)J{{~B!|QR862{rCeQoW3bCSsxt#A!O|rnN-WYl&f!FGA zI?~8lRh6JHp58r8c+C_vAGE->CP}(*mgzgwioIgayJ0-CQvhBszq`^t>^xZOJlgH7 zZyR1`Zav=L-P}3Y-&tOJw7tE*yZ!j{rKCtbGG?E!jo>p$$%@El41EEiF*r1%7L=_V zWkUe9a33#xnY?QbFJxyf&NXlc+-Jc?jDs5U3l}am zt~S5FIBTC6`fl7_5?}lKbxn-*F085vDwox@)epP+VKDYidKZ!|hFA4m>QV$i8xt#w z@$B+iv$2%_VP(qr3TMa3s|Z~V0pcP4E4o&HUVV7qtmW)>7(s}PS;B^9*1=|X?cwz%sUQn@RjfL~GDSlI&=#vglBggAkPe#n(v;$!+v40TcXgqOfYnow zUGS~T^x7oCinUZ}F|yP-PTz1&>Q=)t_?iGORu-6T45Zrczr<6_t}s~U_7hRfs6$Q_Ag&sIoRG` zzqVsYo!e+HFBNZX?XExG+S=ON+}z*WJv=yQugsQ(SFf?=oan^Pl0jqhnaZy4Jg7c^ zMpxut*3QJKi7SrdLy8EdD3qg;Lke`urbVtSsk9N2PEBaQTnLmSAckYOD;Nkc60tf6 zDz(8dQ6GpL+)H}uife6peekB=INCnkci%o5Kl*-WW3Ma#)hvC@EVI{Yu2aCd(t+2u zvlhIv@D(B9>p9F`rBtla2ayAm-kmx~l*MNc#teUIYHGyzhzVGZ847+0b)>72BKb9@ z6mv~tw!`08S`_>dtXTS1u9dK2qn@Nw`;_o1hn0M}qG{}_t?ODxOAj4Yu~pKVXRr27 z5^ftq?4u*BP&%YaXw) zl||MVEeJm-J80^1h&R(sBxGAMe z5tLu#S5Z4K@PMVZcHr8z+VUEb3bF5ET&OpSM_Be$1b{>}Oxr9rPWdloW0df!yj^}r zcnrjxj@sjP0uM-TXqVKGq=r=@54uWt2xx6KLz)kCLU5pV+<&3K85pfuu}@1IUxhWb z1CJTbuB`fDN|#vwsy4ZCnl87_4&XIU*FM%b+3Q6^UKnX7L!yv*rRSArJwa5Z+bm^x zUL3Q;@3ofjgG+Rr9X%KwpO~DOiMMtq5~Cwy=`N$P+~`iv&rF8B4r6F$A~iXgY%0pjmeoGz-eQHSzJEGJ(y&hn)~xu}^G2ay0Mg;&-cNu~(5wsNxgtpC~K zfEGJBdH($Q%U-I|VUsAAYUo}CujhC^hlGO#cvaXfgBKIB5n1ut?d$S~XGYUg zVON*n)m|@Vt6(T>N{I|AA66s5?(zJ2zeuG`wfjoNlk-e|5a{y;c)Yg|K94_`rdwKq^zwHYFwV8 zK$Lr|iQ2c|73sl5oh-B0l1s=rASnc;9HX909VbHvqmkoe{MetI?QU?ALKTTv5z`}C z)96$7KseVf*L)|uYD)xAG1Hrb{5Do^t6(z?9c{m+@cKH7^ol0*757xZD>#+cy&`m# zI*z?gFs0bs-%fa?FO%r_B$_}TKGhGA?)R){@wl&Cee?refJ>t*eWYMb(Iwr;;;@pBM(2$q5NYN_vCRMflxRE!77^30?k1-mB|IQf=N^h zDIjB^EB~`n78~3Sf|jx^6~$Bua*WO#EN_`hAx?gHYJLW~iqKq+MeIZnWq&K>*(*C{ ziG|RLSNOf+F$N31_dpFU$v;J@rSSSe9s~{acp**q)!yDDh4SR=mALS7`-6i7w)Gh zUWB8HeXMoGS}k)>MB1Sv7V(gQ%@NzhD*9Xn#v;cLle(@JrxfKT%C*4V@RI!!-EUZE z1D+@R9xRa=7d6(+*mps9afSQL%U@1@es=O}@8^R*{kpRB{MTNsSyC0SX^Y+Df!DJ@ zk5UgXdqk}MTJRHK$4rakTj&`|8z*w{>J;FL*zjXlMgn;V+06sOj?dF6dryLA*j@ zW?xizB~djHK9Fy2lXrS18J@Y>Iyp3wZs?v&mO1KNNXjdzbb~>EP{dE-gU}w%@$3Hd z5iCzK8AM&ctJKKlW?S5q9>FW<3RC@3fcijw;46cV5L^WjygE7IFE@5yiG7pDGSs)R zQnwokj3KnNq%}s8VIHA>@HAd&YQ0q9aJi8j*fofRgg`pq5Po?436H4>!o5Lo3hQq7 z67`GL<^z6TtQi-i1TC#1vC~2S<;6Ej8D4eM2gTxg=va|a!Pv$M;m5sh^Sn(3QgE`u zw8y94`o^;DZJj_)Z{h5x1l!jBoBmDITl38!mb1Kl*sjy(#h(`9Z@T{I+x+JU)7B?W zYEn4tQx{cSl#f2Ipam%h&H%6Ue=F%;-xtqU6p|r%-)Jyen^U8yQNzQliGyf^tEGEp z!XF-+kDLupPL9V%XGR*_HdxOX<3v~!ugnc7r_Bni3a@Z#wV%c-{>i;YnGjWEy(o5g z2MmpzA1;qq_^?3-E2j~>!j((X9npT^6}}#rrAk(1s?9(ftTHGu@p?fFm%;|3t5S;7 zE=dSPcBAsVS?`L)%b_e2_)vc}F%-8pg_*Q0NBY3#H zzJ6zGc{aST9)1{)>&IJ}Z1>dKLMoEkT+hxW)}DNS^WJjuFxzcx-I-fm-(AjyTI_mj z!|~+q@vFOf{CG3BpUZAH`Z@B~sSG?))Y0lkP)RSqE3N}@Et6{8$oH!7%2Fpj$%I$8 z(KVm&&CWHgxAYB z3WOs5GyoV`@R|oK;Wa3~4Wg(s_GKYn`#YTu_ZvS)>u=YJSHKLd8Lvz+dWYXN_yvtK zFW<_b+7u1=^(ER{|t4I?<5nn`($a6%z+fRSsGOPsPWV*2H*6 zDo}E5lsP}Y4SeP$tRr>_K<8vml1&(DXo)OlW2z)GGHFW(B}Ex*XExxRZWJcI#ccxl zfjG-Rkt+91@8C4C@OEHL1iJwO^Q;x%hj$u)vt@}4T7UP)e)Pp&KL7jo-=AGJYDnFL z3f~lfoX?nrI3{G&whCB;gZ#mBU>Y812(NSvj8_)l)col9nc?yIaC9~~Hru5)SHDjM*(8%yr=|_` z4h|0XvRuDTYgZ|45IYo;9#hu_2%yXa@KY+Q811@7LPnbNP!0gECdoq6q-ZE7#cfB` zhjcWrHxSi93q8C;+WQHwBo@35wzTsRUFR(7A|J8nA|3ofyGtrO9iIZPc{YEsR3%NR z(p$N9{mavMrIapuO&#|n73VYv^%$aEauV*FcWIP!Kq&_x6jtE%a2jKbgF6tR6PYSo zQrhD2e*ifL`tk%_s?+MxbN%@q7yG&t55+Zwp4w=fYaSDL;}3%u>mP zYQ?LRQRbWjb%G%Vt4-Cdtf;K@hN?pzHckgTMxDcE`>3T#)2hy0sL;Izb!_N$+##F> z5X4|NeO6`Wryl%~-w0kA(9GD82~=>)6F|bLs9P0Y8GHa9GFXW)p^MccKQCyHWa+^+ zeD#ox;!L$lZY@ao;K5(|6YqRzeS%upt`nQl(_x{uN`M-Ia!4gzdH z=9GpeUSYv4%Hvh$uEJBYi^B1hu1(>U6!2_?5bX>Zf+?f5!`qcgT#TgWM?#*V`Ke?m zKt2v0>Y99K$b>(z#B)pn92}(j9$#+`h?B0fxR~-lDG0tUT%~ui-iI4kL!P@=^wc!l>X>0bF;z%CLV@)UN;y@p@d)zMxWybPJ6Bd=)Mx{I0P^-4rESg);v%_&6DYq?4^WZt;BCYc=z zNFA^9{fs(HTgO5(Jk8?D@t)nV=>=C+4X)rxVeJY?nftS>E`06XT3822((BgB2d_z9 z6BZ&`UBOkQl~^-&G#=~HTiXDN^4Cq+;3Ym1*@(zWRx}*XxFZ}XFZgr+*8Vb6mF3Om zhvC{fjn`WTdBgVvm3g#z9%aEFqnk0(0YmFN173%YS5)Q@UK!a%onvLsPezsp>vA~i znAv+=Y#p@6EK8baL$1V_*kc-`?8tBcq(EE03lWs6?M{fA5=hfQAqy$A8pgfJ8Vic? zvwTC1B@5)9rG~bsn~R0}56mUd@Zc&ju?zxWzQ_x4y8uxt^Ffi*bH>yMMPsq|t@|w# z%Q}G_1FKBvHdg&&R;enR^PQpfFFb#KK0n-9PWqh&)#NUR!oBWkysE;9Oq6Q=qRiL` zz-Jxm1cyYmZP-X~N@ewx&R4$k>5m`2@#i-#Gr@pq1;rNdT0ArU&ENm{&7Z&b<~tA1 z{O;YCzVZEE|L$8~{@puoz4x>E;l*G5{7!lxd5>$4B<{{F4+KYab}k3aVC?&n@Q`_|9D{PHV5{rkHQFBHH1>2Lq? z_dmaWusM|96L{76+4rj3iUH_nt!U!U=Bh_GTKJRXCym&C* zo!{9#yaT$<5x`$qbQOF|4kLnvh@7)3n}z4jyDu=xi6W)$2JouTt7HwYNT0el2b;|^ zR`xBe;A(|eOoi8F2i0K~j@OtQuB~{2BE zBQlv0{!RJSEYM)1VQWF;w34=Qxn;YoIp7QC-Nx`bT9t5bC??hIQBi;gVm>a@j=RV`PpdALeKGIE7z7U!w%vk4z13U+MiBM>0Zgc^cz4N=kVKqOyfF*)9C zdV0$a<6dp{X}p&09?1`{6%|4DFon48)Of)WbhhaBE zy!v#6Y#;j#3&{d8xV(90LLWW<6LT%tWfeD`3l!}JwS^oABy85b4}4?9yGTg zhX%u z1X(O9mcRz0W&{{A5v{av7HV}H*e1s-Z@4SG0y}OQ@b24dWwV4=gt^#8Bda#>DrNOM zU;XqazxKViKJNKjhSzM%Xkz2&g9q>Y^rt`hl4-A(e)aB|zuf)xkMBPC-8;Yh?N1J- zlZSWz{OR|;|IeSi`{tYP{Q0*(`})DVKYGrF{l9wWjW_Oo>En04efM*3{N&yD?*8@D zKY#bfKY4F?aPa9jik*YM|LA8wKKHqIe)G!VgP(ly!py=%S!e&g zzNe)IUbCpds}lDusT0zsy&g|KE)1_n_!=J-IWSxpUZJpc46iq;yHIGaQRxsD9qn#5~8W)J1G^R|JtpQkF9iGsNnlA$npty^2#fC&v7P-(Ac z9Iq`#oknF9)P7~fVGNSy)^!>gI|<>sz?{N$`WDOlp)0~fDasUDO-rH*!3%1h!{QSa z@o0JV2p)tS42I~$!H`!R7xZVg_i-H6BR#Uca{gki0>K}wH1E1%cT)`$leIb zg+(L-N*-dhFa|eyntJ7#Xv!hHlE%a?HE%2z_TS-vQkL0ppfBJA1gqJeHz{hiSB{wx zo&~8&y2!(ICh*#_)x&y>o-R( z>8+Q(^y`Dy|MJQwA3prs-#+@;U*9?0Er0Rr(ZMes{Oy&q^RGPo_3z(0c;k)h2d{to z!JDm*eew0fJFkD~mEF%h{NWGZ-2BQfe)x-z9Sr8X&s{zoe&;VgdU$aD+rRnVpMUgV z^Pt~uFb0qfX+zSi5@@dxFc5OqQ`9QFqAETdjcTQkcFU}9DpY@r(g!=Ej?0WYS{^Kd<=5~!Xm*Mee9dMbflem8hHHz%Eh|ruO;6!f)BAgw_w-rT z@EX_B@oWLwAZ4&;QdUhG6r8_Y@|+(vUwBNs-gpA9rKRpxc;yG884U2c?Ai!P@%^U1 zO3dtM!s2fo$7`rg!t36cE=CS|3l|pKTV`G*Vrlw#PP`rwt`e1WDd7+{%hqR3yo1zA zt0rDe7G7Xn(f4UVQQ(dXH4eSj#qD$0?1K?qnxXhA*HXDmUdv))G(y%06!W4Zjvf*| zC>)ycSkltf&&nY>3lCg$`6N|bVqhOY_R(35Q-Bqj5 zBnq=NhFS;pC$X$v1YKTcMdLJ+}wTX^*7)8 z5Z8jm6T)RRXY@cz4jk>58S8S_KJZ)9^EtZ$X!&gZ}b$xWe-&X zczt~P#G~jnx&7!C^)-Bsc)hxY*P_EqwH)t%<^(!fm=0v-1YGA+;kBlqa(ZtsmfT+) z8*el#$ZmKwn?ux19w0Tp%-F7rfbFI^xiCh}fokXv5nkIxUg0%9z^K^WWro6wUGp$l z8XDaypEto2eia;=WwxA7+v|9}a&q&eo30MQ+HwAtij@&4QG^@Q((_~$N*)lk_n~>9_I#@lUo}VlyUG%? zBjjHufm(e~R#X>GV|l?Vj+v>p3b_GiW+JhEi8?)aYOINJArhMVCcem)rUJKZ4iLf9 z5T&%>BR0I^Fom4h4SkWpIb&Ap8Cn@Wf!9&Di_K=bV1-vt>y=vwS{=@j9vvy;O>e}l zxYu&ScZgXQ5g&{r9)&<@OO23WoouNe)v|!*r^sXnmWK5uokh_>iCJyH(*|=g3J9&J zZi2-JSTV3Et(GMfnWRXsmQ7)!h0fUP+WZnWYrOZ3(yQ7xF^#U@IA+5c_>tKKi z+Poj)%mHkfy^EhstxaVFa=h}s2@4SWp@%J)+ABj7Aj_&CA+4iiFWYT< zz@tU}jN7Bpe16`ddUg&!Zu8Gy-Wgvsl#WY;1&zxbm^+;I4(B~n_+Gkj?x2%x50tH8 zw`zt;OS-UL#Na0%UxZ%^J9DlA?1yTuEhrio0!4c;8G|IAUkeuxZGu}g4%|Mexvs9F z?JCZ6=xjUF*N}@85EEX9roGY_G%~y@h$aXNyiS4F4)JR6t>_A|dat?gI^6sWJukh~7@amMX5Il_>+P5TP$Y{jnvD+ddPOxs^a*aVW!rj-n#JDD#~72Y zMyHRC$=5V9XWFQJ&+#e|UM(RrJxy1YgYHM6$R*TT;Z=WnxBb! z4=fFWcwKp%Q;F7M!m?#)5d~rGSpq)EuX4?cw!ysG9#1QP!s<0{DVRo~X|?@ei(n{Dg*`PW;cKA=r(N{~T|Dw*6z7H| zU@ST%Op&ZM8Mo|6?Rfmc?nnjenU}1Lu!%E`YB;%6q;zeWN?OP3Gl5s79jm5_juZ}A zUAP=4Zk%i>Yage?D-_m3+LO3)$Vb9`@!y11HD~}Sxfu*nkuhYZ*n@3(&Oai>lY+tmK zMWM?xq(~gEX_-eyGn0yT_O`slo?%H*pA~$m^cFI_GS$*55h7uH4P6$m<64*4vWQm$ zqs=iG;*s5hONRCEOtM))S8$(7o#T~xw5i!$)fJPK3s(jB#0x~LEW)JZXB~RMHs>gB z;I-1LK@I0VdUb!^>k6-tS>^_TTper!ud*v67;&s}+UT0(y|%QaiL47z30#PjB#G12 zgshbrL`D?wRd@x&u-*!YhOR?V6a0wlq4Dkf>3JwXh_#GWsgK z(oCD}cZgRd8Vj%JnIgKzw2s%VS*)>7-X~S{Ugh4Rd{hG4Ynp*Zl0jWV>av`+wAK_wPAa^@cgG#k z6mhSJ8~|Q7m{E+uK?>8f9GZy5s}QT-nuE~BY+%*>*73SvRo0}O1Fr;*M0i~UUfYJ( za0F2hSI{)v;GO`yvMj5_@k*yGx^ZkDJDIs^;dNt)GjlG=^^n7J?j}{Z5drvc9KBUJx9KEiKEFc$xgJkwFrFD zhL01~(pKADFwuLH;innWOdEp`S^&Z*0QFHT&{5G16eeA^D>r7#>P5$029fC-rH+AD z-Zza+8x2Np|-S2@U1f*sao*a2Fwo_ZyS0%Z%CR$D+P_kO1XHfZwdWzm$4 zYawjO=?brKYMoJY0^t=C7bQ9I-6SPmu~5m!sxC0XYw-1QmUp`3>xN0*uLQq?2WIAp z?gEkmYH?q}s2(M>ZNzadtFRtg7J*-R0Ln~dqtqr{(nGXK$=}?ySHtSLbF>Qxv#X@o z#zy>>#48RdVTzbL|A{Fo=a6LkrQtQs^c7wq_H*_7&mYN6RNmVy&8Z9U7^i!k|#s-nB51-Zc6Away4b1ylox@uL76 zonn(tn&OBHuXQoz!_2v;;Z@(&R>R~AegdyB4sb?juU8GP9a9JehFt9|6XA6lcwOSU zEM5>^1=zrA6JR#HZr{AJhF7~0RfT$DhZ-^AFIbcy=!%Mssz3xC zWgrn=aY@i_ls`hbi7MXY#`}+7?T&=kEyJrPqeLd)`;VT#zJvI=#)Qi%n0w`FVicDa z6Bs*CmaO-xM%;33)$vLbNi@Y5pZUjOI_c_o#dX-E^?|DjymEC!WaP5i0Ux^YhCd4N z+FIoY_|uRS0s;nJ^Hf&XRCtZhV`|CjB+A+rH1|jAE1Sn9;-gVy2G3j)t=I6HV+y}q zLi>24dIV7~Pfg&=Y@jsRB^AvO4H3BPq?qK})5K{R}zs(VNFe(ML4P5&Y7NP zDed5E5Y}=;MDXd!f$b7Yuc2_TaeNZ>b(*c(2uRf(d?-hD&jYV@?R9sb zd^Nl-Uv<0+47ex)uZU4}i=t5E`ss|Fwi;!pj#n>{a&MNCuYuPar}5fjL##FeQ_Vzr z0%0+k+gGpLd(G(A>Gv85@Otlt+cPjz-3k;T)$jEupNUwq|AJR%;cdGkn4SP7bGqvh znZZd$4s_U@0_n+}oNGPT}`f^_x}1Et`IY5!CkCr{39D+Tx_3LZ5i417>ic#}z8t$uV}W`ZGNh0bDNZ~=GFuR9HL!ePW!ufiokBY^;o_z;+l?boh9`M@D zO2_M(dO#*)0}X*iNHwgU^&;g7*k1{c#}Zg};xT_Ww3DMic4hu82b?Nx*0 z&A@A@uP4MS%p*1&B3^~DSh9Jb#swtnS9tYR6R#s12f)a^*!#?*=wg65sCsp6jwb9q z;B||5)%QSG;B{`_C0_RpuRipQ`-S7RXd7N{VoL+~n7(~~dxG2B+%(@^%i7|c5cJv_ zq0h7HsY{HEQB*z6D!wl3cs)|+EAjdV!z;%+hx@>*N!86jcr_tfRTax62J*Q};q~Y^ zQ)WB7Ujwh2)&a}^X9KT{u%^2Y`Fs~Y`XpdKIcg`F z3z@|*Y2Lm|k1RvTgUv$onlx!q$>&Mm#}qL#1!m%a*kSFNAYNE@Rkn&_JcNz@ar3gT zlxAo`$9Bk)+6m$|dLpsoH7XIFV*mkzBZSv{BPCYVt|!MCn4>CAv8wb#l^rJndL-;L z=a1iC5oOId(9R|=1YS=Y2U6m-S;MQ>(-vOsJZ7fSZ7s2?n6-s&1u*LN_t)@x)$lqW zO_85!^x8WSLQ3wW2oF%| z-3d9c%oXt8Kvt8vK%B`&Qsj!4_PG+74oJx5=gWj4R#>$X=AocQcQ*q+wAUuq4&-=8 zc7%GlhTb&3n)7jFc!l_=1$d?Q+DpvUx`x*q!0T&w4(H-)MDH_y!43oW&Ymbi6=yz) zS+l*$wPit}Xpxer3UV%fMs*LxM{x?i;BC5(3K``2!GDlXg%nKMmL$N~U+0usp%REI|{BlXWdZBPRS249s zMxG59pQx1~5#%k~ZDrUT;2%>}(rzOzIcyt2_vJ>I%CI*;md_8)b5SYByNRYj6}mt8W`ipApN5*_YWyk9VaO_z-c78P1YXbC_rm0|wG8l{=`+FKb1LMk=3roHCulRQ*e%0_r? zb&G}$E#aj`yiTq?R&DAK!|NZ2SKC;_>&X*%y>4@sfX!(8DR_O6+Uo#G2Z2}7Rd^lA zAKNp$Mo2=Xz0P-t*S6vHex&r^LbDIPFTD0MOS_s4h}SEp@H!fG#MecI*PtEnYPSot z(YG?Qrk}=Y32x%G-#0=fd-wTyO1)cwLBVVX{Uh+@xWIKv}!w$vHR?y%HQ zF`o01%ZXMFWMwl|}>T5c<4SF?HciSKU)% zg9}&lxJUS(h_8kpX#Iv)olfDJw9<`}|AJR}hci0YCSks08~}7UdFA6EA+2C!SzBk& zYfG-J0n-XLh}T^0nJJ;bq91(>W2x*=cxfgOg_z0v55&`Dqai#6_sJ@lsYw!eMnNdO zr)%{xoj?f~KG?N?G3;HN@&OW4DzsWJYo5avO=WczjTzm3Ie>u-^g0?Rx)r^^E6nj= zZdE=9RuNo~sz)@Ppp7ai7NG;OxpGR-*37RabZ<3T$I;VSyfJZWqb)(TC%UuxEW6e^C=#3|&YG#T>jw?nquS&XH zltU{bAcC*3cL=WymE2XG$B6f7I8;+9uxoggEi7mxycWRg((oD)q*2mk(6rwdUcJ#i z0<%H`t>bkg@ap+s;ovvCn*SYl#EIb*U#)41#4G9oB<-c}swy*_Y1dfSN*VNfO^e-; z_UhN4@Olk+Wi6P=Cr;Li#R#vo7>`h4p;j&%SMU8h(;fJ&P0(qWDswSfNgd=OX%bDsrDVXCc?bJ5a@cOK2t`LtLAZIjR<~T7{eB}iv zpfL?12CE7#U<3hMC$gs`w!%NOYR2NBr~U}tk!+JMd0>GBpoRh}!d_E)H$g&^!rYgf z(^QBTc4IzyAn}5TvXKu>P^=KENg@0dG;IxqSB2U##-!y)(B}+k*lOOhqK{Z=c7dXa zT8V7F0B`5%dane~haiAyU4NzaTG?J3D5nh=;;_}dPE}={!fms;3mkq4B~s*)Cner2 znE@AVBg8cY1LS^NQ1@LG-{n=n-p6ik>3PH}&g?2{%jrt5-C5;H;Fj_%jRP!7?r}RC z+`1+os*GvR#Y1;+;mg+gNp)`>)Ls~%~vThu}nY@ly_Szb3 zj!iv9TMpwKDYvG*PW$HIGbPhFXG;@cVJLn3(Q6Y65Efnsk85}h?R6@=hHGmbub?aL z2rOU|cx4ru`*XW=%{F8ARHM3oF)r;Z$GeA)*JaxjZi8wFDuCUxY;}q78f@hzKfX1w z-B}tzl@yEH$!WY!COJe&MC}3Z)1HMSpMX1oQyKJ9P7`|dsf_3fbnRBOwAY;35HT4; zi>saXN!-+_y_T>=HHZkh4^la3B;i+v_A2jxQphV0iQF={iZD;UEp4+dSan!}3l6)Z zPpl%o6XLZN0vvI#eZ%XZ&A8W-D$`nc?cp~-d`^`j)tpH9x=6)YCQ{^q*Jp9fpFMj< zaj!TAR4huWDuioBsrn;(AS*9X_wP@fI!%nUK~AbbwJ_zP081O8UCHoD?D8ozK@(Ed zw-=er6GvkTS!NDVG!ApueN3f-`AAlRRCoSfwp0!{;Mj7+Q^n?aqTIQmA=f}F{HHWP zGkh+D1_Siqa-pFLpo)SHT3W573xMO9vE*wc7StPYSH=P1m0QjHUTWaJ9G39 zf}N1X+aqe8WGf^vOC=mHrGW#M)HLK*z%5yk+lhW0wi$@5Exhol+g>ko4+H6>+iMo=zL0#)$QYumtUuEZX9ZPjhBQx+#sV3xLr z4}sUV(RDoDG?T9^pnmbb4ZOmw)o7aA`o;T46{)$|m2Z9jom@>OV%LR8QsoA`CfY9gv%r_m6K zIgzjGNebVB$}=SmDG^{xX@BlW;1En#9M_b{9sywvg48}b1*A85x~O;7iKqu$JBs*Z znG?b$@Tv=GfgwaY=~8>G+ue^WDR#eOR$#k%W=tzs!|SUptDs33V&uwzZsbLIWqziY zrcKecK~DyZ1LvN7_6#bzC@^cAdHIgllEx3|u0hvu4Th{><}h_tv3ke(YWz%}l*s5` zNxWQ_>`7VMfc5H>63vUauMmGrv-Fe3+YnGx(a=fs2=*D(JIZhoUYlB)Y#FQ22%= z>_NX=lCRUJ;dPgIMO$RYYc0sz@aiG{d1v+!gGQaN9y!1c%^l$tQpf8E$pO}C33!#M zGGHdW(xp2MyoT5n`07665ff!?iDAMk1G73)xc?)qAU3Fu*Ua(Ccv~@Fcr|rgc0b{@ zw!wzio2I?0w7_C)c&+wUcpVe3@NX$8wq`XXUR47zc@bT6wOk6~UJnef^l7L73mb~L zaUjjTcPekZivCfv4|-Hru`VfX^GQ%4Ep>ge12aV(vfv0Z(J&OMtF0ByWHsDGX_63{ z7B*yVR0u2u+G|9!ENc<1R%DzuRW~Zi5}A7bLXo?}iRsr6;?)wDE4)&O*Q^J7Q`*@_ zP%|X%a=`00+>12+rcu#`YN7q3+rDr-;7|##&|VSu8hBMpKig6M%Bm$2OXNm8P z=#?CIN6eA2MfxHv$P#Qg2S2%=bScsbq`lf1lsaDfX~BZo9LUx2 zda#d9{*5H?N;!qsPG)%BpP^d;q*4{{)AowC*P*?xAbEmr%$*VeX2h$Cd^rVy*FibY zmbO2{>+L#UPl(q=k`k|r3a`K(< z`07W>48qHuX||lSh1ZihUu|!9Gh=TTbkoW1Li)LSeQdg?&!S3yi31Su^^kGevCB1DjYshckk-LUUk})`7H4m zN4aX_JCXmHtni9vDD#iwHC=@K_f40@7S@D#uAq+5r8-a zge)K~+N#pJ8t%v!hHCdIv;C10hz+N2WVHRy^t39SCylOini zh5HrB*W86Vt)$nJ@s%!kjNg!KS~gTcGTgvOHq)c6m~UK$A0P1zNP>)jH4` zBB{=-LYMp`B48OxqV}s|E^S~rWa*>yz}-@S1Ras-)AC^<%zd8r>R-$v1;+lAEhHXM za6WsHmSz+VZ|IU&u9M83iR`Ipg|kJ~wMi)=&x{*PtQM$9V+3rk#AapXBe&0l^~Pc> zW@W<2;!*pW#hZkLk!62mYaRF%7Ngik6-CM}t9YNqaEaH8o>uSyX|F5-hAoj7&fsbb zC_R86Q{3sAc`q=j6^cF}&MEJT@S3Q?$GWs@BEIQ+;(+0^8n^dUIliAqs;g>U1zvTl ztK*fwQys4%dYTBAAsb1BSI&G=;(O4qQ*A&Ctnx(Lo;t;zRmCid;sm_pt5Wm*9fWLv zJh|}NETq3m7w;<3RlMW=Q=#Rqsb&IugG2X(H2nS+?yM3E^(1CqAJH?{2miUfV1%~b zwJ)cI?A1VdS>hD#_E3*ZMTR2krsNMW{v>*huL&*6%Gyes#H(r~S9n!jPMFrUIVObB zj^p)|PPPS&eTk%l>dhIxRE%9dj0Q`n6vAzt~eiL$oD*hX00^hjMmU!?l# zqgk39g=`nal_cP+P0?^*XqT2N7TqqDWe~g>V(M!f*N!$EBJ+Se)k?e3%xc(~q~)V} zYMduvB!d#H+hHT_5HCo0YnG8v=9nk!T9m4F0tT^8UE(!&?e!U^6$D;e&1!UvOCZTd zXobi|zm!uQ9{+7S-T$>Sq(1xPSE`1(_UED|&3NRtNI0J#{CD#76~~(YPpOu*IW_=A z%ZrenwAY}k_!{DP1$(8w8eTV)p~|}KtOBmMC^dC*!;EF9@tiBd_@QV!6Qtr%fmOS& zlvXh=f=Je2%BE;>X3z3ebuVcY=|LqWH5G)M7A)q%XjglZ+jIMHuZNbAG_WyF*0vz< zdbX;T#XE-WX@%EjAq7OmEs4@ZugzdZ&nNdgA_st1;UW-e(8zP(wFA8Rtboq@&|Xy= zAm4j+h1a9N>-Ap0+9(|`3A}QTqT2+u4kCHIeqp*}^N*3P#i{1FxrSA&&>%YiKe+FCFa`LW87U2-0S1Q2bIcj-5RMNZx*Yc~qM4q+5^VXk6ma$SMyj@vj#t@U*@)XVp@4dUezCS)yYH=0F6&=hZR7faw?-F7Ne@X0T~?T4 z_lr~IwDHI%Ed6?R&8x)+;+2}YEWhC*a|UjaLZ(mu_m8^O^F!I{2+X^SwPB5cpAcgI9q!N6^Q?*ya zD+!>eSRqHkq*&az*6R$I4HJ6^M9 zTX?PSE%6G64WT14v2-cbKRHBoZqb)hx;r?EtOKtUHVAYn(wume$gU)3l^jzP*=O;F z0hItIhw+xezXUP+8?@OTM0Axv+vTWJc-?lM#>g_r>b179$qL<#vt1zvTQsAD5U;y4 zgD1`!;Wg|xt4^_t8QYRYm#x8u1swGxLn`TFycq~!`6{!9g}}ib*%w zJimAD!nt$jF8o`GdGX>u$$weWg-e`Xf>fVhU#MQ|nG2q1`m|O0z0J+$u!%4X6nHFAWs7*dRCO!xd@VhZgp+-R*X9KIU`bjqW)GGfl}Z*&8RENS zpSrLPh_EUbR50NbnRzhf*dHvidDNanH34DPr0hw1^~{Z~vSw0-2SiPXOkzu6He!~e z@~bHr&|3_z2x^4VG7?_T$v+3Io&{bJ;CogjUF6qAh%F5NR%FgA-IrM3WJ0`ZC*3&k zHUL`HhqG=4Or*C{+KRe>$UZoyS9#21U2J;DGvyd+S$H&5-yCYVwR1C zPvf-$H|o8zm_6~z$f-JBuX$aT_Lz;h+3-aiMgFN}Gt6vmQudnW+ET7Vh_wx1%}6TT z$5-pz25XNiyuv2Ind^APOyCupTw!5_*Rk*_*w^v;FUrpD=VdsGn7T{|8?Ipu7cG*oi9Blflk`q;`&88$5Gv|I7jS*cVSin1C?ua(sl72@1- z$tZJMkYj7SRs*|sh}R?gAqo_wemzh{UPu9|;igLI`fG3)IQT8Y;C+Q zfmhWpxluj)@u}U)N4|j7l1iRUw|Xc8RzGS;m>KG%Rp3vVWA0X9yt-4Yv{%;K(m1BP zHU?Mc$Ip#VAT}0%J^aHTq(||4FYt<92$W&2?|HpH85?PVcIizKYfs;rmgq2;T71;Y zkktw=eA~l<{}CUpj2(j7t2&65YRLhfM{Cp?bPQXPXQHKEp?U%5&dnE7x1p5R2uW|5 zwMEv5r4cd^-Yh>=3$em$bcLYxD#}nCt3;lxHV8S=$x~ATahS4!nwYhXi#`dkR2Bf* zR7+c3%xg|Nh;mr&5*KL&6vur-YaJ53P%D@?8<7JnsSmuCB80Ye*zDSe2(PI3nnA+A zd~tJRu!p0*%vVHn3a^x`zWL+zyx{d9i$up75r>fj7ugJkTmfDk_nIwRQSTLazZun;1v>hP2+%v>~j@fmpi=900MV6E_4^BJ1r z$K{KVkK2zIFP@oXkkYWiw1d~9B`~Xm$4`#vado+vjX_sY;ZJe@{+=+2DPCf^*8C~n zDCMtPaX1;S4icKMm~e5QOA8-&B+ePm`WU%C>yEL|W2JP))Qe&Fa_R9r(T<3cC(a#M z%uY@CgOPIx|Axi(n&M(E25KxQPN2Xm?J>tHK2WoF#lgdYSH(~=Y(vtDOdA@rEGQxE zm6w2H7hJEJ8>-On;StEsieipy9qy{mOPf`;t9*gM*NTC_5dJ!_IPu!bEa1R^R}qyj z{tr4@@LC#ipQ4uyX~_7MyXvqD4B2s3BByCmb}7Vtgd2TGyb>zF>kL-GZ3P`>^ICWf z;JBOC05#hi$le-Au^ZhYFH*yM%NaT;h*#^EnKH}Iu}RbhoGTB@*$k#u;5h_Iv1*7N zm`uFl(w`Bp;FFctg4gjHoqYM>O9)u721$t_GuoE%m&7XrP;(q=$yoLu#t}T_8 zm>RF21FtRZb(?tgnC1KmypF1>gI5N{BDoj^Y^)Gcz(hZ++reyit5PY8TIybojFgVh z7XCa7xy*TlaxJSL!!vel;e6|7`9tb z_UhNj(hn%zzI_{)tF%|kxOWtf>sT6#SEedMpHiq3C*5<`N4<#W5;p)IUi0{Xhm>Q} zOYpXwgU6Pqt){5;g?%+pR}LruSDL}JJzB=Ag){za;#CO&s5N`icy(q$7Qz-@70d4C z5D@E^^q^uYiD~8O9#*oVFWtV9J=sDjxE6oX5xwd4onGOT5nGPoH74R&0 z%~Vew9X1KzmGs0G#rB#f%(&M%U?n(WB4JgigQo@|{!Ih`C4}HG^3N@{DyucRC0c>G zv$YRkajX3N{<9~oB4d333Rg7W-+h&QvAn&$uf$`coX#10T^hF9-C$a*1&UxVc%4pg zQrFPRhk3{9_kiWZ>#k@^8?Tj;QO?5lim$ed*Fx9z)1N;mpNo8Xa`VWc6lbI*ULny8 zCK{};2jylqTOEfsSkTuYs%D9iBuN6ei`M{N%*2wYI2|A=7K1+MD!`7%unXJ+OD~@| z3bx+S(*8K@1${}Vv#FM5E0&Cm!dy^2RcvEb8+7o>lh%F2=+I7MS3Re>o*OS_FKE|x z7n0ordTCGJTU7#igUf;;N+71!dllBxI zrn$7&Zau9&HBdhFUPRVbvem9N;FU-LtQPebwWf;f0O9ppHBkKK;v(@133S^y;OAB1 zHGN2lSF@zJwnC!8!r(NkDD2Hq>Y&6G>|!oIzp58*ZM(mjet87CrhJabfns}Yb<>je zD!f{0UhTBkz&Cqs;f`lKUb6r~R9+jMi0~?(f7@uP+-*!1_#ufVi)sTY1wQdA$;~V- z6Gcjj$ov!A@*rA=TMbS~DaV$d&sY;;&X_!UAlE5%&6j4m0bbp0l*S{b{#`snxa!>Y zm8sLT@oGuDV#lZJTfl3U#&sO_swv7VBCTKYqYk6~psw*5{OKMx!^z=E;FXX6<8#zr zPpVyx@w(ky-IuwskPmjXw!SL5LV5ypVAJL}zO{uB6TzxQ*M8ttpBGbiF7`0x9yMNj z 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

;}*r`L<$IiU6lvoL2OCmiu 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%0D(P~;TMrKk#ewskuzs2-s@#+WKn1U4n^M*a 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

#ElKnE&u!uk3M03YbTMsp~sSYGjV$sP7dEC?Fy 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 LRb`5$%>w=pB)J%! diff --git a/luci-app-smartsafehub/docs/assets/dashboard-white.png b/luci-app-smartsafehub/docs/assets/dashboard-white.png index 47840bcaa91017d29270561114437cbb7af542cb..fb906ce3d1211be5de11306fd345aea55cb9244d 100644 GIT binary patch literal 594200 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ⅈ_Aht^qHb*1DiAt>SIg&8oN^t9@0J*@ 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

4TSyQL=ba8&8kmGJbS$;T@{UX=ZG9A<}i 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�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%0AqvvS3hXRE1)RBTO3iB9Wf9WV^7d zb+ODKB}kFP6IT;gb5gD1YAJqW#?(IRp>&gH>loZ)lVUm6W5JJAcoo2QU0Y00C%g*Q zf#>z(#~MHS`H#J^b@*84Gbc}e{^ZMbr#`y#wNIKCUXJ0rpy*2A^gLg_k-OrfF$6W1 zwsJE`*D!;!18K=2Gf>gOFU9h>+NNF>J6QuZ$ez@2*TSn&{rg!o+Gto?5^-y zf)s%K$msCwQu@}diJ7Gk69P&%bfz)ai!S=1-k!Z*6_~RQFSFNShx4Q39 zc*U;Fa4K?>d{uy_YdHYjMV=JlmBnEAWUIHr=Hk{>jIpQ|LTsa9j6?WNha+&Sqh0|8 z-*v)pH7%8g6N$rQd<15?I&yHkSXWeeWqENLCe~E$Ed;z4l4G1oFD;nNl-(-x*%9iza3;ObTI-0Wf|-ppqtgA}!lRdv(E;K_q43%#5C>0!KKK0yFpFR1>PrWpFYU_q4-uTSdUM>`PWvM%K zsnBUFZu=bjANtUTbYu?2l!#_YNVtx|3eM6FKcyoE1X1Dfm)54}QB;W%LTByy6IjDH zlTl}G00R6v08z7^5V4At8cB+Pt*{1EO*psa4n&9Y`GtIDWh^&(GyjDvxyftJ*wW;c z%r#W#n7BEaN-j)HPn;WCbk0vLX0P7Lk6v_c&0n9%_AfdEy}5G(ncNEE?`oS8`I(S8 zHWTW{`@mKI%FiFK?|4e(snl2}M8tLPg}ju><|D9XRyDK;LVzkDg3FeWvwz;PI#W`o8wjhPFdLd}UYQ z(|`Qo6$EGHR zp8=|aL9Vy?mTq9G=#K4;;3{pdzvp|GEgjmRPQX@`A62S9;$(c-0zX9-TIf1J#yQM$vV1QT&9~WQMaV5-fzhTl|TK z1zm#_WhF#qt}blBV}WkU5V-9+A<|;1g$gXZ;!cXKS%6&AEXwq3ye#nIYKeNar3}am zp;^p;S8IE9s}-Q+$G@qQo&#v>Z^J=zbwW9fmZ=d39*!d?Rcfi4kx;# zWK45&Be{VQ-^Pn$sY5h@@azj%~k+a@iO4myzt8DH(ov)7I>w3Kz;se zijvq0)`V9`Kt&Z(o9M%Hcpto0x$sJj$-=9FtRr+@696RsvJaK(woTYVkv27O&=d97 z!z<2O7u2&A=wHlb@>h4|7t=E%gV&t7)P)7qAiS2j+F-6_r%@kvHkVm!7+PK!$qvmq z7y1N*ouxTPypY+Uh0KoO>`W?iesIpY`A{U8pH0`#=F@Nin(M+N7ujIG2{zwzBct`R z4thgSK{Vh!{)eG+;t}+LKQDB^TXQFedIpn#v+_+aZxZ= zzF-2T{)J}()jRu5>l=M-t&?Y-*&S=0eB$N0@WIv{2VVG0Z=(Ldsjq#u<%J)9_S0vc zo;>r}P&oWxgTMncR$_xPP!lLrape$V)p-n@m65&=UdsWmFe?j$O5_r=wV-zsVo1Wg zS}0BN8Y>hqG~B3h-@fMN)(;ka>nE39-@EsL2lhS+Sbd)I*t>hN=JiYOz5UD0O1TJO z6p{F>>hM1^=gUNR7zDjyN^(-AET>tSZ3@~wcnuPur4$5?52O)z1>0K{INzYl^Q^cY z!4+1wgJVgG%5wcbNW1c%M(QZuFNc5@u!R6^p(QO>D@7N(Zrc#uh#S@`MY5)twr;^n zVGAwWT5Bm}O{syPUDj3CBd$kQO}wx5UaxpZjmIV)@z!W!V*DF?$9x$^)L(qM(`n~B z)0rvrnK$o!-sj;>4>NOvb52<3oU;uo?Zk-Wi>DBnTo`CU4hFWg!pLwP?-id&%Dy3G zzk@5EurUu2D%x1N%x9DEy3wtm3Zc+u;x4fOJU1B^oC^!ln{G0qIc;@>uR}u;UI!QE zh(iM4+6c>V&uKAWFuSkSh_2Yc5r?6{*HC>OhYBbg3A;(%7P%n$3^-G}vb+*rVIZWon)uX9_9yU^MuMxWkyK)>??7fM7l};eR<~u+!H1H%(yAWe z6*l+fmr9tcoxa)#D#LjjFUTYM1U7$N7w!k2S_ z+za8@N-^Hpe}3wrR4`J?Z!Z=LnSy|zYjN0SY0`y?Q$8VP@@cPd#xemCbP*rJRTd*hUBn;8Z!zdGoDrAvAC)I<8-{VYMuP>r2P3^0^3I z$uMz`r;j}@39qn2M9kzz=td&NGrV$5wF<9Iy#SWj$!`N*!PPTU*cCM6^=(bq+Z;e2 z;1!e!fLma8>MOW8H#d+4E=Q}Lygu{pD0qkfuS#Dk)?_4o7p8|c^4`EFxEN4Y1FtYz z7TE&Ma!iJijNz3Pvj(b~uo@3{MIohwh#zQC+bSvs=jP_3KstwNQj?wlb_l?ey;t^K z0bQZ+4;P?OM$Kz$=u!)(A&#dS)fI=4cN@7PIkGd}Uj<{7`X+D5Y%xud-LOZ1f`2 zSe&C58!=QBPBB)>rl6||ud2$c*vMD&wW?)fZse%xRjn4<1g~-fnt-I#FQ~_zW2c+p z^>la3{EfHXd;k7lc3u0F?yg&P5AR>Td;j65zmLvp{2MbfG&DPax z?mG;k1ZeU^XhPN8`hmI#Fue}te9;U_Spk*U@@VP8N@fQb-6G|3T2K87b-ns}*=$$p zT5=8(zL@q^!Yj2XX{8Y7-{F-b8mdMYR&5cvvdZezi(UEUk%_1%L}v1qKs+tPfyHhS zJ9=X0d}J+Fj4#GrrG#mzI4E?n&6dFTMVyoxwVo) zw^T8Jz6UUxG|@SJ2l(4oOGUAjlpte~J@TmzjY3D(u5+$?^S!sfy%2%}-+jlyfmd$3 z?ZR)~IX2p|tw*8)fE$uf5yM*BB)oD|fQ+Tqa1U6ml;im@{bOK9vxL_{_-Z)y=#bi7 z+g<&jO6N8MVZaO>IlB6L`XFEd=5kr8u(6&Ev5Ot;As3{Lph9l19y-dJ+JT{nGRRGi z>WU7qy>`2&qpQ+yC-}ik9~?Lfm{($~8F7f-6Yms0@@e3;7U6Yp z(1tq#*{NIH?PgnRm%ph3Tvh;R;1R$Ai$!16G}PTaL=a2xY6Q2m2{M+W-G|^aJfNZO z9i1>U)a`<}hn~RI1if`^#*3_#7Du(-jP)*cc#b_pQy4|sirtTwC6`F>4{Wgjg_5fx z=yu8Qibes`tMM}FLU^UodVi-yRggmw&?`+<{Hz21Gdc>UTV_wK(LnvXtv z?Hytkr176zx*NF554fMb_O9D+U%zAD15muYZ{OYHH|#&G1Li<@{o2cJz4o4w{kPwB z!96>no8iuPVQUB6w?4H~ybPg*n}MA5`2Hsi^H1!%?DoS(hz+!xfSARsHW?fMh7#bW z;((AwMhB^rQu9LYYQi)cXE21<`O-{FJiihTEf?>&Ka)J1cIPv( zawIxF9xshO7g;Zlmg7hAWv?(53c_v)A1$ZvPlU@W>CEWi(vkd{>&Z}{T)4j+bU2qY zz4?cB+#6di=3}K*TZ5Sd_f&W#$r;kw-ssQE1X7mRfdNWSC}a+hAaFev#VQZ}3VDDY zlp(M|&&-s@YeeE`EgQN-l!!;fLL?i-nuspF`4lnw>C^9g{>>*pTnG`@A3pi)^LL*9 z^pcyp`cXlPje>>*RjsU?OYo}70TQ)T1Fv9hGPNb)mCkwvIIs2rAXpeHjY61^l4Y~C z_L~h37lLcIt-;Zxx55$=IDr)%dp&lSt7*VBFn67yMQ?z-Fy5}cx~Nl#Hctn%lJOgj zpf}?a!tbEgW!U$JjZO;vIWxRUG8a`yDQr@1BuIBBgxBu5QzX19(QA_}>NN-=nS1f8 z2ZlP)m#&081Ol%R)vb=Gh#nesd1h_)CQNL#R8}@r4GeX7?VUr1kR07PG*@-VQZkr)SHN58Ai=8| zgQTi0zl2wobdh;~#8-gV@lw2y&t-;%vyeDswlu$(HaD1S0AoO$zZhPX z`0HtE(|tlPtmeZ1bu5H;np$e9X0`aTl`yDsu-GHkJZZ|U5(^8AE^r}WsM?c@8~#g| z6+=Ve=dEq-r8@#* z*O9~P?P6s4$kNizk@a2e=dRy*$C4E&vF+QImPgvx?^s`2YFS@eKQbmzCu{yNY|XfI zphnCujqBEz&TZdyWZqprcE_Dd?d{v#=)F?gG8JA~wWSu^9h_0_{M=VfQXAo}*~ah+ zsVxbs{3;{S@*{aSl71+B6Cbb!Ue$Y7^HzA3MFbjnZ6} zbR|-oJ);gb2H{6V^p)Thkbod6zHX({oQ$PshGrtIJ$C(x$>eO*8_kBr zpx7}P@_OdFv%L#M95~~Yn?gH0jp4+3o=&6`ba(8S$qo$t;YtRC)e8J6olXp=3yG+h zUyRK}LV<|4w#hq}%${(JRt;2jB*U{!PM8`Rs~KKN%eRr>wH2;NQZL*LuR>_ymBtb= ztDaLKd}UH>ZG0>o8avx0bmJqYk?{j#=eo~zx9b{~#;)7A29+%QX^@+OCfF)Kqhd6c zyd%7+*B&Yp5+tApjr4U^Tb6k$+3Q(_*JhPKq-^ABsQi*RNlY>oC$zc;EGTd)e?J3{ ziYG>deXNNWSd2wgTPFBN|JN`?!94Wyg}HMHlVA=EQH(w`oU6k!ty2ZP!}ZY26wC#q zqOKbL925sc%egysxT$T(yfZ0WDabBKcAmv7%R8z%hg)=Y>4$5ZH^D3GM>7$X`W~QbqxMQ5IH95> zlJf$CO!ifXuJ%#8zhiJNx;wh(sy!`Yvz>Xm)dvBDL!(GL0-v(Gv$K1sj+vU=PN$BT zQ>5HNrljMzuv(HjX+MDXS});MIT~oM5Hb0Te2B%Yl*5&EkWN3OyIHKLTcxn2CYk0IbQ!1~{?O4lYR;#Eef+)|D zvP?UL`N2AdS3!TkO1@Y1UaQG_Wq4K9oal{eEk+Q4vVz(GWvvW~Y^&ON5H1R)eBqRr zl8MbVLPSW_K7pcF1>2x!ccyB}>8&tPUC&J%SBmEnh)T5A3Sl)c)1C*)w6qGd zGO1nzFxd|A7q`_6;D-%e2?E>6+}J_;T>PB6y`mri$Yg>6I~kiKY*S^jU>Kq%jG%4Q z;A~3`tO|X&;R_rN?#2z924hdV+1lAR$MkcCSDf%~2w5!3X1BJ|#Y)xK!~?0oA4p9p zVYGR}gIB1_e9pDtNQJV>dhGjiFC5BF$#t}S3^ZFXpb!w9SdGvCq{o24+hEYhM38B= zD&dvAR`dd;z_bdlJYI#@UcXH#szK7wsrS_wPuBrw$l}~>ZJRS!Le{}E#81n0t@?}1 zc)vF5jJD1y57Nd*QC6VBsJo)Z)Y1TTby1rGuK0l=JD{0s$lho7JM>;E5e0bFvzjS+ zu5DHLObdI*HCpHn!f(Ju0i5l?ABmmr;YucEF}#u|gThkmm0^QsD79~*9)1#D8`+nu z=B$#vfBV56SEt=|mCsYVpfjWXs~7G?+qMDu$l^Bn9FCqt9J+s{)7&t1cF3W#~^)|ujt9rHDTRD3F5NIPuqj`C`t z9I+4W4U`WD$`iwp1A+3gfahqNzi%O#FD}j&rW?;6IVF)>EKKE>g;@kL*=#Wzbvd&~ zgUjX6dU*lUaOTD0R>AGDlYH~6nI4n1f4tfGEmaR`Iu~FsOPko z$*HrhWM&p4(@EdjYO<7AO;v7p1oC5nhYn?nV-rXFl8O0r$q-*0S&3O}T^$34>}okZ zx0VWI^7cM}*M-T*fx=p6AvbcQ;1F$QlNiZO8w}w{Rybl);hCe;V!#_-3on-g+4vv9 z)b{K{p4D=7;<+I!r3YEAQm?`*97YHBlRz7u0BAPXn*Ch&I4W>5YsZAo!x;i@M4dQP}@y#Llw) z27&WAFENiKRg`3|NFR*9m!}JJb0^$Zck3B{wCV>zb)$u%sGD2+Yox@WDi7sfZNI@2 z&~Lv1KAV(>1Ns$g-5c;qK|K;6(zMteA+z@{`F} zkKG(B21Gu7cBe76cAm&gR*nbbxnU92dF&m2|Ji4!rVROVD$*-frh@TG9HoTt6MKLPO;J<|Z!9Q9z#V%ryTD{JZnvnE(A2V8Bb-4WX%5In z+=ygIQFZESlGDM}#nohOJf2&dn2Pwi`@7E*6J=YvAPh&tzSBg0YPJYL&49se**j3Z zqcXDC37+c8T6o*puI|0zu!zJxrK6F2$XEligbk+YwQBHSLt;6%noGn|!s2uVM6kRg zoa}Io#p2VA;ps>zSL-I;h=!uhKQNc5*`)U>s|wJ2wGYCD%aSf#LIyCU17aX`S7ewm z1c6E1p*S46tJI1Bw#Og`0b5iR*mPso2CR_iZa`PD z#c2OXkI`7eT$0}qT|s>wqzoll4NkKYy;n?awISdjA7rD=G5!OwyjE^kjQMO8UbV(9 zCgB>r!URoaYbiUgq_Q;5B`axfHHnNWS}NTLD88eXZXvvG!f*O|HTtWC*G_vCFfEDR z2*99(I$5GnY7X!gRPU9k1wfzKy&F0f+W=G1Ad74poI8PU2wpp?1{aK6KxlMgnW=_s-8)$5?-q|!7F$6ZX)he-^ht$UwrlLBga1Y{)^8)627-S_~MHXpB9E= zKYe_;_s~y29sKzFlOMcy$sx}RCy(pfKmF=eas1@>AOH0GV!hD@bxJlYX_xR?#oZS8 z#PZG}ydqxlExYdT@QQsuqH3ai@;rC}io`SZNxNFrb8H#vZ%>k|3J-qMV9vJ|wP?HY3Rh{bYnq!bV43l_7@ zXlNGaFXmFIthGPAdj4c!d0JTX9U@eowDb#0y)|7*b!RiVOlrVQr36$}9OF|FQf!-mnDO&`kF zW-@$57@~upoG)qFDAH3Fe57#-_rnG+KJFO^ShZDy>g}Xdq_78xZ?D2Dji!kFCU~W1FmV2zXnN$z;8Qqi{Vl6ath>li@Wo zoM|Nz2YI)o1dThcz-zsPS5~qE@MOv>Y?J%>u?{tJ>$u|xRvcIWUi-GUzwrIZSAYHK z;7?zCd+}SsdHmzIfB5RS@E(8T$M~i!Toe;&`Q1^Yy#a*J94NUq3cz?!dAkfh?trrOST`9o`2Atu*^uQ)DNVsk<~J0X^UiZ=*RqR#q! zx~jY?3Txrn0SH}-EI6v|rL>sHgy4aJJcF53oe(t>S!fxVoD@E@F|?Kxy71IcI4OF{ zq4-qP_0WXTLBAnbrDQO}?h_xP0_d^`uZ&1+BuLm_wE?ddrAdr*A2gk$&|hj{H&$#l zfIyr+_84A9I1AdU1~e1~pbQecqBZE~bJ47rc8njL`exbME^$7n@Z zLu-gD>b~#`Psn)o-wlr0%!b;w2F;=kNv=&UEp^nwe`Yf#=Kf*RI@W!oj%EbVX7Yi( z@+Kst9*eMb_6@SIJx_4T&D1*1V0I{K>628GkHFZhNRX^pXx;I-3^R~NbI46kZ%K+zl^$KI&IYZr?z zw>io7Q~@`LJWl{k=bjUdjnaE<+=JSvUavRmtl~0LJ4m7n9nsZ3wEgNwe*EIq&z}|t559WxV9lIi&%rOgclu_JU;N&f0{Pf$u zAG_qx@sppu{qZ|reSiF=&%Xct+i#zq{nBYgB^q@9S(XrMwG^IXtMO>3j}jwwy2JT!~a~e4^)k0H707#nN*V2a4JDQaqmN-CoKUiW87~5wq1z z_KN<}v{(UmF6N$E9A61u;V{)j`y!cqrh6&gyQ>(_XFR)#xp-!@7K@@F?<0$Z@!O~# zQK~w~kTH0%46i(rB^^2Tda4Sql)uy4yw-k8Fg`!l8x3V5+1|ohWw$->&~t@+u&mi$! zTANC(*7Z(@c8Rk?!X(ZwKa|Q(jO7kZJOnZo-LYaJUhXvkf3~)c^xvx_yw)H<69E5bK(~5?-YgSQR}CN_cH%c$MTj;Rkqi zx3*fX5OcHH_Q2J-r+TlS=Y9_Ee*fdiH@&o)5qI{PWMh`5-7vaL)j$KlWRwCL_IX%*N4qWv)JEM2Sws0fask zUTw7hq%-J97N*1I&{`^$%BMR$K*)+kl9uyl!iMuESHeaSo?HoF^1%#|tAVEeL~!=( z#8kpl6I+{3r6SqrfM@Q!)zz>Vn>VB3>4A@8HAtEDkFJ({)@* z3ulTO1uFhOK|cu+%GfI%BWk1k#n|<|wpE7VoTN2POl*^kEGKPqw2^I@Hqsbvl~RkM zbyZ2x=>{z{`{8sf)glaI9q5&MQA#1~UMMmcf)s|M*nwq}GUjNv!4w>I-iVIkg@1w1 z`@HAN=^+k%*iMq~eCOmOX`Z~_`{Q|Y>4f$AH;A-{UjOLB6Cc0x#WPR!?LBe)_~%nr z<@4kFtRqKH9z7bePJeNc`xIl zp?4d~shENNax5uO;ovp&H!z8V?880Koxu*8rD+>rP^wVC0Duw4>A`ex{s7V4-)PtX zEK}^(BV^m-=;btk5yJ5Mh;6|G91Un22T$*nB1F`^VB-$zFl(+PpxN!FlrZFP#I1J~ zWIjLd8i9sHf?iUKB_sE5m}ThIt9&!`>VGPaUd=>5y;=(2wM5fT`smfo>usS|7gipL zSs_v@(!Yb$mj-(>RTR8P60m^Jii5=okw{_R*zSYaRgh604*HZo9`s>< z8PEd|oJXz}sE!mX8T-`SZG!X)rbUojis_gwZzT8H{Jpk9n2D`XH>Kt_I{tGRNv_dU zuU>#f{lk6LmAflz*Y94eUf+`j`s8A+rGhE!@N4UH_yxlvoEss)I-&CEd zRY*WUzm9aMW&`K!^HVQYUVpNVN`rW9E*s339#18Ps)2k*Emj>OyD|i#P9mjOR`#+> zt~7(8?P4Ms7U=bH`Tgs3>D4bxWtP-YHcv%dVNOF_ajwlN-K<(Jrt;LZ(`w%HDquDG zPeifT%dzsdgf~ymsbtUFM9qxj_1EX;>vf$k2fvNMK)h~5py`l^*W(G6czG%zLvjGz z7M1|pcpW`iFu?wWq)&)ok9WyyQcwfRGT_;|lK4B5%E38cd_4ZN)e2aC<1Av9eqG`e z0GNLP5$wbR`u5-|qDrrO9DY?P4He;ksinc{snR6X7P}`q@=OTdajb<51))J!(Jj911o>6TjieW^4;aze_dL+yYT16 z`pv)2A6qCd-M+N-!>#4SwHudyxUzBHdcrP{UL#uDk1eI~By(RPrAXg5?NvZ(ZBR}T z`_@mdpnf<&Q{DM|EVXZ6akUiLE^Skte1fdh8O)6b#LyTD+b^f_^QGAn4i1f!P>#@E zt(Im=k-iBa5{m>K6rkFHBn+tF+zkGhVUTK9Lw7+SYgfu3@`>3#R`qiw;AiMH7@_=T zMtrZHV%Bs_7Q;b`bUAZ%3ndk)awM|7y(;S$5a=qJis!n*FDKLXIEtbQc2^oE5i|;o z8@_jfr5mC|Q-aSr7z^7mdpwJvrzE66W&vSNi+B)P2IF=v*k0^|lc}>K4}X6wSe({6 zJW?2znz4 zmjp{hVF*8=WmGNJ)BVr|+;^z;z^HfY2VJ%GxB#-)WD(X51-cA@lL}eH39{V{K%rMI}Jfj>P0r0x|s_*hwQcG9c52~+JVelO`y zQe;4SO+H}E<+x?&wa_kVqTnoRZRN%dEQ@da5B$Zhmz+5G_=zpb0h+ zQh=vA+6XCq!Wx#H+%?GEF4MfKtvEtkTJ8YSV-AD(O(y7PQILvaU>%!jYuLinkFmwM z*Z|VqP(*4`y)n!*3}{n}2gQaC0hYB09Y`;5Isj;`a%2215s}Lcf?jDzxLp;3O0O7J zrxEEjXROy$ECoDD=dAz{VEjIze$BmJS6J(OoOcFQXhyV%zBKgY>5LfvJ7Ha3%PL@A9Pc8Cr<*WLJTc4)4a((54T)qo^Q z=RiBr#?TgR+a1;oRj9F1wJvEa9oM5VYHF_j12jh2Nzm6guUSC=sKU(K-j_OV;fBZg zx8|x`dr*wcq_ARIe1tt1#RJ~g2>}|8I;b7A@lf7Bj>#E-us-MtlM4x3PGs{`pdHyQ zBY~_)+>(MDBv%JNI5u~Mz2{M|ov!n{^xn$hbUoO}Gs#nn@h5VO?4zi?ww!h%64Bps zb??)x1HG!=sCWPgp(LSK%ddrt_g4v!v3oiM{QEUo%qz(A`(F8r!$S!eq^+SYo_!~0 zdJb8SUfEpBZ?!T@%ZeI$<#(EOqo7wR{~71NIHwbdCcSnCB}e~Qa`Wcdb7#+ehfe>3 zv%psd^5C3-j{ElMWdH2%2%e4mHkS7unj|V%@%{&1U~z|^UMcCq98_bycDI9Gd&M^p zVMLNL(4<$gid4jklla)HOFv$;?6r%vp<{>Es*?*=0R+2nVQt~!;^xxA=F)|Wn+uDJ z#kJqIu3!Fb$y!{wcJ2BfOVV|qI_EHJU17vrG;IhBB>4)IQt43Nt4FW#MDPWv+M)rQ z5`u->x%})jP%aW67SNEW^%V?qaO%O(bd|Gl`C8E{%33m?v+2o+37Eme%n2BLSh0YI zNUyX{nJ}XC+SVz=)}&Vr1!8Usy|x3ez}b6F!W5uM6-~qyg9MQuO>IFN7f^sg51f}h zv6A@MQe{F^!SIohy{RK6mJ9o=v3oGa@W9E6S(L-70A80AAcf27ebF|&B1^GbE{<+) zxIP)kWU9v8;J#hHxCaxnq`ZUlO2w=&Mm>7PGFX62ct;$PV5d0gO~ysk9Jeg)^ps$f zPobQxrvmiLs?Vw4WYxe(=rtHVw>XbwUDzo>Hn;e}^By*@3L548Vnd=73VrQHMp?z* zBNb6;M3+FNQiPSm44D^p8)u8Kx!i~&)=skltW7GlWdi2$1OOgo($LtJ8S;ea+At#b zQNAUox|Y1@~^}M zksfc@kY2U7kDJzm6$$CJrNWBjwxijA$Bt&WRjD<{L1}6z6S2bhzPTdE+FR$Gt|x$w=ftHNQkhdz$Q2#CxAj;_qx8?^X@B$toH+TGM@x zJymoTpPkE2=cQJ@yjEG;vsifA%B`(Ebw9TlBXy+11pYJ7ARNc zyM5N{W29Fq>xI}ab(*1Qpp4uKNu&T6Ndiwff}9)VBlzn8fVC8$H<_)KZ|VZZfcwH3 zZqpwCqm{}CpI#V4Fkbl{^|W2wK7zDiBJDKV>Eg(9y;tclTlK42OE*8m9GjYV^^1A3*;4`?Q4^||eF zVnVNR#ulhHV381E!Zpx=8~srwN}g{p!!sNYh&&BwOwBcR+}^S5j04QHq}&R-YH>B` zWh`KK)GOE`bV-XXtzCaHC&r_ixuxE@(b?It5!)U;JbQQ~Y>&;(j)Lw74$qE(1IG>z zq|?}g3F!gMvy+&Iw%8+Mhtczlw_^j@@Bqg8d-~CP5WI__5tzDTassNnROv8wp0U^zC#)LXgII6@7h@*eN|)mrb%uST5L2tq2+ z`7&rpuT3Y5pI#qorB~Cnz)!FLPR@nLBsp&i*L5*%RPc*ej))qr) zoMHmU7~&~PoOS0bi}R>fOf1b5A!mKG)b-ap?46@ajqB+xL;j zsnt!6!Ir=Gg`xvh51AGZW^Lp#wZ9Fb0=@7e)c#0Mg%OV_;+7F!JNN5{TTgf`6ReX6 zT?VBQrYQ8YO7(vN7AMfGMqmpJIAz6gAhHsG#!!9b2)P(m+Z8HCsCyVw;T1qD<{;7B z9eAZh182AJisPKL0>Udcsl5hV?Ntj&$n8K=bFmD-xLv($T&#MA#oz8GTRSOsI-Xpk z5{q}JlZ{E{3b9NLbVW+qkgAs=pU@#WAq(I-?tJnv(-K6oMZ&99D#%jcEUCmZh_=^8iDlz7!@?{5Ti$A$OzEPluw`!BUM<$C7fRQ;rFkQ6 z4Aox}DeSt6-OGqsp3c=%S=5jN;YmpVcHvdUo=(=d$2QQt^^iR~cWGc2Gc`+`G} zn8aP{6ymmzT??;#*YGiq{P@dn|3!YHJlLl4kB5By)u3w_II>&*y8X;4ue#?IUWu+2 zUX`zoQT}{!>QA7(thB?AD6JrP4@O2N+S)3}o-cW2e{cpqgyd=jDW8L{NLWS>LnQQp z1kfT)U~*}A3GopfFQI;HEeOD?Y4ihJ<8ZOwu|k^)Ltv{lIhVyxt@hf(9}eM__#!D& z&_flYtiGm|Tx|w~DtKyyVDzk7K~*}O=u0h=jbjvnRG=qv0lZ~r`VT5tkh{crx^CNC zX)r-wC47A#a^Qr*t7?;cp`}4Dg1e~G>IOf3mZ+sMp^X1bM7F^ajPt~r4kXuTi`80j zaFvgq4tama>RIGh;FY4)!iuTYZo{j>nwmEWufb|Y$11!M+gK>25({I33+MKaosC}a zKYn&#Z0zREM1a__*F4@IeHVdu3a^X|K)VuU(Fa7ax8IIH9VI0o4Tv=gSP%3z9|`VC zkIRCM&dxUbdY}ZFWG=JbV@xWyxEb}Cbm88D!PaVF8H?GCbWwS9tFQtzOXUk|XiDVr zYbKe^XV>#v$IabBw%?eZt^7vx1MIrn?}^^cZ3;B56t;Tt?lub>Nwb#AW;d3j28MD@^^>zdDRfQtLtILqi zlE4nU%KZ1(snUwCK+pHL@)iI8ML_Q79^i_z^V9c&XAc9yn#5Cso9ToF4fvmE+&eFs zUa;Psl6i2TMBx?o)#4-mA`7pA0Mt}P!J_c~MZgD1B)sNYaeY8k7UWd771uR1!Q%~h zm6E2&+N}*1A9ya{F9VVD`-h>kg7_IVx9ggO_PIhRpt0?39I0yTKp>gKUN_X?QegLd z7~u@Q>e`7$AI!nQqjhz`5)FG-e08c}mJ&Bl_c-4^<6a4`&`_=7s=!JEGKEkE50&b8 zTF4b`V9j)dKt<8ohEUxB$Hi6zixpq>u|sr4qqyMNPNEwYWp}_6U6}z65x!Rouf^>! z$LOa^lYk1&Vu74KL^i6DDhu?KfvkAFESpPo6)EYkrE4`G8sgm^+fGhgIb^?1vVu|s zvejcE=&bO%-@Un%G0S-_F>9+_Dzd<9C9Yc^43C|kT^_wN)_4D`|MKlyS8v?7_>>3V z%v=8G^;@^zd?UcrCFh1@vZS5v|0BHecGn^#E<-aFUxio4KfUc;6N0B5wfb>Y2hVsC znb=$`-=CO^O~=;Fa%6fYa@Q&0VXCl+#&E(utI5xA` zwGqq2Gp*72SSFl1zA@d6@`9_8OnfP1@-vH(d^DMv&cyP)xyamnY%XoOj`w;Nrf25k zD`q7&Ge5s}2E8LozRm7gf%N&AOl&%|5XU7fpV`2unW))_t)^1bk$CKG>%vStGQCif zSd7KP+2aY2amUxxz)g4s_GsLzX7=!>jdH$Y!@v)YZR^L7eX=(ZS=bu|Jsw*7oBnIBqB3;qBrR5}cJSd3rc;LKi|_gj76Phs~nWp$TX=2tRY?SpGfFyCovabOz+8d4N~-gLWvqvRaFx zi0sz*YSravJqBz#^g`SQAVQN91V)HB&&XF@NTVOGsw_H)%;X>?JkZnuoJRRIG5Ka^ zbmvrCY}C{T1!kcqy6{>q@EX9$q+mC}8N%@~lI15CJce+`J_4(Z1W4CZTMVKaG7l}0 zs6elB+MvNQ`m%@flmS>n!_`u^R+tN`D-f}7X?aG}mUZCOoqR!DLPGoqH11XFVV4WM z)_@lJ&O4L0#s+UU1SfAGtsxZh*Ax{s|InPg|H|;_{YwE~0Pu1OVX$!bxyA6!WMSp?xmY@}ocJb|iyl1q5R}rHwOO2XYx-taqCc5m zO=ZKO<#6uaMt|3AIvts>Uysc$L^8dRxzuL&H?v`sG+c_MldErg7Q5GGyO+*oyH}zc z>owW%N-92|lsDnCq>Ku$WUl9Pknnm4E4Eq+=Xvx(X!HPV1_G}K^;liucI(IdK)z>nn@8-r*^rgy7WOdnhb$B@LqewmL^h*KFxa6vepp9S zLqo%P{MSk6vg&}OeTd)?98-7nbkkFZpF%1Zdcu&{(Xr2&GS+iRy^hhEXwonTCLWQ^ z+V9I*@|63$N5o!47CM7zD#5K8;kfWIBgvDHn{2LogCHwGf3P*80Hr zMs6jGt}eWaRC9^`ygMrz{|;V*r8@(&D5N1R@|**_el~jf)}_$xVC&=+)jq+@*L=S@ zbi2cttJlvya?q#niZITd6-XTA#l16kl-H7b{V^M_wF6$Uc#vL;^e))m)~Vr_f21|l zdTeH{wh&31Z1|&|l$j0ZUe82wOZil9A{{TFb=JJyz1*KR>2R)fKDN4)hdm$)g%({m zO)|Vul`#9K7yA-sem>Myn9pUF5+<44j4vi@I}_`XLZ2~-nWfIEZZb4zG5&}r99dcmZ^*`DrG~h4Mygl(s+}129w-mz49nwD}#Rea# zQh0qz;Pn_f%RQ^0!zI49Q|8qhgJyiR=;qZ|M+Q)CvDp`T>*DzJBO~W4FI=A*zk2O4 z^V$!?MQs;8dv)y2rODgv;8JXVv-5y=;Ns|8eWSOUhd+Dy)vH(T3{;kPPF>d@_R1Rq?#3ijvAZ;oE86XPj^l4uW=#9YEiX%h1dG_eVjGWXe-dp?}PA-xPE77jHWpoetjZpky_qMlD8@`UvNBX((1` zng9mVN|4%=me9_chJ;K9ftV0tMzR;Y^bhc@|A^n`d+y;f_1Wl;`{Ufx+uqN8&U2n0 z60?ji-2x}N#q#&s*1*EH+8V$|y1P;Nk&j^qAlBM=9)Pz&LQ~O@+4- zO65+6i+C!hyiaF*{oBKN7T$T*Mpg#d_Su+ zYHRrpz0v6KCX53ezXqevpM{G)wBElJoXHHI?uRp1w^P~fq7>%lTo+mR5?-0Rna`Eh z@3s~o;(eDTG^oH5ueNF0+{HdHbNy$mvr9`F0@{TQ#pYrQ?V@^oAy{OC_)=scS}+X~ z*2Jrsmt>|_<@#T|a*5G+^<9AZUf-#uUM^RJ&KxCprJv^2+d5;G2L5@xTC*%fMFYhn z<@WJRTiuy7Njnr{9JrVh1@q_h6-D=W^;o(q zS`f8}!sJ&hA}$l+sJ`4nWq`&3nC`Ai4}0}a6j23hyK1JALvO?;P`+kiVRm-T)#X}P zQ=LoSE6>N1g@MsgoX5F8AG@ykUrc|$q#o`(ym{r$!^jU8zgDZWvE}i}rfUG`qb z7vHqk^{VOEy=#{`3sV=~dpQ2b1LS?GyR%e4hSJ~tLn~7%u<}RM9Yc4jr*IL4uq26P z98j+ey!#5J*WmS4zQi`WW{+uA;CyvCkR9>~u zI5syD`S8-*s+>HvSL|H=ODVOHffx8lmNo>jh$jJmPAQ38X9 zb5LC4^(WrFM&Hl*jqMRs^FBO02ybD}`zpGr)V4Q~3HsDV)RPGhs^{LsvtOXS60fbz z;<}*+%6v3!Q@WGwWT!wt=R z9~2W^W|!IGy$oCPZfG2{Y-0@eweN*i8A&O5fFN3G!FG_XQ%aoMcT^D@uiVk#wNg+0 zKtUv48MP&H&BE&&Y|!AfS@6nfVI3w6Pas?&5@IhSL~Ym$uf}#3knQhRHCISJ zykAI$LOZdwoq>*PEn_it@zK<=e__%8xK=$#j?Rxo9)8pMO53Br+BKAy1e!TBq$)Pwbz|nB`Iu6stvGL@lifFRSPjNQD&~ z<8rEl{1vjc4G9b25`rY787%`zth$ZGUA7mbY}Jx&6$zE1PYit3%kR~ zyo)kWq%tgeE*hXKy38y~_b@b~)t!0{jw`>w%N5dv3hLjIi22K&E(@N2yGY^s`KI#92x6);I&g*ETM z&!_Qvk$7e1-ZN80%fQWdYlUX0XU&pKVuK|qAbJR=tC6^=;Ze&3O=M7S<}aiH3Vc-I6EFaL61HVoRT7DS-AFc1rIN=S_0c%L^9LO03Q~L z4e%<`PA!&d4%YF;!>B`$Uw&$D3SLEsH8S?{dAxcwUTaJl7N@)V_R`~VBm{RXCy}cx zHXm5{OsT%V`ri`vA%@`aPEvOVn zk%1;TA5!H4|ND zlmAxh+>w3Mm11!@GOWPLD8+Oq#4ByDFX0s`*3Cz?##;vCG6>@o^>7o0wCi$NVALoR z&$1O$g7B_Hk9fV`b><@1=aTM9WUB}rrdrq}(8;Y$es4hp1&jjQai9z5ym;6FZr`Ty zS`ECuZ&@)&Y}zZajm#W%xO?WuzFnPIm{Jd7e*ePvp*uG#2PVem0;7X-tqUuUmLoll zKZn+O3WZSM`_-fx+L>^V^elC@dmi_vXKZ|RGyo+TX{0;Enay&z(#8P}nh{oD;kBxhHv=8oB)k-z5qPc8 z(Owuu=?4n#E;w0KN`Y57JDihzTkwjr%}t0K5?2^%@QTu##HGHk>2-W0ad~j-e49PA zKQW%pPien4^`wkt|nOOQQfDDNtW8 zgZ{J@Q=5igfzI_UUXl3WX}mI`iziHA&er*H&;kCsntM8w!7HW4;8i-&(P!bcS|*t> z@w7u3O62o<Sk)>L!4oF8$h{`^s?U*$@ry;APJ8!1}b;<^0ZlN^{?%8jV|xm+GAeCcc{ z>ugM+SY^eQtpR)|6d(f45D6(_w$^NeEAQYY0W&9wZdq&ef|gs#M{2C}u@ zN*GI28vX}|O72pew3Zblq9(3>W+hn3C#Byqjk8b@ z0I{Nh2undZXW+n2PL|M=X_d68?X0b#i-mgsHfby)a_+jy$ z&an^sI$W>&Ly=K+Lrn)R_1+v>LvgIY7Y`!IrTHsPbuSPfT6?g(@E{P0EzLHxw$RN} z`!AUcIuJT$@$0zQNwUy?ioB#jfGHGB`FD)-CHo8oXA;H(oCKLJV)AHg`nEQ^aDpe+OyM`CoU2S()(L=)Vqgi0K*6U=s5GpmYj70a39K$l^Ab!xn}U+NI7amK5P zk1(Cd`&X%h*pQ|IO-rs$%_^KFvBijlz?~-MxY5@U07>XtCxTBDXzTh?Yl2mdg({d- zRUj+o0V{hpeJm`z61wd@AE`6+5sZx5qT}J^iw3Xt%3>ot>fN5XsnB$2?7lh^tdqRu zBF!J#4wF{QkA9EF@yF-^kn`7Dw*;%?F6qq_e|Rq`w{Bq@Q|+J;Yh8E+;^Lw4tQe_% z6eU;lTj$FUw3>J9Qk(M)c99(gpt;3ey`7V509aextvB$%^~z}hrIj`iy-a=MZbp)U z^X#8XI-FW!W-DvlwRhB4Fg9m%-4L1ETkK`iJjOPH;E(;!v#ow|Fi2oq7 zEm1h>C1cu3v8~jd!>gHc7rOonuf}5l|257DN7#Aex4>5o%DPYFE7};$~TO(YpMJ6%8OHq*b}#f(y9l9WTHG@CZCl zuXqT)^Btc!rm#YMZS1jU=FE(LK99#|&Z!pLGgzLJN;~x#G}Vz*a|wOmj~r8tSLfAX zeEHqammmJ}!*?HldH%CPr{8@1*=L_5PNCsEJ^$iqsZlsPTkRd4T?~&NeLqXizIr*jY`i)+|7hzh{`PG6 z{HK=}(Qmuv8#d>hd14qdJc+fnJZc1znfehfJVs#{vT7hNQY1mE;=Ec( zuh=wt)jqs7-R56tMqP8EA`H}iT2JX!&koqU`PS4=J?FjE>04TQUI8Q|67jFlX0UIo z1zDU8vB?%~acM)HTBwU@@vdP<2&0ODGN}ls7)I%C`cmpugNk#;E6N^O`n5GVV7bab5?(zG;ap*tW#TKe}Kfq!a9{4C^%$c$bI z%FLbRQ5_%NnZps_@I?SLX zc_D^FyYcf!jimMT;{1a|JS8M}#%@)d#FhIC7VwhF-krnt{LOaac=52?`}+B~+a2GT z4_hBTZyi32i@{~m-fM1c9bUo|;A--scaS{TdxZnM)#xWqQmpJJmA>3ZZUY);fKdhN zL>%E^5EeWDiX**Ab0x|j0X8z*We3}yHr5=4hL;5}m=k65zw(Tl+sJa-sY|z3qc9%* zYA)cTN!(x!2r5LV{QrZjc6r#Y{KZl)X3)NmsoX8I>w2>`8}j8#XHIQOzeeemj9!eD zUai0A-F1atX=A?zhE#j}o_O(ZkYB?kyCQtQ*N;`~wG!k~nFpq0y?z;Q#PXmoRZ0ky z#EdNSnhouejRBT0G$8rj#)f?*lN*!-EZbo~Yk@LB_Owt?BiO=awY&6dgUXboGGRRS9zwIB?nn&^va0?%f<@|IeJw=%Go(~HF{-^B^_oBu-}@eSI*7b2!&qt z3Y9yF^m>Q(`!aeZ9G}wt$0s{|+~d>`QtP4Ym?{pc2y5q+vnmmfE`=)5A6X~zfojYv za;%r<26b&j*{`8j069`>hl=d1b+}N_ZjOfiBC?J1^orj0n_7ui<$&)tPojfWQG;43 zhGB5`^AL{2uA0R+s}J_tn135}yTdNDdRO9Zw->Jj`Wh8_1$H}|MVNWUXR83qpyrxh;E8xX76t{)9z4AZVFy{3Z$ewk^=An7dNnh9HY%td?=JgcBTDUI*bjm{+x#-qt{V) z{(uTWWX^TdU8h1b)vXDv`QaOh-cZef3On~UuzAligxwkMYa3x}8V3tUMx2h16aOmwBTI%rc!%jngt(IP$I zbx)>|SUj0uiSu)G%EV)US{y}KY|p{GXVMIUCNaOFebRjllOcW|3Hx&x^bGn2)pwN- z6<9J0f{g~UXHH?UU=V2lifIu2KElY6rmXg6qi{)0cV#fxiB{g&r;!zdq$Jj>(QXjz zHZb)8Pm_KEZLFz(EHYp&31LC_yfb{;kbY#oj!+n73s zkRaC5c2lTlbaqVAefvPM!G@*>wgEvB+;3PgKa?JPyZ$qp+@RKnrO zFj}YWE>uiw$QlL6B6~C&Dv}}W>-l9$2DOGf*BWND#2_r$wGk#}j>`_$T>>29hu{@z zCJk2b!c68s|ESdo@p;Ld8L3%U{~dZOSOGG6-N21&* zTHz9+@}N}en*S>#s-$aMBE7D2a+Y`H1(s+yOTD@JB&iCI|K%l?nAmlF?SWO0N}bbS z#eq(tSM(fYv+Ub@xkMrBn!j1_PQBU_G)(-v;Jcf}!zTiAZh|Q)csi6EcB_H16pH9; z_>c+AcY)Gt$==0LxP0^A6!;bNV(HMcS00P%M~ z<-meFtcP)o>&2F7k)et*pFRUM2?%%tA{facCcF@t3e*pM&u_DT7pLX z9Uas#OF77;>Hug$c5?oyD1&C2wx*qFTzEUXAb+oQ2NS93QZ|!q!1)S@A58^>|AdO> z6>bI&PfxEu&&PvNS)JPu_Pxe&I=xB(jxIU>2FURQr=(XX;V&k|3ccbDLcjPRK%Y#c zSM)omUj%yPxZ)OOa;NrQ*Th0%W@ZumwwIvN&>^DI;U>+lF7&3W^HW z^o+VCxFF{`6UwP~7E4;DXzna?=7`yQy(66|G!qXEP8J8jrrruv?^O(~SJJ_O4M^M2|#N;R-Ww3$E}+QW)_V?qj#<2K4a zh+)8M55HLBaA@{El@fNat+2Xx1#Cc6a-i_2t|@SgajuHUXsxrB@=%Pq*#@+#8r@d# zM2r>KjAN|uk2Mov1Mxis#@s(#L|M4P1xI_qG$pmXpGn2ZaJLR(Z%t zRk0?xw^R{pvOycfSZy=wAR945b~ttU80ac&UmOLCE8i1SfI492MALB-cQ0Nn7WBID zt_+sC&z?PVgVg7>j4B3A{I-6rt8N*3`W*4Xke9k;)iwA4Yt_o2tL{2?tKtHaNW{?s zf3bI6ukI94IAcjPapTPzuQySmSipAGV7nK4!{CFWDE5M=h^SbwAgEXn>{zg2MGy-X z6e|{d@kM+TpT$T23BNKYlQmXEpZtFJw>!H#ZFgtCoH=vm%oh7$!;`+W9pG%7Yosz1 zio-~>4qz*L5TfMG;!Aq2|GE~T2(A|#O(k2*LkH}nTxTh9i)0x70_^cfne2xi=mCSRzutVvPM z6)#+2v={U$$8z*?v`nw3q(ZOmB#gG%+;TEroy{((H#RQ0jo39~#AT82>pz~M6F6f3 zj$J`?4szcUJvnym*sXhLqdw)5OJ?H{Vi=t01>o0;{n94f^A8}T15Wqih3Fc(dkG`S zJ@M*^P1*Xasc%giN$&SSZnW_A$UCu4i{CYv=R=97$wg~BZMi2D0SE%NU*HLx*%=== z{%c)ZwmqzzjI>y!n5}%9+`8TH5N!|q$7WBp_X!XSG_OrYXodT5d;-sm;V}Ye##m@- zWT3iQuTl4xp&mQn4dCN^6c2L5F!RO>$XP@OKkES21S$-+!#^k8NBRb4=?W^H^ApCz zh-*{(R{Xi|$p`C1immK;W810xcyrjIR=K7w8t_;j;TOAjQn&n}uLa*zlS34x!LyfxIGrdB39r5kz1@d*Q(bEOMlbmF{ zr;j&*#-5vkO(VigU%(?J@Fm%tId(HuIZ3)V%=}ZVh|MiA)y@TAOR7}EU(f94oq|5t zoC-&8PMO$nkp&>vbzMN&g^e9wW$v+uGnpbLz^f!-$HND};f5*erAiP zkzS=c_Z%jg#EV|H<*0gS&_P7hpTS6!2H&FB%A6?-r7%CxlQ>LwU8)3tBrvE&cpR2i z1k*k$PhI6ZFMeFf$0^OHyLOblcov~HvCxwU>A7i!+hZD>loJD3=4Df^8P*<>TaYHb z;zXfWtO8tdNVG;Sn{bk4@xsC<{wR;>)Uo>?du)-?czSODf&~H$`U1rok&gu&Y_f#v zEpj$|KCba#LA;e%mqj}4bG%59yyO!L#-jd>+oO>f83Cg5o zITs)m(_*-C;wE3GRBI^D$jU(@N>LJS0xnH5af$1S9>7cXr7UQOU`4M7(8oHZ2imD-4r>CzNpJ8=tz0%Wq*x=$=>Kf=tIBUIJ6spXl$D`_UmVi7AU%^T0TWv$+*p`V9 zc}2bkoL*;ct&A3qmryZt0r!X+41im!TW?h!*j5O8>-dPs9n#>wbaX555N;g1SoZJM zhj0O6Ti7@_9mlT-EuSmxbkQ{^1XPGPHcoLtNMl8v$t!fP9RKDpt_LdVq!*xfHm-0% zpTm$zpeNuG9b1xKfxZRGa0wtKMkS8`gU}Dhv&`r&s%7)60;CHQTENknR~T)$mQ*@p ztO>cd9jl*n)h^`M#yL3*AIcWR&Ityj*TYG#fQ$!hi{l~atQ-JDuiWFUVEMd}mwCg; zqk+D`8U-93;PKCR3Xx#31X0nwlettPkxc`NP_+umU$1y;Idff9N z^K=?$pur2`%dl`S7-rER$n*;O@}-W3Vu0GL5mJfkZF)`a!Ew`sPRfj`0PP@XHuiBo zD65?BBeGBmDCq*NWjI!|)P({x+*OVPrq@WX>k2k=&C?zTC+G;J-SBxdw9!P1npU?9 zT@33AK7DLsDMQ)DZ&Bz~CP+33p^`wZE7ovbbMj#e`2QBNU6G*I*pazQ-W=VkXPgvEGZ!zfndw!A5fjmCDXgyjs66(` zxhckqA2pj-68eLe^~>C8i6B@>6dXWM@d85{2ij&3A^Z)k45Q}xDy|0@H@1v&zG}ihC@X)Q@LxeaI(&DzujM>fdhgJ}p{CdE zn)C`MUWm^jfYoz_@z}c+zG&jsR)E46VR@<7K-$0g`>xInLi;Q|Xu zz-!QJVo!9LUaPL_kDQgEG7EYQesy6cRrFO&udAz2Ut`u*>l9AK5L81EtvfKiI@4|L zESx}jXulY9F0cJwKYmoS+Rn*z_uDpAMDD6-+`0ZYvzSM^F>FWPAw3BYeB5&jikA%n1tN0yzs1C(Xaq_P?n7h@;v0^C*?z~dN z5+Wt8cfy2?`L#{2ktSw-qpxo3LX}X^=br;hXwoZ-FuhjMO;$0|z!!Rrc_P6(?o3Cc zXZ*?uD~HNWliJ$0>nmR%{gE;e4CnpP>5CRvli=l0&a(s;5w8T%k$vnV(^kILkP$=(YdbyqrK|QD&#c1b`8n-ziiN47;`+Wo>@=0qqegTdNOE zubitC^tu&4T+-`qJ7lIdyRMwO@^Ugxrh#9*0$+qj$D61CvUFm6w+f1(rdOCbnjtF! z4ahD96>FJU4XS$!y(T#^@D1oMBAWus)2>CY8s>3@BB!d$3R$*9B|OPV#!!r556?Vr z_)aR(>(KN{c2)U@wQ&w{9g%}#O?vg{d20Df2D`Sj-Z!wzI@vXr>P8F&nULR@(-+GD znAC_~wT`iu6>89{d=zeFg86W73%&x8sh- z9d{9M9Kg+v7ror=#3U6DD+(##gFu&1@x@QA0}+l?1&*EazMYz|mNd*TxXtvcP4J#_ zXD%Lnjx|3r)ijn~)N*H$xKWjP7?I54Facy|1Z`b;8bw4A0mseSLuE`vk5Zkn(D30? z)_IQ#+DV!hFZIQUQ!-H0l6_kUvJ17Uo@T*ZYuk+n*hGoUv=Kv!=dv=U;1d17Rf>Y` zuqtfcX&1ziUmB#>U7vtODSzD`;Yi26My+3{L{$9Q2vq9M1CE>bv>*T|WOS7~?jac7Ir#V1G;3yV17zyU zX^ntkZ7V7oFV_24zIvsjL6^?E@1C3<{p9_3pBNpzz6(4c-rh;azWwa6>AH8ndS#mE zAi>ky=JX1EEBu~$jXx68_F9~XgIo5-$H`6DfnLGF*tB-V?7Z7X1dTblrTHO-$~i3* zz{!l;Zlj^zXmrg!yN-6%AEMv3&o!Dy%1zD(F=<3NnJ_P1L~dBo)S2vx^R)a^fhwzj z5pWW@UPF#!Z6xqQUB#LR*U(~hJX$}2LtA#Hg!|fWKe=4ldC@SdAF3irsIAng5`L=S zbtfhMQVm9hYc%Vw!bO1 z`w#RAy?Lc@2a8-F1idJNL9b%0vgQYNQNBMe(QDySmlX`3 zGXIz{7z)#4x8k;JTSD8LX+<&Z8N_wgCHEjDVw#8@@YhqwGeQK?m|pXK?sB43Q^Xb= z=$irZ!<-XjlpVPO-gk_s2>+JpwfKN9-Y;BvK0oEt$5xL=)d+g!%6wXK_X}=ct z0bgmiTye_-Ti^Nc=jXg|etq^WH+*=SqjWO`rNpjAn;j87Mi1<1!*nKIor)HSR+fKJat4?(jlk+Y_f7Z0zWx^6`NG5_r5o3Hw&Lg=Y? zuD|)Z+n>Jvs_Q>Hc9-ccpFMW^OPyCr1f*bV!B9GH4R(2#(#wfm62;R4DeeZ&hy0c`>(Pi$`s% zd$pcKKuL8T*LkdPn^1;6(RTJV=~d3-X!lApGs?Q8*DXT#iWZJnfDqZWbKRXM-G2MA z&%Ar*^yqt@y>t5POJ~p@buFId!?7pM!`u_VnM67q=4?BkL zxa0owOs_>sQhPBy`P{DzK76I=fT65+Y?g>GSZ@-M%6c2-Rzu_S{-z7P7P<|3E$+<2 z!&u=hWEN|gEy{bP;z6%L_Nbgh9O)`N*MvzbtL9Wt(5ui|B)rC)lwlUeO|J|^Ig9ja zVqXZxKIB_Z+1B|W=tX{y->M=wXR7rF7WC?by@flC$LTi`^s1RPJ}%BZ7NuvqMQ*S> zY2IbT6S7i~?d0oy`{3Bg9>*L5=R2d+J9C>9IDD<%XV>l4)+d{^%R8491HA%RhbeVQ zuU?27?zDqmE$mUnmBu%nbj9829PiC$s-SthZI@Rg#|U2ezSu zV|cZM_kpFMWmWD^u+sb6rUA~h9Q{K(gW;I;N>Oz?E;o)Fq}(cyURQ@w=Bt5qsZ>2S zz5D!&&p-Xib67I%_7|^uH(`DA)Oza6FW>m-gJ*w!nHVvS2ufPH21)r9y_=JmLn=h)fC%Df29BqAn7E0FOomm;qDGdD-{# zYkKXf`cz#6LS8f}8a`FzcWz6jsElRdLa#nDdLIH+`Ul+o0Z(y2!XmQOj%f z^^~>P%n8s%B8L`KAh85M_b>=gc1ay6g|EN3Wb?-_((0?Pp84IUKRz-!^OQFaO6lV_ zH_v?a)mI-m>)VghK9lurw%JT+b0U9v57Bywj5id$$}o#Ymb=TPODD9I=s#4eXWwwy zg||F)!)yB)_~I{63mtDAW}f z_v}{zC=&hx=Fw17$!}KaceJJHl};QI`7i8U`EO-Y9Dm2s$D@x|b!pWj_KK|}yoso- z(uqhJA!?0%51mMA9s5>|n$mQksWONf%Cv)ysG8Jh#6FFZXll?V9mL<@^ZlIrecyYu zwZ?BgY43XOx#ykx-sgVL_k0&z%d_U->9;Z|Av6?_d2N*>gOzy!Q2u*5^9=R@8O9(9wRG%XPok@qF*_v+eIZv7)PQ z?E`)7_Z(JR3wn(%X}OzJ80R)@r~qHn#LY0^jex_rdXp_+P!Kpq;j#O+w;0RFMjFT z+pl@^%*M-ax%IBgZ@Bd^w$ZD`$S~AzGLnlh92;!HCt>uOjV0SG$yFbPK3JnyKG39a zv6Js+d$P7>$|+cz!$cTsxoJ!tR;zuDm^)Se5@VBNJ-t#{z!5ITjhGIlw?57a{FJIJ zPze8|SJ~r_Gy=Wm$5wRoHg~LwDsk72*2c7}>8tChX=#t8Qqy9Cc^eWs5K7}(g=Cu%RS{z1`^eTx+kcva-bw`ePyfL+PgNj4~*&=_a zl^n+_YJwcU%22@Z+ZRgfYQL71VTnd2u;?x^OgvFbUxM}G5~+u^Neely^z=$6K^mSx zblpbdgh?)3S`J7dE=jKtUtL#oPxWBkk1u@K+}u0VE-xqNo?SVDoNB|J$j0uFYi;dS z^)z29MEiDhv|N7SKM=f4_eb}Y?vual#{1k%;B8#>df-O=;;8Hs` zELP+f{SNvrmZ1?jBnU)iRcLxNqt_InVvM$wds**qmo3p;6vkJ!BI1M*o=Hu7Q?bKX zDr?GIFM8{mRAj^yiqnZDRb&PlCK04p@39cC{equJdp|J+mJA24ZFCA%AsWrw+_Di# zN^3Db(!?F6leLfQ^VMM$YcRcf9%U*njoc;E?@zov{oT6!%$F1Qe)-MY)yq~-Pk-?7 z%+$u!qZ2cmpZRvZOXpGh!;@22lrO8Ujv~2bZ0EnzLV5+9((Cfbxr-k=Vz1-wzbJAy zJ^JX?SKfM}Z*$Js2tZ^)@23)v`1v&?m&KYW(rWy)sP5)xHf=m_=?j_Qn|Oq2><4L~ zVhu`>L1WpNuX_VcKrBa%Ae$kV>a41??<$UxyqN79X^uC%Egv&)C|AiD>qn6DpdAC;#)0N{oI{cXbvY)zB4QTeapECJ zi~&k=$W|aGp`5oD309nBaTY3Bgn9tIZe#RXp8O8kdtBU>>_-t>C)?Lm6Gym`EWks` zu6C8DS4u)kuP&fh95s5ibe43PGJ0ix7~f2HdXipYSAc0e5oJSqb+ObKL2>;=Z!0oJ z_O|vkxwXybxeuXQsXA?>y}5O$^XE67SlKr=^g`dtu?VRms*a5yypmr>XXobTw@!@D zZ5f~abreTme)+yj93NphfsPAx0BLTA^or74h4h+I@-&f25ufLPQ-wA6GXaYD7s3{d-6+sG? zgC-Uy2b?Ox8mXHfx3gO>La!;yj!KD39|QM%VP3{-j9v*|l=1Z}L9eWc8?wlj2lOhr zRp@b5sLrRZ`1sz-wj@{CINn`;cBYPEL86=2 zpRTSxr#ixwHq3R)NUx#pmGee>D9j-Yz~#Yh}|N+0`WUu>6LWnly~jH8@-k&z2=l&d78)Aahmx+)!hNTk}fDd zQ=W~jNi<7s3BenYn`xTmAGV6*v9q6AuB0OresV=`_dwkvtA@|6h`O5Vn+ECzpX{#a zdF~`iuc^}Zj(Zx{)(v)dpB>eP^op1R2kZf70T5`MjFhefk};2-v4GI*4zO<`y@GIK z4s}!(`3}>ZFamn=xs1)AdflF??8#yYU3Wr~qhMz?9u~aSL)R9TJqaPw7_L}~E#xgd zz3!}e1ex3hz>d+Y`QN%Mb+7HO@Ave3eZ$VJ>Z%)a1I-V>LStp$4Z}|lw|-XhUTbgf zP}k3{9;O55mw0-`|3_P9XXm$Wn4O=Wo1L3zx$otc7NJ)YHOm*+Rq2AzDRV;CI*26# zQ7%Ii)p=zm%WFZ7Y?ExP56f1z$q%X;&Fc3|PRgYPwLK92k@*#b?5{)WkCUa>|4|+mQT*+ewzQ z<{}qB^7TTn8>;i})S1z@rba(lU;fGT^vpErb@fLxo5rW6+Faq&k5+#H6PNl zuGF7m>3_lDvr@B8AUqq0{eh5PjPINdbM%EOLLMn5?2CuJY>CxQc-1@>fgv3W`zbbi z&FV>LOhVNIz)z@?#xYW{m;M4kh*H;i7h94;=V(6fPZn8w94=!&3s7NJ*Ag^nUz@|UZ+S9x#9=khKT zq*t5TiVd^;SV8Qvn(pZy>gekjtLQ`)^c5p-wBF#N&UbEVYJ9Ti$6?nqxUXyavA3$G z0)BEO1<>o=z*n<#8@A5RwoI(suyt*g?*tZ(lJpJvBK!_05{!Is9}Iz&kiWv{^$5_b*vs2zi1LTsk=pC<=#_el1@sC~iLU&apjXvb2BTo3S4F8` ziF(pGAB!PfGxEkejrq=@2P&hU=b}|3W5YvZHQf)@yZVvN(sDO4a?+DyV?%3)R-Io9 zHejGES5i=%K2vhUkau^an1^znUO9MYMMA5Zh#Lsr);p=>UF@5X zUKepg3Z+}Gc(LA3SjynW;TP3(5`nb`VD#$qV=-I}vMp=!*5A=z$JK+(jvLXi0y=SD;r|W{u8@*xE3Q>7%m?!J?>TK+oog zu;(%fi&rd@(rj4J8x`91!AVr@a;9F-@feN}&iS6u2N*v6P_k#+J+hcxRsz&o0msc^ zLU)Sw8vn(Y#|nYc?FNg0x|CANTI?ukK98#xDE3v7NEl>g0CpQ=oQm56PqSKJ!ixEw$X1uulY+id^-N!=bOe~8J+sXrG#EHh~JUf z{rmAkw5{a)v+sK@IkmO(BJ>(n?kSjsX<<>3b}sFRoVCHZyd%zsmr=AU9U@9HXomON(j;yGgPcI9BLjIsZyS0S zFkL^0XwU89n1C7OSLr*mXfL4|1)(k~%C0Q(2j6ejk~~k7I$me=swK=Mly?p3HPKxG zz4BA}wu6LRmk+nIDF;#n={5Dj^=o^Eo4d|@0$PE>rGwYs;F{7sE1n-17+U+B zd+zz4$HvCq*)5ZbkQ6?5{8x9AUMIHB&CY&w-@2_(5zN2ULM(UEV@9tTqgO&U8L&a< z14RWqk&~Yxzwl*d;RfK0hkqRyy-KiperRJ}-B#zOT#h!^Y3}EW^vYY?g|S1q&=U~K zkqiA{J$MCc!8W0Mw18fvUAYp{D_JoUr+UtKQVxT61@vmvjbc`7%IMYZ&#O{@gwh8ola0v|jC3zpX7|r>14iD;Y1%oMs6e){D!X-a>jpsY<8q%W%I!ly+@DeEG?y z&qp0_$xk0_S)VU#`ejuonROnTdVLL#_ zSByDelb~P?3A0%iCUv21pe&Y6u{4#B1Jr*YmX~PUsyaWT*Ai9xvlU7aNfFF|^4t0M8;tZ8g&YN|)d@QQSVEZ>#U zNjN9RPzJ7b;@-iE=~i&G43SB%M4a%Mj``~0Bu`1q2>?ib%)}xS6l|fv&u$2m8q5Sf z=mwi4R_~Wkvq({1&DeL+34)?MVlY%ND>;*b7O{j8cX!e&_?0tx+ai=L-WPlB$=Ar9 zhccBR?N*8n+0`w7;ltj(H}2fuxtjX=+)&?nQDb`5&|qJ0U*GGlbKs4>zTO`Xe03*` zACR1{Tqx3J z|H7^gKB;Z9Qx_<$(oDT)t>Ux6zTJZ_G5Q!;b|pH!y8gF6`1s?|hmqR6YWbQqpT3zP69rBfo*Tlxg$|j}P?UNC+oc2f@Nw=~r$~qTC*sJtEB<~TT zxt+|1Oy=M`7wJq;TFrYo37re1PkygRy?Qj6t6wKgMV>dV;~R;IOjM-A(GZ%>U)dy( z#dv3RCt$>i;3AipLKlh-=F*Lbk_{Fc3(zb0wN?Ph)I&1E&{Y#1D2pm7Py63Wsx9G%^?1^xy zz`DsTm@0`u=?iP^ZPg(tLV7h_pO)3^GL&9vH?Z9vBE6Dck>8IX^wIa{vLK@VLUi(dWLFVlTN)Z#8ot7+MW(wN`m@>o z{(gyKupE$(*-_fCAdX=Mc=c8GD+v=Q06q*Nb_LkTl%rUDfoHKow7gJ2W>J^81P7Ka=aNEoCxdVgyVk=afccdE<@!D8v2KPFV8Ssmvq$8b&m(lBM;q zA-;wc0_+kJk`_*3mtk|I#BJE6B}h;W+khel-tflTz()}-#90xW+KrUKqE^c!X%d_;!arimTJT@CDp~O zhhpZlISGSZ71ApTn_F|Jp>b*{n51bJ+8hylubS=^uL-0T;7f$sj$KHv2YGrmMHrXS z;k&xb`LJt7oi|=uT_q6@swB)yZ58YzBnIrRUl%`J?u@%VyNXXNc(uVt9)Q!9HwZy) z8phZvnB^(K%_Ts87lx>?11`f|gH@zjL#>j_poA{{T!R)fEOu2;Rq=}OXadO_5r)O9 zwK}a;i`34w9WVqRf6-S((tF2YloTBuK2rB<0eh-m8 z`47=liAC)1{P{|pC&;ccOwy2ai1$i*1?WBiwJRvc(=7s`?&7rpJh^>HuXx|t@R4r+ zev@n448jlT1Lkt!@if-~y~b-TCDw82sTM&9jz4~PKuhz25K;ht z7YKI00A*R8(6V9a0Jt=$XzB7i%}PTY|3ChFu;2fB$u{7GM0bEoJ8s0xVyU5CW0v3MQt^S(O5TDO;<`ph*&g=kQj~G zD}xlTQqa9v3wxUf5HAF80s#@h7w|271@X!Yi*MkS58-#dos-#PQ;k}r_@%o$J9B1s z^W*32%$f69opR^R!|?+Q62N2@BZ+~V*6xE|5x7N|mGT6q$T@C)3ptWTqQYgd0LBS8 z1#wbjz-P)<8tU4B(-nYHrHx%j$7-clwE+3vG5dSyqv zlGAIY!v8@S`ZeFm4Sr|I<5`}cUl-?fnN0`Ji`rLQaZrfkY0rP$oS z16jWY=gD?yyht@ITNn%8&I^mhTD4j8pt)-CoA>_nPZK#XIYhwy@*u#$C$S0K2{&Sw z8&e*0K1GM=y;{I7DdX&mdlq)fE+C;Dd*!$#(TH;GxJU%$po{w!;-?YOxWu4!Mi>p} zqOf}&dx9mX*g%4j?*0I*3_;yO790Kx@P1h~kHG|K22@cNBRvAe^VV zuc302^#Jp+qZa;*nNH2S~3=GkUGuzj_lq3b1#20)qeoS(U%aY))q# zWx&GYau9kg2r)XLeabM9VO1;0Ma$weDO|Nn+ND&OuqN}Iz^&Ju&nlMtwUx*=eh0=m zB(U_F|EEDIY$}Tt=(Xfrk;|Z0tk;0E)x9uIfh1)ARDpg-n8fLXNYgk;diPvOFG-Q# z=}5swo;#Ioii2rD5QeTZi42(X5=e7TsJTMxvDO?Lx>taKL+oA+9?pLnWjkc|2%}_;Eq7y4_?#K~n?Gz4&W%b?@OTV`sDe22H@+ z>OMwyxOX>@XQ`leo)5l+9<)P~ABLN~k_e>4<|a;AI#39`f_Ti}z`A-25W+tqm$JHg znS%smS4?zagMX|npvBk7u(RaXz>(6E4|{Mu!1IR8w!%d>*R!)ss$QM$OfyNbmR^Io z^vWV1dq9qcUYGaM>&>GQWE*eq$ePfrL|NqOiA&mhEpf_HqT!NVA5Bt+*s&I=k03h= zmk!4ruxXmy5F}vT(NN}>0Ab!Z36Z&lSCXW0N=$%GXS~#b-s-y!QXpeOFUJ(Nt;89R zfeHS0b|#aZu^_kJ+S=H-v9YnWm2M%wGY+0TTRw?G-g1iTN=$FGF>AIZ$ruQ8#15>G zLlXwJC^glXaX?7TjTErga-rsaeg&JqKqD#O69LJo;W$SHcxSOEd1X`89cZ1uAqy z!ww|tmK9vNMSArf&tTUc*wy{8`KvB;8y*!q4Q@sz}7DIU*iw~g?h`?qD!); z*JGsDi=|Wqrt8WImC~WP#L}vIROgYb0q?$dy6k4aW_lAaEv~GzM*_9aa!L$N(YT5zLu>Oq0?MkA2uK53xvXudl(BD{`>K;|EB}JRtnGM90U^SpMw3I`;yOQ;hN; z+2|uF6}E3&d3^hIFY6+1S7Si8hWZd>-5g{|OvcVHj*>Q-8)atlEIfqxKk4=NfG=ND zijbQt1jw$AUu!R?9kQTD&~?4nV>!Kgk)aY4r(92u;rD>L(kmB*P%9CI+8~`st;VoI z=yk!Eq-6i<+s&_Ezg~L&@QmRm(yRJ? z3bo~ZP10)voT`P-S=e&rWM59d0UQYRsPYxdtU~QNrPpf}E=;%%~6)sf?-r&I{gIqQtPyaIJD$RljFi^(1A4wHVB59 zA(BJMuiv@5vXCXBDBNkMXt8C=vIUAZkTR%@Xg7?AWTMFS#b}u#^r49si}nX28w(w! zG(`fDbWoy_C@N@yh+ZP-wH12nA)=?wx#R76qrGT5VLEq4=l|#b=ljn+_dDPB+hW;o zc;gS_s|>GvLuQNc3DM}O`}-0avZ<|YA4yh*ysZG?6>s-mqG?Bz3K+3Sq2(RKS3bzP z96m!+`aX85I2w`X*F>+c$UXP`nYJ$jOT?ye!v`{7jGhSwHOvw}~L2F#=Dh1=Z2 z9#dC^(3N5Uv5i3Vv=2deMV_ne|JQ@a0{uzAg&u5m9Un--w_8bx#f0{TEyaOm0dy&% zt0)SHz`?PO?!@A7i0)4TffSNv$Cu$%&R%)GN-u;=r@XW!lnP{cWfg)!j1k!GB+4?5sXIzqa9wt%SD41Rs)N!pf%F8XySV4 z2!J;jjmCpp*8ptYy71t1Z)eY3#8}7Ks5!^GX8OX=hGPO_f@ zpRcoO0w%>gq@$oCFXi!Z`I&Z$Ae9QK8}D=a1KmD43xM!bZb_+GX2sgr$;vbko|eg%2xUa{nI(FAmTGo?Y<3XKH9^WezZx zEiTMCPQa@@16wtC;@D1$W+J}!70dmhg=W^s&B$qiu$fFI>)Gs+P|r07>$SRdty);O z_FBDE3e-{uNAD|M8j*kTBxS`TSnx%{?BEp&X!^;)*lm|QmYLA6}2 z?Xxmrz|6T8Ghy!BaCOU~<51NaL#x%pmjZ`lc{u((Ft_Ya%%3?2_?zN~5VHC4#54X| z%L8AUTTqoi!q=I75nkI6ypp>a35tvb4zEm*a2Rle0|&Rn#q5jl0>KrR!;v&kkO4eJ zR1j+vD&`6~A=@~O3^y61ks)>$Oqgs@ONkpKxoH5?%wy6|pN3b8R$smDLPZ;CM?w@p z*qcc*!2B7(9^Zvq91KLV&UOh#JeQ)H$jizA_Lo0k+O$qC1;w5*uvJsRO}rFNS68JI zjxR-WD^l2Shs)z0fM1LY55f012e`2^pr92$_k#d}ItH&JhOF+5KY`u|qoi|!@Y;cp z7MHYeZ5@-mcJu-P3C9VTuAt^Xi9hz60z)X=3WWF;T3}jW~}haq!x+I zE0_ZL1g`>L7XgGY2R%!xRXlrLFlA9uj~RNyilog#%&4SFr~o_7RWvj;maVDV zsy@w#9ehG!+!5cQx^Z7Kp^FiVLqlB&{w`~ch?<#EkC|<@p4J0U){4_>s;1T!Wm5CQ z-n5!J?X%KqeS727se+cvWT5IZQhGVB=Hr^Gs>bU=BXoUHLp^=UmwuvFqgtw>maNqI zK=&E>7-|5IfOMe_vmMpK;e@Kjv}#Txc>RCl+u`+3)nySFe+FKsNdHga!Qd4g-MX2(S3-O=hV4zTjQmPS*hUK+oX*$m$#bbK7)0CVb5lDb?e*l0Y;j zImJvmJMvBg2D(!DPDrS530#Ju_5e|iBzP6Apu)0T7ItPfTFsEoBJ?li5W>6iPWfOu zGveh^fS@wiPj$3uP6+w|2D_+7&P@k+!gRTimIdJ;^l~}r0=eiqdZwXZf`V@u0Kkpn z>6taf4(WhFHCN;*k^ZU8&7!U?O7d_Qd(nX5X7JBXM(m9FY8cxJ6&LR_1{HjiAUa z{VC}znqqCS-=;GvEJJv0S)pC!y?FEG%ggs>ZtXjB8P8r996y`ZA0K-1subBBsKv7D zQ&y@BGdy#>R?I{Q-C`E<08mov2Md?1)Z^0^VhOVAiN-B04SuKIP8=*;8+Ltkr4U%5 zUOT5&t`!nslxtd~IHRs-88?9qUb3lgHND8efZPndIy4QI1t!31Uj{fn*hjKOTyr6ViQ2623VfG z%1eZuJ|#%VThZ`)>A>MtWUu%^wqx{^y$e=}MXb<~+jmg|>*=$X4~|UX#C>c`oNJ<^ z;ngSCBJ08RssegUzX~4DtV5b=q>E~zs@4;UWJS#uwLnxij8}RB))>a_vQZ#-t)v#F z)#@cJu`i{cjvXqgrJPhxdw$p@h_$-1~5)KjY%2tE>VBHn^uRH_( zbL7OmY4pMyXC`}G8*i)tIIs?9|7*{TSbt&Tj&mDM(x-`rbCLJS4e;HY9{3oX_sZ_Q zj?JUxJ5~6*^BvqAMvyk8#S}?Bkc%|oLkKxGW!$)@hhWR|gJ|2q!Q0*~Q5pzc2Ty}| z#uv$lZ>3IYzM|<%>1qQ!UHq1&zNhY7V;ZTVINs}n>MCjxx)v)w&{Y(5>uXu7Y*9#w zlC32eYJo-=6zL*T$c`dQ8YvWGrBH0>BP}aPNDytYm53xt!1#<3KbUCv$`Uku(_~}( z_M&kS+<#F#aKu&e=Z1S`{}R~l^ZyDF#9rP~*9 zjgL+SW3I|Du%=gM$Ozv-7b z4Eds=>Gn}qd$Sna*$^klkm%ewesVfVx=12$bEI-+**P)gOxMKb2V<6gXM&_$6t82B z{zMG@(IVn%`HIz-8c$CLyhj#7E>~*CI-EBuRz@w2)9FY2{?$};XYu`MJxK97fV$a>A zrzKBCnny}odTt}_vyFrXX!+fxz^if!jv{uMi4bU%J#%rN;>j{AxkrgtOcZ!!-f(si zeRe9Qu0BbB;-f9u=rI94zTBi zLfvIo4v+No^sKKpXBW5EAFrL=-q@(`+vp(fjoIVJdbeA1AdA4G>++v26Hv`o z(vrTKcoR6uWT{@|Xj!J=Sq85xN8)n)u+HO{f#4!4(u!ofs5m+(T0xj$r-Vkv_+Rzrjk4EI&p3@ zklxvLPIz29vFUJfx|dXu73ax$>%_7%d^kK2@kLiQTTC%A8SvFl`fA4fWur@}&?Z`Z zX;(rmgoMRdwYh8jqj?kXT03ctSvM`N^Z~!Ww0>&5x?h}h8z4ek?iQmK_snE!=HyZ$ z-4U^Fjt?y@i$kN+vGAMWd7p>WbyNsvozHfr{QGlq+t1Eu181z=NWE9?aChVzpv8MK6;CaTiq%wdYU9M&IN3KL*(p`@9fILk) zC?>&Ko8FDC(P$v8j|Te7)kD@KLa#{3kPgc5diC|^TnKb#6i|_Rg$yjjTj8zZ75*v) zyVzJetCq!^tgHYRo#K^_^D(@_K6~s(1O`3>UQho7*mAx;rr|1TdeZo0cgyhXqJ=Q) zT_dgA$B(SHwQL;Hnd5Pfr){yG=owu}zSOykQ}z$=nx#~yY)Xe$-j#ymRc;1D$$ASu z7X+gJD*NZ&ycQ?#)Q+kKvH6u zM1o>4o$z&&NWdx%Iii6Y0eFpy!B8mFOw7y62Pzy>NwOpc1HRZt*6u0S@*^v*h%1et zi#b{um`YT}y56t^T%H8&7;KJhrsv;xZeBMYbi#o~jG=bYDY{~4d#er4SRBTRivJ&8 z|7_oTq$PG&v4mX@ZY-panabNE<4U5h36IYb0j>qqAUwrAA*{8S=%x=8qG{w)93s?UirM#j*DcsUVFX}>FRHSky=~KceOS*KUtZ0 zPD{tH#$8L=$;!n0)_?&?1G=Jg$U0}s)0<6UbT|zJ`bkjiSDAd#TD3vT&jF{*@CrF? zfCkam>#yhf{WLznUSL4160b1eRZa2wG8JJbIkc~G7GCpzJpB{+dYbVS3m;=5m4!vB z^7wYo$VhMdxkN{Wc?Q=>Wa9?+z(C7(&#}F3fd(K z%g88URw1b=;}yXHZs#!}1sW5%K*lSBE5AG(uini4X)L++)VDdGzfOw2{jT}#tq;i2 zj0g+(T7o~qcqBYuZ<{cYuxrz~iGf9PvNEL9~?WGVLj&UoXY zGCd(nR^Zj|eK684TsDWyfrZL}I!{z=QIFL}UL*a%K#kGg5f*n6iA1PD(={iiW+qOi z^H*Z2!R5Ksbf2eBV-u#vr_%?jsvZc4p_nL&ky{s>f%%Xt=Fx=3P&5>r-n>yb-ag?e zi#SuH_W0<8kVZ^mva*l(1@QH3Gy5JKOgpu`JEY1)Sp1`tef% zY&NrD9KqS3bCe-=**Zm#HJcUVknl)c4Jq1pmn>cExsO~ zU0hsS?&;`><1V#wNuE zO~fa}b>DuZUHv7^JUS=nhPp2<+mC&nMaNEMc^P6n?v z`Y#CwLeXd}RIj-vg)y^`b4Np%jf%%K>aMCICFa1001rAEO88<;(fNkN@|<%e=}VRL zM|aldC!J}brl!to)`mk%8k_#H@_j?%3`x$_dyQuyUH1Yy8Lwx44EvsU@sHxw_}gi) zz-!*G@p|3Gyq}YdSBY`-)x8$K)HE`Cvw7r1Rqe9_y1};M(w>bMuQ%yDi`RrlN=d$6 zn*~T2O&Ppqr$#C9ny9)J<5fD`FLL9a{vQys@ z`@0Wsy<3<1BhX*a@coIF;qlJKGMm|4M2MxK4$1-#_8x2LZ5muHSsnHqub&ux z)L}c)C1`{j>u>NLHkF!%L(QxA1FsP0_IsOK550N-r`wGibPE7z>k)%MEORSY|b>7u`AH<>bB&QM@#o>jX)#G(Skt)B#0p%9>8v;{g_0v6h zAs|?%rCGs(@gUW}y5C>dfxw|qM@R?kT0gRGORyJGa=57Eah)EOt~CN`U6GAj<#7ciU$akJ!YikRBH*etCQq#;hN=>k*+yWR(k|0}h%=aos;JgfZbJ4bYsQVT z0(TWr8^{#~L#Y|Hu*BU@n4y^XvafTcq*sbp-JLg;T%O4k;HCI@at2Uod;r){;+5sa z0C&1GtRUU|>P?Be?3;(AZt`uf`1+Twcr zM*W=)W%}ecFI+Cnydv>ST%g@2k z);@+;L|t<;ZJg-WzVuwEq9ZuDw4*=k&P`QLGtz}HWxP_+DvvjX&G>>0r;3DrNe)FW zL*=RwC3|F9@xv^gF3D}i>Po!wevj0$GmKE#N)=kz zHNl)(rB&zV=}Tzfx_5CFMYh_Zsr_l-J(*E|WY$a|&s6XxWy0-6nn z6V;mHsd=!5hCYS5BB*Vby$Y2VSV^4#uM_Kh>BlQ2 zEbZG>Llv*VXRi3_a6m>IQ&4hjjP1<`(d>gDqnGtqh1zQ!q_nX%-4hOoS3uN`BQarE zzMK0MqV}?k^j||GoBw^j+JAc||1F9*OMiEv{ZHg+uo|w8^jl`S*Mx;L6~D2c0bVui z!8;Ge60@@L`ZIB77urY_#c{`vR@-LR)UMmsT3pm>)K!bhwpLe%B3oqHf<&UN33jF? z4XLRlgc=fEOov2^8H*314}nNzUqxgM2qGhhJ}lykAU>;4KFyPl{_nlHo;gl~trb0O zCNp>L+}un%zd3X6J?A_+K%r1{G?tqO!PH?~O~N5`@~Vm0qzGOz3GaD0d`@EWEUug& zUipO;Fu(45*$vPzl)f@Wb()(Mpk-Kl)m+3rLr62SwMN=wM#DN3{uDu(;xl?0&$ zfLKvS^%TBNuZ~X4o<8~O2n?$tLIZwhXF*nMPMw}TJtZ>2;6x6on+9}XvgjH;?G;v4 zJ=b2Ts$%AV)LWI=6|2}rwpfW*FxvPNuMmo*jXAHs!%{%K5dY%7{e>Xj4zp+7k>Wnm!E(6g^aHAYN0WO?pr zRFmrg_yVsY8n^0+u1$UlSeNb#e2x}33u8?*LSFY06lx8{oFNd}oO^L{YUy8^e^9+%7|yo!ayD`ZT66~e0^>;w3N z$PIFe?Nvnh9U+4vDi+>F5;bunKqXCC6!1N`ezHDr%=usVrBj?&?mVu=jrTIs=+({mqa$+5hQqfS zu{gYUT7cdEc^ul5z-vU|CW63$7~LAXMdJ0|AYP*?`aOjSq>!xgQ0xO;gTqCHJs>h< zI_(!Sln6ynnSx{N(UZ)8{92{Sve<1fqiuh~DTKLkswyg(G+BP>)8&GH+%SVH*)>LA zT$-3bG~CfZW^Sp*;!UPBoFuJ72k>QDxIeTc-3JvOc2&yh#5wE;Q~)vmr8&2X3NiCy6uI+<>Jn2 zvzv6XnOfqf(!3p8cM8R)oV4p_)*a9BZKMjAF)nX3F0Iv^?rIkrY%?QN)3sVNxl?pf zF+AMIQtdmfcaw#8TZ_gMe!D+wJq#?3Zb1;^>W(`tVA z{^v~($zDt)xHfsZJN#(ADu$Q`yOvi-h&~*z{eW_`0i~70f|Kae`=oNHPXZD5aJ5z5U$EG2=6aNA}STZurMw#N;15Xk&;s6 z$r5^S=kOcWGkhR~SEXVi6e4y(F;sO8M7>pWDvYRXdPL(DL+MxoJkkOSzA9}M{;AiHQh^*o{?4eQcG4)8 zI~ZHHN=Cu*oGm+Le7sTrz_MrC{?>LYk?{-3{7&JSLec|X zXUduUVx?@y?74O<9;)OuO&bJ(D6)ro@c-7-2x~)(?RB9g{ecZ2(EC&@UXm~LpVu~=AgO~G_w*a`+h?P zTdGLA!`S?f@Ot?04yMK{1Uab0%Gmrvw~H8~I-IsljUx9zwN+T_)t3qLBSZ2^di&K^ zUyW!!G3%&go^~wYx+Kb2?0dNp9Bd+?x&0cikbs4cX|Gx+-5z}aN58z>sSXL78zv-Z z4`vO}#@N_^F~+h{(@tt*R0#$P^-NO9)QIf7avB~Jc)bGXiN2vgr?WAgs-5hT#{W|8wZHC8m}mm zFz)HHgjb=eo|JgKTH+PJgzso<}VkXdMeYJ zU9Kf6>5o53dY3%geyZS9oNmT<^TmeceeT;<_Q`oW+q8D8#f`OUGV`f(x!8pb)~}Uo zkP2EG5ph*E%tFPwYS~YbQ)D7?l8>aU2~UuOYoRWU)Me0mBqO z!9xhIL7_UVt>AuroEaoPwI1%1$v-`8Iyn%D&Cm%7*?bR%bX($8A!AJ9^+w?Je(~RZ zgT(8jhBN@ET{>z#5o=UlK{T@fEwLwlt~PSuaH9anE0!FuRFwj<5MEKD>T|pX+9tCr z>jJgPG*aqF5U-LL9IqN>Mo@-y*j0M=5Ac<;!9Xa`Vq}2f_3oGNh4~Tb(8Y+)xWMa3 zZ%)?9{qc&4Sqjop^~Cy+4){vRVj+sI+VKq;YgrP8m+(?|3T(-qgi;%7*9&zzl{G_d z@U#V33@ecXlKAb-!l3An;Z0%Az6bQs6a} zZoS|X6GgA&Bx~ihnw!Wc%C*(zUi{olI&bH*TWR~1x^&OL1-QOmlkIser1N9CeZaGrI&$GwfM^=fq)piXaX7p=At zjm3_oGETX9F;TSN`KaKysk3o2a0k#!^~-W@A53*M1E?@1cCh46(CiRStiK)p2`P=N zRVMv0%*xEa8V3Tq`pn+a)>f56Ev({mDB~3-BNZ_ShZN(3j0AGk**r}C1{0<%jaOVz zk`%z}h`{S{;PnZGSK<;xr7Rd#pzGmPAI&*M&-4mSS(1}y~nilx1R(-8W%}-V1 zP00gzqf~`NYSsJTl}b3IXAnsjgg?HI$Wh&g~X z1vlM#hd}E!$5Vz4j1^#^p2q5aipi{whranx?u#W2!)j?q)=P zH8um8#h6sdVNlAg<4S~rs_2RXs906hQCbvUN7M~Nc@zMzFnAmnbRAK6MOR4bufJt3 zKs2y4Td{?g#%n#_a+=At)~Uj!1GqMdeHs8ZdI2{UUq%Y7D2nscD#@*lpDU+DA&DQ)qfUYx!gjrm`P^c zj-PR0eTcudycBO+<++PZ*Uv{@E5o*%`cru&$V#$`We~6je7VAukc;Pumx-xGagT zvW)Pmiurt~5MEgo;;Z;*&d$E{V|t{1Cn}IG&D@Qc^v5f;sg1+E+zg|=HPQpICK7W4 zJ)Ez?2F&q_kscA%Md0ZdT?nXMN0Xra&w<4nPD)=frVKFNU@5kl5 zSBm$lIyx-X*SFq)Qb3}?CCQ3kg;x_^{q=gOdERwx*XXv+WAuL0DAnrm`SugF(&D+D z-1KrS*GXLY#PzQr3AVBOX6cDcV{?5gQOIVhd%$bf$$0{=CR&T9+EJ@=*O^lCv#ytN zH}lY5FD!U|V=rIKri8PA3pV@dxm5H@E9qF##kz6Pv4B@wT$O}W)lbT{O?W*l7w8d~ z-nCY%_L@gU&=FeDJydX*aK{Z2ueYn~0hd11Sc+(cD_I)n!s$cxxKn^@gTg_Ttd?Yyg<#3;0%Xx- zxmyB&)X`tsZI+uW?5)YRi1&Tc8|XFK8CIx+2k)nGhst#anX(>H)4qn)EC(4HLDG!0 z*XcjlySA2@qA)z;G;C(G$2gzQhnyvo2~i@+g(#FmM8p+0E~G}9a$#;s{|UjPIGX*M8r%mag44g{}lsU}JClx?*LL zWEzObEC#@~c(Y}B(``x%yH~>M;fG0reSYfHyCInM9F0I^rW(LXQI;E;Gtx-o@vZHJ zb|F`)4l2m~ut_@tY6*;}`dhJ$vx^+0ADc_kDi!;qB-513N^f+qri0!I_&^ zj}PuWx_j@*ZOmS~Z*D&LeEIX00hGg?;81bl=8X$yKKI*ayMtLTKEHw`*x>Ws3$PNH zMF*_6Z`TcW@0)dK-{Y%~VN<)fJ$U^3^Be6=Tlp90!6)KUel;RBSLU8YXeuwpI9G0? zIFw&ZWE!(6eOdy%QG!Qx%hKWK2E;D96iF%kKG^iLzBmh23{9$lGU}?jf-b8qNiK~{ zNvoxe0`>VJN=YFA`uBVL^!DDK?i*$~uyXqbEDpdPXv&05J7t(vZ>McL$#2aXrD>in zd&ja}maJF-rFwb=+-3{vO$O>l9Mc@@3-#IysnvJ<(pN!2LxGHA1M z|HL#nT(N8xl%m%bja>u18mkiHwV%t}xzjL#jVEw%BZ8XkMVL3ikD~P~w;Al_>^UIA z(eQpTgH!=QL%Xm+Mp>iRU?SW|n+SsZ`Cid_kzC_a?~uZS3Mk~#bN`JcCuL)GbA3iz zhTICmAq7*|JNg)`Gnmdt`6cQD)+S^M6+2Iv+`$J)oQVe$of?XThj=p|H-!SA4j=-E1Tzmh1H`wBi)!VR=h4}S-A7Rk|>F;4AMKFU@@#{FN@b`cb zb2|S5P$R=15&bE>sYidIBcSH{ce?fH|BZJmk>GGzfxTF;{a(*SyVu;$PCXUbE3rwo zEh_WN6F9?Ef)Qnu=(RD5UKLY%isyhLNkbAHR^(BpR~6($P9h}}UCD#n#bB=Ox~ip# zltidtHUuE8c6_RePAVB+LRuUL!4p?|ocg8`Rix$v6RGU!Rh zVa92+`EZl#%x$NOsNJ^0>19w6AT36T@fyRaX=<*m8Jyc2>38He7w5R42#MCyD|$Dc zKp$6H%CyxxL9aw%!oeiB(Y^EOe!|iFph5%;^)E&PdOZ^hj7bbYjRU(LeT^)GMY>zC zE!KU@_!!d$5Zp~=bXVANwtv3Ath?Llc@;#qY}o>dP*oHZSRbWa1KB=Z6^5+;r~p5? ze-8M6ce)-Q^rpu7XU?MxX%`ddwMfTf1qJ~Xl($uJrw9mI4R9D@z)EBc%liBxLQ*&i zuB?ZW%k(XfVy)~2#&0cHx;o<;hub9Odz4Dxbx#kf& zo!e^9u}LlHG&*d-YzwQgh(o2#eKX8}+kud54Ye@?NuXB*hOEt|HzO;?Q(QSGCA}7U zsLw^xTGuck3we<_F>V0SYfR)Gka-$?-j?aLE_w|c654mibe_*JXBz3%u=>Ed`VhUg zW&rTLK6JEq=gyr^pAZl|!yTj%DJe(^h(GRq`t1zZo-Nbzq>U#pKhHAFPei8lyNWK2E=m|armmew{Z+@-fAMN>{?eFgEZLYi}k8nHm zDtK*8F~h7~J2%uL;mP%&p=l@&mKD8n&lbl{I$foj`$iF-O3T>EAE#A8ucWyOIuv;+ z^dh(`)2kQq!h#y)B{JVZnLK3ewtLqe+M;z#S!+=i7I28+8*VvfuTw;?bLZmWKhEzk zX&sMW&?{nGf}I;I2}omnwUvzf8)5xs*ybV=uW9iYfJN5SP|Q^LQGiTnXxgzAF$Z?Y z@9C&kNTS02L-cBk$kQiVk7wF}+yM7|9k*i5!`S#p@>4g%I&gNU)97^I_l6rF*_FZc zx+riR-m~|5r%$Q=^#ZZtdQn`zjw`}|G5mCh>k!5Cw13vn2T&-Ya|>mq5F+L!dn5{( z5|*cmf-gY(p5N3B8V`DZ{9ii5_bxXZS7kea(oxu$d4*X;??lZ3P*cFgWO+b1Z z$cSK$Z9^g%BvPIt{1^-r$^ZJ}V~z|YU^vGt0olB2mJ&bK`tqd{?IF#4-e+z|hhz zx}-AGCUg!m1VS4%_}@q+k}XgtBMLkN>tRu;3FWQ4DaDGFn2Pvy2?Fu5!gS{eU&#m* z(TEkUVcO|LT4Z~wWo@=Eydkfz*uG){$c9d@;}9U6GY9lakJvf511Z1Evv>^jXp z5Aj#lq;B&9@$^c!)nR&NUh~o={XHYAIXv-{jg{;hwB8_uu4shCt}0*m^a^d&^onJW ziSQHzs~RwKM{idiIM}3g7MEnQ&E(fZK!*Ucjn%+bhCpzlTqFh&6DAcirPfhf8Bl`x zhIznZ0P&g!-lRtE>l|9Vc#mz}vTkwQHUflcj1NG+cFnNLtvZj`q{PUzF~PEw>_8pr z6a;=4NnJHGO8A-q#>QfWqm`IQbtMv^%Ih^(#ScOicrfu-P}30C5EyE>scMWes!<+~ zDiM8PdG6R1Xtvhxz_Z%Sl`!$1JYm)LAdqni<7M+OwGmGwZe*7D%_B>qL|H1i%qDte zC}e!3q@-t8L3#mI8O7R;1C#U&Pp?QQ(Q6fRqdB5ShRN0`(rZyKLrT;Um4~u|OQ`FY zj+-(QmK)Pya~0^7J_VD3x#I)7azB5}X(PQ(n1+JUtD_}rel@(%7cBe@(!|!*5t{Kc zZy7l^Y2D#^su%vwZ_Y2Qe{WSLhzuXbPG^HSJ;OB`W?2_u3e`vD*2nK%KW!$S9_(HEWLtJMOyg`7p#ikZTcqQ~7me~` zL+HyOc6AeKWFRrIYogas5D`z0x#+b%l3vS0=gW(L<%b}olgzVpl;LEv7~pB+h)kSm z%LBHf!iqK9=Vv1+6BPJkj^3s|L~xYk-W2^DoW#H?bp zHj-P~M4ToAlx;Ch^lJ*5;qk*89c$S*L37tKsrm^zMPwrZ#Z+ocJ#0BJ(fWW%t1S^& zuNN&^GzIrqAXt5D|Gd#8_hZEQqa4@pXnmiD#lT7$CHJ3R|Km%0=knr25QK4Y4e=2l zB%*m}R!lYzHwr3?CKneMQ9OE5@ZiOx;Cb)f1P_AfNd&Lr)j!X#zUnVMcyYC z{iv?0uI?FoC-aIBr_bHEwWyKvEn~8GegC+&)$YZ@KjWYQ z3E=Ind^jHpCu>-A^I^1dt*(Bu0|)u)B0p;P^r`1U)>>T)Phi>ezJYJnu2rW|iVx!H z1h;$^?;JSDt63YvZJZhaN4D|pVl~p*8Q++P5SxY$OF5AE0fi^Lyrj2)RUl{|d*$N2+Rg&8VPK`KfUIVVo#f zt+ADUk_w~azdWbaJ|$OPHl%bg-Wv_lj_pkD+}Nm^u@iCds^#jR*pHeC+)8w;;sgHC zqigk!yb}2ST~5S_sjs)EpJ?A2@3d-KU-_EXgMt^h>>TWoEINFMG>Q)zll0}2b^D4+ zyUuyE@UC3FaK+ykQBPUNK~z0@_p&;r3hDGa}aMA=XQKj*H8ncc5 zxE1Xl3#1xH1X04KtB~(optOS-{>afidu8U)+Al%#{u9kKy%`!)mn17@DwEU=O$7p_ zC4%x<_9Fon+q1pLcSeiFyv7~7H%E59HMupuJ?wNlPzBmDO#_$ayehm0`BRHXbw=e9 zbnY%O_QGah2gyK+f`b-GPM=Z>AIW0>42xzcQ5SoA%ot@&SoQfdkw zx~L2*w3;4v>__*T_q&*NQTJWwrhM9xv9U8Ak6QSQjMLw^xP?N^7Skbba^?EU8?@}_ z5Gwu}tw!S-me=*rg2>k%By#A)3*Hn&LdZ((%3~?(#18aD+*n@yl`b3pZ~;z?*sTMg zwNab*29xV|#>RsmGR~}_MeZnPK{8ayINDVsh2VP6eTYg!ng1dWLX@aUzLqh0{P;0* zmWk?&F2c49nwPHPTvSb5Zk1$jZ!apyOOOTO`g5ir6xBMWXpKV+?j#C?&`QwR`1Wkj z>-Fro3Cyw1g4u28GdQMe4GPZ6dK6T8SSc$a#}SCvV>w9ttm@4I&H+LTgpQH_DrxVL zpST0&7XDtpn2%j?v;865YY%vrmS5cRXJf@dh=7*Yb-}TJeFc0GEix)N`oLgm{r73Y z9g@7(ckf)p9|sNv_ya8lmRo?s*WO?@+PQw)*&(TN-C%*KL@vfxyrTZ_;Y0iax0Zv4 z4(cU#9`3ku_W1l3@y^7DffI$<>K3#fmWk2s5?1RHFao@CT%iR=o*;G!w>GHMHR685i3;*4Uq36t&E z-jP%9Jco6 zn18>(s8a(c{k8#1{W=#btQ!!nv7*KUPaU^bB7=YyS>$YIQ5LE9 zaW^rUOrkyGxe9V;rtOUYExpTBaMk&|cX@GKI?j($>;)*K)w+O2GpQs=BMO2`a+;?D8nfW4PaJtN(=kKn>otrM(f+41=! zb_SF+yD#-DpdztOAZIfwho~T9ZZ2dP2i&5wyaV`V)@;E6XqbK5dup%((l|EyxR7+> zs9&Eftf=Y9f_mh@DLXfT8}yCBX)Kn-qk0*hkdkt;h85D}7y@5M>+b$h_U8&xeFRK+ zwDVwen0weDk|Z-Qx@(L8DuD^pY9%Z4Oi zMkUr!2*`G!`4Bl?GPVz)dS!HmD*eJVZ6wytw&BOHRP)jOWs3kvrmbyi} zK{5G^$$OzAMeKOMeNtAY18G~utiv#De(yof)@+M{2IZ4&2aAV&YJilKLBtwE*A7U> z^n4}^AEhq+ZTN99NcBMPZ0%vC?K94t+V=Bz|JK+$C@UAB}ik|*`*Zo^I~ z%v2gv&W&r)F!ay5!kXrJ?Jh^0HyIA(8P8?&YbF%uL8=eSx$QY$j!JZiW|=~d|HUk2 zO=|`PY;q*&A9z*b%^Um}uik!m_u<25=cDoI)2A2UOXNkFPZ3&)P>1oF$S0yOzM$?U zp>~oRf9UtUEZ^fF($zq(f{#n28RsTgMpcnxDH22qtYnbn%i%{w%H3dT%j!CqwYIw) zd0x<=SQRR)igJ~A>4WmfvSHdNxg!oU;2~+ma+t$ZLw4kaqJcL5>R7#TS(l@XdMn{G zR}?s@`&AYNR4Gwq#!!M-25S-x*5}Jg7yetOs%H_sRx1Yo+8YdMMKIk|6iLRd8)m(d esz^i#;Nw?fZ#hx4<{bh60000OA-h1z7 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%0AsT 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 t6qP*>f8u:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-7>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 7) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 7) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-5{column-gap:calc(var(--spacing) * 5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-slate-200>:not(:last-child)){border-color:var(--color-slate-200)}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-300{border-color:var(--color-amber-300)}.border-current{border-color:currentColor}.border-emerald-200{border-color:var(--color-emerald-200)}.border-emerald-700{border-color:var(--color-emerald-700)}.border-red-200{border-color:var(--color-red-200)}.border-red-700{border-color:var(--color-red-700)}.border-rose-200{border-color:var(--color-rose-200)}.border-rose-300{border-color:var(--color-rose-300)}.border-sky-100{border-color:var(--color-sky-100)}.border-sky-200{border-color:var(--color-sky-200)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.border-teal-200{border-color:var(--color-teal-200)}.border-teal-300{border-color:var(--color-teal-300)}.border-teal-600{border-color:var(--color-teal-600)}.border-teal-700{border-color:var(--color-teal-700)}.border-white\/80{border-color:#fffc}@supports (color:color-mix(in lab, red, red)){.border-white\/80{border-color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-50\/70{background-color:#fffbebb3}@supports (color:color-mix(in lab, red, red)){.bg-amber-50\/70{background-color:color-mix(in oklab, var(--color-amber-50) 70%, transparent)}}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-600{background-color:var(--color-amber-600)}.bg-amber-700{background-color:var(--color-amber-700)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-50\/70{background-color:#ecfdf5b3}@supports (color:color-mix(in lab, red, red)){.bg-emerald-50\/70{background-color:color-mix(in oklab, var(--color-emerald-50) 70%, transparent)}}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-700{background-color:var(--color-emerald-700)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-700{background-color:var(--color-red-700)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-50\/70{background-color:#fff1f2b3}@supports (color:color-mix(in lab, red, red)){.bg-rose-50\/70{background-color:color-mix(in oklab, var(--color-rose-50) 70%, transparent)}}.bg-rose-100{background-color:var(--color-rose-100)}.bg-rose-700{background-color:var(--color-rose-700)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-50\/60{background-color:#f0f9ff99}@supports (color:color-mix(in lab, red, red)){.bg-sky-50\/60{background-color:color-mix(in oklab, var(--color-sky-50) 60%, transparent)}}.bg-sky-600{background-color:var(--color-sky-600)}.bg-sky-700{background-color:var(--color-sky-700)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-50\/70{background-color:#f8fafcb3}@supports (color:color-mix(in lab, red, red)){.bg-slate-50\/70{background-color:color-mix(in oklab, var(--color-slate-50) 70%, transparent)}}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-400{background-color:var(--color-slate-400)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-950{background-color:var(--color-slate-950)}.bg-slate-950\/70{background-color:#020618b3}@supports (color:color-mix(in lab, red, red)){.bg-slate-950\/70{background-color:color-mix(in oklab, var(--color-slate-950) 70%, transparent)}}.bg-teal-50{background-color:var(--color-teal-50)}.bg-teal-100{background-color:var(--color-teal-100)}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-600{background-color:var(--color-teal-600)}.bg-teal-700{background-color:var(--color-teal-700)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/70{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.bg-white\/70{background-color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab, red, red)){.bg-white\/95{background-color:color-mix(in oklab, var(--color-white) 95%, transparent)}}.p-0{padding:0}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-10{padding-block:calc(var(--spacing) * 10)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-12{padding-right:calc(var(--spacing) * 12)}.pb-1{padding-bottom:var(--spacing)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-9{padding-left:calc(var(--spacing) * 9)}.pl-11{padding-left:calc(var(--spacing) * 11)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.7rem\]{font-size:.7rem}.text-\[0\.65rem\]{font-size:.65rem}.text-\[0\.68rem\]{font-size:.68rem}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-900\/80{color:#7b3306cc}@supports (color:color-mix(in lab, red, red)){.text-amber-900\/80{color:color-mix(in oklab, var(--color-amber-900) 80%, transparent)}}.text-amber-950{color:var(--color-amber-950)}.text-blue-700{color:var(--color-blue-700)}.text-current{color:currentColor}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-800{color:var(--color-emerald-800)}.text-emerald-900{color:var(--color-emerald-900)}.text-emerald-950{color:var(--color-emerald-950)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-red-900{color:var(--color-red-900)}.text-red-950{color:var(--color-red-950)}.text-rose-600{color:var(--color-rose-600)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-rose-900{color:var(--color-rose-900)}.text-rose-950{color:var(--color-rose-950)}.text-sky-700{color:var(--color-sky-700)}.text-sky-800{color:var(--color-sky-800)}.text-sky-950{color:var(--color-sky-950)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-slate-950{color:var(--color-slate-950)}.text-teal-300{color:var(--color-teal-300)}.text-teal-600{color:var(--color-teal-600)}.text-teal-700{color:var(--color-teal-700)}.text-teal-800{color:var(--color-teal-800)}.text-teal-950{color:var(--color-teal-950)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.accent-teal-700{accent-color:var(--color-teal-700)}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-slate-900\/5{--tw-shadow-color:#0f172b0d}@supports (color:color-mix(in lab, red, red)){.shadow-slate-900\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-900) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-slate-950\/10{--tw-shadow-color:#0206181a}@supports (color:color-mix(in lab, red, red)){.shadow-slate-950\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-950) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-amber-200{--tw-ring-color:var(--color-amber-200)}.ring-blue-200{--tw-ring-color:var(--color-blue-200)}.ring-emerald-200{--tw-ring-color:var(--color-emerald-200)}.ring-red-200{--tw-ring-color:var(--color-red-200)}.ring-rose-200{--tw-ring-color:var(--color-rose-200)}.ring-sky-100{--tw-ring-color:var(--color-sky-100)}.ring-sky-200{--tw-ring-color:var(--color-sky-200)}.ring-slate-100{--tw-ring-color:var(--color-slate-100)}.ring-slate-200{--tw-ring-color:var(--color-slate-200)}.ring-teal-100{--tw-ring-color:var(--color-teal-100)}.ring-teal-200{--tw-ring-color:var(--color-teal-200)}.ring-white{--tw-ring-color:var(--color-white)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\]{transition-property:left;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.ring-inset{--tw-ring-inset:inset}.group-open\:hidden:-webkit-any(:where(.group):-webkit-any([open],:popover-open,:open) *){display:none}.group-open\:hidden:is(:where(.group):is([open],:popover-open,:open) *){display:none}.group-open\:inline-block:-webkit-any(:where(.group):-webkit-any([open],:popover-open,:open) *){display:inline-block}.group-open\:inline-block:is(:where(.group):is([open],:popover-open,:open) *){display:inline-block}.group-open\:inline-flex:-webkit-any(:where(.group):-webkit-any([open],:popover-open,:open) *){display:inline-flex}.group-open\:inline-flex:is(:where(.group):is([open],:popover-open,:open) *){display:inline-flex}.placeholder\:text-slate-400::placeholder{color:var(--color-slate-400)}.first\:mt-0:first-child{margin-top:0}.first\:pt-0:first-child{padding-top:0}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:0}@media (hover:hover){.hover\:border-emerald-800:hover{border-color:var(--color-emerald-800)}.hover\:border-red-200:hover{border-color:var(--color-red-200)}.hover\:border-red-300:hover{border-color:var(--color-red-300)}.hover\:border-red-800:hover{border-color:var(--color-red-800)}.hover\:border-slate-300:hover{border-color:var(--color-slate-300)}.hover\:border-teal-200:hover{border-color:var(--color-teal-200)}.hover\:border-teal-300:hover{border-color:var(--color-teal-300)}.hover\:border-teal-400:hover{border-color:var(--color-teal-400)}.hover\:border-teal-800:hover{border-color:var(--color-teal-800)}.hover\:bg-amber-50:hover{background-color:var(--color-amber-50)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-amber-700:hover{background-color:var(--color-amber-700)}.hover\:bg-amber-800:hover{background-color:var(--color-amber-800)}.hover\:bg-black\/5:hover{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/5:hover{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.hover\:bg-emerald-800:hover{background-color:var(--color-emerald-800)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-800:hover{background-color:var(--color-red-800)}.hover\:bg-rose-50:hover{background-color:var(--color-rose-50)}.hover\:bg-rose-100:hover{background-color:var(--color-rose-100)}.hover\:bg-rose-800:hover{background-color:var(--color-rose-800)}.hover\:bg-sky-800:hover{background-color:var(--color-sky-800)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}.hover\:bg-teal-50:hover{background-color:var(--color-teal-50)}.hover\:bg-teal-100:hover{background-color:var(--color-teal-100)}.hover\:bg-teal-800:hover{background-color:var(--color-teal-800)}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:text-rose-800:hover{color:var(--color-rose-800)}.hover\:text-slate-800:hover{color:var(--color-slate-800)}.hover\:text-slate-950:hover{color:var(--color-slate-950)}.hover\:text-teal-700:hover{color:var(--color-teal-700)}.hover\:text-teal-800:hover{color:var(--color-teal-800)}.hover\:text-teal-900:hover{color:var(--color-teal-900)}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\:border-teal-500:focus{border-color:var(--color-teal-500)}.focus\:bg-white:focus{background-color:var(--color-white)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-4:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-teal-100:focus{--tw-ring-color:var(--color-teal-100)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:rounded:focus-visible{border-radius:.25rem}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-4:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-amber-100:focus-visible{--tw-ring-color:var(--color-amber-100)}.focus-visible\:ring-amber-200:focus-visible{--tw-ring-color:var(--color-amber-200)}.focus-visible\:ring-current:focus-visible{--tw-ring-color:currentcolor}.focus-visible\:ring-emerald-100:focus-visible{--tw-ring-color:var(--color-emerald-100)}.focus-visible\:ring-red-100:focus-visible{--tw-ring-color:var(--color-red-100)}.focus-visible\:ring-red-200:focus-visible{--tw-ring-color:var(--color-red-200)}.focus-visible\:ring-teal-100:focus-visible{--tw-ring-color:var(--color-teal-100)}.focus-visible\:ring-teal-200:focus-visible{--tw-ring-color:var(--color-teal-200)}.focus-visible\:ring-teal-500:focus-visible{--tw-ring-color:var(--color-teal-500)}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-teal-500:focus-visible{outline-color:var(--color-teal-500)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-progress:disabled{cursor:progress}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:bg-red-700:disabled{background-color:var(--color-red-700)}.disabled\:bg-slate-100:disabled{background-color:var(--color-slate-100)}.disabled\:text-slate-400:disabled{color:var(--color-slate-400)}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.disabled\:opacity-80:disabled{opacity:.8}@media (min-width:40rem){.sm\:mx-6{margin-inline:calc(var(--spacing) * 6)}.sm\:mb-6{margin-bottom:calc(var(--spacing) * 6)}.sm\:h-52{height:calc(var(--spacing) * 52)}.sm\:min-h-9{min-height:calc(var(--spacing) * 9)}.sm\:min-h-10{min-height:calc(var(--spacing) * 10)}.sm\:w-auto{width:auto}.sm\:max-w-\[392px\]{max-width:392px}.sm\:max-w-\[592px\]{max-width:592px}.sm\:flex-none{flex:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:justify-start{justify-content:flex-start}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:self-auto{align-self:auto}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-7{padding:calc(var(--spacing) * 7)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:px-2{padding-inline:calc(var(--spacing) * 2)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:pt-2{padding-top:calc(var(--spacing) * 2)}.sm\:pt-6{padding-top:calc(var(--spacing) * 6)}.sm\:pb-6{padding-bottom:calc(var(--spacing) * 6)}.sm\:pb-10{padding-bottom:calc(var(--spacing) * 10)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:48rem){.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:inline-flex{display:inline-flex}.md\:h-\[4\.5rem\]{height:4.5rem}.md\:h-full{height:100%}.md\:min-h-screen{min-height:100vh}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[5rem_minmax\(0\,1fr\)\]{grid-template-columns:5rem minmax(0,1fr)}.md\:grid-cols-\[16rem_minmax\(0\,1fr\)\]{grid-template-columns:16rem minmax(0,1fr)}.md\:flex-col{flex-direction:column}.md\:py-0{padding-block-start:0;padding-block-end:0}.md\:transition-\[grid-template-columns\]{transition-property:grid-template-columns;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.md\:duration-200{--tw-duration:.2s;transition-duration:.2s}.md\:ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}}@media (min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-start-2{grid-column-start:2}.lg\:block{display:block}.lg\:w-72{width:calc(var(--spacing) * 72)}.lg\:flex-1{flex:1}.lg\:shrink-0{flex-shrink:0}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:justify-end{justify-content:flex-end}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:pt-3{padding-top:calc(var(--spacing) * 3)}.lg\:pt-8{padding-top:calc(var(--spacing) * 8)}.lg\:pb-12{padding-bottom:calc(var(--spacing) * 12)}.lg\:whitespace-nowrap{white-space:nowrap}}@media (min-width:80rem){.xl\:col-start-1{grid-column-start:1}.xl\:col-start-2{grid-column-start:2}.xl\:row-span-2{grid-row:span 2/span 2}.xl\:row-start-1{grid-row-start:1}.xl\:row-start-2{grid-row-start:2}.xl\:size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.xl\:h-full{height:100%}.xl\:w-80{width:calc(var(--spacing) * 80)}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-\[minmax\(0\,0\.95fr\)_minmax\(0\,1\.05fr\)\]{grid-template-columns:minmax(0,.95fr) minmax(0,1.05fr)}.xl\:grid-cols-\[minmax\(0\,1\.2fr\)_minmax\(18rem\,0\.8fr\)\]{grid-template-columns:minmax(0,1.2fr) minmax(18rem,.8fr)}.xl\:grid-cols-\[minmax\(0\,1\.08fr\)_minmax\(0\,0\.92fr\)\]{grid-template-columns:minmax(0,1.08fr) minmax(0,.92fr)}.xl\:grid-cols-\[minmax\(0\,1\.45fr\)_minmax\(20rem\,0\.75fr\)\]{grid-template-columns:minmax(0,1.45fr) minmax(20rem,.75fr)}.xl\:grid-cols-\[minmax\(0\,1\.55fr\)_minmax\(18rem\,0\.65fr\)\]{grid-template-columns:minmax(0,1.55fr) minmax(18rem,.65fr)}.xl\:flex-col{flex-direction:column}.xl\:items-stretch{align-items:stretch}.xl\:justify-end{justify-content:flex-end}.xl\:gap-2{gap:calc(var(--spacing) * 2)}.xl\:self-stretch{align-self:stretch}.xl\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.xl\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.xl\:p-4{padding:calc(var(--spacing) * 4)}.xl\:px-10{padding-inline:calc(var(--spacing) * 10)}.xl\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.xl\:whitespace-nowrap{white-space:nowrap}}@media (min-width:96rem){.\32 xl\:size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.\32 xl\:flex-row{flex-direction:row}.\32 xl\:p-5{padding:calc(var(--spacing) * 5)}.\32 xl\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}}:host{color:#0f172a;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:transparent;text-rendering:optimizelegibility;width:100%;min-width:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;display:block}.smartsafehub-shadow-root{width:100%;min-width:0;max-width:100%;display:block}.smartsafehub-shadow-root,.smartsafehub-shadow-root *,.smartsafehub-shadow-root :before,.smartsafehub-shadow-root :after{box-sizing:border-box}.ssh-app{width:100%;min-width:0;max-width:100%;overflow:clip}.ssh-app main,.ssh-app section,.ssh-app article,.ssh-app aside,.ssh-app nav,.ssh-app div{min-width:0}.ssh-product-hero{border-radius:0}.ssh-product-header-action{border-color:#e2e8f0!important}.ssh-product-header-action:hover{border-color:#5eead4!important}.ssh-app a,.ssh-app button,.ssh-app input,.ssh-app textarea{touch-action:manipulation}.ssh-app[data-theme=dark] .ssh-custom-select-trigger:disabled{color:#64748b;background-color:#1e293b;border-color:#334155}.ssh-app[data-theme=dark] .ssh-custom-select-trigger:focus-visible{--tw-ring-color:#134e4aa6}.ssh-app[data-theme=dark] .ssh-custom-select-menu{box-shadow:0 18px 45px #00000059}.ssh-mobile-navigation{padding-left:max(1rem, env(safe-area-inset-left));padding-right:max(1rem, env(safe-area-inset-right))}.ssh-mobile-menu{overscroll-behavior:contain;-webkit-overflow-scrolling:touch;max-height:calc(100dvh - 4.5rem);overflow-y:auto}.ssh-touch-scroll{scrollbar-width:none;overscroll-behavior-inline:contain;-webkit-overflow-scrolling:touch}.ssh-touch-scroll::-webkit-scrollbar{display:none}@media (max-width:767px){.ssh-app{min-height:100dvh;overflow-x:clip}.ssh-product-hero{padding-top:max(1.25rem, env(safe-area-inset-top));padding-left:max(1rem, env(safe-area-inset-left));padding-right:max(1rem, env(safe-area-inset-right))}.ssh-product-main{padding-right:max(1rem, env(safe-area-inset-right));padding-bottom:max(2rem, env(safe-area-inset-bottom));padding-left:max(1rem, env(safe-area-inset-left))}.ssh-app input,.ssh-app textarea{font-size:16px}.ssh-app button,.ssh-app a{min-height:44px}}.ssh-sidebar-toggle{color:#64748b;background:#fff;border:1px solid #e2e8f0;box-shadow:0 1px 3px #0f172a1f}.ssh-sidebar-toggle:hover{color:#0f766e;background:#f8fafc;border-color:#99f6e4}.ssh-app[data-theme=dark] .ssh-sidebar-toggle{color:#94a3b8;background:#1e293b;border-color:#334155;box-shadow:0 1px 3px #00000047}.ssh-app[data-theme=dark] .ssh-sidebar-toggle:hover{color:#5eead4;background:#334155;border-color:#0f766e}.ssh-update-nav-badge{color:#92400e;background:#fef3c7;border:1px solid #f59e0b;border-radius:9999px;justify-content:center;align-items:center;min-width:1.3rem;height:1.3rem;padding:0 .25rem;font-size:.75rem;font-weight:900;line-height:1;display:inline-flex;box-shadow:0 1px 2px #0f172a1f}.ssh-update-nav-badge[data-collapsed=true]{z-index:1;width:auto;min-width:1.25rem;height:1.25rem;padding:0 .25rem;position:absolute;top:.125rem;right:.125rem;box-shadow:0 0 0 2px #fff,0 2px 5px #0f172a33}.ssh-app[data-theme=dark] .ssh-update-nav-badge{color:#422006;background:#fbbf24;border-color:#fcd34d;box-shadow:0 1px 3px #0000004d}.ssh-app[data-theme=dark] .ssh-update-nav-badge[data-collapsed=true]{box-shadow:0 0 0 2px #0f172a,0 2px 6px #00000061}.ssh-update-progress-track{background:#bae6fd;border-radius:9999px;height:.375rem;position:relative;overflow:hidden}.ssh-update-progress-bar{border-radius:inherit;background:#0284c7;width:38%;animation:1.2s ease-in-out infinite ssh-update-progress;position:absolute;top:0;bottom:0;left:0}.ssh-app[data-theme=dark] .ssh-update-progress-track{background:#1e3a5f}.ssh-app[data-theme=dark] .ssh-update-progress-bar{background:#38bdf8}.ssh-app button.ssh-switch-control{box-sizing:border-box;flex:0 0 3rem;width:3rem;min-width:3rem;max-width:3rem;height:1.75rem;min-height:1.75rem;max-height:1.75rem;padding:0}.ssh-switch-thumb{aspect-ratio:1;box-sizing:border-box;background-color:#fff;border-radius:9999px;width:1.25rem;min-width:1.25rem;max-width:1.25rem;height:1.25rem;min-height:1.25rem;max-height:1.25rem}@keyframes ssh-update-progress{0%{transform:translate(-110%)}to{transform:translate(300%)}}.ssh-software-settings-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,18rem),1fr));gap:1rem;display:grid}.ssh-software-settings-channel{grid-column:1/-1}.ssh-time-select{grid-template-columns:repeat(2,minmax(0,1fr));gap:.5rem;width:100%;min-width:0;max-width:100%;display:grid}.ssh-time-select>*{min-width:0}.ssh-time-select .ssh-custom-select-trigger{gap:.5rem;min-width:0;max-width:100%;padding-inline-start:.75rem;padding-inline-end:.75rem}.ssh-ipv4-segments{grid-template-columns:repeat(4,minmax(0,1fr));gap:.75rem;width:100%;min-width:0;max-width:100%;display:grid}.ssh-ipv4-segment{min-width:0;position:relative}.ssh-ipv4-separator{pointer-events:none;position:absolute;top:50%;right:-.375rem;transform:translate(50%,-50%)}@media (min-width:640px){.ssh-ipv4-segments{gap:1rem}.ssh-ipv4-separator{right:-.5rem}}.ssh-app .ssh-rule-group-toggle:hover{background-color:#f1f5f9}.ssh-app[data-theme=dark] .ssh-rule-group-toggle:hover{background-color:#1e293b}.ssh-app[data-theme=dark] .ssh-password-input:-webkit-autofill{-webkit-text-fill-color:#f8fafc;caret-color:#f8fafc;box-shadow:inset 0 0 0 1000px #0f172a}.ssh-app[data-theme=dark] .ssh-password-input:-webkit-autofill:hover{-webkit-text-fill-color:#f8fafc;caret-color:#f8fafc;box-shadow:inset 0 0 0 1000px #0f172a}.ssh-app[data-theme=dark] .ssh-password-input:-webkit-autofill:focus{-webkit-text-fill-color:#f8fafc;caret-color:#f8fafc;box-shadow:inset 0 0 0 1000px #0f172a}.ssh-app[data-theme=light] .ssh-password-input:-webkit-autofill{-webkit-text-fill-color:#0f172a;caret-color:#0f172a;box-shadow:inset 0 0 0 1000px #fff}.ssh-app[data-theme=light] .ssh-password-input:-webkit-autofill:hover{-webkit-text-fill-color:#0f172a;caret-color:#0f172a;box-shadow:inset 0 0 0 1000px #fff}.ssh-app[data-theme=light] .ssh-password-input:-webkit-autofill:focus{-webkit-text-fill-color:#0f172a;caret-color:#0f172a;box-shadow:inset 0 0 0 1000px #fff}.ssh-app[data-theme=dark]{color:#f8fafc;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;background:#020617}.ssh-app[data-theme=dark] [class~=bg-white]{background-color:#0f172a}.ssh-app[data-theme=dark] [class~=bg-white\/95]{background-color:#0f172af2}.ssh-app[data-theme=dark] [class~=bg-white\/70]{background-color:#0f172ac7}.ssh-app[data-theme=dark] [class~=bg-slate-50]{background-color:#020617}.ssh-app[data-theme=dark] [class~=bg-slate-50\/70]{background-color:#020617b8}.ssh-app[data-theme=dark] [class~=bg-slate-100]{background-color:#1e293b}.ssh-app[data-theme=dark] [class~=bg-slate-200]{background-color:#334155}.ssh-app[data-theme=dark] [class~=bg-slate-300]{background-color:#475569}.ssh-app[data-theme=dark] [class~=bg-slate-400]{background-color:#64748b}.ssh-app[data-theme=dark] [class~=bg-black\/5]{background-color:#ffffff0d}.ssh-app[data-theme=dark] [class~=text-slate-950]{color:#f8fafc}.ssh-app[data-theme=dark] [class~=text-slate-900]{color:#f1f5f9}.ssh-app[data-theme=dark] [class~=text-slate-800]{color:#e2e8f0}.ssh-app[data-theme=dark] [class~=text-slate-700],.ssh-app[data-theme=dark] [class~=text-slate-600]{color:#cbd5e1}.ssh-app[data-theme=dark] [class~=text-slate-500],.ssh-app[data-theme=dark] [class~=text-slate-400]{color:#94a3b8}.ssh-app[data-theme=dark] [class~=text-slate-300]{color:#cbd5e1}.ssh-app[data-theme=dark] [class~=border-slate-100],.ssh-app[data-theme=dark] [class~=border-slate-200],.ssh-app[data-theme=dark] [class~=divide-slate-200]{border-color:#1e293b}.ssh-app[data-theme=dark] [class~=border-slate-300],.ssh-app[data-theme=dark] [class~=border-white\/80]{border-color:#334155}.ssh-app[data-theme=dark] [class~=ring-slate-100],.ssh-app[data-theme=dark] [class~=ring-slate-200],.ssh-app[data-theme=dark] [class~=ring-white]{--tw-ring-color:#334155}.ssh-app[data-theme=dark] [class~=bg-teal-50],.ssh-app[data-theme=dark] [class~=bg-teal-100]{background-color:#0d948829}.ssh-app[data-theme=dark] [class~=text-teal-700],.ssh-app[data-theme=dark] [class~=text-teal-800],.ssh-app[data-theme=dark] [class~=text-teal-950]{color:#5eead4}.ssh-app[data-theme=dark] [class~=border-teal-200],.ssh-app[data-theme=dark] [class~=border-teal-300]{border-color:#115e59}.ssh-app[data-theme=dark] [class~=ring-teal-100],.ssh-app[data-theme=dark] [class~=ring-teal-200]{--tw-ring-color:#134e4a}.ssh-app[data-theme=dark] [class~=bg-sky-50],.ssh-app[data-theme=dark] [class~=bg-sky-50\/60]{background-color:#0ea5e91f}.ssh-app[data-theme=dark] [class~=text-sky-700],.ssh-app[data-theme=dark] [class~=text-sky-800],.ssh-app[data-theme=dark] [class~=text-sky-950]{color:#7dd3fc}.ssh-app[data-theme=dark] [class~=border-sky-200]{border-color:#075985}.ssh-app[data-theme=dark] [class~=ring-sky-100],.ssh-app[data-theme=dark] [class~=ring-sky-200]{--tw-ring-color:#0c4a6e}.ssh-app[data-theme=dark] [class~=bg-emerald-50],.ssh-app[data-theme=dark] [class~=bg-emerald-100]{background-color:#10b98121}.ssh-app[data-theme=dark] [class~=bg-emerald-50\/70]{background-color:#10b9811a}.ssh-app[data-theme=dark] [class~=text-emerald-700],.ssh-app[data-theme=dark] [class~=text-emerald-800],.ssh-app[data-theme=dark] [class~=text-emerald-900],.ssh-app[data-theme=dark] [class~=text-emerald-950]{color:#6ee7b7}.ssh-app[data-theme=dark] [class~=border-emerald-200]{border-color:#065f46}.ssh-app[data-theme=dark] [class~=ring-emerald-100],.ssh-app[data-theme=dark] [class~=ring-emerald-200]{--tw-ring-color:#064e3b}.ssh-app[data-theme=dark] [class~=bg-amber-50],.ssh-app[data-theme=dark] [class~=bg-amber-50\/60],.ssh-app[data-theme=dark] [class~=bg-amber-100],.ssh-app[data-theme=dark] [class~=bg-amber-100\/70]{background-color:#f59e0b21}.ssh-app[data-theme=dark] [class~=bg-amber-50\/70]{background-color:#f59e0b1a}.ssh-app[data-theme=dark] [class~=text-amber-700],.ssh-app[data-theme=dark] [class~=text-amber-800],.ssh-app[data-theme=dark] [class~=text-amber-900],.ssh-app[data-theme=dark] [class~=text-amber-900\/80],.ssh-app[data-theme=dark] [class~=text-amber-950]{color:#fcd34d}.ssh-app[data-theme=dark] [class~=border-amber-200],.ssh-app[data-theme=dark] [class~=border-amber-300]{border-color:#92400e}.ssh-app[data-theme=dark] [class~=ring-amber-100],.ssh-app[data-theme=dark] [class~=ring-amber-200]{--tw-ring-color:#78350f}.ssh-app[data-theme=dark] [class~=bg-red-50],.ssh-app[data-theme=dark] [class~=bg-red-100]{background-color:#ef44441f}.ssh-app[data-theme=dark] [class~=text-red-700],.ssh-app[data-theme=dark] [class~=text-red-800],.ssh-app[data-theme=dark] [class~=text-red-900],.ssh-app[data-theme=dark] [class~=text-red-950]{color:#fca5a5}.ssh-app[data-theme=dark] [class~=border-red-200],.ssh-app[data-theme=dark] [class~=border-red-300]{border-color:#991b1b}.ssh-app[data-theme=dark] [class~=ring-red-100],.ssh-app[data-theme=dark] [class~=ring-red-200]{--tw-ring-color:#7f1d1d}.ssh-app[data-theme=dark] [class~=bg-rose-50]{background-color:#f43f5e1f}.ssh-app[data-theme=dark] [class~=bg-rose-50\/70]{background-color:#f43f5e1a}.ssh-app[data-theme=dark] [class~=text-rose-600],.ssh-app[data-theme=dark] [class~=text-rose-700],.ssh-app[data-theme=dark] [class~=text-rose-800],.ssh-app[data-theme=dark] [class~=text-rose-900],.ssh-app[data-theme=dark] [class~=text-rose-950]{color:#fda4af}.ssh-app[data-theme=dark] [class~=border-rose-200],.ssh-app[data-theme=dark] [class~=border-rose-300]{border-color:#9f1239}.ssh-app[data-theme=dark] [class~=ring-rose-200]{--tw-ring-color:#881337}.ssh-app[data-theme=dark] [class~=bg-blue-50]{background-color:#3b82f61f}.ssh-app[data-theme=dark] [class~=text-blue-700]{color:#93c5fd}.ssh-app[data-theme=dark] [class~=ring-blue-200]{--tw-ring-color:#1e3a8a}.ssh-app[data-theme=dark] .hover\:bg-slate-50:hover{background-color:#1e293b}.ssh-app[data-theme=dark] .hover\:bg-rose-50:hover{background-color:#f43f5e2e}.ssh-app[data-theme=dark] .hover\:text-slate-950:hover{color:#f8fafc}.ssh-app[data-theme=dark] .hover\:text-slate-700:hover{color:#e2e8f0}.ssh-app[data-theme=dark] .hover\:text-rose-800:hover{color:#fecdd3}.ssh-app[data-theme=dark] .hover\:border-slate-300:hover{border-color:#475569}.ssh-app[data-theme=dark] .ssh-product-header-action{color:#cbd5e1;background-color:#0f172a;border-color:#334155!important}.ssh-app[data-theme=dark] .ssh-product-header-action:hover{color:#5eead4;border-color:#0f766e!important}.ssh-app[data-theme=dark] .ssh-product-header-action:focus-visible{--tw-ring-color:#134e4a}.ssh-initial-setup-probe{color:#0f172a;background:#f8fafc;place-items:center;min-height:100dvh;padding:1.5rem;display:grid}.ssh-initial-setup-probe-card{text-align:center;background:#fff;border:1px solid #e2e8f0;border-radius:1.25rem;justify-items:center;gap:.7rem;width:min(100%,28rem);padding:2.25rem;display:grid;box-shadow:0 20px 55px #0f172a14}.ssh-initial-setup-probe-card>svg{color:#0f766e;width:2rem;height:2rem}.ssh-initial-setup-probe-card strong{font-size:1rem;font-weight:900}.ssh-initial-setup-probe-card span{color:#64748b;font-size:.84rem;line-height:1.55}.ssh-initial-setup-probe-card button{color:#fff;cursor:pointer;min-height:2.75rem;font:inherit;background:#0f766e;border:0;border-radius:.8rem;margin-top:.4rem;padding:0 1rem;font-size:.84rem;font-weight:900}.smartsafehub-login-shadow-root{background:#f8fafc;min-height:100dvh}.ssh-login-page,.ssh-login-page *,.ssh-login-page :before,.ssh-login-page :after{box-sizing:border-box}.ssh-login-page{--ssh-login-bg:#f8fafc;--ssh-login-surface:#fff;--ssh-login-surface-soft:#f8fafc;--ssh-login-border:#e2e8f0;--ssh-login-border-strong:#cbd5e1;--ssh-login-text:#0f172a;--ssh-login-muted:#64748b;--ssh-login-muted-soft:#94a3b8;--ssh-login-accent:#0f766e;--ssh-login-accent-hover:#115e59;--ssh-login-accent-soft:#f0fdfa;--ssh-login-accent-ring:#14b8a624;--ssh-login-card-shadow:0 24px 70px #0f172a14, 0 2px 10px #0f172a0a;background:var(--ssh-login-bg);min-height:100dvh;color:var(--ssh-login-text);grid-template-columns:minmax(0,1.08fr) minmax(420px,.92fr);display:grid}.ssh-login-page[data-theme=dark]{--ssh-login-bg:#020617;--ssh-login-surface:#0f172a;--ssh-login-surface-soft:#111827;--ssh-login-border:#1e293b;--ssh-login-border-strong:#334155;--ssh-login-text:#f8fafc;--ssh-login-muted:#94a3b8;--ssh-login-muted-soft:#64748b;--ssh-login-accent:#2dd4bf;--ssh-login-accent-hover:#5eead4;--ssh-login-accent-soft:#14b8a61a;--ssh-login-accent-ring:#2dd4bf2e;--ssh-login-card-shadow:0 28px 72px #0000003d, 0 0 0 1px #94a3b80a}.ssh-login-toast{top:max(1rem, env(safe-area-inset-top));z-index:20;color:#115e59;background:#f0fdfa;border:1px solid #99f6e4;border-radius:1rem;align-items:center;gap:.75rem;width:min(100% - 2rem,34rem);padding:.9rem 1rem;font-size:.88rem;font-weight:800;line-height:1.45;display:flex;position:fixed;left:50%;transform:translate(-50%);box-shadow:0 18px 45px #0f172a29}.ssh-login-toast svg{flex:none;width:1.25rem;height:1.25rem}.ssh-login-page[data-theme=dark] .ssh-login-toast{color:#99f6e4;background:#0f2f2e;border-color:#2dd4bf57;box-shadow:0 18px 45px #00000052}.ssh-login-brand{color:#f8fafc;background:radial-gradient(circle at 16% 14%,#2dd4bf29,#0000 28rem),linear-gradient(145deg,#020617 0%,#0f172a 56%,#042f2e 140%);justify-content:center;align-items:center;min-height:100dvh;padding:clamp(3rem,7vw,7rem);display:flex;position:relative;overflow:hidden}.ssh-login-brand:after{content:"";pointer-events:none;background-image:linear-gradient(#94a3b80e 1px,#0000 1px),linear-gradient(90deg,#94a3b80e 1px,#0000 1px);background-size:44px 44px;position:absolute;top:0;bottom:0;left:0;right:0;-webkit-mask-image:linear-gradient(to bottom right,#000,#0000 78%);mask-image:linear-gradient(to bottom right,#000,#0000 78%)}.ssh-login-brand-orb{filter:blur(1px);pointer-events:none;border-radius:9999px;position:absolute}.ssh-login-brand-orb-one{border:1px solid #2dd4bf29;width:30rem;height:30rem;top:-10rem;right:-8rem;box-shadow:inset 0 0 6rem #14b8a60d}.ssh-login-brand-orb-two{border:1px solid #5eead41c;width:36rem;height:36rem;bottom:-13rem;left:-10rem}.ssh-login-brand-content{z-index:1;width:min(100%,680px);position:relative}.ssh-login-brand-mark,.ssh-login-mobile-mark{color:#5eead4;background:#14b8a621;place-items:center;display:grid;box-shadow:inset 0 0 0 1px #5eead42e}.ssh-login-brand-mark{border-radius:1.5rem;width:4.5rem;height:4.5rem;margin-bottom:2rem}.ssh-login-brand-mark svg{width:2.25rem;height:2.25rem}.ssh-login-eyebrow,.ssh-login-kicker{color:#5eead4;letter-spacing:.22em;text-transform:uppercase;margin:0;font-size:.72rem;font-weight:900}.ssh-login-brand h1{letter-spacing:-.055em;margin:.7rem 0 0;font-size:clamp(2.7rem,5vw,5rem);font-weight:900;line-height:.98}.ssh-password-setup-brand-title-line{display:block}.ssh-login-brand-description{color:#cbd5e1;max-width:39rem;margin:1.6rem 0 0;font-size:clamp(1rem,1.5vw,1.16rem);line-height:1.85}.ssh-login-features{gap:.85rem;max-width:40rem;margin-top:3rem;display:grid}.ssh-login-feature{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#0f172a75;border:1px solid #94a3b81c;border-radius:1rem;align-items:center;gap:1rem;padding:.95rem 1rem;display:flex}.ssh-login-feature-icon{color:#5eead4;background:#14b8a61c;border-radius:.8rem;flex:none;place-items:center;width:2.65rem;height:2.65rem;display:grid}.ssh-login-feature-icon svg{width:1.25rem;height:1.25rem}.ssh-login-feature-copy{gap:.15rem;min-width:0;display:grid}.ssh-login-feature-copy strong{color:#f8fafc;font-size:.92rem;font-weight:800}.ssh-login-feature-copy>span{color:#94a3b8;font-size:.8rem;line-height:1.45}.ssh-login-panel{background:var(--ssh-login-bg);justify-content:center;align-items:center;min-height:100dvh;padding:clamp(2rem,5vw,5rem);transition:background-color .18s;display:flex;position:relative}.ssh-login-theme-toggle{top:max(1.25rem, env(safe-area-inset-top));right:max(1.25rem, env(safe-area-inset-right));z-index:2;border:1px solid var(--ssh-login-border);background:var(--ssh-login-surface);width:2.75rem;height:2.75rem;color:var(--ssh-login-muted);cursor:pointer;border-radius:.9rem;place-items:center;transition:border-color .15s,background-color .15s,color .15s,transform .15s;display:grid;position:absolute;box-shadow:0 5px 16px #0f172a0f}.ssh-login-theme-toggle svg{width:1.15rem;height:1.15rem}.ssh-login-theme-toggle:hover{border-color:var(--ssh-login-border-strong);color:var(--ssh-login-accent);transform:translateY(-1px)}.ssh-login-panel-inner{flex-direction:column;justify-content:center;width:min(100%,480px);min-height:min(40rem,100dvh - 4rem);display:flex}.ssh-login-card{border:1px solid var(--ssh-login-border);background:var(--ssh-login-surface);width:100%;box-shadow:var(--ssh-login-card-shadow);border-radius:1.5rem;padding:clamp(1.6rem,4vw,2.6rem);transition:background-color .18s,border-color .18s}.ssh-login-card-heading{align-items:flex-start;gap:1rem;display:flex}.ssh-login-card-heading>div{min-width:0}.ssh-login-mobile-mark{color:#fff;background:#0f766e;border-radius:1.1rem;flex:none;width:3.5rem;height:3.5rem;display:none;box-shadow:0 12px 28px #0f766e38}.ssh-login-mobile-mark svg{width:1.8rem;height:1.8rem}.ssh-login-kicker{color:var(--ssh-login-accent);letter-spacing:.18em}.ssh-login-card h2{color:var(--ssh-login-text);letter-spacing:-.035em;margin:.65rem 0 0;font-size:clamp(1.8rem,4vw,2.25rem);font-weight:900;line-height:1.15}.ssh-login-subtitle{color:var(--ssh-login-muted);margin:.7rem 0 0;font-size:.94rem;line-height:1.6}.ssh-login-alert{color:#9f1239;background:#fff1f2;border:1px solid #fecdd3;border-radius:.85rem;margin-top:1.3rem;padding:.85rem 1rem;font-size:.82rem;font-weight:700;line-height:1.55}.ssh-login-page[data-theme=dark] .ssh-login-alert{color:#fecdd3;background:#8813372e;border-color:#f43f5e59}.ssh-login-form{gap:1.1rem;margin-top:1.6rem;display:grid}.ssh-login-field{gap:.5rem;display:grid}.ssh-login-label{color:var(--ssh-login-text);font-size:.82rem;font-weight:800}.ssh-login-input-wrap{border:2px solid var(--ssh-login-border-strong);background:var(--ssh-login-surface-soft);min-height:3.3rem;color:var(--ssh-login-muted);border-radius:.9rem;align-items:center;transition:border-color .15s,background-color .15s,box-shadow .15s;display:flex;overflow:hidden;box-shadow:inset 0 1px 2px #0f172a09}.ssh-login-input-wrap:focus-within{border-color:var(--ssh-login-accent);background:var(--ssh-login-surface);box-shadow:0 0 0 4px var(--ssh-login-accent-ring)}.ssh-login-field-icon{background:var(--ssh-login-accent-soft);width:2.15rem;height:2.15rem;color:var(--ssh-login-accent);border-radius:.65rem;flex:none;place-items:center;margin-left:.55rem;transition:background-color .15s,color .15s,box-shadow .15s;display:grid}.ssh-login-field-icon svg{width:1.05rem;height:1.05rem}.ssh-login-input-wrap:focus-within .ssh-login-field-icon{box-shadow:inset 0 0 0 1px var(--ssh-login-accent-ring)}.ssh-login-input-wrap input{width:100%;min-width:0;height:3.15rem;color:var(--ssh-login-text);font:inherit;background:0 0;border:0;outline:0;padding:0 .8rem;font-size:.94rem;font-weight:700}.ssh-login-input-wrap input::placeholder{color:var(--ssh-login-muted-soft);opacity:.82;font-weight:600}.ssh-login-input-wrap input:-webkit-autofill{-webkit-text-fill-color:var(--ssh-login-text);caret-color:var(--ssh-login-text);box-shadow:0 0 0 1000px var(--ssh-login-surface-soft) inset}.ssh-login-input-wrap input:-webkit-autofill:hover{-webkit-text-fill-color:var(--ssh-login-text);caret-color:var(--ssh-login-text);box-shadow:0 0 0 1000px var(--ssh-login-surface-soft) inset}.ssh-login-input-wrap input:-webkit-autofill:focus{-webkit-text-fill-color:var(--ssh-login-text);caret-color:var(--ssh-login-text);box-shadow:0 0 0 1000px var(--ssh-login-surface-soft) inset}.ssh-login-input-wrap:focus-within input:-webkit-autofill{box-shadow:0 0 0 1000px var(--ssh-login-surface) inset}.ssh-login-input-wrap input:disabled{cursor:wait;opacity:.68}.ssh-login-password-toggle{width:2.35rem;height:2.35rem;color:var(--ssh-login-muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:.7rem;flex:none;place-items:center;margin-right:.45rem;transition:border-color .15s,background-color .15s,color .15s;display:grid}.ssh-login-password-toggle svg{width:1.05rem;height:1.05rem}.ssh-login-password-toggle:hover:not(:disabled){border-color:var(--ssh-login-border);background:var(--ssh-login-accent-soft);color:var(--ssh-login-accent)}.ssh-login-password-toggle:disabled{cursor:wait;opacity:.6}.ssh-login-theme-toggle:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-password-toggle:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-submit:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-fallback:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-password-hint{color:var(--ssh-login-muted);margin:-.55rem 0 -.15rem;font-size:.76rem;line-height:1.5}.ssh-password-requirements{gap:.4rem;margin:-.25rem 0 0;padding:0;list-style:none;display:grid}.ssh-password-requirement{color:var(--ssh-login-muted);align-items:center;gap:.5rem;font-size:.78rem;font-weight:700;display:flex}.ssh-password-requirement svg{width:1rem;height:1rem;color:var(--ssh-login-muted-soft);flex:none}.ssh-password-requirement.is-met,.ssh-password-requirement.is-met svg,.ssh-password-match.is-met{color:var(--ssh-login-accent)}.ssh-password-match{color:#be123c;margin:-.5rem 0 -.1rem;font-size:.78rem;font-weight:800}.ssh-password-setup-summary{background:#14b8a617;border:1px solid #5eead42e;border-radius:1rem;align-items:flex-start;gap:.85rem;max-width:40rem;margin-top:2.4rem;padding:1rem 1.1rem;display:flex}.ssh-password-setup-summary>svg{color:#5eead4;flex:none;width:1.3rem;height:1.3rem;margin-top:.1rem}.ssh-password-setup-summary>div{gap:.25rem;display:grid}.ssh-password-setup-summary strong{color:#f8fafc;font-size:.9rem}.ssh-password-setup-summary span{color:#94a3b8;font-size:.8rem;line-height:1.5}.ssh-login-caps{color:#b45309;margin:-.45rem 0 -.15rem;font-size:.78rem;font-weight:800}.ssh-login-page[data-theme=dark] .ssh-login-caps{color:#fbbf24}.ssh-login-submit{color:#fff;cursor:pointer;min-height:3.3rem;font:inherit;background:#0f766e;border:0;border-radius:.9rem;justify-content:center;align-items:center;gap:.65rem;margin-top:.25rem;font-size:.94rem;font-weight:900;transition:background-color .15s,transform .15s,box-shadow .15s;display:inline-flex;box-shadow:0 12px 26px #0f766e33}.ssh-login-submit:hover:not(:disabled){background:#115e59;transform:translateY(-1px);box-shadow:0 16px 30px #0f766e40}.ssh-login-submit:disabled{cursor:wait;opacity:.72}.ssh-login-submit-spinner,.ssh-login-probe-spinner{flex:none;animation:.75s linear infinite ssh-login-spin;display:inline-block}.ssh-login-submit-spinner{color:#fff;width:1rem;height:1rem}.ssh-login-security-note{color:var(--ssh-login-muted);align-items:flex-start;gap:.55rem;margin-top:1.2rem;font-size:.76rem;line-height:1.5;display:flex}.ssh-login-security-note svg{width:1rem;height:1rem;color:var(--ssh-login-accent);flex:none;margin-top:.06rem}.ssh-login-fallback{border:1px solid var(--ssh-login-border-strong);background:var(--ssh-login-surface);min-height:2.7rem;color:var(--ssh-login-muted);border-radius:.8rem;justify-content:center;align-items:center;margin-top:.9rem;font-size:.8rem;font-weight:800;text-decoration:none;display:flex}.ssh-login-fallback:hover{border-color:var(--ssh-login-muted-soft);background:var(--ssh-login-surface-soft);color:var(--ssh-login-text)}.ssh-login-probe{color:var(--ssh-login-muted);text-align:center;justify-items:center;gap:.6rem;padding:2.5rem;display:grid}.ssh-login-probe-spinner{width:2rem;height:2rem;color:var(--ssh-login-accent);margin-bottom:.4rem}.ssh-login-probe strong{color:var(--ssh-login-text);font-size:1rem}.ssh-login-probe>span:last-child{font-size:.82rem}.ssh-login-footer{color:var(--ssh-login-muted-soft);flex-wrap:wrap;justify-content:center;gap:.4rem;margin-top:1.5rem;font-size:.72rem;display:flex}@keyframes ssh-login-spin{to{transform:rotate(360deg)}}@media (max-width:980px){.ssh-login-page{grid-template-columns:1fr}.ssh-login-brand{display:none}.ssh-login-panel{padding:max(1.25rem, env(safe-area-inset-top)) max(1.25rem, env(safe-area-inset-right)) max(1.25rem, env(safe-area-inset-bottom)) max(1.25rem, env(safe-area-inset-left))}.ssh-login-panel-inner{min-height:calc(100dvh - 2.5rem)}.ssh-login-mobile-mark{display:grid}}@media (max-width:520px){.ssh-login-panel{background:var(--ssh-login-surface);align-items:stretch;padding:0}.ssh-login-theme-toggle{top:max(1rem, env(safe-area-inset-top));right:max(1rem, env(safe-area-inset-right));box-shadow:none}.ssh-login-panel-inner{width:100%;min-height:100dvh}.ssh-login-card{min-height:100dvh;padding:max(4.75rem, calc(env(safe-area-inset-top) + 4.25rem)) max(1.25rem, env(safe-area-inset-right)) max(2rem, env(safe-area-inset-bottom)) max(1.25rem, env(safe-area-inset-left));box-shadow:none;border:0;border-radius:0;flex-direction:column;justify-content:center;display:flex}.ssh-login-card-heading{display:block}.ssh-login-mobile-mark{margin-bottom:1.25rem}.ssh-login-input-wrap input{font-size:16px}.ssh-login-footer{display:none}.ssh-login-probe{align-content:center;min-height:100dvh}}@media (prefers-reduced-motion:reduce){.ssh-login-panel,.ssh-login-card,.ssh-login-theme-toggle,.ssh-login-submit,.ssh-login-input-wrap{transition:none}.ssh-login-submit-spinner,.ssh-login-probe-spinner{animation-duration:1.4s}}.ssh-safeshield-plan-badge{isolation:isolate;letter-spacing:.085em;white-space:nowrap;border:1px solid #0000;border-radius:999px;align-items:center;gap:.5rem;min-height:2rem;padding:.3rem .82rem .3rem .36rem;font-size:.75rem;font-weight:950;line-height:1;display:inline-flex;position:relative;overflow:hidden}.ssh-safeshield-plan-badge[data-compact=true]{min-height:1.72rem;padding:.22rem .66rem .22rem .3rem;font-size:.69rem}.ssh-safeshield-plan-badge-mark{z-index:2;border-radius:999px;flex:none;place-items:center;width:1.2rem;height:1.2rem;font-size:.76rem;line-height:1;display:grid;position:relative}.ssh-safeshield-plan-badge[data-compact=true] .ssh-safeshield-plan-badge-mark{width:1.02rem;height:1.02rem;font-size:.66rem}.ssh-safeshield-plan-badge[data-tier=free]{color:#475569;background:linear-gradient(135deg,#fff 0%,#f1f5f9 100%);border-color:#cbd5e1;box-shadow:inset 0 1px #ffffffe6}.ssh-safeshield-plan-badge[data-tier=free] .ssh-safeshield-plan-badge-mark{color:#475569;background:#e2e8f0}.ssh-safeshield-plan-badge[data-tier=pro]{color:#f0fdfa;background:linear-gradient(135deg,#115e59 0%,#0f766e 62%,#0d9488 100%);border-color:#0f766e;box-shadow:0 1px 2px #0f766e29,inset 0 1px #ffffff24}.ssh-safeshield-plan-badge[data-tier=pro] .ssh-safeshield-plan-badge-mark{color:#ccfbf1;box-shadow:none;background:#f0fdfa1f;border:1px solid #99f6e475}.ssh-safeshield-plan-badge[data-tier=ultimate]{color:#fffbeb;background:linear-gradient(135deg,#78350f 0%,#92400e 58%,#b45309 100%);border-color:#b45309;box-shadow:0 1px 2px #78350f2e,inset 0 1px #ffffff1f}.ssh-safeshield-plan-badge[data-tier=ultimate] .ssh-safeshield-plan-badge-mark{color:#fde68a;box-shadow:none;background:#fffbeb1f;border:1px solid #fde68a75}.ssh-safeshield-plan-badge[data-tier=paid]{color:#f0f9ff;background:linear-gradient(135deg,#0c4a6e 0%,#075985 58%,#0369a1 100%);border-color:#0369a1;box-shadow:0 1px 2px #0369a129,inset 0 1px #ffffff1f}.ssh-safeshield-plan-badge[data-tier=paid] .ssh-safeshield-plan-badge-mark{color:#bae6fd;box-shadow:none;background:#f0f9ff1f;border:1px solid #bae6fd75}.ssh-safeshield-plan-caption{color:#64748b;white-space:nowrap;align-items:center;gap:.34rem;font-size:.68rem;font-weight:850;display:inline-flex}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=free]{color:#cbd5e1;background:#1e293b;border-color:#475569}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=free] .ssh-safeshield-plan-badge-mark{color:#e2e8f0;background:#475569}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=pro]{color:#99f6e4;background:linear-gradient(135deg,#042f2e 0%,#134e4a 100%);border-color:#0f766e;box-shadow:inset 0 1px #99f6e414}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=pro] .ssh-safeshield-plan-badge-mark{color:#99f6e4;background:#0d94881f;border-color:#2dd4bf61}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=ultimate]{color:#fde68a;background:linear-gradient(135deg,#451a03 0%,#78350f 100%);border-color:#b45309;box-shadow:inset 0 1px #fde68a14}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=ultimate] .ssh-safeshield-plan-badge-mark{color:#fde68a;background:#92400e29;border-color:#d9770675}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=paid]{color:#bae6fd;background:linear-gradient(135deg,#082f49 0%,#0c4a6e 100%);border-color:#0369a1;box-shadow:inset 0 1px #bae6fd14}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=paid] .ssh-safeshield-plan-badge-mark{color:#bae6fd;background:#0369a124;border-color:#0ea5e95c}.ssh-app[data-theme=dark] .ssh-safeshield-plan-caption{color:#94a3b8}.ssh-safeshield-upgrade-card{background:linear-gradient(120deg,#f0fdfa 0%,#ecfeff 58%,#fff7ed 100%);border:1px solid #99f6e4;border-radius:1rem;align-items:center;gap:.85rem;margin-top:.75rem;padding:.9rem 1rem;display:flex;box-shadow:0 10px 24px #0f766e14}.ssh-safeshield-upgrade-mark{color:#fff;background:linear-gradient(135deg,#0f766e,#0891b2);border-radius:.8rem;flex:none;place-items:center;width:2.5rem;height:2.5rem;font-size:1.05rem;display:grid;box-shadow:0 8px 18px #0d948838}.ssh-safeshield-upgrade-copy{flex:1;gap:.2rem;min-width:0;display:grid}.ssh-safeshield-upgrade-meta{color:#0f766e;letter-spacing:.12em;text-transform:uppercase;flex-wrap:wrap;align-items:center;gap:.45rem;font-size:.62rem;font-weight:900;display:flex}.ssh-safeshield-upgrade-soon{letter-spacing:.06em;background:#0f766e1a;border-radius:999px;padding:.18rem .45rem}.ssh-safeshield-upgrade-copy strong{color:#0f172a;font-size:.86rem;line-height:1.35rem}.ssh-safeshield-upgrade-copy>span{color:#64748b;font-size:.74rem;font-weight:600;line-height:1.15rem}.ssh-safeshield-upgrade-action{color:#fff;background:#0f766e;border:1px solid #0f766e;border-radius:.8rem;flex:none;justify-content:center;align-items:center;gap:.4rem;min-height:2.45rem;padding:.55rem .8rem;font-size:.74rem;font-weight:900;text-decoration:none;transition:background-color .15s,border-color .15s,transform .15s;display:inline-flex}.ssh-safeshield-upgrade-action:hover{background:#115e59;border-color:#115e59;transform:translateY(-1px)}.ssh-safeshield-upgrade-action:focus-visible{outline-offset:2px;outline:3px solid #14b8a63d}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-card{background:linear-gradient(120deg,#0d948821 0%,#0f172afa 58%,#92400e1f 100%);border-color:#134e4a;box-shadow:0 12px 28px #0000002e}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-mark{background:linear-gradient(135deg,#0d9488,#0891b2);box-shadow:0 8px 20px #2dd4bf21}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-meta{color:#5eead4}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-soon{background:#2dd4bf1f}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-copy strong{color:#f8fafc}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-copy>span{color:#94a3b8}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-action{color:#ccfbf1;background:#0d948838;border-color:#2dd4bf}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-action:hover{background:#0d948852;border-color:#5eead4}@media (max-width:640px){.ssh-safeshield-upgrade-card{flex-wrap:wrap;align-items:flex-start}.ssh-safeshield-upgrade-action{justify-content:center;width:100%}}.ssh-safeshield-refresh{background:#f0fdfab3;border:1px solid #ccfbf1;border-radius:1rem;align-items:center;gap:.875rem;width:27rem;max-width:100%;margin-top:1rem;padding:.75rem .875rem;display:flex}.ssh-safeshield-refresh[data-state=error]{background:#fef2f2c7;border-color:#fecaca}.ssh-safeshield-refresh-copy{min-width:0}.ssh-safeshield-refresh-kicker,.ssh-safeshield-refresh-title,.ssh-safeshield-refresh-description,.ssh-safeshield-refresh-error-code{margin:0}.ssh-safeshield-refresh-kicker{color:#0f766e;letter-spacing:.14em;text-transform:uppercase;font-size:.66rem;font-weight:900}.ssh-safeshield-refresh[data-state=error] .ssh-safeshield-refresh-kicker{color:#b91c1c}.ssh-safeshield-refresh-title{color:#0f172a;margin-top:.25rem;font-size:.875rem;font-weight:800}.ssh-safeshield-refresh-description{color:#475569;margin-top:.25rem;font-size:.75rem;font-weight:600;line-height:1.25rem}.ssh-safeshield-refresh-error-code{overflow-wrap:anywhere;color:#64748b;margin-top:.375rem;font-size:.68rem;font-weight:600}.ssh-safeshield-refresh-error-code code{font:inherit}.ssh-safeshield-refresh-donut{color:#0d9488;place-items:center;width:3.35rem;min-width:3.35rem;height:3.35rem;display:grid;position:relative}.ssh-safeshield-refresh-donut[data-state=error]{color:#dc2626}.ssh-safeshield-refresh-loader-svg{transform-origin:50%;width:100%;height:100%;animation:.82s linear infinite ssh-safeshield-refresh-loader-rotate;position:absolute;top:0;bottom:0;left:0;right:0;transform:rotate(-90deg)}.ssh-safeshield-refresh-loader-svg-error{animation:none}.ssh-safeshield-refresh-loader-track{color:#cbd5e1;stroke:#cbd5e1}.ssh-safeshield-refresh-loader-arc{color:#0f172a;stroke:#0f172a;filter:drop-shadow(0 0 .06rem #0f172a47)}.ssh-safeshield-refresh-donut[data-state=error] .ssh-safeshield-refresh-loader-track{color:#dc2626;stroke:#dc2626}.ssh-safeshield-refresh-donut-label{z-index:1;color:#0f766e;font-variant-numeric:tabular-nums;font-size:.68rem;font-weight:900;position:relative}.ssh-app[data-theme=dark] .ssh-safeshield-refresh{background:#0f766e1f;border-color:#134e4a}.ssh-app[data-theme=dark] .ssh-safeshield-refresh[data-state=error]{background:#7f1d1d2e;border-color:#7f1d1d}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-title{color:#f8fafc}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-description,.ssh-app[data-theme=dark] .ssh-safeshield-refresh-error-code{color:#94a3b8}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-loader-track{color:#334155;stroke:#334155}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-loader-arc{color:#fff;stroke:#fff;filter:drop-shadow(0 0 .08rem #ffffff8c)}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-donut-label{color:#5eead4}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-donut[data-state=error] .ssh-safeshield-refresh-loader-track{color:#ef4444;stroke:#ef4444}@keyframes ssh-safeshield-refresh-loader-rotate{to{transform:rotate(270deg)}}@media (prefers-reduced-motion:reduce){.ssh-safeshield-refresh-loader-svg{animation:none}}.ssh-dashboard-account-banner{background:#f0fdfa;border-color:#99e8df}.ssh-dashboard-account-banner-icon{color:#0f766e;background:#ccfbf1}.ssh-dashboard-account-banner-title{color:#0f172a}.ssh-dashboard-account-banner-description{color:#475569}.ssh-dashboard-account-banner-badge{color:#92400e;background:#fef3c7}.ssh-dashboard-account-banner-action{color:#fff;background:#0f766e}.ssh-dashboard-account-banner-action:hover{color:#fff;background:#115e59}.ssh-dashboard-account-banner-action:focus-visible{outline-color:#0d9488}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner{background:#102927;border-color:#115e59}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-icon{color:#99f6e4;background:#134e4a}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-title{color:#f1f5f9}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-description{color:#cbd5e1}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-badge{color:#fde68a;background:#78350f}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-action{color:#fff;background:#0f766e}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-action:hover{background:#0d9488}.ssh-account-nav-dot{width:10px;height:10px;box-shadow:0 0 0 2px var(--ssh-account-dot-ring,#fff);background-color:#d97706;border-radius:50%;flex:none;margin-left:auto;display:block}.ssh-account-nav-dot-collapsed{margin-left:0;position:absolute;top:5px;right:7px}.ssh-app[data-theme=dark] .ssh-account-nav-dot{--ssh-account-dot-ring:#0f172a;background-color:#fbbf24}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}} +@layer properties{:host,*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:#fef2f2;--color-red-100:#ffe2e2;--color-red-200:#ffcaca;--color-red-300:#ffa3a3;--color-red-500:#fb2c36;--color-red-700:#bf000f;--color-red-800:#9f0712;--color-red-900:#82181a;--color-red-950:#460809;--color-amber-50:#fffbeb;--color-amber-100:#fef3c6;--color-amber-200:#fee685;--color-amber-300:#ffd236;--color-amber-500:#f99c00;--color-amber-600:#dd7400;--color-amber-700:#b75000;--color-amber-800:#953d00;--color-amber-900:#7b3306;--color-amber-950:#461901;--color-emerald-50:#ecfdf5;--color-emerald-100:#d0fae5;--color-emerald-200:#a4f4cf;--color-emerald-500:#00bb7f;--color-emerald-700:#007956;--color-emerald-800:#005f46;--color-emerald-900:#004e3b;--color-emerald-950:#002c22;--color-teal-50:#f0fdfa;--color-teal-100:#cbfbf1;--color-teal-200:#96f7e4;--color-teal-300:#46ecd5;--color-teal-400:#00d3bd;--color-teal-500:#00baa7;--color-teal-600:#009588;--color-teal-700:#00776e;--color-teal-800:#005f5a;--color-teal-900:#0b4f4a;--color-teal-950:#022f2e;--color-sky-50:#f0f9ff;--color-sky-100:#dff2fe;--color-sky-200:#b8e6fe;--color-sky-600:#0084cc;--color-sky-700:#0069a4;--color-sky-800:#005986;--color-sky-950:#052f4a;--color-blue-50:#eff6ff;--color-blue-200:#bedbff;--color-blue-700:#1447e6;--color-rose-50:#fff1f2;--color-rose-100:#ffe4e6;--color-rose-200:#ffccd3;--color-rose-300:#ffa2ae;--color-rose-600:#e70044;--color-rose-700:#c20039;--color-rose-800:#a30037;--color-rose-900:#8b0836;--color-rose-950:#4d0218;--color-slate-50:#f8fafc;--color-slate-100:#f1f5f9;--color-slate-200:#e2e8f0;--color-slate-300:#cad5e2;--color-slate-400:#90a1b9;--color-slate-500:#62748e;--color-slate-600:#45556c;--color-slate-700:#314158;--color-slate-800:#1d293d;--color-slate-900:#0f172b;--color-slate-950:#020618;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--animate-bounce:bounce 1s infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}@supports (color:color(display-p3 0 0 0)){:root,:host{--color-red-50:color(display-p3 .988669 .951204 .950419);--color-red-100:color(display-p3 .980386 .889727 .887779);--color-red-200:color(display-p3 .969562 .798149 .794299);--color-red-300:color(display-p3 .956922 .651886 .645122);--color-red-500:color(display-p3 .903738 .262579 .253307);--color-red-700:color(display-p3 .692737 .116232 .104679);--color-red-800:color(display-p3 .569606 .121069 .108493);--color-red-900:color(display-p3 .466906 .133198 .12139);--color-red-950:color(display-p3 .25064 .0550983 .0468818);--color-amber-50:color(display-p3 .997804 .985047 .926312);--color-amber-100:color(display-p3 .989391 .954583 .796328);--color-amber-200:color(display-p3 .979824 .904554 .57325);--color-amber-300:color(display-p3 .974327 .83063 .33298);--color-amber-500:color(display-p3 .93994 .620584 .0585367);--color-amber-600:color(display-p3 .827144 .467166 .0336006);--color-amber-700:color(display-p3 .67989 .32771 .0520514);--color-amber-800:color(display-p3 .547533 .256058 .0728326);--color-amber-900:color(display-p3 .445958 .216422 .0823321);--color-amber-950:color(display-p3 .252662 .109091 .026881);--color-emerald-50:color(display-p3 .936818 .989882 .961937);--color-emerald-100:color(display-p3 .848335 .975974 .901691);--color-emerald-200:color(display-p3 .713164 .947563 .822283);--color-emerald-500:color(display-p3 .267113 .726847 .508397);--color-emerald-700:color(display-p3 .164041 .470229 .343508);--color-emerald-800:color(display-p3 .135396 .371401 .277561);--color-emerald-900:color(display-p3 .117821 .302975 .234501);--color-emerald-950:color(display-p3 .0549113 .170434 .13484);--color-teal-50:color(display-p3 .951444 .990904 .98112);--color-teal-100:color(display-p3 .834533 .980328 .946428);--color-teal-200:color(display-p3 .675869 .957879 .896029);--color-teal-300:color(display-p3 .484989 .914726 .835079);--color-teal-400:color(display-p3 .322787 .822056 .744388);--color-teal-500:color(display-p3 .266569 .721518 .655462);--color-teal-600:color(display-p3 .207114 .579584 .53668);--color-teal-700:color(display-p3 .174094 .461318 .433866);--color-teal-800:color(display-p3 .1457 .367051 .350749);--color-teal-900:color(display-p3 .135344 .303314 .290629);--color-teal-950:color(display-p3 .0664925 .181482 .179465);--color-sky-50:color(display-p3 .946501 .975402 .998336);--color-sky-100:color(display-p3 .889195 .946622 .992447);--color-sky-200:color(display-p3 .758153 .897447 .986665);--color-sky-600:color(display-p3 .162505 .509376 .796082);--color-sky-700:color(display-p3 .130314 .404568 .640847);--color-sky-800:color(display-p3 .120719 .343083 .524405);--color-sky-950:color(display-p3 .0726429 .180783 .28188);--color-blue-50:color(display-p3 .941826 .963151 .995385);--color-blue-200:color(display-p3 .76688 .855207 .987483);--color-blue-700:color(display-p3 .1379 .274983 .867624);--color-rose-50:color(display-p3 .989671 .946597 .949215);--color-rose-100:color(display-p3 .982241 .897232 .902568);--color-rose-200:color(display-p3 .96875 .808776 .827317);--color-rose-300:color(display-p3 .96017 .647703 .683715);--color-rose-600:color(display-p3 .848792 .102011 .269259);--color-rose-700:color(display-p3 .711801 .0770816 .226777);--color-rose-800:color(display-p3 .591248 .0929065 .220097);--color-rose-900:color(display-p3 .498064 .104884 .214595);--color-rose-950:color(display-p3 .275407 .0406065 .0990695);--color-slate-50:color(display-p3 .974377 .979815 .986207);--color-slate-100:color(display-p3 .947345 .959969 .97483);--color-slate-200:color(display-p3 .890322 .909405 .939294);--color-slate-300:color(display-p3 .800294 .834432 .882803);--color-slate-400:color(display-p3 .577446 .629622 .716602);--color-slate-500:color(display-p3 .397645 .452653 .547642);--color-slate-600:color(display-p3 .283418 .332214 .416355);--color-slate-700:color(display-p3 .205992 .253487 .336039);--color-slate-800:color(display-p3 .121994 .158688 .232363);--color-slate-900:color(display-p3 .0639692 .0891152 .163036);--color-slate-950:color(display-p3 .0102437 .0227555 .0878731)}}@supports (color:lab(0% 0 0)){:root,:host{--color-red-50:lab(96.5005% 4.18508 1.52328);--color-red-100:lab(92.243% 10.2865 3.83865);--color-red-200:lab(86.017% 19.8815 7.75869);--color-red-300:lab(76.5514% 36.422 15.5335);--color-red-500:lab(55.4814% 75.0732 48.8528);--color-red-700:lab(40.4273% 67.2623 53.7441);--color-red-800:lab(33.7174% 55.8993 41.0293);--color-red-900:lab(28.5139% 44.5539 29.0463);--color-red-950:lab(13.003% 29.04 16.7519);--color-amber-50:lab(98.6252% -.635922 8.42309);--color-amber-100:lab(95.916% -1.21653 23.111);--color-amber-200:lab(91.7203% -.505269 49.9084);--color-amber-300:lab(86.4156% 6.13147 78.3961);--color-amber-500:lab(72.7183% 31.8672 97.9407);--color-amber-600:lab(60.3514% 40.5624 87.1228);--color-amber-700:lab(47.2709% 42.9082 69.2966);--color-amber-800:lab(37.8822% 37.1699 52.2718);--color-amber-900:lab(31.2288% 30.2627 40.0378);--color-amber-950:lab(15.8111% 20.9107 23.3752);--color-emerald-50:lab(97.8462% -6.94966 1.85487);--color-emerald-100:lab(94.9004% -17.0769 5.63836);--color-emerald-200:lab(90.2247% -31.039 9.47084);--color-emerald-500:lab(66.9756% -58.27 19.5419);--color-emerald-700:lab(44.4871% -41.0396 11.0361);--color-emerald-800:lab(35.3675% -33.1188 8.04002);--color-emerald-900:lab(28.8637% -26.9249 5.45986);--color-emerald-950:lab(15.0582% -17.9507 2.38369);--color-teal-50:lab(98.3189% -4.74921 -.111711);--color-teal-100:lab(95.1845% -17.4212 -.425422);--color-teal-200:lab(90.7612% -33.1343 -.542295);--color-teal-300:lab(84.8977% -48.1516 -1.3321);--color-teal-400:lab(76.0109% -53.3483 -2.27906);--color-teal-500:lab(67.3859% -49.0983 -2.63511);--color-teal-600:lab(55.0223% -41.0774 -3.90277);--color-teal-700:lab(44.4134% -33.1436 -4.22149);--color-teal-800:lab(35.5975% -26.6648 -4.34487);--color-teal-900:lab(29.506% -21.4706 -3.59886);--color-teal-950:lab(16.6371% -15.3183 -3.81732);--color-sky-50:lab(97.3623% -2.33802 -4.13098);--color-sky-100:lab(94.3709% -4.56053 -8.23453);--color-sky-200:lab(88.6983% -11.3978 -16.8488);--color-sky-600:lab(51.7754% -11.4712 -49.8349);--color-sky-700:lab(41.6013% -9.10804 -42.5647);--color-sky-800:lab(35.164% -9.57692 -34.4068);--color-sky-950:lab(17.8299% -5.31271 -21.1584);--color-blue-50:lab(96.492% -1.14644 -5.11479);--color-blue-200:lab(86.15% -4.04379 -21.0797);--color-blue-700:lab(36.9089% 35.0961 -85.6872);--color-rose-50:lab(96.2369% 4.94155 1.28011);--color-rose-100:lab(92.8221% 9.86832 2.60075);--color-rose-200:lab(86.806% 19.1909 4.07754);--color-rose-300:lab(76.6339% 38.3549 9.68835);--color-rose-600:lab(49.1882% 81.577 36.0311);--color-rose-700:lab(41.1651% 71.6251 30.3087);--color-rose-800:lab(34.6481% 60.802 20.1957);--color-rose-900:lab(29.7104% 51.514 12.6253);--color-rose-950:lab(14.2323% 34.0086 9.80922);--color-slate-50:lab(98.1434% -.369519 -1.05966);--color-slate-100:lab(96.286% -.852436 -2.46847);--color-slate-200:lab(91.7353% -.998765 -4.76968);--color-slate-300:lab(84.7652% -1.94535 -7.93337);--color-slate-400:lab(65.5349% -2.25151 -14.5072);--color-slate-500:lab(48.0876% -2.03595 -16.5814);--color-slate-600:lab(35.5623% -1.74978 -15.4316);--color-slate-700:lab(26.9569% -1.47016 -15.6993);--color-slate-800:lab(16.132% -.318035 -14.6672);--color-slate-900:lab(7.78673% 1.82345 -15.0537);--color-slate-950:lab(1.76974% 1.32743 -9.28855)}}}@layer base{*,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::-webkit-file-upload-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::-webkit-file-upload-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:-webkit-any([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:-webkit-any([multiple],[size])) optgroup option{padding-inline-start:20px}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::-webkit-file-upload-button{margin-inline-end:4px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-year-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-month-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-day-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-hour-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-minute-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-second-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-millisecond-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-meridiem-field{padding-block-start:0;padding-block-end:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button{-webkit-appearance:button;appearance:button}input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;appearance:button}::-webkit-file-upload-button{-webkit-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;bottom:0;left:0;right:0}.inset-y-0{top:0;bottom:0}.top-0{top:0}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1{top:var(--spacing)}.top-\[4\.5rem\]{top:4.5rem}.right-0{right:0}.right-0\.5{right:calc(var(--spacing) * .5)}.right-1{right:var(--spacing)}.left-0{left:0}.left-1{left:var(--spacing)}.left-6{left:calc(var(--spacing) * 6)}.isolate{isolation:isolate}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[1000\]{z-index:1000}.m-0{margin:0}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-auto{margin-inline-start:auto;margin-inline-end:auto}.my-5{margin-block:calc(var(--spacing) * 5)}.my-6{margin-block:calc(var(--spacing) * 6)}.my-auto{margin-block-start:auto;margin-block-end:auto}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-auto{margin-top:auto}.mb-0{margin-bottom:0}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-0{margin-left:0}.ml-1{margin-left:var(--spacing)}.ml-3{margin-left:calc(var(--spacing) * 3)}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-24{width:calc(var(--spacing) * 24);height:calc(var(--spacing) * 24)}.size-\[76px\]{width:76px;height:76px}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-10{height:calc(var(--spacing) * 10)}.h-44{height:calc(var(--spacing) * 44)}.h-\[4\.5rem\]{height:4.5rem}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-\[20rem\]{max-height:20rem}.max-h-\[22rem\]{max-height:22rem}.max-h-\[28rem\]{max-height:28rem}.min-h-0{min-height:0}.min-h-9{min-height:calc(var(--spacing) * 9)}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-14{min-height:calc(var(--spacing) * 14)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-52{min-height:calc(var(--spacing) * 52)}.min-h-\[4\.5rem\]{min-height:4.5rem}.min-h-screen{min-height:100vh}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[68\%\]{max-width:68%}.max-w-\[288px\]{max-width:288px}.max-w-\[1600px\]{max-width:1600px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-20{min-width:calc(var(--spacing) * 20)}.min-w-24{min-width:calc(var(--spacing) * 24)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.translate-x-1\/2{--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-180{rotate:180deg}.animate-bounce{animation:var(--animate-bounce)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.resize{resize:both}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-7>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 7) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 7) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-1\.5{column-gap:calc(var(--spacing) * 1.5)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-5{column-gap:calc(var(--spacing) * 5)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-slate-200>:not(:last-child)){border-color:var(--color-slate-200)}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-300{border-color:var(--color-amber-300)}.border-current{border-color:currentColor}.border-emerald-200{border-color:var(--color-emerald-200)}.border-emerald-700{border-color:var(--color-emerald-700)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-red-700{border-color:var(--color-red-700)}.border-rose-200{border-color:var(--color-rose-200)}.border-rose-300{border-color:var(--color-rose-300)}.border-sky-100{border-color:var(--color-sky-100)}.border-sky-200{border-color:var(--color-sky-200)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.border-teal-200{border-color:var(--color-teal-200)}.border-teal-300{border-color:var(--color-teal-300)}.border-teal-400{border-color:var(--color-teal-400)}.border-teal-600{border-color:var(--color-teal-600)}.border-teal-700{border-color:var(--color-teal-700)}.border-white\/80{border-color:#fffc}@supports (color:color-mix(in lab, red, red)){.border-white\/80{border-color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-50\/70{background-color:#fffbebb3}@supports (color:color-mix(in lab, red, red)){.bg-amber-50\/70{background-color:color-mix(in oklab, var(--color-amber-50) 70%, transparent)}}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-600{background-color:var(--color-amber-600)}.bg-amber-700{background-color:var(--color-amber-700)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-50\/70{background-color:#ecfdf5b3}@supports (color:color-mix(in lab, red, red)){.bg-emerald-50\/70{background-color:color-mix(in oklab, var(--color-emerald-50) 70%, transparent)}}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-700{background-color:var(--color-emerald-700)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-700{background-color:var(--color-red-700)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-50\/70{background-color:#fff1f2b3}@supports (color:color-mix(in lab, red, red)){.bg-rose-50\/70{background-color:color-mix(in oklab, var(--color-rose-50) 70%, transparent)}}.bg-rose-100{background-color:var(--color-rose-100)}.bg-rose-700{background-color:var(--color-rose-700)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-50\/60{background-color:#f0f9ff99}@supports (color:color-mix(in lab, red, red)){.bg-sky-50\/60{background-color:color-mix(in oklab, var(--color-sky-50) 60%, transparent)}}.bg-sky-600{background-color:var(--color-sky-600)}.bg-sky-700{background-color:var(--color-sky-700)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-50\/70{background-color:#f8fafcb3}@supports (color:color-mix(in lab, red, red)){.bg-slate-50\/70{background-color:color-mix(in oklab, var(--color-slate-50) 70%, transparent)}}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-400{background-color:var(--color-slate-400)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-950{background-color:var(--color-slate-950)}.bg-slate-950\/70{background-color:#020618b3}@supports (color:color-mix(in lab, red, red)){.bg-slate-950\/70{background-color:color-mix(in oklab, var(--color-slate-950) 70%, transparent)}}.bg-teal-50{background-color:var(--color-teal-50)}.bg-teal-100{background-color:var(--color-teal-100)}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-600{background-color:var(--color-teal-600)}.bg-teal-700{background-color:var(--color-teal-700)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/70{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.bg-white\/70{background-color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab, red, red)){.bg-white\/95{background-color:color-mix(in oklab, var(--color-white) 95%, transparent)}}.p-0{padding:0}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-12{padding-right:calc(var(--spacing) * 12)}.pb-1{padding-bottom:var(--spacing)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-9{padding-left:calc(var(--spacing) * 9)}.pl-11{padding-left:calc(var(--spacing) * 11)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.7rem\]{font-size:.7rem}.text-\[0\.65rem\]{font-size:.65rem}.text-\[0\.68rem\]{font-size:.68rem}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-900\/80{color:#7b3306cc}@supports (color:color-mix(in lab, red, red)){.text-amber-900\/80{color:color-mix(in oklab, var(--color-amber-900) 80%, transparent)}}.text-amber-950{color:var(--color-amber-950)}.text-blue-700{color:var(--color-blue-700)}.text-current{color:currentColor}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-800{color:var(--color-emerald-800)}.text-emerald-900{color:var(--color-emerald-900)}.text-emerald-950{color:var(--color-emerald-950)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-red-900{color:var(--color-red-900)}.text-red-950{color:var(--color-red-950)}.text-rose-600{color:var(--color-rose-600)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-rose-900{color:var(--color-rose-900)}.text-rose-950{color:var(--color-rose-950)}.text-sky-700{color:var(--color-sky-700)}.text-sky-800{color:var(--color-sky-800)}.text-sky-950{color:var(--color-sky-950)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-slate-950{color:var(--color-slate-950)}.text-teal-300{color:var(--color-teal-300)}.text-teal-600{color:var(--color-teal-600)}.text-teal-700{color:var(--color-teal-700)}.text-teal-800{color:var(--color-teal-800)}.text-teal-900{color:var(--color-teal-900)}.text-teal-950{color:var(--color-teal-950)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.accent-teal-700{accent-color:var(--color-teal-700)}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-slate-900\/5{--tw-shadow-color:#0f172b0d}@supports (color:color-mix(in lab, red, red)){.shadow-slate-900\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-900) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-slate-950\/10{--tw-shadow-color:#0206181a}@supports (color:color-mix(in lab, red, red)){.shadow-slate-950\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-950) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-amber-200{--tw-ring-color:var(--color-amber-200)}.ring-blue-200{--tw-ring-color:var(--color-blue-200)}.ring-emerald-200{--tw-ring-color:var(--color-emerald-200)}.ring-red-200{--tw-ring-color:var(--color-red-200)}.ring-rose-200{--tw-ring-color:var(--color-rose-200)}.ring-sky-100{--tw-ring-color:var(--color-sky-100)}.ring-sky-200{--tw-ring-color:var(--color-sky-200)}.ring-slate-100{--tw-ring-color:var(--color-slate-100)}.ring-slate-200{--tw-ring-color:var(--color-slate-200)}.ring-teal-100{--tw-ring-color:var(--color-teal-100)}.ring-teal-200{--tw-ring-color:var(--color-teal-200)}.ring-white{--tw-ring-color:var(--color-white)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\]{transition-property:left;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.ring-inset{--tw-ring-inset:inset}.group-open\:hidden:-webkit-any(:where(.group):-webkit-any([open],:popover-open,:open) *){display:none}.group-open\:hidden:is(:where(.group):is([open],:popover-open,:open) *){display:none}.group-open\:inline-block:-webkit-any(:where(.group):-webkit-any([open],:popover-open,:open) *){display:inline-block}.group-open\:inline-block:is(:where(.group):is([open],:popover-open,:open) *){display:inline-block}.group-open\:inline-flex:-webkit-any(:where(.group):-webkit-any([open],:popover-open,:open) *){display:inline-flex}.group-open\:inline-flex:is(:where(.group):is([open],:popover-open,:open) *){display:inline-flex}.placeholder\:text-slate-400::placeholder{color:var(--color-slate-400)}.first\:mt-0:first-child{margin-top:0}.first\:pt-0:first-child{padding-top:0}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:0}@media (hover:hover){.hover\:border-emerald-800:hover{border-color:var(--color-emerald-800)}.hover\:border-red-200:hover{border-color:var(--color-red-200)}.hover\:border-red-300:hover{border-color:var(--color-red-300)}.hover\:border-red-800:hover{border-color:var(--color-red-800)}.hover\:border-slate-300:hover{border-color:var(--color-slate-300)}.hover\:border-teal-200:hover{border-color:var(--color-teal-200)}.hover\:border-teal-300:hover{border-color:var(--color-teal-300)}.hover\:border-teal-400:hover{border-color:var(--color-teal-400)}.hover\:border-teal-800:hover{border-color:var(--color-teal-800)}.hover\:bg-amber-50:hover{background-color:var(--color-amber-50)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-amber-700:hover{background-color:var(--color-amber-700)}.hover\:bg-amber-800:hover{background-color:var(--color-amber-800)}.hover\:bg-black\/5:hover{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/5:hover{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.hover\:bg-emerald-800:hover{background-color:var(--color-emerald-800)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-800:hover{background-color:var(--color-red-800)}.hover\:bg-rose-50:hover{background-color:var(--color-rose-50)}.hover\:bg-rose-100:hover{background-color:var(--color-rose-100)}.hover\:bg-rose-800:hover{background-color:var(--color-rose-800)}.hover\:bg-sky-800:hover{background-color:var(--color-sky-800)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}.hover\:bg-teal-50:hover{background-color:var(--color-teal-50)}.hover\:bg-teal-100:hover{background-color:var(--color-teal-100)}.hover\:bg-teal-800:hover{background-color:var(--color-teal-800)}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:text-rose-800:hover{color:var(--color-rose-800)}.hover\:text-slate-800:hover{color:var(--color-slate-800)}.hover\:text-slate-950:hover{color:var(--color-slate-950)}.hover\:text-teal-700:hover{color:var(--color-teal-700)}.hover\:text-teal-800:hover{color:var(--color-teal-800)}.hover\:text-teal-900:hover{color:var(--color-teal-900)}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\:border-teal-500:focus{border-color:var(--color-teal-500)}.focus\:bg-white:focus{background-color:var(--color-white)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-4:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-teal-100:focus{--tw-ring-color:var(--color-teal-100)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:rounded:focus-visible{border-radius:.25rem}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-4:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-amber-100:focus-visible{--tw-ring-color:var(--color-amber-100)}.focus-visible\:ring-amber-200:focus-visible{--tw-ring-color:var(--color-amber-200)}.focus-visible\:ring-current:focus-visible{--tw-ring-color:currentcolor}.focus-visible\:ring-emerald-100:focus-visible{--tw-ring-color:var(--color-emerald-100)}.focus-visible\:ring-red-100:focus-visible{--tw-ring-color:var(--color-red-100)}.focus-visible\:ring-red-200:focus-visible{--tw-ring-color:var(--color-red-200)}.focus-visible\:ring-teal-100:focus-visible{--tw-ring-color:var(--color-teal-100)}.focus-visible\:ring-teal-200:focus-visible{--tw-ring-color:var(--color-teal-200)}.focus-visible\:ring-teal-500:focus-visible{--tw-ring-color:var(--color-teal-500)}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-teal-500:focus-visible{outline-color:var(--color-teal-500)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-progress:disabled{cursor:progress}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:bg-red-700:disabled{background-color:var(--color-red-700)}.disabled\:bg-slate-100:disabled{background-color:var(--color-slate-100)}.disabled\:text-slate-400:disabled{color:var(--color-slate-400)}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.disabled\:opacity-80:disabled{opacity:.8}@media (min-width:40rem){.sm\:mx-6{margin-inline:calc(var(--spacing) * 6)}.sm\:mb-6{margin-bottom:calc(var(--spacing) * 6)}.sm\:h-52{height:calc(var(--spacing) * 52)}.sm\:min-h-9{min-height:calc(var(--spacing) * 9)}.sm\:min-h-10{min-height:calc(var(--spacing) * 10)}.sm\:w-52{width:calc(var(--spacing) * 52)}.sm\:w-auto{width:auto}.sm\:max-w-\[392px\]{max-width:392px}.sm\:max-w-\[592px\]{max-width:592px}.sm\:flex-none{flex:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:justify-start{justify-content:flex-start}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:self-auto{align-self:auto}.sm\:p-4{padding:calc(var(--spacing) * 4)}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-7{padding:calc(var(--spacing) * 7)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:px-2{padding-inline:calc(var(--spacing) * 2)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:pt-2{padding-top:calc(var(--spacing) * 2)}.sm\:pt-6{padding-top:calc(var(--spacing) * 6)}.sm\:pb-6{padding-bottom:calc(var(--spacing) * 6)}.sm\:pb-10{padding-bottom:calc(var(--spacing) * 10)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:48rem){.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:inline-flex{display:inline-flex}.md\:h-\[4\.5rem\]{height:4.5rem}.md\:h-full{height:100%}.md\:min-h-screen{min-height:100vh}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[5rem_minmax\(0\,1fr\)\]{grid-template-columns:5rem minmax(0,1fr)}.md\:grid-cols-\[16rem_minmax\(0\,1fr\)\]{grid-template-columns:16rem minmax(0,1fr)}.md\:flex-col{flex-direction:column}.md\:py-0{padding-block-start:0;padding-block-end:0}.md\:transition-\[grid-template-columns\]{transition-property:grid-template-columns;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.md\:duration-200{--tw-duration:.2s;transition-duration:.2s}.md\:ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}}@media (min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-start-2{grid-column-start:2}.lg\:block{display:block}.lg\:w-72{width:calc(var(--spacing) * 72)}.lg\:flex-1{flex:1}.lg\:shrink-0{flex-shrink:0}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,18\.5rem\)\]{grid-template-columns:minmax(0,1fr) minmax(0,18.5rem)}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:justify-end{justify-content:flex-end}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:pt-3{padding-top:calc(var(--spacing) * 3)}.lg\:pt-8{padding-top:calc(var(--spacing) * 8)}.lg\:pb-12{padding-bottom:calc(var(--spacing) * 12)}.lg\:whitespace-nowrap{white-space:nowrap}}@media (min-width:80rem){.xl\:col-start-1{grid-column-start:1}.xl\:col-start-2{grid-column-start:2}.xl\:row-span-2{grid-row:span 2/span 2}.xl\:row-start-1{grid-row-start:1}.xl\:row-start-2{grid-row-start:2}.xl\:size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.xl\:h-full{height:100%}.xl\:w-80{width:calc(var(--spacing) * 80)}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-\[minmax\(0\,0\.95fr\)_minmax\(0\,1\.05fr\)\]{grid-template-columns:minmax(0,.95fr) minmax(0,1.05fr)}.xl\:grid-cols-\[minmax\(0\,1\.2fr\)_minmax\(18rem\,0\.8fr\)\]{grid-template-columns:minmax(0,1.2fr) minmax(18rem,.8fr)}.xl\:grid-cols-\[minmax\(0\,1\.08fr\)_minmax\(0\,0\.92fr\)\]{grid-template-columns:minmax(0,1.08fr) minmax(0,.92fr)}.xl\:grid-cols-\[minmax\(0\,1\.45fr\)_minmax\(20rem\,0\.75fr\)\]{grid-template-columns:minmax(0,1.45fr) minmax(20rem,.75fr)}.xl\:grid-cols-\[minmax\(0\,1\.55fr\)_minmax\(18rem\,0\.65fr\)\]{grid-template-columns:minmax(0,1.55fr) minmax(18rem,.65fr)}.xl\:flex-col{flex-direction:column}.xl\:items-stretch{align-items:stretch}.xl\:justify-end{justify-content:flex-end}.xl\:gap-2{gap:calc(var(--spacing) * 2)}.xl\:self-stretch{align-self:stretch}.xl\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.xl\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.xl\:p-4{padding:calc(var(--spacing) * 4)}.xl\:px-10{padding-inline:calc(var(--spacing) * 10)}.xl\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.xl\:whitespace-nowrap{white-space:nowrap}}@media (min-width:96rem){.\32 xl\:size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.\32 xl\:flex-row{flex-direction:row}.\32 xl\:p-5{padding:calc(var(--spacing) * 5)}.\32 xl\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}}:host{color:#0f172a;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:transparent;text-rendering:optimizelegibility;width:100%;min-width:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;display:block}.smartsafehub-shadow-root{width:100%;min-width:0;max-width:100%;display:block}.smartsafehub-shadow-root,.smartsafehub-shadow-root *,.smartsafehub-shadow-root :before,.smartsafehub-shadow-root :after{box-sizing:border-box}.ssh-app{width:100%;min-width:0;max-width:100%;overflow:clip}.ssh-app main,.ssh-app section,.ssh-app article,.ssh-app aside,.ssh-app nav,.ssh-app div{min-width:0}.ssh-product-hero{border-radius:0}.ssh-product-header-action{border-color:#e2e8f0!important}.ssh-product-header-action:hover{border-color:#5eead4!important}.ssh-app a,.ssh-app button,.ssh-app input,.ssh-app textarea{touch-action:manipulation}.ssh-app[data-theme=dark] .ssh-custom-select-trigger:disabled{color:#64748b;background-color:#1e293b;border-color:#334155}.ssh-app[data-theme=dark] .ssh-custom-select-trigger:focus-visible{--tw-ring-color:#134e4aa6}.ssh-app[data-theme=dark] .ssh-custom-select-menu{box-shadow:0 18px 45px #00000059}.ssh-mobile-navigation{padding-left:max(1rem, env(safe-area-inset-left));padding-right:max(1rem, env(safe-area-inset-right))}.ssh-mobile-menu{overscroll-behavior:contain;-webkit-overflow-scrolling:touch;max-height:calc(100dvh - 4.5rem);overflow-y:auto}.ssh-touch-scroll{scrollbar-width:none;overscroll-behavior-inline:contain;-webkit-overflow-scrolling:touch}.ssh-touch-scroll::-webkit-scrollbar{display:none}@media (max-width:767px){.ssh-app{min-height:100dvh;overflow-x:clip}.ssh-product-hero{padding-top:max(1.25rem, env(safe-area-inset-top));padding-left:max(1rem, env(safe-area-inset-left));padding-right:max(1rem, env(safe-area-inset-right))}.ssh-product-main{padding-right:max(1rem, env(safe-area-inset-right));padding-bottom:max(2rem, env(safe-area-inset-bottom));padding-left:max(1rem, env(safe-area-inset-left))}.ssh-app input,.ssh-app textarea{font-size:16px}.ssh-app button,.ssh-app a{min-height:44px}}.ssh-apps-nav-link:not([aria-current=page]){color:#115e59;background-color:#f0fdfa;border:1px solid #99f6e4}.ssh-apps-nav-link:not([aria-current=page]):hover{background-color:#ccfbf1;border-color:#5eead4}.ssh-apps-nav-description{color:#0f766e}.ssh-app[data-theme=dark] .ssh-apps-nav-link:not([aria-current=page]){color:#e2e8f0;background-color:#14b8a617;border-color:#134e4a}.ssh-app[data-theme=dark] .ssh-apps-nav-link:not([aria-current=page]):hover{color:#5eead4;background-color:#14b8a629;border-color:#0f766e}.ssh-app[data-theme=dark] .ssh-apps-nav-description{color:#5eead4}.ssh-apps-nav-link:focus-visible{outline-offset:2px;outline:2px solid #0d9488}.ssh-sidebar-toggle{color:#64748b;background:#fff;border:1px solid #e2e8f0;box-shadow:0 1px 3px #0f172a1f}.ssh-sidebar-toggle:hover{color:#0f766e;background:#f8fafc;border-color:#99f6e4}.ssh-app[data-theme=dark] .ssh-sidebar-toggle{color:#94a3b8;background:#1e293b;border-color:#334155;box-shadow:0 1px 3px #00000047}.ssh-app[data-theme=dark] .ssh-sidebar-toggle:hover{color:#5eead4;background:#334155;border-color:#0f766e}.ssh-update-nav-badge{color:#92400e;background:#fef3c7;border:1px solid #f59e0b;border-radius:9999px;justify-content:center;align-items:center;min-width:1.3rem;height:1.3rem;padding:0 .25rem;font-size:.75rem;font-weight:900;line-height:1;display:inline-flex;box-shadow:0 1px 2px #0f172a1f}.ssh-update-nav-badge[data-collapsed=true]{z-index:1;width:auto;min-width:1.25rem;height:1.25rem;padding:0 .25rem;position:absolute;top:.125rem;right:.125rem;box-shadow:0 0 0 2px #fff,0 2px 5px #0f172a33}.ssh-app[data-theme=dark] .ssh-update-nav-badge{color:#422006;background:#fbbf24;border-color:#fcd34d;box-shadow:0 1px 3px #0000004d}.ssh-app[data-theme=dark] .ssh-update-nav-badge[data-collapsed=true]{box-shadow:0 0 0 2px #0f172a,0 2px 6px #00000061}.ssh-update-progress-track{background:#bae6fd;border-radius:9999px;height:.375rem;position:relative;overflow:hidden}.ssh-update-progress-bar{border-radius:inherit;background:#0284c7;width:38%;animation:1.2s ease-in-out infinite ssh-update-progress;position:absolute;top:0;bottom:0;left:0}.ssh-app[data-theme=dark] .ssh-update-progress-track{background:#1e3a5f}.ssh-app[data-theme=dark] .ssh-update-progress-bar{background:#38bdf8}.ssh-app button.ssh-switch-control{box-sizing:border-box;flex:0 0 3rem;width:3rem;min-width:3rem;max-width:3rem;height:1.75rem;min-height:1.75rem;max-height:1.75rem;padding:0}.ssh-switch-thumb{aspect-ratio:1;box-sizing:border-box;background-color:#fff;border-radius:9999px;width:1.25rem;min-width:1.25rem;max-width:1.25rem;height:1.25rem;min-height:1.25rem;max-height:1.25rem}@keyframes ssh-update-progress{0%{transform:translate(-110%)}to{transform:translate(300%)}}.ssh-software-settings-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,18rem),1fr));gap:1rem;display:grid}.ssh-software-settings-channel{grid-column:1/-1}.ssh-time-select{grid-template-columns:repeat(2,minmax(0,1fr));gap:.5rem;width:100%;min-width:0;max-width:100%;display:grid}.ssh-time-select>*{min-width:0}.ssh-time-select .ssh-custom-select-trigger{gap:.5rem;min-width:0;max-width:100%;padding-inline-start:.75rem;padding-inline-end:.75rem}.ssh-ipv4-segments{grid-template-columns:repeat(4,minmax(0,1fr));gap:.75rem;width:100%;min-width:0;max-width:100%;display:grid}.ssh-ipv4-segment{min-width:0;position:relative}.ssh-ipv4-separator{pointer-events:none;position:absolute;top:50%;right:-.375rem;transform:translate(50%,-50%)}@media (min-width:640px){.ssh-ipv4-segments{gap:1rem}.ssh-ipv4-separator{right:-.5rem}}.ssh-app .ssh-rule-group-toggle:hover{background-color:#f1f5f9}.ssh-app[data-theme=dark] .ssh-rule-group-toggle:hover{background-color:#1e293b}.ssh-app[data-theme=dark] .ssh-password-input:-webkit-autofill{-webkit-text-fill-color:#f8fafc;caret-color:#f8fafc;box-shadow:inset 0 0 0 1000px #0f172a}.ssh-app[data-theme=dark] .ssh-password-input:-webkit-autofill:hover{-webkit-text-fill-color:#f8fafc;caret-color:#f8fafc;box-shadow:inset 0 0 0 1000px #0f172a}.ssh-app[data-theme=dark] .ssh-password-input:-webkit-autofill:focus{-webkit-text-fill-color:#f8fafc;caret-color:#f8fafc;box-shadow:inset 0 0 0 1000px #0f172a}.ssh-app[data-theme=light] .ssh-password-input:-webkit-autofill{-webkit-text-fill-color:#0f172a;caret-color:#0f172a;box-shadow:inset 0 0 0 1000px #fff}.ssh-app[data-theme=light] .ssh-password-input:-webkit-autofill:hover{-webkit-text-fill-color:#0f172a;caret-color:#0f172a;box-shadow:inset 0 0 0 1000px #fff}.ssh-app[data-theme=light] .ssh-password-input:-webkit-autofill:focus{-webkit-text-fill-color:#0f172a;caret-color:#0f172a;box-shadow:inset 0 0 0 1000px #fff}.ssh-app[data-theme=dark]{color:#f8fafc;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;background:#020617}.ssh-app[data-theme=dark] [class~=bg-white]{background-color:#0f172a}.ssh-app[data-theme=dark] [class~=bg-white\/95]{background-color:#0f172af2}.ssh-app[data-theme=dark] [class~=bg-white\/70]{background-color:#0f172ac7}.ssh-app[data-theme=dark] [class~=bg-slate-50]{background-color:#020617}.ssh-app[data-theme=dark] [class~=bg-slate-50\/70]{background-color:#020617b8}.ssh-app[data-theme=dark] [class~=bg-slate-100]{background-color:#1e293b}.ssh-app[data-theme=dark] [class~=bg-slate-200]{background-color:#334155}.ssh-app[data-theme=dark] [class~=bg-slate-300]{background-color:#475569}.ssh-app[data-theme=dark] [class~=bg-slate-400]{background-color:#64748b}.ssh-app[data-theme=dark] [class~=bg-black\/5]{background-color:#ffffff0d}.ssh-app[data-theme=dark] [class~=text-slate-950]{color:#f8fafc}.ssh-app[data-theme=dark] [class~=text-slate-900]{color:#f1f5f9}.ssh-app[data-theme=dark] [class~=text-slate-800]{color:#e2e8f0}.ssh-app[data-theme=dark] [class~=text-slate-700],.ssh-app[data-theme=dark] [class~=text-slate-600]{color:#cbd5e1}.ssh-app[data-theme=dark] [class~=text-slate-500],.ssh-app[data-theme=dark] [class~=text-slate-400]{color:#94a3b8}.ssh-app[data-theme=dark] [class~=text-slate-300]{color:#cbd5e1}.ssh-app[data-theme=dark] [class~=border-slate-100],.ssh-app[data-theme=dark] [class~=border-slate-200],.ssh-app[data-theme=dark] [class~=divide-slate-200]{border-color:#1e293b}.ssh-app[data-theme=dark] [class~=border-slate-300],.ssh-app[data-theme=dark] [class~=border-white\/80]{border-color:#334155}.ssh-app[data-theme=dark] [class~=ring-slate-100],.ssh-app[data-theme=dark] [class~=ring-slate-200],.ssh-app[data-theme=dark] [class~=ring-white]{--tw-ring-color:#334155}.ssh-app[data-theme=dark] [class~=bg-teal-50],.ssh-app[data-theme=dark] [class~=bg-teal-100]{background-color:#0d948829}.ssh-app[data-theme=dark] [class~=text-teal-700],.ssh-app[data-theme=dark] [class~=text-teal-800],.ssh-app[data-theme=dark] [class~=text-teal-900],.ssh-app[data-theme=dark] [class~=text-teal-950]{color:#5eead4}.ssh-app[data-theme=dark] [class~=border-teal-200],.ssh-app[data-theme=dark] [class~=border-teal-300]{border-color:#115e59}.ssh-app[data-theme=dark] [class~=ring-teal-100],.ssh-app[data-theme=dark] [class~=ring-teal-200]{--tw-ring-color:#134e4a}.ssh-app[data-theme=dark] [class~=bg-sky-50],.ssh-app[data-theme=dark] [class~=bg-sky-50\/60]{background-color:#0ea5e91f}.ssh-app[data-theme=dark] [class~=text-sky-700],.ssh-app[data-theme=dark] [class~=text-sky-800],.ssh-app[data-theme=dark] [class~=text-sky-950]{color:#7dd3fc}.ssh-app[data-theme=dark] [class~=border-sky-200]{border-color:#075985}.ssh-app[data-theme=dark] [class~=ring-sky-100],.ssh-app[data-theme=dark] [class~=ring-sky-200]{--tw-ring-color:#0c4a6e}.ssh-app[data-theme=dark] [class~=bg-emerald-50],.ssh-app[data-theme=dark] [class~=bg-emerald-100]{background-color:#10b98121}.ssh-app[data-theme=dark] [class~=bg-emerald-50\/70]{background-color:#10b9811a}.ssh-app[data-theme=dark] [class~=text-emerald-700],.ssh-app[data-theme=dark] [class~=text-emerald-800],.ssh-app[data-theme=dark] [class~=text-emerald-900],.ssh-app[data-theme=dark] [class~=text-emerald-950]{color:#6ee7b7}.ssh-app[data-theme=dark] [class~=border-emerald-200]{border-color:#065f46}.ssh-app[data-theme=dark] [class~=ring-emerald-100],.ssh-app[data-theme=dark] [class~=ring-emerald-200]{--tw-ring-color:#064e3b}.ssh-app[data-theme=dark] [class~=bg-amber-50],.ssh-app[data-theme=dark] [class~=bg-amber-50\/60],.ssh-app[data-theme=dark] [class~=bg-amber-100],.ssh-app[data-theme=dark] [class~=bg-amber-100\/70]{background-color:#f59e0b21}.ssh-app[data-theme=dark] [class~=bg-amber-50\/70]{background-color:#f59e0b1a}.ssh-app[data-theme=dark] [class~=text-amber-700],.ssh-app[data-theme=dark] [class~=text-amber-800],.ssh-app[data-theme=dark] [class~=text-amber-900],.ssh-app[data-theme=dark] [class~=text-amber-900\/80],.ssh-app[data-theme=dark] [class~=text-amber-950]{color:#fcd34d}.ssh-app[data-theme=dark] [class~=border-amber-200],.ssh-app[data-theme=dark] [class~=border-amber-300]{border-color:#92400e}.ssh-app[data-theme=dark] [class~=ring-amber-100],.ssh-app[data-theme=dark] [class~=ring-amber-200]{--tw-ring-color:#78350f}.ssh-app[data-theme=dark] [class~=bg-red-50],.ssh-app[data-theme=dark] [class~=bg-red-100]{background-color:#ef44441f}.ssh-app[data-theme=dark] [class~=text-red-700],.ssh-app[data-theme=dark] [class~=text-red-800],.ssh-app[data-theme=dark] [class~=text-red-900],.ssh-app[data-theme=dark] [class~=text-red-950]{color:#fca5a5}.ssh-app[data-theme=dark] [class~=border-red-200],.ssh-app[data-theme=dark] [class~=border-red-300]{border-color:#991b1b}.ssh-app[data-theme=dark] [class~=ring-red-100],.ssh-app[data-theme=dark] [class~=ring-red-200]{--tw-ring-color:#7f1d1d}.ssh-app[data-theme=dark] [class~=bg-rose-50]{background-color:#f43f5e1f}.ssh-app[data-theme=dark] [class~=bg-rose-50\/70]{background-color:#f43f5e1a}.ssh-app[data-theme=dark] [class~=text-rose-600],.ssh-app[data-theme=dark] [class~=text-rose-700],.ssh-app[data-theme=dark] [class~=text-rose-800],.ssh-app[data-theme=dark] [class~=text-rose-900],.ssh-app[data-theme=dark] [class~=text-rose-950]{color:#fda4af}.ssh-app[data-theme=dark] [class~=border-rose-200],.ssh-app[data-theme=dark] [class~=border-rose-300]{border-color:#9f1239}.ssh-app[data-theme=dark] [class~=ring-rose-200]{--tw-ring-color:#881337}.ssh-app[data-theme=dark] [class~=bg-blue-50]{background-color:#3b82f61f}.ssh-app[data-theme=dark] [class~=text-blue-700]{color:#93c5fd}.ssh-app[data-theme=dark] [class~=ring-blue-200]{--tw-ring-color:#1e3a8a}.ssh-app[data-theme=dark] .hover\:bg-slate-50:hover{background-color:#1e293b}.ssh-app[data-theme=dark] .hover\:bg-red-50:hover{background-color:#ef444429}.ssh-app[data-theme=dark] .hover\:bg-rose-50:hover{background-color:#f43f5e2e}.ssh-app[data-theme=dark] .hover\:text-slate-950:hover{color:#f8fafc}.ssh-app[data-theme=dark] .hover\:text-slate-700:hover{color:#e2e8f0}.ssh-app[data-theme=dark] .hover\:text-rose-800:hover{color:#fecdd3}.ssh-app[data-theme=dark] .hover\:border-slate-300:hover{border-color:#475569}.ssh-app[data-theme=dark] .ssh-product-header-action{color:#cbd5e1;background-color:#0f172a;border-color:#334155!important}.ssh-app[data-theme=dark] .ssh-product-header-action:hover{color:#5eead4;border-color:#0f766e!important}.ssh-app[data-theme=dark] .ssh-product-header-action:focus-visible{--tw-ring-color:#134e4a}.ssh-initial-setup-probe{color:#0f172a;background:#f8fafc;place-items:center;min-height:100dvh;padding:1.5rem;display:grid}.ssh-initial-setup-probe-card{text-align:center;background:#fff;border:1px solid #e2e8f0;border-radius:1.25rem;justify-items:center;gap:.7rem;width:min(100%,28rem);padding:2.25rem;display:grid;box-shadow:0 20px 55px #0f172a14}.ssh-initial-setup-probe-card>svg{color:#0f766e;width:2rem;height:2rem}.ssh-initial-setup-probe-card strong{font-size:1rem;font-weight:900}.ssh-initial-setup-probe-card span{color:#64748b;font-size:.84rem;line-height:1.55}.ssh-initial-setup-probe-card button{color:#fff;cursor:pointer;min-height:2.75rem;font:inherit;background:#0f766e;border:0;border-radius:.8rem;margin-top:.4rem;padding:0 1rem;font-size:.84rem;font-weight:900}.smartsafehub-login-shadow-root{background:#f8fafc;min-height:100dvh}.ssh-login-page,.ssh-login-page *,.ssh-login-page :before,.ssh-login-page :after{box-sizing:border-box}.ssh-login-page{--ssh-login-bg:#f8fafc;--ssh-login-surface:#fff;--ssh-login-surface-soft:#f8fafc;--ssh-login-border:#e2e8f0;--ssh-login-border-strong:#cbd5e1;--ssh-login-text:#0f172a;--ssh-login-muted:#64748b;--ssh-login-muted-soft:#94a3b8;--ssh-login-accent:#0f766e;--ssh-login-accent-hover:#115e59;--ssh-login-accent-soft:#f0fdfa;--ssh-login-accent-ring:#14b8a624;--ssh-login-card-shadow:0 24px 70px #0f172a14, 0 2px 10px #0f172a0a;background:var(--ssh-login-bg);min-height:100dvh;color:var(--ssh-login-text);grid-template-columns:minmax(0,1.08fr) minmax(420px,.92fr);display:grid}.ssh-login-page[data-theme=dark]{--ssh-login-bg:#020617;--ssh-login-surface:#0f172a;--ssh-login-surface-soft:#111827;--ssh-login-border:#1e293b;--ssh-login-border-strong:#334155;--ssh-login-text:#f8fafc;--ssh-login-muted:#94a3b8;--ssh-login-muted-soft:#64748b;--ssh-login-accent:#2dd4bf;--ssh-login-accent-hover:#5eead4;--ssh-login-accent-soft:#14b8a61a;--ssh-login-accent-ring:#2dd4bf2e;--ssh-login-card-shadow:0 28px 72px #0000003d, 0 0 0 1px #94a3b80a}.ssh-login-toast{top:max(1rem, env(safe-area-inset-top));z-index:20;color:#115e59;background:#f0fdfa;border:1px solid #99f6e4;border-radius:1rem;align-items:center;gap:.75rem;width:min(100% - 2rem,34rem);padding:.9rem 1rem;font-size:.88rem;font-weight:800;line-height:1.45;display:flex;position:fixed;left:50%;transform:translate(-50%);box-shadow:0 18px 45px #0f172a29}.ssh-login-toast svg{flex:none;width:1.25rem;height:1.25rem}.ssh-login-page[data-theme=dark] .ssh-login-toast{color:#99f6e4;background:#0f2f2e;border-color:#2dd4bf57;box-shadow:0 18px 45px #00000052}.ssh-login-brand{color:#f8fafc;background:radial-gradient(circle at 16% 14%,#2dd4bf29,#0000 28rem),linear-gradient(145deg,#020617 0%,#0f172a 56%,#042f2e 140%);justify-content:center;align-items:center;min-height:100dvh;padding:clamp(3rem,7vw,7rem);display:flex;position:relative;overflow:hidden}.ssh-login-brand:after{content:"";pointer-events:none;background-image:linear-gradient(#94a3b80e 1px,#0000 1px),linear-gradient(90deg,#94a3b80e 1px,#0000 1px);background-size:44px 44px;position:absolute;top:0;bottom:0;left:0;right:0;-webkit-mask-image:linear-gradient(to bottom right,#000,#0000 78%);mask-image:linear-gradient(to bottom right,#000,#0000 78%)}.ssh-login-brand-orb{filter:blur(1px);pointer-events:none;border-radius:9999px;position:absolute}.ssh-login-brand-orb-one{border:1px solid #2dd4bf29;width:30rem;height:30rem;top:-10rem;right:-8rem;box-shadow:inset 0 0 6rem #14b8a60d}.ssh-login-brand-orb-two{border:1px solid #5eead41c;width:36rem;height:36rem;bottom:-13rem;left:-10rem}.ssh-login-brand-content{z-index:1;width:min(100%,680px);position:relative}.ssh-login-brand-mark,.ssh-login-mobile-mark{color:#5eead4;background:#14b8a621;place-items:center;display:grid;box-shadow:inset 0 0 0 1px #5eead42e}.ssh-login-brand-mark{border-radius:1.5rem;width:4.5rem;height:4.5rem;margin-bottom:2rem}.ssh-login-brand-mark svg{width:2.25rem;height:2.25rem}.ssh-login-eyebrow,.ssh-login-kicker{color:#5eead4;letter-spacing:.22em;text-transform:uppercase;margin:0;font-size:.72rem;font-weight:900}.ssh-login-brand h1{letter-spacing:-.055em;margin:.7rem 0 0;font-size:clamp(2.7rem,5vw,5rem);font-weight:900;line-height:.98}.ssh-password-setup-brand-title-line{display:block}.ssh-login-brand-description{color:#cbd5e1;max-width:39rem;margin:1.6rem 0 0;font-size:clamp(1rem,1.5vw,1.16rem);line-height:1.85}.ssh-login-features{gap:.85rem;max-width:40rem;margin-top:3rem;display:grid}.ssh-login-feature{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#0f172a75;border:1px solid #94a3b81c;border-radius:1rem;align-items:center;gap:1rem;padding:.95rem 1rem;display:flex}.ssh-login-feature-icon{color:#5eead4;background:#14b8a61c;border-radius:.8rem;flex:none;place-items:center;width:2.65rem;height:2.65rem;display:grid}.ssh-login-feature-icon svg{width:1.25rem;height:1.25rem}.ssh-login-feature-copy{gap:.15rem;min-width:0;display:grid}.ssh-login-feature-copy strong{color:#f8fafc;font-size:.92rem;font-weight:800}.ssh-login-feature-copy>span{color:#94a3b8;font-size:.8rem;line-height:1.45}.ssh-login-panel{background:var(--ssh-login-bg);justify-content:center;align-items:center;min-height:100dvh;padding:clamp(2rem,5vw,5rem);transition:background-color .18s;display:flex;position:relative}.ssh-login-theme-toggle{top:max(1.25rem, env(safe-area-inset-top));right:max(1.25rem, env(safe-area-inset-right));z-index:2;border:1px solid var(--ssh-login-border);background:var(--ssh-login-surface);width:2.75rem;height:2.75rem;color:var(--ssh-login-muted);cursor:pointer;border-radius:.9rem;place-items:center;transition:border-color .15s,background-color .15s,color .15s,transform .15s;display:grid;position:absolute;box-shadow:0 5px 16px #0f172a0f}.ssh-login-theme-toggle svg{width:1.15rem;height:1.15rem}.ssh-login-theme-toggle:hover{border-color:var(--ssh-login-border-strong);color:var(--ssh-login-accent);transform:translateY(-1px)}.ssh-login-panel-inner{flex-direction:column;justify-content:center;width:min(100%,480px);min-height:min(40rem,100dvh - 4rem);display:flex}.ssh-login-card{border:1px solid var(--ssh-login-border);background:var(--ssh-login-surface);width:100%;box-shadow:var(--ssh-login-card-shadow);border-radius:1.5rem;padding:clamp(1.6rem,4vw,2.6rem);transition:background-color .18s,border-color .18s}.ssh-login-card-heading{align-items:flex-start;gap:1rem;display:flex}.ssh-login-card-heading>div{min-width:0}.ssh-login-mobile-mark{color:#fff;background:#0f766e;border-radius:1.1rem;flex:none;width:3.5rem;height:3.5rem;display:none;box-shadow:0 12px 28px #0f766e38}.ssh-login-mobile-mark svg{width:1.8rem;height:1.8rem}.ssh-login-kicker{color:var(--ssh-login-accent);letter-spacing:.18em}.ssh-login-card h2{color:var(--ssh-login-text);letter-spacing:-.035em;margin:.65rem 0 0;font-size:clamp(1.8rem,4vw,2.25rem);font-weight:900;line-height:1.15}.ssh-login-subtitle{color:var(--ssh-login-muted);margin:.7rem 0 0;font-size:.94rem;line-height:1.6}.ssh-login-alert{color:#9f1239;background:#fff1f2;border:1px solid #fecdd3;border-radius:.85rem;margin-top:1.3rem;padding:.85rem 1rem;font-size:.82rem;font-weight:700;line-height:1.55}.ssh-login-page[data-theme=dark] .ssh-login-alert{color:#fecdd3;background:#8813372e;border-color:#f43f5e59}.ssh-login-form{gap:1.1rem;margin-top:1.6rem;display:grid}.ssh-login-field{gap:.5rem;display:grid}.ssh-login-label{color:var(--ssh-login-text);font-size:.82rem;font-weight:800}.ssh-login-input-wrap{border:2px solid var(--ssh-login-border-strong);background:var(--ssh-login-surface-soft);min-height:3.3rem;color:var(--ssh-login-muted);border-radius:.9rem;align-items:center;transition:border-color .15s,background-color .15s,box-shadow .15s;display:flex;overflow:hidden;box-shadow:inset 0 1px 2px #0f172a09}.ssh-login-input-wrap:focus-within{border-color:var(--ssh-login-accent);background:var(--ssh-login-surface);box-shadow:0 0 0 4px var(--ssh-login-accent-ring)}.ssh-login-field-icon{background:var(--ssh-login-accent-soft);width:2.15rem;height:2.15rem;color:var(--ssh-login-accent);border-radius:.65rem;flex:none;place-items:center;margin-left:.55rem;transition:background-color .15s,color .15s,box-shadow .15s;display:grid}.ssh-login-field-icon svg{width:1.05rem;height:1.05rem}.ssh-login-input-wrap:focus-within .ssh-login-field-icon{box-shadow:inset 0 0 0 1px var(--ssh-login-accent-ring)}.ssh-login-input-wrap input{width:100%;min-width:0;height:3.15rem;color:var(--ssh-login-text);font:inherit;background:0 0;border:0;outline:0;padding:0 .8rem;font-size:.94rem;font-weight:700}.ssh-login-input-wrap input::placeholder{color:var(--ssh-login-muted-soft);opacity:.82;font-weight:600}.ssh-login-input-wrap input:-webkit-autofill{-webkit-text-fill-color:var(--ssh-login-text);caret-color:var(--ssh-login-text);box-shadow:0 0 0 1000px var(--ssh-login-surface-soft) inset}.ssh-login-input-wrap input:-webkit-autofill:hover{-webkit-text-fill-color:var(--ssh-login-text);caret-color:var(--ssh-login-text);box-shadow:0 0 0 1000px var(--ssh-login-surface-soft) inset}.ssh-login-input-wrap input:-webkit-autofill:focus{-webkit-text-fill-color:var(--ssh-login-text);caret-color:var(--ssh-login-text);box-shadow:0 0 0 1000px var(--ssh-login-surface-soft) inset}.ssh-login-input-wrap:focus-within input:-webkit-autofill{box-shadow:0 0 0 1000px var(--ssh-login-surface) inset}.ssh-login-input-wrap input:disabled{cursor:wait;opacity:.68}.ssh-login-password-toggle{width:2.35rem;height:2.35rem;color:var(--ssh-login-muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:.7rem;flex:none;place-items:center;margin-right:.45rem;transition:border-color .15s,background-color .15s,color .15s;display:grid}.ssh-login-password-toggle svg{width:1.05rem;height:1.05rem}.ssh-login-password-toggle:hover:not(:disabled){border-color:var(--ssh-login-border);background:var(--ssh-login-accent-soft);color:var(--ssh-login-accent)}.ssh-login-password-toggle:disabled{cursor:wait;opacity:.6}.ssh-login-theme-toggle:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-password-toggle:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-submit:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-fallback:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-password-hint{color:var(--ssh-login-muted);margin:-.55rem 0 -.15rem;font-size:.76rem;line-height:1.5}.ssh-password-requirements{gap:.4rem;margin:-.25rem 0 0;padding:0;list-style:none;display:grid}.ssh-password-requirement{color:var(--ssh-login-muted);align-items:center;gap:.5rem;font-size:.78rem;font-weight:700;display:flex}.ssh-password-requirement svg{width:1rem;height:1rem;color:var(--ssh-login-muted-soft);flex:none}.ssh-password-requirement.is-met,.ssh-password-requirement.is-met svg,.ssh-password-match.is-met{color:var(--ssh-login-accent)}.ssh-password-match{color:#be123c;margin:-.5rem 0 -.1rem;font-size:.78rem;font-weight:800}.ssh-password-setup-summary{background:#14b8a617;border:1px solid #5eead42e;border-radius:1rem;align-items:flex-start;gap:.85rem;max-width:40rem;margin-top:2.4rem;padding:1rem 1.1rem;display:flex}.ssh-password-setup-summary>svg{color:#5eead4;flex:none;width:1.3rem;height:1.3rem;margin-top:.1rem}.ssh-password-setup-summary>div{gap:.25rem;display:grid}.ssh-password-setup-summary strong{color:#f8fafc;font-size:.9rem}.ssh-password-setup-summary span{color:#94a3b8;font-size:.8rem;line-height:1.5}.ssh-login-caps{color:#b45309;margin:-.45rem 0 -.15rem;font-size:.78rem;font-weight:800}.ssh-login-page[data-theme=dark] .ssh-login-caps{color:#fbbf24}.ssh-login-submit{color:#fff;cursor:pointer;min-height:3.3rem;font:inherit;background:#0f766e;border:0;border-radius:.9rem;justify-content:center;align-items:center;gap:.65rem;margin-top:.25rem;font-size:.94rem;font-weight:900;transition:background-color .15s,transform .15s,box-shadow .15s;display:inline-flex;box-shadow:0 12px 26px #0f766e33}.ssh-login-submit:hover:not(:disabled){background:#115e59;transform:translateY(-1px);box-shadow:0 16px 30px #0f766e40}.ssh-login-submit:disabled{cursor:wait;opacity:.72}.ssh-login-submit-spinner,.ssh-login-probe-spinner{flex:none;animation:.75s linear infinite ssh-login-spin;display:inline-block}.ssh-login-submit-spinner{color:#fff;width:1rem;height:1rem}.ssh-login-security-note{color:var(--ssh-login-muted);align-items:flex-start;gap:.55rem;margin-top:1.2rem;font-size:.76rem;line-height:1.5;display:flex}.ssh-login-security-note svg{width:1rem;height:1rem;color:var(--ssh-login-accent);flex:none;margin-top:.06rem}.ssh-login-fallback{border:1px solid var(--ssh-login-border-strong);background:var(--ssh-login-surface);min-height:2.7rem;color:var(--ssh-login-muted);border-radius:.8rem;justify-content:center;align-items:center;margin-top:.9rem;font-size:.8rem;font-weight:800;text-decoration:none;display:flex}.ssh-login-fallback:hover{border-color:var(--ssh-login-muted-soft);background:var(--ssh-login-surface-soft);color:var(--ssh-login-text)}.ssh-login-probe{color:var(--ssh-login-muted);text-align:center;justify-items:center;gap:.6rem;padding:2.5rem;display:grid}.ssh-login-probe-spinner{width:2rem;height:2rem;color:var(--ssh-login-accent);margin-bottom:.4rem}.ssh-login-probe strong{color:var(--ssh-login-text);font-size:1rem}.ssh-login-probe>span:last-child{font-size:.82rem}.ssh-login-footer{color:var(--ssh-login-muted-soft);flex-wrap:wrap;justify-content:center;gap:.4rem;margin-top:1.5rem;font-size:.72rem;display:flex}@keyframes ssh-login-spin{to{transform:rotate(360deg)}}@media (max-width:980px){.ssh-login-page{grid-template-columns:1fr}.ssh-login-brand{display:none}.ssh-login-panel{padding:max(1.25rem, env(safe-area-inset-top)) max(1.25rem, env(safe-area-inset-right)) max(1.25rem, env(safe-area-inset-bottom)) max(1.25rem, env(safe-area-inset-left))}.ssh-login-panel-inner{min-height:calc(100dvh - 2.5rem)}.ssh-login-mobile-mark{display:grid}}@media (max-width:520px){.ssh-login-panel{background:var(--ssh-login-surface);align-items:stretch;padding:0}.ssh-login-theme-toggle{top:max(1rem, env(safe-area-inset-top));right:max(1rem, env(safe-area-inset-right));box-shadow:none}.ssh-login-panel-inner{width:100%;min-height:100dvh}.ssh-login-card{min-height:100dvh;padding:max(4.75rem, calc(env(safe-area-inset-top) + 4.25rem)) max(1.25rem, env(safe-area-inset-right)) max(2rem, env(safe-area-inset-bottom)) max(1.25rem, env(safe-area-inset-left));box-shadow:none;border:0;border-radius:0;flex-direction:column;justify-content:center;display:flex}.ssh-login-card-heading{display:block}.ssh-login-mobile-mark{margin-bottom:1.25rem}.ssh-login-input-wrap input{font-size:16px}.ssh-login-footer{display:none}.ssh-login-probe{align-content:center;min-height:100dvh}}@media (prefers-reduced-motion:reduce){.ssh-login-panel,.ssh-login-card,.ssh-login-theme-toggle,.ssh-login-submit,.ssh-login-input-wrap{transition:none}.ssh-login-submit-spinner,.ssh-login-probe-spinner{animation-duration:1.4s}}.ssh-safeshield-plan-badge{isolation:isolate;letter-spacing:.085em;white-space:nowrap;border:1px solid #0000;border-radius:999px;align-items:center;gap:.5rem;min-height:2rem;padding:.3rem .82rem .3rem .36rem;font-size:.75rem;font-weight:950;line-height:1;display:inline-flex;position:relative;overflow:hidden}.ssh-safeshield-plan-badge[data-compact=true]{min-height:1.72rem;padding:.22rem .66rem .22rem .3rem;font-size:.69rem}.ssh-safeshield-plan-badge-mark{z-index:2;border-radius:999px;flex:none;place-items:center;width:1.2rem;height:1.2rem;font-size:.76rem;line-height:1;display:grid;position:relative}.ssh-safeshield-plan-badge[data-compact=true] .ssh-safeshield-plan-badge-mark{width:1.02rem;height:1.02rem;font-size:.66rem}.ssh-safeshield-plan-badge[data-tier=free]{color:#475569;background:linear-gradient(135deg,#fff 0%,#f1f5f9 100%);border-color:#cbd5e1;box-shadow:inset 0 1px #ffffffe6}.ssh-safeshield-plan-badge[data-tier=free] .ssh-safeshield-plan-badge-mark{color:#475569;background:#e2e8f0}.ssh-safeshield-plan-badge[data-tier=pro]{color:#f0fdfa;background:linear-gradient(135deg,#115e59 0%,#0f766e 62%,#0d9488 100%);border-color:#0f766e;box-shadow:0 1px 2px #0f766e29,inset 0 1px #ffffff24}.ssh-safeshield-plan-badge[data-tier=pro] .ssh-safeshield-plan-badge-mark{color:#ccfbf1;box-shadow:none;background:#f0fdfa1f;border:1px solid #99f6e475}.ssh-safeshield-plan-badge[data-tier=ultimate]{color:#fffbeb;background:linear-gradient(135deg,#78350f 0%,#92400e 58%,#b45309 100%);border-color:#b45309;box-shadow:0 1px 2px #78350f2e,inset 0 1px #ffffff1f}.ssh-safeshield-plan-badge[data-tier=ultimate] .ssh-safeshield-plan-badge-mark{color:#fde68a;box-shadow:none;background:#fffbeb1f;border:1px solid #fde68a75}.ssh-safeshield-plan-badge[data-tier=paid]{color:#f0f9ff;background:linear-gradient(135deg,#0c4a6e 0%,#075985 58%,#0369a1 100%);border-color:#0369a1;box-shadow:0 1px 2px #0369a129,inset 0 1px #ffffff1f}.ssh-safeshield-plan-badge[data-tier=paid] .ssh-safeshield-plan-badge-mark{color:#bae6fd;box-shadow:none;background:#f0f9ff1f;border:1px solid #bae6fd75}.ssh-safeshield-plan-caption{color:#64748b;white-space:nowrap;align-items:center;gap:.34rem;font-size:.68rem;font-weight:850;display:inline-flex}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=free]{color:#cbd5e1;background:#1e293b;border-color:#475569}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=free] .ssh-safeshield-plan-badge-mark{color:#e2e8f0;background:#475569}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=pro]{color:#99f6e4;background:linear-gradient(135deg,#042f2e 0%,#134e4a 100%);border-color:#0f766e;box-shadow:inset 0 1px #99f6e414}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=pro] .ssh-safeshield-plan-badge-mark{color:#99f6e4;background:#0d94881f;border-color:#2dd4bf61}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=ultimate]{color:#fde68a;background:linear-gradient(135deg,#451a03 0%,#78350f 100%);border-color:#b45309;box-shadow:inset 0 1px #fde68a14}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=ultimate] .ssh-safeshield-plan-badge-mark{color:#fde68a;background:#92400e29;border-color:#d9770675}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=paid]{color:#bae6fd;background:linear-gradient(135deg,#082f49 0%,#0c4a6e 100%);border-color:#0369a1;box-shadow:inset 0 1px #bae6fd14}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=paid] .ssh-safeshield-plan-badge-mark{color:#bae6fd;background:#0369a124;border-color:#0ea5e95c}.ssh-app[data-theme=dark] .ssh-safeshield-plan-caption{color:#94a3b8}.ssh-safeshield-upgrade-card{background:linear-gradient(120deg,#f0fdfa 0%,#ecfeff 58%,#fff7ed 100%);border:1px solid #99f6e4;border-radius:1rem;align-items:center;gap:.85rem;margin-top:.75rem;padding:.9rem 1rem;display:flex;box-shadow:0 10px 24px #0f766e14}.ssh-safeshield-upgrade-mark{color:#fff;background:linear-gradient(135deg,#0f766e,#0891b2);border-radius:.8rem;flex:none;place-items:center;width:2.5rem;height:2.5rem;font-size:1.05rem;display:grid;box-shadow:0 8px 18px #0d948838}.ssh-safeshield-upgrade-copy{flex:1;gap:.2rem;min-width:0;display:grid}.ssh-safeshield-upgrade-meta{color:#0f766e;letter-spacing:.12em;text-transform:uppercase;flex-wrap:wrap;align-items:center;gap:.45rem;font-size:.62rem;font-weight:900;display:flex}.ssh-safeshield-upgrade-soon{letter-spacing:.06em;background:#0f766e1a;border-radius:999px;padding:.18rem .45rem}.ssh-safeshield-upgrade-copy strong{color:#0f172a;font-size:.86rem;line-height:1.35rem}.ssh-safeshield-upgrade-copy>span{color:#64748b;font-size:.74rem;font-weight:600;line-height:1.15rem}.ssh-safeshield-upgrade-action{color:#fff;background:#0f766e;border:1px solid #0f766e;border-radius:.8rem;flex:none;justify-content:center;align-items:center;gap:.4rem;min-height:2.45rem;padding:.55rem .8rem;font-size:.74rem;font-weight:900;text-decoration:none;transition:background-color .15s,border-color .15s,transform .15s;display:inline-flex}.ssh-safeshield-upgrade-action:hover{background:#115e59;border-color:#115e59;transform:translateY(-1px)}.ssh-safeshield-upgrade-action:focus-visible{outline-offset:2px;outline:3px solid #14b8a63d}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-card{background:linear-gradient(120deg,#0d948821 0%,#0f172afa 58%,#92400e1f 100%);border-color:#134e4a;box-shadow:0 12px 28px #0000002e}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-mark{background:linear-gradient(135deg,#0d9488,#0891b2);box-shadow:0 8px 20px #2dd4bf21}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-meta{color:#5eead4}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-soon{background:#2dd4bf1f}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-copy strong{color:#f8fafc}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-copy>span{color:#94a3b8}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-action{color:#ccfbf1;background:#0d948838;border-color:#2dd4bf}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-action:hover{background:#0d948852;border-color:#5eead4}@media (max-width:640px){.ssh-safeshield-upgrade-card{flex-wrap:wrap;align-items:flex-start}.ssh-safeshield-upgrade-action{justify-content:center;width:100%}}.ssh-safeshield-refresh{background:#f0fdfab3;border:1px solid #ccfbf1;border-radius:1rem;align-items:center;gap:.875rem;width:27rem;max-width:100%;margin-top:1rem;padding:.75rem .875rem;display:flex}.ssh-safeshield-refresh[data-state=error]{background:#fef2f2c7;border-color:#fecaca}.ssh-safeshield-refresh-copy{min-width:0}.ssh-safeshield-refresh-kicker,.ssh-safeshield-refresh-title,.ssh-safeshield-refresh-description,.ssh-safeshield-refresh-error-code{margin:0}.ssh-safeshield-refresh-kicker{color:#0f766e;letter-spacing:.14em;text-transform:uppercase;font-size:.66rem;font-weight:900}.ssh-safeshield-refresh[data-state=error] .ssh-safeshield-refresh-kicker{color:#b91c1c}.ssh-safeshield-refresh-title{color:#0f172a;margin-top:.25rem;font-size:.875rem;font-weight:800}.ssh-safeshield-refresh-description{color:#475569;margin-top:.25rem;font-size:.75rem;font-weight:600;line-height:1.25rem}.ssh-safeshield-refresh-error-code{overflow-wrap:anywhere;color:#64748b;margin-top:.375rem;font-size:.68rem;font-weight:600}.ssh-safeshield-refresh-error-code code{font:inherit}.ssh-safeshield-refresh-donut{color:#0d9488;place-items:center;width:3.35rem;min-width:3.35rem;height:3.35rem;display:grid;position:relative}.ssh-safeshield-refresh-donut[data-state=error]{color:#dc2626}.ssh-safeshield-refresh-loader-svg{transform-origin:50%;width:100%;height:100%;animation:.82s linear infinite ssh-safeshield-refresh-loader-rotate;position:absolute;top:0;bottom:0;left:0;right:0;transform:rotate(-90deg)}.ssh-safeshield-refresh-loader-svg-error{animation:none}.ssh-safeshield-refresh-loader-track{color:#cbd5e1;stroke:#cbd5e1}.ssh-safeshield-refresh-loader-arc{color:#0f172a;stroke:#0f172a;filter:drop-shadow(0 0 .06rem #0f172a47)}.ssh-safeshield-refresh-donut[data-state=error] .ssh-safeshield-refresh-loader-track{color:#dc2626;stroke:#dc2626}.ssh-safeshield-refresh-donut-label{z-index:1;color:#0f766e;font-variant-numeric:tabular-nums;font-size:.68rem;font-weight:900;position:relative}.ssh-app[data-theme=dark] .ssh-safeshield-refresh{background:#0f766e1f;border-color:#134e4a}.ssh-app[data-theme=dark] .ssh-safeshield-refresh[data-state=error]{background:#7f1d1d2e;border-color:#7f1d1d}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-title{color:#f8fafc}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-description,.ssh-app[data-theme=dark] .ssh-safeshield-refresh-error-code{color:#94a3b8}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-loader-track{color:#334155;stroke:#334155}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-loader-arc{color:#fff;stroke:#fff;filter:drop-shadow(0 0 .08rem #ffffff8c)}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-donut-label{color:#5eead4}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-donut[data-state=error] .ssh-safeshield-refresh-loader-track{color:#ef4444;stroke:#ef4444}@keyframes ssh-safeshield-refresh-loader-rotate{to{transform:rotate(270deg)}}@media (prefers-reduced-motion:reduce){.ssh-safeshield-refresh-loader-svg{animation:none}}.ssh-dashboard-account-banner{background:#f0fdfa;border-color:#99e8df}.ssh-dashboard-account-banner-icon{color:#0f766e;background:#ccfbf1}.ssh-dashboard-account-banner-title{color:#0f172a}.ssh-dashboard-account-banner-description{color:#475569}.ssh-dashboard-account-banner-badge{color:#92400e;background:#fef3c7}.ssh-dashboard-account-banner-action{color:#fff;background:#0f766e}.ssh-dashboard-account-banner-action:hover{color:#fff;background:#115e59}.ssh-dashboard-account-banner-action:focus-visible{outline-color:#0d9488}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner{background:#102927;border-color:#115e59}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-icon{color:#99f6e4;background:#134e4a}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-title{color:#f1f5f9}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-description{color:#cbd5e1}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-badge{color:#fde68a;background:#78350f}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-action{color:#fff;background:#0f766e}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-action:hover{background:#0d9488}.ssh-account-nav-dot{width:10px;height:10px;box-shadow:0 0 0 2px var(--ssh-account-dot-ring,#fff);background-color:#d97706;border-radius:50%;flex:none;margin-left:auto;display:block}.ssh-account-nav-dot-collapsed{margin-left:0;position:absolute;top:5px;right:7px}.ssh-app[data-theme=dark] .ssh-account-nav-dot{--ssh-account-dot-ring:#0f172a;background-color:#fbbf24}.ssh-apps-storage-track,.ssh-apps-storage-free{fill:none;stroke-width:9px}.ssh-apps-storage-track{stroke:#e2e8f0}.ssh-apps-storage-free{stroke:#0d9488;transform-origin:50%;transform:rotate(-90deg)}.ssh-apps-storage-ring[data-level=warning] .ssh-apps-storage-free{stroke:#d97706}.ssh-apps-storage-ring[data-level=critical] .ssh-apps-storage-free{stroke:#e11d48}.ssh-app[data-theme=dark] .ssh-apps-storage-track{stroke:#334155}.ssh-app[data-theme=dark] .ssh-apps-storage-free{stroke:#2dd4bf}.ssh-app[data-theme=dark] .ssh-apps-storage-ring[data-level=warning] .ssh-apps-storage-free{stroke:#fbbf24}.ssh-app[data-theme=dark] .ssh-apps-storage-ring[data-level=critical] .ssh-apps-storage-free{stroke:#fb7185}.ssh-apps-storage-card[data-level=warning] .ssh-apps-storage-available,.ssh-dashboard-storage-card[data-level=warning] .ssh-apps-storage-available{color:#b45309}.ssh-apps-storage-card[data-level=critical] .ssh-apps-storage-available,.ssh-dashboard-storage-card[data-level=critical] .ssh-apps-storage-available{color:#be123c}.ssh-app[data-theme=dark] .ssh-apps-storage-card[data-level=warning] .ssh-apps-storage-available,.ssh-app[data-theme=dark] .ssh-dashboard-storage-card[data-level=warning] .ssh-apps-storage-available{color:#fbbf24}.ssh-app[data-theme=dark] .ssh-apps-storage-card[data-level=critical] .ssh-apps-storage-available,.ssh-app[data-theme=dark] .ssh-dashboard-storage-card[data-level=critical] .ssh-apps-storage-available{color:#fb7185}.ssh-apps-installed-badge{color:#475569;background:#f1f5f9;border-color:#cbd5e1}.ssh-apps-update-badge{color:#92400e;background:#fffbeb;border-color:#fcd34d}.ssh-apps-update-button{color:#fff;background:#d97706;border-color:#d97706}.ssh-apps-update-button:hover:not(:disabled){background:#b45309;border-color:#b45309}.ssh-apps-update-button:focus-visible{outline-offset:2px;outline:2px solid #d97706}.ssh-app[data-theme=dark] .ssh-apps-installed-badge{color:#cbd5e1;background:#1e293b;border-color:#475569}.ssh-app[data-theme=dark] .ssh-apps-update-badge{color:#fcd34d;background:#451a03;border-color:#92400e}.ssh-app[data-theme=dark] .ssh-apps-update-button{color:#fff;background:#b45309;border-color:#b45309}.ssh-app[data-theme=dark] .ssh-apps-update-button:hover:not(:disabled){background:#d97706;border-color:#d97706}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}} /*$vite$:1*/ \ No newline at end of file diff --git a/luci-app-smartsafehub/frontend/demo-dist/demo.js b/luci-app-smartsafehub/frontend/demo-dist/demo.js index 6445716ae..08b69c6d2 100644 --- a/luci-app-smartsafehub/frontend/demo-dist/demo.js +++ b/luci-app-smartsafehub/frontend/demo-dist/demo.js @@ -1,4 +1,3 @@ -var e,t,n,r,i,a,o,s,c,l,u={},d=[],f=/^m(i|n|o|s|text|space)$/,p=Array.isArray,m=d.slice,h=Object.assign;function g(e){e&&e.parentNode&&e.remove()}function _(n,r,i,a,o){var s={type:n,props:r,key:i,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o||++t,__i:-1,__u:0};return!o&&e.vnode&&e.vnode(s),s}function v(e){return e.children}function y(e,t){this.props=e,this.context=t,this.__g=0}function b(e,t){if(t==null)return e.__?b(e.__,e.__i+1):null;for(var n;tr&&n.sort(a),t=n.shift(),r=n.length,8&t.__g&&(s=void 0,c=void 0,l=(c=(o=t).__v).__e,u=[],d=[],(f=o.__P)&&((s=h({constructor:void 0},c)).__v=c.__v+1,e.vnode&&e.vnode(s),M(f,s,c,o.__n,f.namespaceURI,32&c.__u?[l]:null,u,l||b(c),32&c.__u,d),s.__v=c.__v,s.__.__k[s.__i]=s,te(u,s,d),c.__=c.__e=null,s.__e!=l&&x(s)))}finally{n.length=i=0}}function w(e,t,n,r,i,a,o,s,c,l,f){var p,m,h,g,_,v,y=r.__k||d,b=t.length;for(c=T(n,t,y,c,b),p=0;pc?x--:x++,S=!0)):(~l||(i>g?x--:i>1]+!!u){for(i=n-1,a=n+1;i>=0||a=0?i--:a++])&&!(2&l.__u)&&s==l.key&&c==l.type)return o}return-1}function k(e,t,n){n??(n=``),t[0]==`-`?e.setProperty(t,n):e[t]=n}function A(e,t,n,r,i){var a,o;n:if(t==`style`){if(typeof n==`string`)e.style.cssText=n;else{if(typeof r==`string`&&(e.style.cssText=r=``),r)for(t in r)n&&t in n||k(e.style,t,``);if(n)for(t in n)r&&n[t]==r[t]||k(e.style,t,n[t])}}else if(t[0]==`o`&&t[1]==`n`)(e.__e||(e.__e={}))[t]=n,n&&r||(o=l[t]||(l[t]=j(t)),(e.__a||(e.__a={}))[t]=c,a=t!=(t=t.replace(s,`$1`)),(t=t.slice(2))[0]<`a`&&(t=t.toLowerCase()),n?e.addEventListener(t,o,a):e.removeEventListener(t,o,a));else{if(i==`http://www.w3.org/2000/svg`)t=t.replace(/xlink(H|:h)/,`h`).replace(/sName$/,`s`);else if(t!=`width`&&t!=`height`&&t!=`href`&&t!=`list`&&t!=`form`&&t!=`tabIndex`&&t!=`download`&&t!=`rowSpan`&&t!=`colSpan`&&t!=`role`&&t!=`popover`&&t in e)try{e[t]=n??``;break n}catch{}typeof n==`function`||(n==null||!1===n&&t[4]!=`-`?e.removeAttribute(t):e.setAttribute(t,t==`popover`&&n==1?``:n))}}function j(t){return function(n){if(this.__e){var r=this.__e[t];if(n[o]==null)n[o]=c++;else if(n[o]=n.__.length&&n.__.push({}),n.__[e]}function F(e){return pe=1,Ce(Fe,e)}function Ce(e,t,n){var r=Se(le++,2);if(r.t=e,!r.__c&&(r.__=[n?n(t):Fe(void 0,t),function(e){var t=r.__N?r.__N[0]:r.__[0],n=r.t(t,e);fe(t,n)||(r.__N=[n,r.__[1]],r.__c.setState({}))}],r.__c=N,!N.__f)){N.__f=!0;var i=N.shouldComponentUpdate;N.shouldComponentUpdate=function(e,t,n){var r=this.__H;if(!r)return!0;var a=!1,o=this.props!=e;if(r.__.some(function(e){e.__N&&(a=!0,fe(e.__[0],e.__N[0])||(o=!0))}),i){var s=i.call(this,e,t,n);return a?s||o:s}return!a||o}}return r.__}function I(e,t){var n=Se(le++,3);!P.__s&&Pe(n.__H,t)&&(n.__P=!0,n.__=e,n.u=t,N.__H.__h.push(n))}function we(e){return pe=5,Te(function(){return{current:e}},[])}function Te(e,t){var n=Se(le++,7);return Pe(n.__H,t)&&(n.__=e(),n.__H=t),n.__}function Ee(e,t){return pe=8,Te(function(){return e},t)}function De(){var e=Se(le++,11);if(!e.__){for(var t=N.__v;!t.__m&&t.__;)t=t.__;var n=t.__m||(t.__m=[0,0]);e.__=`P`+n[0]+`-`+n[1]++}return e.__}function Oe(){var e;do{for(;e=he.shift();)try{Me(e)}catch(t){P.__e(t,{__:(e=e.__P)&&e.__v})}for(;e=me.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(Me),t.__h.some(Ne),t.__h=[]}catch(n){t.__h=[],P.__e(n,e.__v)}}}while(he.length)}P.__b=function(e){N=null,ge&&ge(e)},P.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),xe&&xe(e,t)},P.__r=function(e){_e&&_e(e),le=0;var t=(N=e.__c).__H;t&&(ue==N?N.__h=[]:(t.__h.some(Me),t.__h.some(Ne),le=0),t.__h=[],t.__.some(function(e){e.__N&&(e.__=e.__N),e.u=e.__N=void 0})),ue=N},P.diffed=function(e){ve&&ve(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&je(me.push(t)),t.__H.__.some(function(e){e.u&&(e.__H=e.u)})),ue=N=null},P.__c=function(e,t){t.some(function(e){try{e.__h.some(Me),e.__h=e.__h.filter(function(e){return!e.__||Ne(e)})}catch(n){t.some(function(e){e.__h&&(e.__h=[])}),t=[],P.__e(n,e.__v)}}),ye&&ye(e,t)},P.unmount=function(e){be&&be(e);var t,n,r=e.__c;r&&r.__H&&(r.__H.__.some(function(r){try{if(r.__P&&r.__c){if(n===void 0){for(n=e.__;n&&(!n.__c||!n.__c.__P);)n=n.__;n=n&&n.__c}r.__P=n,je(he.push(r))}else Me(r)}catch(e){t=e}}),r.__H=void 0,t&&P.__e(t,r.__v))};var ke=typeof requestAnimationFrame==`function`;function Ae(e){var t,n=function(){clearTimeout(r),ke&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,35);ke&&(t=requestAnimationFrame(n))}function je(e){e!=1&&de==P.requestAnimationFrame||((de=P.requestAnimationFrame)||Ae)(Oe)}function Me(e){var t=N,n=e.__c;typeof n==`function`&&(e.__c=void 0,n()),N=t}function Ne(e){var t=N;e.__c=e.__(),N=t}function Pe(e,t){return!e||e.length!=t.length||t.some(function(t,n){return!fe(t,e[n])})}function Fe(e,t){return typeof t==`function`?t(e):t}var Ie=Object.fromEntries([{route:`home`,hash:`#home`,label:`대시보드`,title:`대시보드`,description:`네트워크, 장치와 시스템 상태를 한눈에 확인합니다.`},{route:`activity`,hash:`#activity`,label:`최근 활동`,title:`최근 활동`,description:`현재 부팅 이후 인터넷, 보호, 업데이트와 진단 상태 변화를 확인합니다.`},{route:`network`,hash:`#network`,label:`네트워크`,title:`네트워크`,description:`인터넷 연결과 내부 네트워크 주소, DHCP 및 네트워크 충돌을 한 곳에서 관리합니다.`},{route:`wifi`,hash:`#wifi`,label:`Wi-Fi`,title:`Wi-Fi`,description:`기본 무선 네트워크의 이름, 보안과 사용 상태를 관리합니다.`},{route:`iptv`,hash:`#iptv`,label:`IPTV`,title:`IPTV`,description:`SK Broadband와 LG U+ 멀티캐스트 IPTV를 설정합니다.`},{route:`devices`,hash:`#devices`,label:`연결된 기기`,title:`연결된 기기`,description:`네트워크에서 확인된 기기와 연결 방식을 살펴봅니다.`},{route:`safeshield`,hash:`#safeshield`,label:`SafeShield`,title:`SafeShield`,description:`DNS 보호 상태를 확인하고 차단 목록을 관리합니다.`},{route:`rules`,hash:`#rules`,label:`사용자 규칙`,title:`사용자 규칙`,description:`직접 허용하거나 차단할 도메인을 관리합니다.`},{route:`account`,hash:`#account`,label:`SmartSafeHub 계정`,title:`SmartSafeHub 계정`,description:`이 기기의 SmartSafeHub 계정 연결 상태와 구독 플랜을 확인합니다.`},{route:`system`,hash:`#system`,label:`업데이트`,title:`업데이트`,description:`기기의 펌웨어와 관리 소프트웨어 업데이트를 관리합니다.`},{route:`settings`,hash:`#settings`,label:`설정`,title:`설정`,description:`시스템 상태와 시간대를 확인하고 장치 관리 및 진단 기능을 설정합니다.`}].map(e=>[e.route,e])),Le=[`home`,`activity`,`network`,`wifi`,`devices`,`safeshield`,`rules`,`system`],Re=`smartsafehub.theme`;function ze(){if(typeof window>`u`)return`light`;try{let e=window.localStorage.getItem(Re);if(e===`dark`||e===`light`)return e}catch{}return window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}function Be(e){try{window.localStorage.setItem(Re,e)}catch{}}function Ve(e){let t=document.querySelector(`meta[name="theme-color"]`);t&&(t.content=e===`dark`?`#0f172a`:`#f8fafc`),document.documentElement.style.colorScheme=e,document.body.style.backgroundColor=e===`dark`?`#020617`:`#f8fafc`}var He=0;Array.isArray;function L(t,n,r,i,a,o){n||(n={});var s,c,l=n;if(`ref`in l&&typeof t!=`function`)for(c in l={},n)c==`ref`?s=n[c]:l[c]=n[c];var u={type:t,props:l,key:r,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--He,__i:-1,__u:0};return(a||o)&&(u.__source=a,u.__self=o),e.vnode&&e.vnode(u),u}function R({children:e,title:t,...n}){return L(`svg`,{"aria-hidden":!t||void 0,fill:`none`,role:t?`img`:void 0,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`1.8`,viewBox:`0 0 24 24`,...n,children:[t?L(`title`,{children:t}):null,e]})}function Ue(e){return L(R,{...e,children:[L(`path`,{d:`M12 3 5 6v5c0 4.6 2.8 8.1 7 10 4.2-1.9 7-5.4 7-10V6l-7-3Z`}),L(`path`,{d:`m9 12 2 2 4-4`})]})}function We(e){return L(R,{...e,children:[L(`rect`,{height:`7`,rx:`2`,width:`18`,x:`3`,y:`13`}),L(`path`,{d:`M7 16.5h.01M11 16.5h.01M7 10a7 7 0 0 1 10 0M9.5 7.5a3.5 3.5 0 0 1 5 0`})]})}function Ge(e){return L(R,{...e,children:[L(`rect`,{height:`11`,rx:`2`,width:`16`,x:`4`,y:`3`}),L(`path`,{d:`M8 21h8M12 14v7`})]})}function Ke(e){return L(R,{...e,children:[L(`path`,{d:`m3 11 9-8 9 8`}),L(`path`,{d:`M5 10v10h14V10M9 20v-6h6v6`})]})}function qe(e){return L(R,{...e,children:[L(`circle`,{cx:`12`,cy:`8`,r:`4`}),L(`path`,{d:`M4.5 21a7.5 7.5 0 0 1 15 0`})]})}function Je(e){return L(R,{...e,children:[L(`path`,{d:`M12 16V4`}),L(`path`,{d:`m7 9 5-5 5 5`}),L(`path`,{d:`M5 14v5h14v-5`})]})}function Ye(e){return L(R,{...e,children:[L(`circle`,{cx:`12`,cy:`12`,r:`3`}),L(`path`,{d:`M19.4 15a1.7 1.7 0 0 0 .3 1.9l.1.1-2.8 2.8-.1-.1a1.7 1.7 0 0 0-1.9-.3 1.7 1.7 0 0 0-1 1.6v.2h-4V21a1.7 1.7 0 0 0-1-1.6 1.7 1.7 0 0 0-1.9.3l-.1.1L4.2 17l.1-.1a1.7 1.7 0 0 0 .3-1.9A1.7 1.7 0 0 0 3 14H2.8v-4H3a1.7 1.7 0 0 0 1.6-1 1.7 1.7 0 0 0-.3-1.9L4.2 7 7 4.2l.1.1a1.7 1.7 0 0 0 1.9.3A1.7 1.7 0 0 0 10 3V2.8h4V3a1.7 1.7 0 0 0 1 1.6 1.7 1.7 0 0 0 1.9-.3l.1-.1L19.8 7l-.1.1a1.7 1.7 0 0 0-.3 1.9 1.7 1.7 0 0 0 1.6 1h.2v4H21a1.7 1.7 0 0 0-1.6 1Z`})]})}function Xe(e){return L(R,{...e,children:[L(`path`,{d:`M5 9.5a10 10 0 0 1 14 0M8 13a6 6 0 0 1 8 0M11 16.5a2 2 0 0 1 2 0`}),L(`path`,{d:`M12 20h.01`})]})}function Ze(e){return L(R,{...e,children:[L(`path`,{d:`M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4z`}),L(`path`,{d:`M6.5 6.5h1M16.5 6.5h1M6.5 16.5h1`}),L(`path`,{d:`M14 14h2v2h-2zM18 14h2v2h-2zM16 16h2v2h-2zM18 18h2v2h-2zM14 18h1`})]})}function Qe(e){return L(R,{...e,children:[L(`path`,{d:`M7 3v4M17 3v4M5 7h14v4a7 7 0 0 1-14 0V7Z`}),L(`path`,{d:`M12 18v3`})]})}function $e(e){return L(R,{...e,children:[L(`circle`,{cx:`12`,cy:`12`,r:`9`}),L(`path`,{d:`M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18`})]})}function et(e){return L(R,{...e,children:[L(`rect`,{height:`13`,rx:`2`,width:`18`,x:`3`,y:`6`}),L(`path`,{d:`m8 2 4 4 4-4M8 22h8`})]})}function tt(e){return L(R,{...e,children:[L(`circle`,{cx:`12`,cy:`12`,r:`9`}),L(`path`,{d:`M12 7v5l3 2`})]})}function nt(e){return L(R,{...e,children:[L(`rect`,{height:`14`,rx:`2`,width:`14`,x:`5`,y:`5`}),L(`path`,{d:`M9 9h6v6H9zM9 2v3M15 2v3M9 19v3M15 19v3M2 9h3M2 15h3M19 9h3M19 15h3`})]})}function z(e){return L(R,{...e,children:[L(`path`,{d:`M20 11a8 8 0 1 0-2.3 5.7`}),L(`path`,{d:`M20 4v7h-7`})]})}function rt(e){return L(R,{...e,children:[L(`path`,{d:`M12 2v10`}),L(`path`,{d:`M18.4 6.6a8 8 0 1 1-12.8 0`})]})}function it(e){return L(R,{...e,children:[L(`path`,{d:`M12 3v12`}),L(`path`,{d:`m7 10 5 5 5-5`}),L(`path`,{d:`M5 21h14`})]})}function at(e){return L(R,{...e,children:[L(`ellipse`,{cx:`12`,cy:`5`,rx:`8`,ry:`3`}),L(`path`,{d:`M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6`})]})}function ot(e){return L(R,{...e,children:[L(`circle`,{cx:`8`,cy:`15`,r:`4`}),L(`path`,{d:`m11 12 8-8M15 8l2 2M17 6l2 2`})]})}function st(e){return L(R,{...e,children:[L(`path`,{d:`M2.5 12s3.5-6 9.5-6 9.5 6 9.5 6-3.5 6-9.5 6-9.5-6-9.5-6Z`}),L(`circle`,{cx:`12`,cy:`12`,r:`2.5`})]})}function ct(e){return L(R,{...e,children:[L(`path`,{d:`m3 3 18 18`}),L(`path`,{d:`M10.6 6.2A8.8 8.8 0 0 1 12 6c6 0 9.5 6 9.5 6a15.5 15.5 0 0 1-2.6 3.2`}),L(`path`,{d:`M6.2 6.3C3.8 8 2.5 12 2.5 12s3.5 6 9.5 6a9.8 9.8 0 0 0 3.1-.5`}),L(`path`,{d:`M10.3 10.3a2.5 2.5 0 0 0 3.4 3.4`})]})}function lt(e){return L(R,{...e,children:[L(`rect`,{height:`17`,rx:`2`,width:`18`,x:`3`,y:`4`}),L(`path`,{d:`M8 2v4M16 2v4M3 9h18`})]})}function ut(e){return L(R,{...e,children:[L(`circle`,{cx:`12`,cy:`12`,r:`9`}),L(`path`,{d:`m8 12 2.5 2.5L16 9`})]})}function B(e){return L(R,{...e,children:[L(`path`,{d:`M10.3 4.2 2.7 17.5A2 2 0 0 0 4.4 20h15.2a2 2 0 0 0 1.7-2.5L13.7 4.2a2 2 0 0 0-3.4 0Z`}),L(`path`,{d:`M12 9v4M12 17h.01`})]})}function dt(e){return L(R,{...e,children:L(`path`,{d:`M12 5v14M5 12h14`})})}function ft(e){return L(R,{...e,children:L(`path`,{d:`M4 7h16M9 7V4h6v3M7 7l1 13h8l1-13M10 11v5M14 11v5`})})}function pt(e){return L(R,{...e,children:[L(`circle`,{cx:`11`,cy:`11`,r:`7`}),L(`path`,{d:`m20 20-4-4`})]})}function mt(e){return L(R,{...e,children:[L(`path`,{d:`M8 6h12M8 12h12M8 18h12`}),L(`path`,{d:`M4 6h.01M4 12h.01M4 18h.01`})]})}function ht(e){return L(R,{...e,children:[L(`path`,{d:`M10 5H6a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h4`}),L(`path`,{d:`M14 8l4 4-4 4M8 12h10`})]})}function gt(e){return L(R,{...e,children:L(`path`,{d:`M4 7h16M4 12h16M4 17h16`})})}function _t(e){return L(R,{...e,children:L(`path`,{d:`m6 9 6 6 6-6`})})}function vt(e){return L(R,{...e,children:L(`path`,{d:`m6 6 12 12M18 6 6 18`})})}function yt(e){return L(R,{...e,children:L(`path`,{d:`m15 18-6-6 6-6`})})}function bt(e){return L(R,{...e,children:L(`path`,{d:`m9 18 6-6-6-6`})})}function xt(e){return L(R,{...e,children:L(`path`,{d:`M20.7 13.2A8.5 8.5 0 1 1 10.8 3.3 6.7 6.7 0 0 0 20.7 13.2Z`})})}function St(e){return L(R,{...e,children:[L(`circle`,{cx:`12`,cy:`12`,r:`4`}),L(`path`,{d:`M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41`})]})}function Ct({description:e,loading:t,onRefresh:n,onToggleTheme:r,refreshing:i,theme:a,title:o}){return L(`header`,{class:`ssh-product-hero border-b border-slate-200 bg-white px-4 py-4 sm:px-6 md:h-[4.5rem] md:py-0 lg:px-8 xl:px-10`,children:L(`div`,{class:`flex w-full items-center justify-between gap-4 md:h-full`,children:[L(`div`,{class:`min-w-0`,children:[L(`p`,{class:`m-0 text-[0.68rem] font-extrabold uppercase tracking-[0.18em] text-teal-700`,children:`SmartSafeHub`}),L(`div`,{class:`mt-1 flex min-w-0 items-baseline gap-3`,children:[L(`h1`,{class:`m-0 truncate text-xl font-black tracking-tight text-slate-950 sm:text-2xl`,children:o}),L(`p`,{class:`m-0 hidden truncate text-sm text-slate-500 lg:block`,children:e})]})]}),L(`div`,{class:`flex shrink-0 items-center gap-2`,children:[L(`button`,{"aria-label":a===`dark`?`라이트 모드로 전환`:`다크 모드로 전환`,class:`ssh-product-header-action hidden h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white text-slate-600 shadow-sm transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 md:inline-flex`,onClick:r,title:a===`dark`?`라이트 모드`:`다크 모드`,type:`button`,children:L(a===`dark`?St:xt,{class:`size-5`})}),L(`button`,{"aria-busy":i,"aria-label":i?`새로고침 중`:`현재 화면 새로고침`,class:`ssh-product-header-action hidden h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white shadow-sm transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-wait disabled:opacity-60 md:inline-flex ${i?`text-teal-700`:`text-slate-600`}`,disabled:t||i,onClick:n,title:i?`새로고침 중`:`새로고침`,type:`button`,children:i?L(z,{class:`size-5 animate-spin`}):L(z,{class:`size-5`})})]})]})})}var wt=`/cgi-bin/luci`;function Tt(){let e=window.location.pathname,t=e.indexOf(`/cgi-bin/luci`);return t>=0?e.slice(0,t+13):wt}function Et(e){let t=e.startsWith(`/`)?e:`/${e}`;return`${Tt()}${t}`}function Dt(e){return Et(e)}var Ot=[{label:`Overview`,routes:[`home`,`activity`]},{label:`Network`,routes:[`network`,`wifi`,`iptv`,`devices`]},{label:`Security`,routes:[`safeshield`,`rules`]},{label:`System`,routes:[`account`,`system`,`settings`]}];function kt({route:e}){switch(e){case`home`:return L(Ke,{class:`size-5`});case`activity`:return L(tt,{class:`size-5`});case`network`:return L($e,{class:`size-5`});case`wifi`:return L(Xe,{class:`size-5`});case`iptv`:return L(et,{class:`size-5`});case`devices`:return L(Ge,{class:`size-5`});case`safeshield`:return L(Ue,{class:`size-5`});case`rules`:return L(qe,{class:`size-5`});case`account`:return L(ot,{class:`size-5`});case`system`:return L(Je,{class:`size-5`});case`settings`:return L(Ye,{class:`size-5`})}}function At({theme:e}){return L(e===`dark`?St:xt,{class:`size-5`})}function jt(e){return e===`dark`?`라이트 모드`:`다크 모드`}function Mt(e,t=!1){return`relative flex min-h-11 min-w-0 items-center rounded-xl py-2.5 text-sm font-extrabold no-underline transition ${t?`justify-center px-2`:`gap-3 px-3`} ${e?`bg-teal-50 text-teal-800 ring-1 ring-inset ring-teal-200`:`text-slate-600 hover:bg-slate-50 hover:text-slate-950`}`}function Nt({accountRegistered:e,collapsed:t=!1,route:n,updateCount:r,demo:i=!1}){return L(`div`,{class:t?`space-y-3`:`space-y-5`,children:Ot.filter(e=>!i||e.routes.some(e=>Le.includes(e))).map((a,o)=>L(`section`,{"aria-label":a.label,class:t&&o>0?`border-t border-slate-100 pt-3`:void 0,children:[t?null:L(`p`,{class:`mb-2 px-3 text-[0.65rem] font-black uppercase tracking-[0.18em] text-slate-400`,children:a.label}),L(`div`,{class:`space-y-1`,children:a.routes.filter(e=>!i||Le.includes(e)).map(i=>{let a=Ie[i],o=n===i;return L(`a`,{"aria-current":o?`page`:void 0,"aria-label":i===`account`&&e===!1?`${a.label} (계정 연결 필요)`:t?a.label:void 0,class:Mt(o,t),href:a.hash,title:i===`account`&&e===!1?`SmartSafeHub 계정 연결 필요`:t?a.label:void 0,children:[L(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg ${o?`bg-teal-700 text-white`:`bg-slate-100 text-slate-500`}`,children:L(kt,{route:i})}),t?null:L(`span`,{class:`flex min-w-0 flex-1 items-center gap-2`,children:[L(`span`,{class:`truncate`,children:a.label}),i===`iptv`?L(`span`,{class:`rounded-full border border-amber-300 bg-amber-100 px-1.5 py-0.5 text-[9px] font-black uppercase tracking-[0.08em] text-amber-800`,children:`Beta`}):null]}),t&&i===`iptv`?L(`span`,{"aria-label":`Beta 기능`,class:`absolute right-0.5 top-0.5 inline-flex size-5 items-center justify-center rounded-full border border-amber-300 bg-amber-100 text-[13px] font-extrabold leading-none text-amber-900 shadow-sm ring-2 ring-white`,children:`β`}):null,i===`account`&&e===!1?L(`span`,{"aria-label":`계정 연결 필요`,class:`ssh-account-nav-dot ${t?`ssh-account-nav-dot-collapsed`:``}`,"aria-hidden":`true`,title:`계정 연결 필요`}):null,i===`system`&&r>0?t?L(`span`,{"aria-label":`${r}개의 업데이트 유형`,class:`ssh-update-nav-badge`,"data-collapsed":`true`,children:r}):L(`span`,{class:`ssh-update-nav-badge`,"data-collapsed":`false`,children:r}):null]},i)})})]},a.label))})}function Pt({accountRegistered:e,collapsed:t,loading:n,onRefresh:r,onToggleCollapsed:i,onToggleTheme:a,refreshing:o,route:s,theme:c,title:l,updateCount:u,demo:d=!1}){let[f,p]=F(!1),m=jt(c);return I(()=>{p(!1)},[s]),I(()=>{if(!f)return;let e=e=>{e.key===`Escape`&&p(!1)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[f]),L(v,{children:[L(`nav`,{"aria-label":`SmartSafeHub 모바일 메뉴`,class:`ssh-mobile-navigation sticky top-0 z-40 border-b border-slate-200 bg-white/95 px-4 shadow-sm shadow-slate-900/5 backdrop-blur md:hidden`,children:[L(`div`,{class:`flex min-h-16 items-center justify-between gap-3`,children:[L(`a`,{class:`flex min-w-0 items-center gap-3 no-underline`,href:`#home`,children:[L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-950 text-teal-300`,children:L(Ue,{class:`size-5`})}),L(`span`,{class:`min-w-0`,children:[L(`strong`,{class:`block truncate text-sm font-black text-slate-950`,children:`SmartSafeHub`}),L(`span`,{class:`block truncate text-xs font-semibold text-slate-500`,children:l})]})]}),L(`div`,{class:`flex shrink-0 items-center gap-2`,children:[L(`button`,{"aria-label":`${m}로 전환`,class:`inline-flex size-11 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white text-slate-600 transition hover:border-slate-300 hover:bg-slate-50 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:a,title:m,type:`button`,children:L(At,{theme:c})}),L(`button`,{"aria-busy":o,"aria-label":o?`새로고침 중`:`현재 화면 새로고침`,class:`inline-flex size-11 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white transition hover:border-slate-300 hover:bg-slate-50 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-wait disabled:opacity-60 ${o?`text-teal-700`:`text-slate-600`}`,disabled:n||o,onClick:r,title:o?`새로고침 중`:`새로고침`,type:`button`,children:o?L(z,{class:`size-5 animate-spin`}):L(z,{class:`size-5`})}),L(`button`,{"aria-controls":`smartsafehub-mobile-menu`,"aria-expanded":f,"aria-label":f?`모바일 메뉴 닫기`:`모바일 메뉴 열기`,class:`inline-flex size-11 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white text-slate-700 transition hover:bg-slate-50 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:()=>p(e=>!e),type:`button`,children:L(f?vt:gt,{class:`size-5`})})]})]}),f?L(`div`,{class:`ssh-mobile-menu border-t border-slate-100 py-4`,id:`smartsafehub-mobile-menu`,children:[L(Nt,{accountRegistered:e,demo:d,route:s,updateCount:u}),d?null:L(`div`,{class:`mt-5 space-y-1 border-t border-slate-100 pt-4`,children:L(`a`,{class:`${Mt(!1)} text-rose-700 hover:bg-rose-50 hover:text-rose-800`,href:Dt(`/admin/logout`),children:[L(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg bg-rose-50 text-rose-600`,children:L(ht,{class:`size-5`})}),`로그아웃`]})})]}):null]}),L(`aside`,{class:`hidden min-h-screen border-r border-slate-200 bg-white md:flex md:flex-col`,"data-collapsed":t?`true`:`false`,children:L(`div`,{class:`sticky top-0 flex h-screen flex-col`,children:[L(`div`,{class:`flex h-[4.5rem] min-h-[4.5rem] shrink-0 items-center border-b border-slate-100 ${t?`justify-center px-2`:`gap-3 px-4`}`,children:[L(`a`,{"aria-label":`SmartSafeHub Dashboard`,class:`flex items-center no-underline ${t?`justify-center`:`min-w-0 flex-1 gap-3`}`,href:`#home`,title:t?`SmartSafeHub`:void 0,children:[L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-950 text-teal-300 shadow-sm shadow-slate-950/10`,children:L(Ue,{class:`size-5`})}),t?null:L(`div`,{class:`min-w-0`,children:[L(`strong`,{class:`block truncate text-sm font-black tracking-tight text-slate-950`,children:`SmartSafeHub`}),L(`span`,{class:`block text-[0.68rem] font-bold uppercase tracking-[0.14em] text-slate-400`,children:`Home Gateway`})]})]}),L(`button`,{"aria-controls":`smartsafehub-desktop-navigation`,"aria-expanded":!t,"aria-label":t?`사이드바 펼치기`:`사이드바 접기`,class:`ssh-sidebar-toggle absolute right-0 top-[4.5rem] z-20 inline-flex size-7 translate-x-1/2 -translate-y-1/2 shrink-0 items-center justify-center rounded-full transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:i,title:t?`사이드바 펼치기`:`사이드바 접기`,type:`button`,children:L(t?bt:yt,{class:`size-4`})})]}),L(`nav`,{"aria-label":`SmartSafeHub 메뉴`,class:`flex-1 overflow-y-auto py-5 ${t?`px-2`:`px-3`}`,id:`smartsafehub-desktop-navigation`,children:L(Nt,{accountRegistered:e,collapsed:t,demo:d,route:s,updateCount:u})}),d?null:L(`div`,{class:`border-t border-slate-100 ${t?`p-2`:`p-3`}`,children:L(`a`,{"aria-label":`SmartSafeHub에서 로그아웃`,class:`${Mt(!1,t)} mt-1 text-rose-700 hover:bg-rose-50 hover:text-rose-800`,href:Dt(`/admin/logout`),title:t?`로그아웃`:void 0,children:[L(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg bg-rose-50 text-rose-600`,children:L(ht,{class:`size-5`})}),t?null:`로그아웃`]})})]})})]})}var Ft=`smartsafehub.sidebar.collapsed`;function It(){if(typeof window>`u`)return!1;try{return window.localStorage.getItem(Ft)===`1`}catch{return!1}}function Lt({accountRegistered:e,children:t,loading:n,onRefresh:r,refreshing:i,route:a,updateCount:o,demo:s=!1}){let c=Ie[a],[l,u]=F(It),[d,f]=F(ze);return I(()=>{try{window.localStorage.setItem(Ft,l?`1`:`0`)}catch{}},[l]),I(()=>{Be(d),Ve(d)},[d]),L(`div`,{class:`ssh-app min-h-screen bg-slate-50 text-slate-950 md:grid md:transition-[grid-template-columns] md:duration-200 md:ease-out ${l?`md:grid-cols-[5rem_minmax(0,1fr)]`:`md:grid-cols-[16rem_minmax(0,1fr)]`}`,"data-theme":d,children:[L(Pt,{accountRegistered:e,demo:s,collapsed:l,loading:n,onRefresh:r,onToggleCollapsed:()=>u(e=>!e),onToggleTheme:()=>f(e=>e===`dark`?`light`:`dark`),refreshing:i,route:a,theme:d,title:c.title,updateCount:o}),L(`div`,{class:`min-w-0 md:min-h-screen`,children:[L(Ct,{description:c.description,loading:n,onRefresh:r,onToggleTheme:()=>f(e=>e===`dark`?`light`:`dark`),refreshing:i,theme:d,title:c.title}),L(`main`,{class:`ssh-product-main w-full max-w-[1600px] bg-slate-50 px-4 pb-8 sm:px-6 sm:pb-10 lg:px-8 lg:pb-12 xl:px-10 ${n?`pt-2 sm:pt-2 lg:pt-3`:`pt-5 sm:pt-6 lg:pt-8`}`,children:t})]})]})}function V({action:e,description:t,eyebrow:n,id:r,title:i}){return L(`div`,{class:`ssh-section-heading mb-4 min-w-0`,children:[L(`p`,{class:`m-0 text-[0.68rem] font-black uppercase tracking-[0.18em] text-teal-700`,children:n}),L(`div`,{class:`mt-2 flex min-w-0 flex-wrap items-center justify-between gap-3`,children:[L(`h2`,{class:`m-0 min-w-0 text-xl font-black tracking-tight text-slate-950`,id:r,children:i}),e?L(`div`,{class:`shrink-0`,children:e}):null]}),L(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500`,children:t})]})}var Rt=new Intl.NumberFormat(`ko-KR`),zt=new Intl.DateTimeFormat(`ko-KR`,{dateStyle:`medium`,timeStyle:`short`});function Bt(e){if(!Number.isFinite(e)||e<0)return`확인 불가`;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}일 ${n}시간`:n>0?`${n}시간 ${r}분`:`${Math.max(r,1)}분`}function Vt(e){if(!Number.isFinite(e)||e<0)return`확인 불가`;let t=[`B`,`KB`,`MB`,`GB`],n=e,r=0;for(;n>=1024&&r864e10?`기록 없음`:!Number.isFinite(t)||e>t+300||t-e>=604800?Wt(e):Gt(e,t)}function qt(e){let t=/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z$/.exec(e??``);if(!t)return null;let[,n,r,i,a,o,s]=t,c=Date.UTC(Number(n),Number(r)-1,Number(i),Number(a),Number(o),Number(s)),l=new Date(c);return l.getUTCFullYear()!==Number(n)||l.getUTCMonth()+1!==Number(r)||l.getUTCDate()!==Number(i)||l.getUTCHours()!==Number(a)||l.getUTCMinutes()!==Number(o)||l.getUTCSeconds()!==Number(s)||c<=0?null:c/1e3}function Jt(e){if(!Number.isFinite(e)||e<=0)return`확인 불가`;let t=Math.floor(e/3600),n=Math.floor(e%3600/60);return t>0?n>0?`${t}시간 ${n}분`:`${t}시간`:`${n}분`}function Yt(e){let t=Math.max(0,e.total),n=e.free+e.buffered+e.cached,r=Math.min(t,Math.max(0,e.available>0?e.available:n)),i=Math.max(0,t-r);return{used:i,percent:t>0?i/t*100:0}}function Xt(e,t){let n=e.metadata[t];return typeof n==`string`&&n.trim().length>0?n.trim():null}function Zt(e,t){let n=e.metadata[t];return typeof n==`number`&&Number.isFinite(n)?n:null}function Qt(e,t){let n=e.metadata[t];return typeof n==`boolean`?n:null}function $t(e,t){let n=Xt(e,`error_code`);return n?`${t} (오류 코드: ${n})`:t}function en(e){let t=Math.max(0,Math.floor(e));if(t<60)return`${t}초`;let n=Math.floor(t/60),r=t%60;if(n<60)return r>0?`${n}분 ${r}초`:`${n}분`;let i=Math.floor(n/60),a=n%60;return a>0?`${i}시간 ${a}분`:`${i}시간`}function tn(e){let t=Xt(e,`from_version`),n=Xt(e,`to_version`);return t&&n?`${t} → ${n}`:n?`${n} 버전이 적용되었습니다.`:null}function nn(e){return e?e.toUpperCase():null}function rn(e){switch(e){case`dhcp`:return`자동 IP(DHCP)`;case`pppoe`:return`PPPoE`;case`static`:return`고정 IPv4`;default:return e.toUpperCase()}}function an(e){switch(e.eventType){case`system.booted`:return{title:`공유기 부팅 감지`,description:`공유기가 켜지거나 재시작된 것을 확인했습니다.`};case`network.internet.disconnected`:return{title:`인터넷 연결 끊김 감지`,description:`공유기에서 인터넷 연결을 확인할 수 없었습니다.`};case`network.internet.recovered`:{let t=Zt(e,`downtime_seconds`);return{title:`인터넷 연결 복구`,description:t!==null&&t>0?`약 ${en(t)} 동안 인터넷 연결이 확인되지 않았습니다.`:`공유기에서 인터넷 연결을 다시 확인했습니다.`}}case`safeshield.protection.enabled`:return{title:`SafeShield 보호 활성화`,description:`DNS 보호 기능이 활성화되었습니다.`};case`safeshield.protection.disabled`:return{title:`SafeShield 보호 비활성화`,description:`DNS 보호 기능이 비활성화되었습니다.`};case`safeshield.blocklist.updated`:{let t=Zt(e,`domain_count`),n=Xt(e,`artifact_version`),r=[];return t!==null&&t>0&&r.push(`${H(t)}개 도메인 적용`),n&&r.push(`목록 ${n}`),{title:`SafeShield 차단 목록 업데이트 완료`,description:r.length>0?r.join(` · `):`최신 차단 목록을 적용했습니다.`}}case`safeshield.blocklist.update_failed`:return{title:`SafeShield 차단 목록 업데이트 실패`,description:$t(e,`차단 목록을 업데이트하지 못했습니다.`)};case`safeshield.statistics.enabled`:return{title:`SafeShield 차단 통계 수집 활성화`,description:`기기별 차단 통계 수집을 활성화했습니다.`};case`safeshield.statistics.disabled`:return{title:`SafeShield 차단 통계 수집 비활성화`,description:`기기별 차단 통계 수집을 비활성화했습니다.`};case`safeshield.rule.added`:return{title:Xt(e,`rule_action`)===`allow`?`사용자 허용 규칙 추가`:`사용자 차단 규칙 추가`,description:`SafeShield 사용자 규칙이 변경되었습니다.`};case`safeshield.rule.removed`:return{title:Xt(e,`rule_action`)===`allow`?`사용자 허용 규칙 삭제`:`사용자 차단 규칙 삭제`,description:`SafeShield 사용자 규칙이 변경되었습니다.`};case`settings.scheduled_reboot.updated`:{let t=Qt(e,`enabled`);return{title:`예약 재부팅 설정 변경`,description:t===!0?`예약 재부팅 설정을 저장하고 새 일정에 적용했습니다.`:t===!1?`예약 재부팅을 비활성화했습니다.`:`예약 재부팅 설정을 변경했습니다.`}}case`settings.software_updates.updated`:return{title:`관리 소프트웨어 업데이트 설정 변경`,description:Qt(e,`auto_install`)===!0?`자동 설치를 포함한 업데이트 설정을 저장했습니다.`:`관리 소프트웨어 업데이트 설정을 저장했습니다.`};case`settings.health_reporter.enabled`:return{title:`원격 상태 보고 활성화`,description:`장치 상태를 SmartSafeHub Cloud에 보고하도록 설정했습니다.`};case`settings.health_reporter.disabled`:return{title:`원격 상태 보고 비활성화`,description:`SmartSafeHub Cloud로의 장치 상태 보고를 중지했습니다.`};case`settings.activity_cloud_sync.enabled`:return{title:`Cloud 활동 기록 전송 활성화`,description:`이후 발생하는 활동을 SmartSafeHub Cloud에 전송하도록 설정했습니다.`};case`settings.activity_cloud_sync.disabled`:return{title:`Cloud 활동 기록 전송 비활성화`,description:`Cloud 전송을 중지했습니다. 로컬 최근 활동은 계속 기록됩니다.`};case`settings.timezone.updated`:{let t=Xt(e,`zonename`);return{title:`시간대 설정 변경`,description:t?`공유기 시간대를 ${t}(으)로 변경했습니다.`:`공유기 시간대를 변경했습니다.`}}case`settings.wifi.updated`:return{title:`Wi-Fi 설정 변경`,description:`Wi-Fi 설정을 저장하고 무선 네트워크에 적용했습니다.`};case`settings.wan.updated`:{let t=Xt(e,`protocol`);return{title:`인터넷 설정 변경`,description:t?`${rn(t)} 방식으로 WAN 설정을 변경했습니다.`:`WAN 인터넷 연결 설정을 변경했습니다.`}}case`settings.lan.updated`:return{title:`LAN 설정 변경`,description:`내부 네트워크 및 DHCP 설정을 변경했습니다.`};case`settings.iptv.updated`:{let t=Qt(e,`enabled`),n=Xt(e,`provider`),r=n===`skb`?`SK Broadband`:n===`lgu`?`LG U+`:null;return{title:`IPTV 설정 변경`,description:t===!1?`IPTV 기능을 비활성화했습니다.`:r?`${r} IPTV 설정을 적용했습니다.`:`IPTV 설정을 적용했습니다.`}}case`software.update.completed`:return{title:`관리 소프트웨어 업데이트 완료`,description:tn(e)};case`software.update.failed`:return{title:`관리 소프트웨어 업데이트 실패`,description:$t(e,`관리 소프트웨어를 업데이트하지 못했습니다.`)};case`firmware.update.started`:return{title:`펌웨어 업데이트 시작`,description:`펌웨어 설치를 시작했습니다. 완료 과정에서 공유기가 재부팅됩니다.`};case`firmware.update.failed`:return{title:`펌웨어 업데이트 실패`,description:$t(e,`펌웨어 설치 준비 또는 검증에 실패했습니다.`)};case`license.activated`:{let t=nn(Xt(e,`to_plan`));return{title:`요금제 활성화`,description:t?`${t} 요금제가 활성화되었습니다.`:`요금제가 활성화되었습니다.`}}case`license.changed`:{let t=nn(Xt(e,`from_plan`)),n=nn(Xt(e,`to_plan`));return{title:`요금제 변경`,description:t&&n?`${t} → ${n}`:n?`${n} 요금제로 변경되었습니다.`:`요금제 상태가 변경되었습니다.`}}case`license.cleared`:return{title:`계정 권한 해제`,description:Xt(e,`reason`)===`manual`?`이 공유기에서 계정 권한 연결을 해제했습니다.`:`서버의 계정 권한 상태가 반영되어 이 공유기의 권한 연결이 해제되었습니다.`};case`health.issue.started`:{let t=Zt(e,`warning_count`)??0,n=Zt(e,`critical_count`)??0,r=[];return n>0&&r.push(`이상 ${H(n)}건`),t>0&&r.push(`주의 ${H(t)}건`),{title:`확인이 필요한 장치 상태 발견`,description:r.length>0?r.join(` · `):`장치 상태에서 확인이 필요한 항목이 발견되었습니다.`}}case`health.issue.changed`:{let t=Zt(e,`warning_count`)??0,n=Zt(e,`critical_count`)??0,r=[];return n>0&&r.push(`이상 ${H(n)}건`),t>0&&r.push(`주의 ${H(t)}건`),{title:`확인이 필요한 장치 상태 변경`,description:r.length>0?r.join(` · `):`확인이 필요한 장치 상태 항목이 변경되었습니다.`}}case`health.issue.resolved`:return{title:`장치 상태 정상으로 복구`,description:`이전에 확인이 필요했던 장치 상태가 정상으로 돌아왔습니다.`};default:return{title:`SmartSafeHub 활동`,description:`장치에서 새로운 활동이 기록되었습니다.`}}}function on(e){return e===`error`?{icon:L(B,{class:`size-4`}),surface:`bg-rose-50 text-rose-700 ring-rose-200`}:e===`warning`?{icon:L(B,{class:`size-4`}),surface:`bg-amber-50 text-amber-800 ring-amber-200`}:e===`success`?{icon:L(ut,{class:`size-4`}),surface:`bg-emerald-50 text-emerald-700 ring-emerald-200`}:{icon:L(tt,{class:`size-4`}),surface:`bg-slate-100 text-slate-600 ring-slate-200`}}function sn(e){let t=new Date(e*1e3);return new Intl.DateTimeFormat(`ko-KR`,{hour:`2-digit`,minute:`2-digit`,hour12:!1}).format(t)}function cn(e){let t=new Date(e*1e3);return`${t.getFullYear()}-${t.getMonth()+1}-${t.getDate()}`}function ln(e){let t=new Date(e*1e3),n=new Date,r=new Date(n.getFullYear(),n.getMonth(),n.getDate()),i=new Date(t.getFullYear(),t.getMonth(),t.getDate()),a=Math.round((r.getTime()-i.getTime())/864e5);return a===0?`오늘`:a===1?`어제`:new Intl.DateTimeFormat(`ko-KR`,{month:`long`,day:`numeric`,weekday:`short`}).format(t)}function un({compact:e=!1,events:t}){if(t.length===0)return L(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 px-4 py-5 text-center`,children:[L(tt,{class:`mx-auto size-5 text-slate-400`}),L(`p`,{class:`mt-2 mb-0 text-sm font-extrabold text-slate-700`,children:`아직 기록된 활동이 없습니다.`}),L(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`상태가 실제로 변경되면 이곳에 시간순으로 기록됩니다.`})]});let n=``;return L(`div`,{class:e?`space-y-2`:`space-y-1`,children:t.map(t=>{let r=an(t),i=on(t.severity),a=cn(t.occurredAt),o=!e&&a!==n;return n=a,L(`div`,{children:[o?L(`p`,{class:`mt-5 mb-2 first:mt-0 text-xs font-black text-slate-500`,children:ln(t.occurredAt)}):null,L(`article`,{class:`relative flex min-w-0 gap-3 ${e?`border-b border-slate-100 py-3 first:pt-0 last:border-b-0 last:pb-0`:`rounded-xl px-2 py-3 hover:bg-slate-50`}`,children:[L(`div`,{class:`w-12 shrink-0 pt-1 text-xs font-bold tabular-nums text-slate-400`,children:L(`time`,{dateTime:new Date(t.occurredAt*1e3).toISOString(),title:Wt(t.occurredAt),children:sn(t.occurredAt)})}),L(`span`,{class:`mt-0.5 grid size-8 shrink-0 place-items-center rounded-full ring-1 ring-inset ${i.surface}`,children:i.icon}),L(`div`,{class:`min-w-0 flex-1`,children:[L(`p`,{class:`m-0 text-sm font-black leading-5 text-slate-950`,children:r.title}),r.description?L(`p`,{class:`mt-1 mb-0 break-words text-xs font-medium leading-5 text-slate-500`,children:r.description}):null]})]})]},t.eventId)})})}function dn({error:e,loading:t,onRetry:n}){return t?L(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 px-4 py-5 text-center`,children:[L(z,{class:`mx-auto size-5 animate-spin text-teal-700`}),L(`p`,{class:`mt-2 mb-0 text-sm font-bold text-slate-500`,children:`최근 활동을 불러오는 중입니다.`})]}):e?L(`div`,{class:`rounded-xl border border-amber-200 bg-amber-50/70 px-4 py-4`,children:L(`div`,{class:`flex items-start gap-3`,children:[L(B,{class:`mt-0.5 size-5 shrink-0 text-amber-700`}),L(`div`,{class:`min-w-0 flex-1`,children:[L(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:`최근 활동을 불러오지 못했습니다.`}),L(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:e}),n?L(`button`,{class:`mt-3 inline-flex min-h-9 items-center justify-center rounded-lg border border-amber-300 bg-white px-3 text-xs font-extrabold text-amber-800 transition hover:bg-amber-50`,onClick:n,type:`button`,children:`다시 시도`}):null]})]})}):null}function fn(e){return e.enabled?e.eligible===!1||e.phase===`ineligible`?{label:`계정 연결 필요`,description:`SmartSafeHub 계정을 연결하면 이후 발생하는 활동을 Cloud에 자동으로 동기화할 수 있습니다.`,tone:`bg-slate-100 text-slate-600 ring-slate-200`}:e.phase===`error`?{label:`동기화 확인 필요`,description:`최근 Cloud 전송을 완료하지 못했습니다. 로컬 활동 기록은 계속 보관됩니다.`,tone:`bg-amber-50 text-amber-800 ring-amber-200`}:e.phase===`syncing`?{label:`동기화 중`,description:`새 활동을 SmartSafeHub Cloud에 전송하고 있습니다.`,tone:`bg-teal-50 text-teal-800 ring-teal-200`}:e.eligible===!0?{label:`자동 동기화`,description:`새 활동이 생기면 SmartSafeHub Cloud에 자동으로 안전하게 전송합니다.`,tone:`bg-emerald-50 text-emerald-800 ring-emerald-200`}:{label:`확인 중`,description:`Cloud 활동 기록 사용 가능 여부를 확인하고 있습니다.`,tone:`bg-slate-100 text-slate-600 ring-slate-200`}:e.eligible===!1?{label:`계정 연결 필요`,description:`SmartSafeHub 계정을 연결하면 Free에서도 Cloud 활동 기록을 사용할 수 있습니다.`,tone:`bg-slate-100 text-slate-600 ring-slate-200`}:{label:`Cloud 전송 꺼짐`,description:`활동 기록은 이 공유기에만 저장됩니다. Cloud에는 새로운 활동을 전송하지 않습니다.`,tone:`bg-slate-100 text-slate-700 ring-slate-200`}}function pn(e){if(e.eligible!==!0)return`—`;if(e.retentionDays>0)return`${e.retentionDays}일`;switch(e.plan?.toLowerCase()){case`free`:return`7일`;case`pro`:case`ultimate`:return`90일`;default:return`확인 중`}}function mn({actionError:e,actionMessage:t,cloud:n,onDismissFeedback:r,onSetEnabled:i,saving:a}){let o=fn(n),s=n.plan?.toUpperCase()??null,c=n.eligible===!0,l=n.enabled||c;return L(`section`,{"aria-label":`Cloud 활동 기록 설정`,class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:[L(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[L(`div`,{class:`min-w-0 flex-1`,children:[L(`div`,{class:`flex flex-wrap items-center gap-2`,children:L(`span`,{class:`rounded-full px-2.5 py-1 text-xs font-extrabold ring-1 ring-inset ${o.tone}`,children:a?`설정 중`:o.label})}),L(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:o.description})]}),L(`div`,{class:`flex shrink-0 items-center justify-end gap-3 sm:justify-start`,children:[L(`span`,{class:`text-xs font-bold text-slate-600`,children:[`Cloud 전송 `,n.enabled?`켜짐`:`꺼짐`]}),L(`button`,{"aria-checked":n.enabled,"aria-label":`Cloud 활동 기록 전송 사용`,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${n.enabled?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:a||!l,onClick:()=>i(!n.enabled),role:`switch`,type:`button`,children:L(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${n.enabled?`left-6`:`left-1`}`})})]})]}),(e||t)&&L(`div`,{class:`mt-4 flex min-w-0 items-start justify-between gap-3 rounded-xl border px-4 py-3 text-sm font-bold ${e?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,role:e?`alert`:`status`,children:[L(`span`,{class:`min-w-0`,children:e||t}),L(`button`,{class:`shrink-0 rounded-lg px-2 py-1 text-xs font-extrabold hover:bg-black/5`,onClick:r,type:`button`,children:`닫기`})]}),n.enabled?L(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`Cloud 전송을 끄면 아직 전송하지 않은 대기 기록이 삭제됩니다. 공유기의 로컬 기록은 유지됩니다.`}):null,L(`div`,{class:`mt-4 flex flex-wrap items-center gap-x-5 gap-y-1 border-t border-slate-200 pt-3 text-xs font-semibold text-slate-500`,children:[L(`span`,{children:[`마지막 동기화: `,n.lastSuccessAt>0?Gt(n.lastSuccessAt):`아직 없음`]}),L(`span`,{children:[`Cloud 보관: `,pn(n)]}),n.pendingEvents>0?L(`span`,{children:[`전송 대기: `,H(n.pendingEvents),`건`]}):null]}),n.enabled&&n.phase===`error`&&n.lastErrorCode?L(`p`,{class:`mt-3 mb-0 text-xs font-semibold text-amber-700`,children:[`오류 코드: `,L(`code`,{children:n.lastErrorCode})]}):null,L(`details`,{class:`mt-3 border-t border-slate-200 pt-3`,children:[L(`summary`,{class:`cursor-pointer text-xs font-extrabold text-teal-700 hover:text-teal-800 focus-visible:rounded focus-visible:outline focus-visible:outline-2 focus-visible:outline-teal-500`,children:`Cloud 동기화 상세 정보`}),L(`dl`,{class:`mt-3 grid gap-3 sm:grid-cols-4`,children:[L(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[L(`dt`,{class:`text-xs font-bold text-slate-500`,children:`멤버십`}),L(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:s??(n.eligible===!1?`Free`:`확인 중`)})]}),L(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[L(`dt`,{class:`text-xs font-bold text-slate-500`,children:`전송 대기`}),L(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:[H(n.pendingEvents),`건`]})]}),L(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[L(`dt`,{class:`text-xs font-bold text-slate-500`,children:`마지막 동기화`}),L(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:n.lastSuccessAt>0?Gt(n.lastSuccessAt):`아직 없음`})]}),L(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[L(`dt`,{class:`text-xs font-bold text-slate-500`,children:`Cloud 보관`}),L(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:pn(n)})]})]}),L(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`SmartSafeHub 계정에 연결된 Free는 최근 7일, Pro와 Ultimate는 최근 90일 동안 Cloud 활동 기록을 보관합니다. 끄면 전송 대기 데이터와 임시 인증 정보를 삭제하며, 다시 켠 뒤 새로 발생한 활동부터 Cloud에 전송합니다. 로컬 최근 활동은 항상 유지됩니다.`})]})]})}function hn({actionError:e,actionMessage:t,data:n,error:r,loading:i,onDismissActionFeedback:a,onRetry:o,onSetCloudSync:s,savingCloudSync:c}){let[l,u]=F(20),d=n?.events??[],f=d.slice(0,l),p=d.length-f.length;return L(`div`,{class:`min-w-0 space-y-6`,children:[L(`section`,{"aria-labelledby":`activity-cloud-title`,class:`min-w-0`,children:[L(V,{id:`activity-cloud-title`,eyebrow:`Cloud history`,title:`Cloud 활동 기록`,description:`활동 기록을 Cloud에 자동으로 전송할지 설정합니다. 공유기 내 최근 활동은 항상 기록됩니다.`}),L(mn,{actionError:e,actionMessage:t,cloud:n?.cloud??{enabled:!1,phase:`preparing`,eligible:null,plan:null,retentionDays:0,pendingEvents:0,lastAttemptAt:0,lastSuccessAt:0,lastUploadedCount:0,lastErrorCode:null,nextSyncAt:0},onDismissFeedback:a,onSetEnabled:s,saving:c})]}),L(`section`,{"aria-labelledby":`activity-history-title`,class:`min-w-0`,children:[L(V,{id:`activity-history-title`,eyebrow:`Local history`,title:`현재 부팅 이후의 최근 활동`,description:`인터넷, SafeShield, 업데이트, 계정 권한과 주요 설정에서 실제 상태가 변경된 시점만 기록합니다.`,action:L(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5 text-xs font-extrabold text-slate-600 ring-1 ring-inset ring-slate-200`,children:[`최대 `,n?.maxEvents??128,`건`]})}),L(`div`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:i||r&&!n?L(dn,{error:r,loading:i,onRetry:o}):L(v,{children:[L(un,{events:f}),d.length>20?L(`div`,{class:`mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-slate-200 pt-4`,children:[L(`p`,{class:`m-0 text-xs font-semibold text-slate-500`,children:[H(f.length),` / `,H(d.length),`건 표시 중`]}),L(`div`,{class:`flex flex-wrap items-center gap-2`,children:[l>20?L(`button`,{class:`inline-flex min-h-10 items-center justify-center rounded-xl border border-slate-200 bg-white px-4 py-2 text-xs font-extrabold text-slate-700 transition hover:bg-slate-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>u(20),type:`button`,children:`최신 20건만 보기`}):null,p>0?L(`button`,{class:`inline-flex min-h-10 items-center justify-center rounded-xl border border-teal-200 bg-teal-50 px-4 py-2 text-xs font-extrabold text-teal-800 transition hover:bg-teal-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>u(e=>Math.min(e+20,d.length)),type:`button`,children:[`이전 활동 더 보기 (`,H(Math.min(20,p)),`건)`]}):null]})]}):null]})})]}),L(`aside`,{class:`rounded-2xl border border-slate-200 bg-slate-50 px-5 py-4`,children:[L(`p`,{class:`m-0 text-sm font-extrabold text-slate-800`,children:`로컬 활동 기록 안내`}),L(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`이 기록은 공유기의 메모리 영역에만 보관되어 재부팅하면 초기화됩니다. 직접 설정을 변경한 작업은 성공 시점에 즉시 기록하고, 인터넷 및 장치 진단처럼 외부 상태를 확인해야 하는 항목은 실제 상태 변화가 관찰된 경우에만 추가합니다.`})]})]})}var gn=Object.assign,_n=/^(-|f[lo].*[^se]$|g.{5,}[^ps]$|z|o[pr]|(W.{5})?[lL]i.*(t|mp)$|an|(bo|s).{4}Im|sca|m.{6}[ds]|ta|c.*[st]$|wido|ini)/;function vn(e,t){var n=ce(e,t);return n.containerInfo=t,n}var yn=Symbol.for(`react.element`),bn=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(?!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,xn=/[A-Z0-9]/g,Sn=typeof document<`u`,Cn=function(e){return/fil|che|rad/.test(e)};y.prototype.isReactComponent=!0,[`componentWillMount`,`componentWillReceiveProps`,`componentWillUpdate`].forEach(function(e){Object.defineProperty(y.prototype,e,{configurable:!0,get:function(){return this[`UNSAFE_`+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})});var wn=e.event;e.event=function(e){return wn&&(e=wn(e)),e.persist=function(){},e.isPropagationStopped=function(){return this.cancelBubble},e.isDefaultPrevented=function(){return this.defaultPrevented},e.nativeEvent=e};var Tn={configurable:!0,get:function(){return this.class}},En=e.vnode;e.vnode=function(e){if(typeof e.type==`string`)(function(e){var t=e.props,n=e.type,r={},i=n.indexOf(`-`)==-1;for(var a in t){var o=t[a];if(!(a==`value`&&`defaultValue`in t&&o==null||Sn&&a==`children`&&n==`noscript`||a==`class`||a==`className`)){if(a==`style`&&typeof o==`object`){var s=void 0;for(var c in o)typeof o[c]!=`number`||_n.test(c)||(s||(s=o=gn({},o)),o[c]+=`px`)}else if(a==`defaultValue`&&`value`in t&&t.value==null)a=`value`;else if(a==`download`&&!0===o)o=``;else if(a==`translate`&&o===`no`)o=!1;else if(a[0]==`o`&&a[1]==`n`){var l=a.toLowerCase();l==`ondoubleclick`?a=`ondblclick`:l!=`onchange`||n!=`input`&&n!=`textarea`||Cn(t.type)?l==`onfocus`?a=`onfocusin`:l==`onblur`&&(a=`onfocusout`):l=a=`oninput`,l==`oninput`&&r[a=l]&&(a=`oninputCapture`)}else i&&bn.test(a)?a=a.replace(xn,`-$&`).toLowerCase():o===null&&(o=void 0);r[a]=o}}n==`select`&&(r.multiple&&Array.isArray(r.value)&&(r.value=D(t.children).forEach(function(e){e.props.selected=r.value.indexOf(e.props.value)!=-1})),r.defaultValue!=null&&(r.value=D(t.children).forEach(function(e){e.props.selected=r.multiple?r.defaultValue.indexOf(e.props.value)!=-1:r.defaultValue==e.props.value}))),t.class&&!t.className?(r.class=t.class,Object.defineProperty(r,"className",Tn)):t.className&&(r.class=r.className=t.className),e.props=r})(e);else if(typeof e.type==`function`&&(`ref`in e.props&&`prototype`in e.type&&e.type.prototype.render&&(e.ref=e.props.ref,delete e.props.ref),e.type.defaultProps)){var t=gn({},e.props);for(var n in e.type.defaultProps)t[n]===void 0&&(t[n]=e.type.defaultProps[n]);e.props=t}e.ref&&!(`ref`in e.props)&&Object.defineProperty(e.props,"ref",{value:e.ref,configurable:!0,writable:!0}),e.$$typeof=yn,En&&En(e)};var Dn=8,On=256,kn=8;function An(e){return e.findIndex(e=>!e.disabled)}function jn(e){for(let t=e.length-1;t>=0;--t)if(!e[t]?.disabled)return t;return-1}function Mn(e,t,n){if(e.length===0)return-1;let r=t;for(let t=0;te.value===t&&!e.disabled);return n>=0?n:An(e)}function Pn({ariaLabel:e,className:t=``,disabled:n=!1,id:r,onChange:i,options:a,value:o,variant:s=`default`}){let c=De(),l=r??`ssh-custom-select-${c}`,u=`${l}-menu`,d=we(null),f=we(null),p=we(null),m=we([]),[h,g]=F(!1),[_,v]=F(()=>Nn(a,o)),[y,b]=F(`bottom`),[x,S]=F(On),[C,w]=F({}),[T,E]=F(null),D=Te(()=>a.find(e=>e.value===o)??a[0]??null,[a,o]),O=()=>{let e=f.current;if(!e)return;let t=e.getBoundingClientRect(),n=Math.min(On,Math.max(44,a.length*42+12)),r=window.innerHeight-t.bottom-kn,i=t.top-kn,o=rr?`top`:`bottom`,s=Math.min(t.width,Math.max(0,window.innerWidth-16)),c=Math.max(kn,Math.min(t.left,window.innerWidth-s-kn)),l=o===`bottom`?r:i;b(o),S(Math.max(44,Math.min(On,Math.floor(l)))),w({left:`${c}px`,width:`${s}px`,...o===`bottom`?{top:`${t.bottom+Dn}px`}:{bottom:`${window.innerHeight-t.top+Dn}px`}})},k=(e=!1)=>{g(!1),e&&window.requestAnimationFrame(()=>f.current?.focus())},A=e=>{e<0||(v(e),window.requestAnimationFrame(()=>m.current[e]?.focus()))},j=e=>{let t=a[e];t&&!t.disabled&&(i(t.value),g(!1),window.requestAnimationFrame(()=>f.current?.focus()))},M=e=>{n||a.length===0||(O(),g(!0),A(e??Nn(a,o)))};I(()=>{let e=d.current?.closest(`.ssh-app`);if(e){E(e);return}let t=d.current?.getRootNode();t instanceof ShadowRoot?E(t):typeof document<`u`&&E(document.body)},[]),I(()=>{v(Nn(a,o)),m.current=m.current.slice(0,a.length)},[a,o]),I(()=>{if(!h)return;O();let e=e=>{let t=e.composedPath();d.current&&t.includes(d.current)||p.current&&t.includes(p.current)||k()},t=e=>{e.key===`Escape`&&(e.preventDefault(),k(!0))},n=()=>O();return document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t),window.addEventListener(`resize`,n),window.addEventListener(`scroll`,n,!0),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t),window.removeEventListener(`resize`,n),window.removeEventListener(`scroll`,n,!0)}},[h,a.length]),I(()=>{n&&h&&k()},[n,h]);let ee=s===`emphasized`?`min-h-11 border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100`:`min-h-11 border border-slate-300 bg-slate-50 px-3 py-2.5 text-sm font-bold text-slate-900 focus:border-teal-500 focus:ring-2 focus:ring-teal-100`,te=h?L(`div`,{"aria-label":`${e} 목록`,class:`ssh-custom-select-menu fixed z-[1000] overflow-hidden rounded-xl border border-slate-200 bg-white p-1.5 shadow-xl shadow-slate-950/10`,id:u,ref:p,role:`listbox`,style:C,children:L(`div`,{class:`overflow-y-auto overscroll-contain`,style:{maxHeight:`${x}px`},children:a.map((e,t)=>{let n=e.value===o;return L(`button`,{"aria-selected":n,class:`flex min-h-10 w-full items-center justify-between gap-3 rounded-lg px-3 py-2.5 text-left text-sm font-bold transition ${n?`bg-teal-50 text-teal-800`:`text-slate-700 hover:bg-slate-50`} ${e.disabled?`cursor-not-allowed opacity-50`:``}`,disabled:e.disabled,onClick:()=>j(t),onFocus:()=>v(t),onKeyDown:e=>{switch(e.key){case`ArrowDown`:e.preventDefault(),A(Mn(a,t,1));break;case`ArrowUp`:e.preventDefault(),A(Mn(a,t,-1));break;case`Home`:e.preventDefault(),A(An(a));break;case`End`:e.preventDefault(),A(jn(a));break;case`Enter`:case` `:e.preventDefault(),j(t);break;case`Escape`:e.preventDefault(),k(!0);break;case`Tab`:g(!1)}},ref:e=>{m.current[t]=e},role:`option`,tabIndex:_===t?0:-1,type:`button`,children:[L(`span`,{class:`min-w-0 truncate`,children:e.label}),n?L(`span`,{"aria-hidden":`true`,class:`size-2 shrink-0 rounded-full bg-teal-500`}):null]},e.value)})})}):null;return L(`div`,{class:`relative ${t}`,ref:d,children:[L(`button`,{"aria-controls":u,"aria-expanded":h,"aria-haspopup":`listbox`,"aria-label":e,class:`ssh-custom-select-trigger flex w-full cursor-pointer items-center justify-between gap-3 rounded-xl text-left outline-none transition disabled:cursor-not-allowed disabled:bg-slate-100 disabled:text-slate-400 disabled:opacity-60 ${ee}`,disabled:n,id:l,onClick:()=>{h?k():(O(),g(!0))},onKeyDown:e=>{switch(e.key){case`ArrowDown`:e.preventDefault(),M(h?Mn(a,_,1):Nn(a,o));break;case`ArrowUp`:e.preventDefault(),M(h?Mn(a,_,-1):Nn(a,o));break;case`Home`:e.preventDefault(),M(An(a));break;case`End`:e.preventDefault(),M(jn(a));break;case`Enter`:case` `:e.preventDefault(),h?k():M();break;case`Escape`:h&&(e.preventDefault(),k())}},ref:f,type:`button`,children:[L(`span`,{class:`min-w-0 truncate`,children:D?.label??`선택하세요`}),L(_t,{"aria-hidden":`true`,class:`size-4 shrink-0 text-slate-400 transition-transform ${h?`rotate-180`:``}`})]}),te&&T?vn(te,T):null,L(`span`,{class:`sr-only`,"aria-live":`polite`,children:y===`top`?`선택 목록이 위쪽에 열렸습니다.`:``})]})}function Fn(e){let t=e.split(`.`);return[t[0]??``,t[1]??``,t[2]??``,t[3]??``]}function In(e){return e.replace(/\D/g,``).slice(0,3)}function Ln(e){return e.every(e=>e===``)?``:e.join(`.`)}function Rn({disabled:e=!1,label:t,value:n,onChange:r}){let i=Fn(n),a=(e,t)=>{let n=[...i];n[e]=In(t),r(Ln(n))};return L(`div`,{class:`ssh-ipv4-segments mt-2 min-h-11`,"aria-label":`${t} 입력`,children:i.map((n,r)=>L(`div`,{class:`ssh-ipv4-segment`,children:[L(`input`,{"aria-label":`${t} ${r+1}번째 옥텟`,autocomplete:`off`,class:`min-h-11 w-full min-w-0 max-w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-1.5 py-2.5 text-center text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100 sm:px-2`,disabled:e,inputMode:`numeric`,maxLength:3,onInput:e=>a(r,e.currentTarget.value),pattern:`[0-9]*`,spellcheck:!1,value:n}),rt);function Wn(e){return Vn.includes(e)}function Gn(e){switch(e){case`dhcp`:return`자동 IP (DHCP)`;case`pppoe`:return`PPPoE`;case`static`:return`고정 IPv4`;default:return e?e.toUpperCase():`확인 전`}}function Kn(e){return{protocol:e.configuration.protocol,pppoeUsername:e.configuration.pppoe.username,pppoePassword:``,staticAddress:e.configuration.static.address??``,staticPrefixLength:e.configuration.static.prefixLength??24,staticGateway:e.configuration.static.gateway??``,dnsPrimary:e.configuration.static.dns[0]??``,dnsSecondary:e.configuration.static.dns[1]??``}}function qn(e){return e.trim()}function Jn(e,t){let n=Kn(t);return e.protocol===n.protocol?e.protocol===`dhcp`||!Wn(e.protocol)?!1:e.protocol===`pppoe`?qn(e.pppoeUsername)!==n.pppoeUsername||e.pppoePassword.length>0:qn(e.staticAddress)!==n.staticAddress||e.staticPrefixLength!==n.staticPrefixLength||qn(e.staticGateway)!==n.staticGateway||qn(e.dnsPrimary)!==n.dnsPrimary||qn(e.dnsSecondary)!==n.dnsSecondary:!0}function Yn(e){let t=e.trim().split(`.`);return t.length===4&&t.every(e=>{if(!/^(0|[1-9][0-9]{0,2})$/.test(e))return!1;let t=Number(e);return t>=0&&t<=255})}function Xn(e){let t=e;return Array.from({length:4},()=>{if(t>=8)return t-=8,255;if(t<=0)return 0;let e=256-2**(8-t);return t=0,e}).join(`.`)}function Zn(e){if(!Number.isFinite(e)||e<=0)return`연결 시간 확인 전`;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}일 ${n}시간 연결됨`:n>0?`${n}시간 ${r}분 연결됨`:`${Math.max(1,r)}분 연결됨`}function Qn({feedback:e,onDismiss:t}){return L(`div`,{"aria-live":`polite`,class:`mb-5 rounded-2xl border px-4 py-4 text-sm ${e.kind===`success`?`border-emerald-200 bg-emerald-50 text-emerald-900`:e.kind===`warning`?`border-amber-200 bg-amber-50 text-amber-950`:`border-red-200 bg-red-50 text-red-900`}`,children:L(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[L(`p`,{class:`m-0 font-bold leading-6`,children:e.message}),L(`button`,{class:`min-h-10 shrink-0 rounded-lg border border-current bg-transparent px-3 py-1.5 text-xs font-extrabold`,onClick:t,type:`button`,children:`닫기`})]})})}function $n({data:e,busy:t,onReconnect:n}){let r=e.status,i=r.connected;return L(`section`,{class:`grid gap-4 lg:grid-cols-3`,"aria-label":`인터넷 연결 상태`,children:[L(`article`,{class:`rounded-2xl border p-5 shadow-sm shadow-slate-900/5 ${i?`border-emerald-200 bg-emerald-50 text-emerald-950`:`border-amber-200 bg-amber-50 text-amber-950`}`,children:[L(`div`,{class:`flex items-start justify-between gap-3`,children:[L(`span`,{class:`grid size-10 place-items-center rounded-xl ${i?`bg-emerald-100 text-emerald-700`:`bg-amber-100 text-amber-700`}`,children:L(i?ut:B,{class:`size-5`})}),L(`button`,{class:`inline-flex min-h-10 items-center justify-center gap-2 rounded-xl border border-current bg-transparent px-3 py-2 text-xs font-extrabold transition disabled:cursor-wait disabled:opacity-60`,disabled:t,onClick:n,type:`button`,children:[L(z,{class:`size-4 ${t?`animate-spin`:``}`}),`재연결`]})]}),L(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] opacity-70`,children:`인터넷 상태`}),L(`p`,{class:`mt-2 mb-0 text-xl font-black`,children:r.pending?`연결 중`:i?`연결됨`:`연결 안 됨`}),L(`p`,{class:`mt-1 mb-0 text-sm font-semibold leading-6 opacity-80`,children:[Gn(r.protocol??e.configuration.protocol),` · `,Zn(r.uptimeSeconds)]})]}),L(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[L(`span`,{class:`grid size-10 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:L($e,{class:`size-5`})}),L(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`WAN IPv4`}),L(`p`,{class:`mt-2 mb-0 break-all text-xl font-black text-slate-950`,children:r.address?`${r.address}${r.prefixLength===null?``:`/${r.prefixLength}`}`:`주소 없음`}),L(`p`,{class:`mt-1 mb-0 text-sm font-semibold text-slate-600`,children:r.device?`인터페이스 ${r.device}`:`인터페이스 확인 전`})]}),L(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[L(`span`,{class:`grid size-10 place-items-center rounded-xl bg-slate-100 text-slate-700`,children:L(We,{class:`size-5`})}),L(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`Gateway · DNS`}),L(`p`,{class:`mt-2 mb-0 break-all text-base font-black text-slate-950`,children:r.gateway??`Gateway 확인 전`}),L(`p`,{class:`mt-1 mb-0 break-all text-sm font-semibold leading-6 text-slate-600`,children:r.dns.length>0?r.dns.join(` · `):`DNS 확인 전`})]})]})}function er({action:e,data:t,error:n,feedback:r,loading:i,onDismissFeedback:a,onReconnect:o,onRetry:s,onSave:c}){let[l,u]=F({protocol:`dhcp`,pppoeUsername:``,pppoePassword:``,staticAddress:``,staticPrefixLength:24,staticGateway:``,dnsPrimary:``,dnsSecondary:``}),[d,f]=F(!1),[p,m]=F(!1),[h,g]=F(null);I(()=>{t&&!d&&(u(Kn(t)),g(null))},[t,d]);let _=Te(()=>{let e=[{value:`dhcp`,label:`자동 IP (DHCP)`},{value:`pppoe`,label:`PPPoE`},{value:`static`,label:`고정 IPv4`}];return t&&!t.configuration.supported&&e.unshift({value:t.configuration.protocol,label:`현재 설정 (${t.configuration.protocol})`}),e},[t]);if(i)return L(zn,{});if(n)return L(Bn,{message:n,onRetry:s});if(!t)return null;let y=e!==null,b=e=>{u(n=>{let r={...n,...e};return f(Jn(r,t)),r}),g(null)},x=async e=>{if(e.preventDefault(),!Wn(l.protocol))g(`DHCP, PPPoE 또는 고정 IPv4 중 하나를 선택해 주세요.`);else{if(l.protocol===`pppoe`){if(!qn(l.pppoeUsername)){g(`PPPoE 사용자명을 입력해 주세요.`);return}if((t.configuration.protocol!==`pppoe`||!t.configuration.pppoe.passwordConfigured)&&l.pppoePassword.length===0){g(`PPPoE 연결을 시작하려면 비밀번호를 입력해 주세요.`);return}}if(l.protocol===`static`){if(!Yn(l.staticAddress)){g(`고정 IPv4 주소를 올바르게 입력해 주세요.`);return}if(!Yn(l.staticGateway)){g(`기본 게이트웨이를 올바르게 입력해 주세요.`);return}if(!Yn(l.dnsPrimary)){g(`기본 DNS 서버를 올바르게 입력해 주세요.`);return}if(qn(l.dnsSecondary)&&!Yn(l.dnsSecondary)){g(`보조 DNS 서버를 올바르게 입력해 주세요.`);return}}window.confirm(`인터넷 연결 설정을 적용하면 WAN 연결이 다시 시작되어 인터넷이 잠시 끊길 수 있습니다. 계속하시겠습니까?`)&&await c({protocol:l.protocol,pppoeUsername:qn(l.pppoeUsername),pppoePassword:l.pppoePassword,pppoePasswordChanged:l.pppoePassword.length>0,staticAddress:qn(l.staticAddress),staticPrefixLength:l.staticPrefixLength,staticGateway:qn(l.staticGateway),dnsPrimary:qn(l.dnsPrimary),dnsSecondary:qn(l.dnsSecondary)})&&(u(e=>({...e,pppoePassword:``})),f(!1))}};return L(v,{children:[r?L(Qn,{feedback:r,onDismiss:a}):null,L(V,{eyebrow:`Overview`,title:`인터넷 연결 상태`,description:`WAN 연결 상태와 네트워크 정보를 확인합니다.`}),L($n,{data:t,busy:y,onReconnect:()=>{window.confirm(`WAN 연결을 다시 시작합니다. 인터넷이 잠시 끊길 수 있습니다. 계속하시겠습니까?`)&&o()}}),t.configuration.supported?null:L(`section`,{class:`mt-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-amber-950 sm:p-6`,children:L(`div`,{class:`flex items-start gap-3`,children:[L(B,{class:`mt-0.5 size-5 shrink-0 text-amber-700`}),L(`div`,{children:[L(`h2`,{class:`m-0 text-base font-black`,children:`현재 WAN 방식은 직접 관리하지 않습니다`}),L(`p`,{class:`mt-2 mb-0 text-sm font-semibold leading-6 text-amber-900/80`,children:[`현재 설정은 `,t.configuration.protocol,`입니다. 아래에서 DHCP, PPPoE 또는 고정 IPv4를 선택해 저장하면 해당 방식으로 전환합니다.`]})]})]})}),L(`div`,{class:`mt-7`,children:L(V,{eyebrow:`Internet`,title:`인터넷 연결 설정`,description:`통신사 또는 상위 네트워크 환경에 맞는 WAN 연결 방식을 선택합니다.`})}),L(`form`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void x(e),children:[d?L(`div`,{class:`mb-5 flex justify-end`,children:L(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 self-start items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[L(B,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]})}):null,L(`div`,{children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`연결 방식`}),L(Pn,{ariaLabel:`WAN 연결 방식`,className:`mt-2 max-w-xl`,disabled:y,id:`wan-protocol`,onChange:e=>b(e===`static`&&!qn(l.dnsSecondary)?{protocol:e,dnsSecondary:Hn}:{protocol:e}),options:_,value:l.protocol,variant:`emphasized`}),L(`span`,{class:`mt-2 block text-xs font-semibold leading-5 text-slate-500`,children:`대부분의 가정용 인터넷과 상위 공유기 연결은 자동 IP(DHCP)를 사용합니다.`})]}),l.protocol===`pppoe`?L(`div`,{class:`mt-6 grid gap-5 lg:grid-cols-2`,children:[L(`label`,{class:`block`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`PPPoE 사용자명`}),L(`input`,{autocomplete:`username`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:y,onInput:e=>b({pppoeUsername:e.currentTarget.value}),spellcheck:!1,value:l.pppoeUsername})]}),L(`label`,{class:`block`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`PPPoE 비밀번호`}),L(`span`,{class:`relative mt-2 block`,children:[L(`input`,{autocomplete:`new-password`,class:`min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 pr-12 text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:y,onInput:e=>b({pppoePassword:e.currentTarget.value}),placeholder:t.configuration.protocol===`pppoe`&&t.configuration.pppoe.passwordConfigured?`변경할 때만 입력`:`PPPoE 비밀번호`,...p?{type:`text`}:{type:`password`},value:l.pppoePassword}),L(`button`,{"aria-label":p?`비밀번호 숨기기`:`비밀번호 표시`,class:`absolute inset-y-0 right-1 grid w-10 place-items-center rounded-lg border-0 bg-transparent text-slate-500`,disabled:y,onClick:()=>m(e=>!e),type:`button`,children:L(p?ct:st,{class:`size-5`})})]}),L(`span`,{class:`mt-2 block text-xs text-slate-500`,children:t.configuration.protocol===`pppoe`&&t.configuration.pppoe.passwordConfigured?`비워 두면 현재 저장된 비밀번호를 그대로 사용합니다.`:`통신사에서 제공한 PPPoE 비밀번호를 입력해 주세요.`})]})]}):null,l.protocol===`static`?L(`div`,{class:`mt-6 grid gap-5 lg:grid-cols-2`,children:[L(`label`,{class:`block`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`IPv4 주소`}),L(Rn,{disabled:y,label:`IPv4 주소`,onChange:e=>b({staticAddress:e}),value:l.staticAddress})]}),L(`div`,{class:`block`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`서브넷 마스크`}),L(Pn,{ariaLabel:`WAN 서브넷 마스크`,className:`mt-2`,disabled:y,id:`wan-static-prefix-length`,onChange:e=>b({staticPrefixLength:Number(e)}),options:Un.map(e=>({value:String(e),label:`/${e} · ${Xn(e)}`})),value:String(l.staticPrefixLength),variant:`emphasized`})]}),L(`label`,{class:`block`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`기본 게이트웨이`}),L(Rn,{disabled:y,label:`기본 게이트웨이`,onChange:e=>b({staticGateway:e}),value:l.staticGateway})]}),L(`label`,{class:`block`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`기본 DNS`}),L(Rn,{disabled:y,label:`기본 DNS`,onChange:e=>b({dnsPrimary:e}),value:l.dnsPrimary})]}),L(`label`,{class:`block lg:col-start-2`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`보조 DNS (선택)`}),L(Rn,{disabled:y,label:`보조 DNS`,onChange:e=>b({dnsSecondary:e}),value:l.dnsSecondary})]})]}):null,l.protocol===`dhcp`?L(`div`,{class:`mt-6 rounded-xl border border-slate-200 bg-slate-50 px-4 py-4 text-sm font-semibold leading-6 text-slate-600`,children:`상위 공유기 또는 통신사 장비에서 IP 주소, 기본 게이트웨이와 DNS 정보를 자동으로 받습니다. 별도의 계정이나 고정 주소가 없다면 이 방식을 사용하세요.`}):null,h?L(`p`,{class:`mt-5 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:h}):null,L(`div`,{class:`mt-6 flex flex-col gap-3 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[L(`p`,{class:`m-0 text-xs font-semibold leading-5 text-slate-500`,children:`설정 저장 후 WAN만 다시 연결하며 LAN 관리 페이지와 내부 네트워크 설정은 유지됩니다.`}),L(`button`,{class:`inline-flex min-h-11 w-full shrink-0 items-center justify-center gap-2 rounded-xl border-0 bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white shadow-sm transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:y||!d,type:`submit`,children:[L(ut,{class:`size-5 ${e===`saving`?`animate-pulse`:``}`}),e===`saving`?`저장 중`:`설정 저장`]})]})]})]})}var tr=[16,20,22,23,24,25,26,27,28],nr=[[`30m`,`30분`],[`1h`,`1시간`],[`6h`,`6시간`],[`12h`,`12시간`],[`24h`,`24시간`],[`3d`,`3일`],[`7d`,`7일`]];function rr(e){let t=e.trim().split(`.`);return t.length===4&&t.every(e=>{if(!/^(0|[1-9][0-9]{0,2})$/.test(e))return!1;let t=Number(e);return t>=0&&t<=255})}function ir(e){let t=Fn(e);return t.slice(0,3).some(e=>e===``||Number(e)>255)?null:t.slice(0,3).join(`.`)}function ar(e){return Fn(e)[3]}function or(e){let t=ir(e.lan.address),n=ar(e.dhcp.start??``),r=ar(e.dhcp.end??``);return{ipAddress:e.lan.address,prefixLength:e.lan.prefixLength,dhcpEnabled:e.dhcp.enabled,dhcpStart:t&&n?`${t}.${n}`:e.dhcp.start??``,dhcpEnd:t&&r?`${t}.${r}`:e.dhcp.end??``,leaseTime:e.dhcp.leaseTime}}function sr({disabled:e,label:t,lanAddress:n,value:r,onChange:i}){let a=ir(n),o=a?.split(`.`)??[``,``,``],s=ar(r),c=e=>{let t=In(e);i(a&&t!==``?`${a}.${t}`:t)};return L(`label`,{class:`block`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:t}),L(`div`,{class:`ssh-ipv4-segments mt-2 min-h-11`,"aria-label":`${t} 입력`,children:[o.map((e,t)=>L(`div`,{class:`ssh-ipv4-segment`,children:[L(`span`,{class:`grid min-h-11 w-full min-w-0 max-w-full place-items-center rounded-xl border border-slate-200 bg-slate-100 px-1.5 py-2.5 text-center text-sm font-bold text-slate-500 sm:px-2`,children:e||`—`}),L(`span`,{"aria-hidden":`true`,class:`ssh-ipv4-separator text-sm font-black text-slate-400`,children:`.`})]},t)),L(`div`,{class:`ssh-ipv4-segment`,children:L(`input`,{"aria-label":`${t} 마지막 옥텟`,autocomplete:`off`,class:`min-h-11 w-full min-w-0 max-w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-1.5 py-2.5 text-center text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100 sm:px-2`,disabled:e||!a,inputMode:`numeric`,maxLength:3,onInput:e=>c(e.currentTarget.value),pattern:`[0-9]*`,spellcheck:!1,value:s})})]}),L(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`앞 3개 주소는 공유기 IP 주소와 동일하게 유지됩니다.`})]})}function cr(e){return`${window.location.protocol}//${e}${window.location.pathname}${window.location.search}${window.location.hash}`}function lr({feedback:e,onDismiss:t}){return L(`div`,{"aria-live":`polite`,class:`mb-5 rounded-2xl border px-4 py-4 text-sm ${e.kind===`success`?`border-emerald-200 bg-emerald-50 text-emerald-900`:e.kind===`warning`?`border-amber-200 bg-amber-50 text-amber-950`:`border-red-200 bg-red-50 text-red-900`}`,children:[L(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[L(`p`,{class:`m-0 font-bold leading-6`,children:e.message}),L(`button`,{class:`min-h-10 shrink-0 rounded-lg border border-current bg-transparent px-3 py-1.5 text-xs font-extrabold`,onClick:t,type:`button`,children:`닫기`})]}),e.newAddress?L(`a`,{class:`mt-3 inline-flex min-h-10 items-center rounded-lg border border-current px-3 py-2 font-extrabold underline underline-offset-2`,href:cr(e.newAddress),children:[`새 공유기 주소 `,e.newAddress,`로 연결`]}):null]})}function ur({data:e}){let t=e.conflict.detected;return L(`section`,{class:`grid gap-4 lg:grid-cols-3`,"aria-label":`내부 네트워크 상태`,children:[L(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[L(`span`,{class:`grid size-10 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:L(We,{class:`size-5`})}),L(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`SmartSafeHub LAN`}),L(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:e.lan.subnet}),L(`p`,{class:`mt-1 mb-0 text-sm font-semibold text-slate-600`,children:[`공유기 주소 `,e.lan.address]})]}),L(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[L(`span`,{class:`grid size-10 place-items-center rounded-xl bg-slate-100 text-slate-700`,children:L($e,{class:`size-5`})}),L(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`상위 네트워크`}),L(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:e.wan.subnet??`확인 전`}),L(`p`,{class:`mt-1 mb-0 text-sm font-semibold text-slate-600`,children:e.wan.connected?`WAN ${e.wan.address??`주소 확인 중`}`:`WAN 연결 후 자동으로 확인합니다.`})]}),L(`article`,{class:`rounded-2xl border p-5 shadow-sm shadow-slate-900/5 ${t?`border-red-200 bg-red-50 text-red-950`:`border-emerald-200 bg-emerald-50 text-emerald-950`}`,children:[L(`span`,{class:`grid size-10 place-items-center rounded-xl ${t?`bg-red-100 text-red-700`:`bg-emerald-100 text-emerald-700`}`,children:L(t?B:ut,{class:`size-5`})}),L(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] opacity-70`,children:`대역 충돌`}),L(`p`,{class:`mt-2 mb-0 text-lg font-black`,children:t?`주소 대역이 겹칩니다`:`충돌이 감지되지 않았습니다`}),L(`p`,{class:`mt-1 mb-0 text-sm font-semibold leading-6 opacity-80`,children:t?`상위 네트워크 ${e.conflict.wanSubnet??``}와 다른 LAN 대역이 필요합니다.`:e.wan.connected?`현재 WAN과 LAN이 서로 다른 IPv4 대역을 사용합니다.`:`WAN이 연결되면 상위 네트워크와의 충돌 여부를 확인합니다.`})]})]})}function dr({action:e,data:t,error:n,feedback:r,loading:i,onApplyRecommendation:a,onDismissFeedback:o,onRetry:s,onSave:c}){let[l,u]=F(``),[d,f]=F(24),[p,m]=F(!0),[h,g]=F(``),[_,y]=F(``),[b,x]=F(`12h`),[S,C]=F(!1),[w,T]=F(null),E=(e={})=>{if(!t)return!1;let n=or(t);return(e.ipAddress??l).trim()!==n.ipAddress||(e.prefixLength??d)!==n.prefixLength||(e.dhcpEnabled??p)!==n.dhcpEnabled||(e.dhcpStart??h).trim()!==n.dhcpStart||(e.dhcpEnd??_).trim()!==n.dhcpEnd||(e.leaseTime??b)!==n.leaseTime},D=e=>{let t=ir(e);if(u(e),!t){C(E({ipAddress:e}));return}let n=ar(h),r=ar(_),i=n?`${t}.${n}`:``,a=r?`${t}.${r}`:``;g(i),y(a),C(E({ipAddress:e,dhcpStart:i,dhcpEnd:a}))},O=e=>{g(e),C(E({dhcpStart:e}))},k=e=>{y(e),C(E({dhcpEnd:e}))},A=e=>{f(e),C(E({prefixLength:e}))},j=e=>{x(e),C(E({leaseTime:e}))},M=e=>{m(e),C(E({dhcpEnabled:e}))};I(()=>{if(!t||S)return;let e=or(t);u(e.ipAddress),f(e.prefixLength),m(e.dhcpEnabled),g(e.dhcpStart),y(e.dhcpEnd),x(e.leaseTime),T(null)},[t,S]);let ee=Te(()=>{let e=[...tr];return e.includes(d)||(e.push(d),e.sort((e,t)=>e-t)),e},[d]),te=Te(()=>{let e=[...nr];return e.some(([e])=>e===b)||e.push([b,`현재 설정 (${b})`]),e},[b]);if(i)return L(zn,{});if(n)return L(Bn,{message:n,onRetry:s});if(!t)return null;let ne=e!==null,re=async e=>{e.preventDefault(),rr(l)?!rr(h)||!rr(_)?T(`DHCP 시작/종료 주소를 올바른 IPv4 형식으로 입력해 주세요.`):window.confirm(`내부 네트워크 설정을 적용하면 연결된 기기가 새 DHCP 정보를 받는 동안 잠시 연결이 끊길 수 있습니다. 계속하시겠습니까?`)&&(T(null),await c({ipAddress:l.trim(),prefixLength:d,dhcpEnabled:p,dhcpStart:h.trim(),dhcpEnd:_.trim(),leaseTime:b})&&C(!1)):T(`공유기 주소를 올바른 IPv4 형식으로 입력해 주세요.`)},ie=async()=>{t.recommendation&&window.confirm(`상위 네트워크와 겹치지 않는 ${t.recommendation.subnet} 대역으로 자동 변경합니다. 현재 연결이 잠시 끊길 수 있습니다. 계속하시겠습니까?`)&&(T(null),await a()&&C(!1))};return L(v,{children:[r?L(lr,{feedback:r,onDismiss:o}):null,L(V,{eyebrow:`Overview`,title:`내부 네트워크 상태`,description:`LAN 주소와 DHCP 할당 상태를 확인합니다.`}),L(ur,{data:t}),t.conflict.detected?L(`section`,{class:`mt-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-amber-950 sm:p-6`,children:L(`div`,{class:`flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between`,children:[L(`div`,{class:`min-w-0`,children:[L(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-amber-700`,children:`자동 충돌 해결`}),L(`h2`,{class:`mt-2 mb-0 text-lg font-black`,children:`안전한 LAN 대역으로 변경할 수 있습니다`}),L(`p`,{class:`mt-2 mb-0 text-sm font-semibold leading-6 text-amber-900/80`,children:t.recommendation?`${t.recommendation.subnet} · DHCP ${t.recommendation.dhcpStart} ~ ${t.recommendation.dhcpEnd}`:`현재 활성 네트워크와 겹치지 않는 추천 대역을 찾지 못했습니다. 아래에서 직접 설정해 주세요.`})]}),t.recommendation?L(`button`,{class:`inline-flex min-h-11 shrink-0 items-center justify-center gap-2 rounded-xl border-0 bg-amber-700 px-5 py-2.5 text-sm font-extrabold text-white transition hover:bg-amber-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-amber-200 disabled:cursor-wait disabled:opacity-60`,disabled:ne,onClick:()=>void ie(),type:`button`,children:[L(ut,{class:`size-5 ${e===`auto`?`animate-pulse`:``}`}),e===`auto`?`변경 중`:`추천 대역으로 자동 변경`]}):null]})}):null,L(`div`,{class:`mt-7`,children:L(V,{eyebrow:`Local network`,title:`LAN 및 DHCP 설정`,description:`상위 공유기와 다른 주소 대역을 사용해야 안정적으로 라우팅할 수 있습니다.`})}),L(`form`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void re(e),children:[S?L(`div`,{class:`mb-5 flex justify-end`,children:L(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 self-start items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[L(B,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]})}):null,L(`div`,{class:`grid gap-5 lg:grid-cols-2`,children:[L(`div`,{class:`block`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`공유기 IP 주소`}),L(Rn,{disabled:ne,label:`공유기 IP 주소`,onChange:D,value:l})]}),L(`div`,{class:`block`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`현재 LAN 대역`}),L(`div`,{class:`mt-2 min-h-11 rounded-xl border border-slate-200 bg-slate-50 px-4 py-3 text-sm font-bold text-slate-700`,children:t.lan.subnet}),L(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`서브넷 마스크는 아래 고급 설정에서 변경할 수 있습니다.`})]}),L(sr,{disabled:ne,label:`DHCP 시작 주소`,lanAddress:l,onChange:O,value:h}),L(sr,{disabled:ne,label:`DHCP 종료 주소`,lanAddress:l,onChange:k,value:_})]}),L(`details`,{class:`mt-6 rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[L(`summary`,{class:`cursor-pointer text-sm font-black text-slate-900`,children:`고급 DHCP 설정`}),L(`div`,{class:`mt-5 grid gap-5 lg:grid-cols-2`,children:[L(`div`,{class:`block`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`서브넷 마스크`}),L(Pn,{ariaLabel:`서브넷 마스크`,className:`mt-2`,disabled:ne,id:`lan-prefix-length`,onChange:e=>A(Number(e)),options:ee.map(e=>({value:String(e),label:`/${e} · ${e===t.lan.prefixLength?t.lan.netmask:`CIDR /${e}`}`})),value:String(d),variant:`emphasized`}),L(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`일반 가정용 네트워크는 /24 사용을 권장합니다.`})]}),L(`div`,{class:`block`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`DHCP 임대 시간`}),L(Pn,{ariaLabel:`DHCP 임대 시간`,className:`mt-2`,disabled:ne,id:`lan-dhcp-lease-time`,onChange:j,options:te.map(([e,t])=>({value:e,label:t})),value:b,variant:`emphasized`})]}),L(`label`,{class:`inline-flex min-h-11 items-center gap-3 text-sm font-extrabold text-slate-800 lg:col-span-2`,children:[L(`input`,{checked:p,class:`size-5 accent-teal-700`,disabled:ne,onChange:e=>M(e.currentTarget.checked),type:`checkbox`}),`SmartSafeHub DHCP 서버 사용`]}),L(`p`,{class:`m-0 text-xs font-semibold leading-5 text-slate-500 lg:col-span-2`,children:`DHCP를 끄면 SmartSafeHub에 연결되는 장치에 IP 주소를 자동으로 할당하지 않습니다. 별도의 DHCP 서버를 사용하는 고급 구성에서만 비활성화하세요.`})]})]}),w?L(`p`,{class:`mt-5 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:w}):null,L(`div`,{class:`mt-6 flex flex-col gap-3 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[L(`p`,{class:`m-0 text-xs font-semibold leading-5 text-slate-500`,children:`주소가 바뀌면 현재 관리 페이지 연결이 종료되며 새 IP를 받아 다시 접속해야 합니다.`}),L(`button`,{class:`inline-flex min-h-11 w-full shrink-0 items-center justify-center gap-2 rounded-xl border-0 bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white shadow-sm transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:ne||!S,type:`submit`,children:[L(ut,{class:`size-5 ${e===`saving`?`animate-pulse`:``}`}),e===`saving`?`저장 중`:`설정 저장`]})]})]})]})}var fr={};fr.QR8bitByte=(e,t)=>{var n=t("QRMode");function r(e){this.mode=n.MODE_8BIT_BYTE,this.data=e}r.prototype={getLength:function(){return this.data.length},write:function(e){for(var t=0;t{function n(){this.buffer=[],this.length=0}n.prototype={get:function(e){var t=Math.floor(e/8);return(this.buffer[t]>>>7-e%8&1)==1},put:function(e,t){for(var n=0;n>>t-n-1&1)==1)},getLengthInBits:function(){return this.length},putBit:function(e){var t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},e.exports=n},fr.QRErrorCorrectLevel=(e,t)=>{e.exports={L:1,M:0,Q:3,H:2}},fr.QRMaskPattern=(e,t)=>{e.exports={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7}},fr.QRMath=(e,t)=>{for(var n={glog:function(e){if(e<1)throw Error(`glog(`+e+`)`);return n.LOG_TABLE[e]},gexp:function(e){for(;e<0;)e+=255;for(;e>=256;)e-=255;return n.EXP_TABLE[e]},EXP_TABLE:Array(256),LOG_TABLE:Array(256)},r=0;r<8;r++)n.EXP_TABLE[r]=1<{e.exports={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8}},fr.QRPolynomial=(e,t)=>{var n=t("QRMath");function r(e,t){if(e.length===void 0)throw Error(e.length+`/`+t);for(var n=0;n{var n=t("QRErrorCorrectLevel");function r(e,t){this.totalCount=e,this.dataCount=t}r.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],r.getRSBlocks=function(e,t){var n=r.getRsBlockTable(e,t);if(n===void 0)throw Error(`bad rs block @ typeNumber:`+e+`/errorCorrectLevel:`+t);for(var i=n.length/3,a=[],o=0;o{var n=t("QRMode"),r=t("QRPolynomial"),i=t("QRMath"),a=t("QRMaskPattern"),o={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(e){for(var t=e<<10;o.getBCHDigit(t)-o.getBCHDigit(o.G15)>=0;)t^=o.G15<=0;)t^=o.G18<>>=1;return t},getPatternPosition:function(e){return o.PATTERN_POSITION_TABLE[e-1]},getMask:function(e,t,n){switch(e){case a.PATTERN000:return(t+n)%2==0;case a.PATTERN001:return t%2==0;case a.PATTERN010:return n%3==0;case a.PATTERN011:return(t+n)%3==0;case a.PATTERN100:return(Math.floor(t/2)+Math.floor(n/3))%2==0;case a.PATTERN101:return t*n%2+t*n%3==0;case a.PATTERN110:return(t*n%2+t*n%3)%2==0;case a.PATTERN111:return(t*n%3+(t+n)%2)%2==0;default:throw Error(`bad maskPattern:`+e)}},getErrorCorrectPolynomial:function(e){for(var t=new r([1],0),n=0;n5&&(n+=3+a-5)}for(r=0;r{var n=t("QR8bitByte"),r=t("QRUtil"),i=t("QRPolynomial"),a=t("QRRSBlock"),o=t("QRBitBuffer");function s(e,t){this.typeNumber=e,this.errorCorrectLevel=t,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}s.prototype={addData:function(e){var t=new n(e);this.dataList.push(t),this.dataCache=null},isDark:function(e,t){if(e<0||this.moduleCount<=e||t<0||this.moduleCount<=t)throw Error(e+`,`+t);return this.modules[e][t]},getModuleCount:function(){return this.moduleCount},make:function(){if(this.typeNumber<1){var e=1;for(e=1;e<40;e++){for(var t=a.getRSBlocks(e,this.errorCorrectLevel),n=new o,i=0,s=0;s=7&&this.setupTypeNumber(e),this.dataCache===null&&(this.dataCache=s.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,t)},setupPositionProbePattern:function(e,t){for(var n=-1;n<=7;n++)if(!(e+n<=-1||this.moduleCount<=e+n))for(var r=-1;r<=7;r++)t+r<=-1||this.moduleCount<=t+r||(0<=n&&n<=6&&(r===0||r===6)||0<=r&&r<=6&&(n===0||n===6)||2<=n&&n<=4&&2<=r&&r<=4?this.modules[e+n][t+r]=!0:this.modules[e+n][t+r]=!1)},getBestMaskPattern:function(){for(var e=0,t=0,n=0;n<8;n++){this.makeImpl(!0,n);var i=r.getLostPoint(this);(n===0||e>i)&&(e=i,t=n)}return t},createMovieClip:function(e,t,n){var r=e.createEmptyMovieClip(t,n),i=1;this.make();for(var a=0;a>i&1)==1,this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=n;for(var a=0;a<18;a++)n=!e&&(t>>a&1)==1,this.modules[a%3+this.moduleCount-8-3][Math.floor(a/3)]=n},setupTypeInfo:function(e,t){for(var n=this.errorCorrectLevel<<3|t,i=r.getBCHTypeInfo(n),a,o=0;o<15;o++)a=!e&&(i>>o&1)==1,o<6?this.modules[o][8]=a:o<8?this.modules[o+1][8]=a:this.modules[this.moduleCount-15+o][8]=a;for(var s=0;s<15;s++)a=!e&&(i>>s&1)==1,s<8?this.modules[8][this.moduleCount-s-1]=a:s<9?this.modules[8][15-s-1+1]=a:this.modules[8][15-s-1]=a;this.modules[this.moduleCount-8][8]=!e},mapData:function(e,t){for(var n=-1,i=this.moduleCount-1,a=7,o=0,s=this.moduleCount-1;s>0;s-=2)for(s===6&&s--;;){for(var c=0;c<2;c++)if(this.modules[i][s-c]===null){var l=!1;o>>a&1)==1),r.getMask(t,i,s-c)&&(l=!l),this.modules[i][s-c]=l,a--,a===-1&&(o++,a=7)}if(i+=n,i<0||this.moduleCount<=i){i-=n,n=-n;break}}}},s.PAD0=236,s.PAD1=17,s.createData=function(e,t,n){for(var i=a.getRSBlocks(e,t),c=new o,l=0;ld*8)throw Error(`code length overflow. (`+c.getLengthInBits()+`>`+d*8+`)`);for(c.getLengthInBits()+4<=d*8&&c.put(0,4);c.getLengthInBits()%8!=0;)c.putBit(!1);for(;!(c.getLengthInBits()>=d*8||(c.put(s.PAD0,8),c.getLengthInBits()>=d*8));)c.put(s.PAD1,8);return s.createBytes(c,i)},s.createBytes=function(e,t){for(var n=0,a=0,o=0,s=Array(t.length),c=Array(t.length),l=0;l=0?m.get(g):0}}for(var _=0,v=0;vString.fromCharCode(e)).join(``),r=new(mr(`index`))(0,mr(`QRErrorCorrectLevel`).M);r.addData(n),r.make();let i=r.getModuleCount();return Array.from({length:i},(e,t)=>Array.from({length:i},(e,n)=>!!r.isDark(t,n)))}function gr(e,t,n){let r=e=>e.replace(/([\\;,:"])/g,`\\$1`);return`WIFI:T:${t===`none`?`nopass`:t===`sae`?`WPA3`:`WPA`};S:${r(e)};P:${r(n)};;`}function _r(e){return`${(e.replace(/[\\/:*?"<>|\x00-\x1f\x7f]/g,`_`).replace(/[. ]+$/g,``).trim()||`Wi-Fi`).slice(0,64)}-QR.png`}function vr(e,t,n=8){let r=(e.length+8)*n;t.fillStyle=`#ffffff`,t.fillRect(0,0,r,r),t.fillStyle=`#000000`,e.forEach((e,r)=>e.forEach((e,i)=>{e&&t.fillRect((i+4)*n,(r+4)*n,n,n)}))}function yr({load:e,onClose:t}){let[n,r]=F(null),[i,a]=F(null),[o,s]=F(null);I(()=>{let t=!0;return e().then(e=>{if(t)try{r({ssid:e.ssid,matrix:hr(gr(e.ssid,e.security,e.password))})}catch{a(`QR 코드를 생성할 수 없습니다.`)}}).catch(()=>{t&&a(`Wi-Fi 정보를 불러오지 못했습니다.`)}),()=>{t=!1,r(null)}},[e]);let c=n?.matrix.length??0;return L(`div`,{class:`fixed inset-0 z-50 flex items-center justify-center bg-slate-950/70 p-4`,role:`presentation`,onClick:e=>{e.target===e.currentTarget&&t()},children:L(`section`,{role:`dialog`,"aria-modal":`true`,"aria-label":`Wi-Fi QR 코드`,class:`w-full max-w-sm rounded-2xl bg-white p-5 text-center text-slate-950 shadow-2xl sm:p-7`,children:[L(`h2`,{class:`m-0 text-xl font-extrabold`,children:`Wi-Fi QR 코드`}),L(`p`,{class:`mt-2 break-all text-sm font-semibold text-slate-600`,children:n?.ssid??`Wi-Fi 정보를 확인하는 중`}),i?L(`p`,{role:`alert`,class:`my-6 text-sm font-bold text-red-700`,children:i}):null,!n&&!i?L(`p`,{class:`my-6 text-sm`,children:`QR 코드를 만드는 중...`}):null,n?L(`div`,{class:`mx-auto my-5 w-full max-w-[288px] rounded-xl border border-slate-200 bg-white p-3`,children:L(`svg`,{class:`block h-auto w-full`,viewBox:`0 0 ${c+8} ${c+8}`,role:`img`,"aria-label":`${n.ssid} Wi-Fi 연결 QR 코드`,"shape-rendering":`crispEdges`,children:[L(`rect`,{width:c+8,height:c+8,fill:`white`}),n.matrix.map((e,t)=>e.map((e,n)=>e?L(`rect`,{x:n+4,y:t+4,width:`1`,height:`1`,fill:`black`},`${t}-${n}`):null))]})}):null,L(`p`,{class:`text-xs leading-5 text-slate-500`,children:[L(`span`,{class:`block`,children:`카메라로 스캔해 Wi-Fi에 연결하세요.`}),L(`span`,{class:`block`,children:`QR 코드에는 비밀번호가 포함됩니다.`})]}),o?L(`p`,{role:`alert`,class:`mt-3 text-sm font-bold text-red-700`,children:o}):null,n?L(`button`,{class:`mt-5 inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl bg-teal-700 px-4 font-extrabold text-white transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200`,onClick:()=>{if(n){s(null);try{let e=(n.matrix.length+8)*8,t=document.createElement(`canvas`);t.width=e,t.height=e;let r=t.getContext(`2d`);if(!r)throw Error(`Canvas is not supported`);vr(n.matrix,r,8);let i=document.createElement(`a`);i.href=t.toDataURL(`image/png`),i.download=_r(n.ssid),i.click()}catch{s(`QR 코드 이미지를 저장하지 못했습니다. 다시 시도해 주세요.`)}}},type:`button`,children:[L(it,{class:`size-5`}),`QR 코드 다운로드`]}):null,L(`button`,{class:`mt-2 min-h-11 w-full rounded-xl border border-slate-300 bg-white px-4 font-extrabold text-slate-700 transition hover:bg-slate-50`,onClick:t,type:`button`,children:`닫기`})]})})}function br({guest:e,busy:t,saving:n,onUpdate:r,onLoadQr:i}){let[a,o]=F(!1),[s,c]=F(!1),[l,u]=F(e.ssid),[d,f]=F(``),[p,m]=F(e.enabled),[h,g]=F(null);if(I(()=>{u(e.ssid),m(e.enabled),f(``),g(null)},[e]),!e.supported)return L(`section`,{class:`mt-5 rounded-2xl border border-slate-200 bg-white p-5 sm:p-6`,children:[L(`h2`,{class:`m-0 text-lg font-extrabold text-slate-900`,children:`게스트 Wi-Fi`}),L(`p`,{class:`mt-2 mb-0 text-sm text-slate-600`,children:`2.4GHz 기본 Wi-Fi 장치를 찾지 못해 게스트 Wi-Fi를 사용할 수 없습니다.`})]});let _=l.trim()!==e.ssid||p!==e.enabled||d.length>0,y=t||_||!e.enabled||!e.passwordConfigured,b=async t=>{t.preventDefault();let n=l.trim(),i=new TextEncoder().encode(n).length;i<1||i>32?g(`Wi-Fi 이름은 UTF-8 기준 1~32바이트로 입력해 주세요.`):d&&!(d.length>=8&&d.length<=63||/^[0-9a-fA-F]{64}$/.test(d))?g(`비밀번호는 8~63자 또는 64자리 16진수여야 합니다.`):p&&!e.passwordConfigured&&!d?g(`게스트 전용 비밀번호를 입력해 주세요.`):window.confirm(`게스트 Wi-Fi 설정을 적용하면 무선 연결이 잠시 끊어질 수 있습니다. 계속하시겠습니까?`)&&(g(null),await r({ssid:n,enabled:p,password:d})&&f(``))};return L(v,{children:[L(`form`,{"aria-label":`게스트 Wi-Fi 설정`,class:`mt-5 rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void b(e),children:[L(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between`,children:[L(`button`,{"aria-controls":`ssh-guest-settings`,"aria-expanded":a,"aria-label":`게스트 Wi-Fi 설정 ${a?`접기`:`펼치기`}`,class:`flex min-w-0 flex-1 items-start gap-3 rounded-xl text-left focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:()=>o(e=>!e),type:`button`,children:[L(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:L(We,{class:`size-6`})}),L(`span`,{class:`min-w-0 flex-1`,children:[L(`span`,{class:`block text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`2.4 GHz · 분리 네트워크`}),L(`span`,{class:`mt-2 block text-xl font-extrabold tracking-tight text-slate-950`,children:`게스트 Wi-Fi`}),L(`span`,{class:`mt-2 block break-all text-sm text-slate-600`,children:e.ssid})]}),L(_t,{class:`mt-3 size-5 shrink-0 text-slate-500 transition-transform ${a?`rotate-180`:``}`})]}),L(`div`,{class:`flex flex-wrap items-center gap-2 sm:justify-end`,children:[_&&L(`span`,{"aria-live":`polite`,class:`inline-flex items-center gap-1 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,children:[L(B,{class:`size-3.5`}),`저장되지 않음`]}),L(`button`,{"aria-label":`게스트 Wi-Fi QR 코드 보기`,class:`inline-flex min-h-10 items-center gap-2 rounded-xl border border-slate-300 bg-white px-3.5 py-2 text-sm font-extrabold text-slate-800 transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:y,onClick:()=>c(!0),title:e.enabled?void 0:`게스트 Wi-Fi를 켜고 저장하면 QR 코드를 사용할 수 있습니다.`,type:`button`,children:[L(Ze,{class:`size-4 shrink-0`}),`QR 코드 보기`]}),L(`span`,{class:`rounded-full px-3 py-1.5 text-xs font-extrabold ${e.enabled?`bg-emerald-50 text-emerald-700`:`bg-slate-100 text-slate-600`}`,children:e.enabled?`사용 중`:`꺼짐`})]})]}),L(`div`,{class:a?``:`hidden`,id:`ssh-guest-settings`,children:[L(`p`,{class:`mt-5 mb-0 text-sm leading-6 text-slate-600`,children:`방문자는 인터넷만 이용하며 내부 네트워크와 공유기 관리 화면에는 접근할 수 없습니다.`}),L(`div`,{class:`mt-5 grid gap-5 lg:grid-cols-2`,children:[L(`label`,{class:`block`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`게스트 Wi-Fi 이름 (SSID)`}),L(`input`,{autocomplete:`off`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 outline-none focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:opacity-60`,disabled:t,maxLength:32,onInput:e=>u(e.currentTarget.value),value:l})]}),L(`label`,{class:`block`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`게스트 Wi-Fi 비밀번호`}),L(`input`,{autocomplete:`new-password`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 outline-none focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:opacity-60`,disabled:t,onInput:e=>f(e.currentTarget.value),placeholder:e.passwordConfigured?`비워 두면 기존 비밀번호 유지`:`8자 이상의 별도 비밀번호 입력`,type:`password`,value:d}),L(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`WPA2/WPA3 혼합 · 기본 Wi-Fi와 다른 비밀번호를 권장합니다.`})]})]}),L(`div`,{class:`mt-5 rounded-xl bg-slate-50 px-4 py-3 text-sm leading-6 text-slate-700`,children:[`내부망 접근 차단 · 게스트 기기 간 통신 차단 · SafeShield DNS 사용`,e.subnet&&L(`span`,{class:`block text-xs text-slate-500`,children:[`게스트 게이트웨이: `,e.subnet]})]}),L(`div`,{class:`mt-5 flex flex-col gap-4 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[L(`label`,{class:`inline-flex min-h-11 items-center gap-3 text-sm font-extrabold text-slate-800`,children:[L(`input`,{checked:p,class:`size-5 accent-teal-700`,disabled:t,onChange:e=>m(e.currentTarget.checked),type:`checkbox`}),`게스트 Wi-Fi 사용`]}),L(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:opacity-60 sm:w-auto`,disabled:t||!_,type:`submit`,children:[L(ut,{class:`size-5 ${n?`animate-pulse`:``}`}),n?`적용 중`:`설정 저장`]})]}),h&&L(`p`,{class:`mt-4 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:h})]})]}),s&&L(yr,{load:i,onClose:()=>c(!1)})]})}var xr=[{value:`sae-mixed`,label:`WPA2/WPA3 혼합 (권장)`},{value:`sae`,label:`WPA3-Personal`},{value:`psk2`,label:`WPA2-Personal`},{value:`none`,label:`암호화 없음`}];function Sr(e){switch(e.security){case`sae-mixed`:return`WPA2/WPA3 혼합`;case`sae`:return`WPA3-Personal`;case`psk2`:return`WPA2-Personal`;case`none`:return`암호화 없음`;default:return`고급 설정 (${e.securityRaw})`}}function Cr(e){return e.length>=8&&e.length<=63||/^[0-9a-fA-F]{64}$/.test(e)}function wr({network:e,busy:t,saving:n,onUpdate:r,onLoadQr:i}){let[a,o]=F(e.ssid),[s,c]=F(e.enabled),[l,u]=F(e.security===`custom`?`keep`:e.security),[d,f]=F(``),[p,m]=F(!1),h=Ee(()=>i(e.section),[i,e.section]),[g,_]=F(null);I(()=>{o(e.ssid),c(e.enabled),u(e.security===`custom`?`keep`:e.security),f(``),_(null)},[e]);let v=e.security===`custom`&&l===`keep`,y=l===`psk2`||l===`sae-mixed`||l===`sae`,b=e.security===`custom`?`keep`:e.security,x=a.trim()!==e.ssid||s!==e.enabled||l!==b||d.length>0,S=t||x||e.security===`custom`||!e.enabled||e.security!==`none`&&!e.passwordConfigured,C=[...e.security===`custom`?[{value:`keep`,label:`현재 고급 설정 유지 (${e.securityRaw})`}]:[],...xr],w=async t=>{t.preventDefault();let n=a.trim(),i=new TextEncoder().encode(n).length;i<1||i>32?_(`SSID는 UTF-8 기준 1~32바이트로 입력해 주세요.`):d&&!Cr(d)?_(`비밀번호는 8~63자 또는 64자리 16진수여야 합니다.`):y&&!e.passwordConfigured&&d.length===0?_(`보안 Wi-Fi를 사용하려면 비밀번호를 입력해 주세요.`):window.confirm(`Wi-Fi 설정을 적용하면 현재 무선 연결이 잠시 끊어질 수 있습니다. 계속하시겠습니까?`)&&(_(null),await r({section:e.section,ssid:n,security:l,password:d,enabled:s})&&f(``))};return L(`form`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void w(e),children:[L(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between`,children:[L(`div`,{class:`flex min-w-0 items-start gap-3`,children:[L(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:L(We,{class:`size-6`})}),L(`div`,{class:`min-w-0`,children:[L(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:e.bandLabel}),L(`h2`,{class:`mt-2 mb-0 break-words text-xl font-extrabold tracking-tight text-slate-950`,children:e.ssid||`이름 없는 Wi-Fi`}),L(`p`,{class:`mt-2 mb-0 text-sm text-slate-600`,children:[`채널 `,e.channel??`자동`,` · 연결 기기 `,e.clientCount,`대`]})]})]}),L(`div`,{class:`flex flex-wrap items-center gap-2 sm:justify-end`,children:[x?L(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[L(B,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]}):null,L(`button`,{"aria-label":`${e.bandLabel} Wi-Fi QR 코드 보기`,class:`inline-flex min-h-10 items-center gap-2 rounded-xl border border-slate-300 bg-white px-3.5 py-2 text-sm font-extrabold text-slate-800 shadow-sm transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:S,onClick:()=>m(!0),type:`button`,children:[L(Ze,{class:`size-4 shrink-0`}),`QR 코드 보기`]}),L(`span`,{class:`inline-flex w-fit items-center gap-2 rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${e.runtimeUp?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}`,children:[L(`span`,{class:`size-2 rounded-full ${e.runtimeUp?`bg-emerald-500`:`bg-slate-400`}`}),e.runtimeUp?`동작 중`:e.enabled?`시작 대기`:`꺼짐`]})]})]}),L(`div`,{class:`mt-6 grid gap-5 lg:grid-cols-2`,children:[L(`label`,{class:`block`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`Wi-Fi 이름 (SSID)`}),L(`input`,{autocomplete:`off`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:t,maxLength:32,onInput:e=>o(e.currentTarget.value),value:a})]}),L(`div`,{class:`block`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`보안 방식`}),L(Pn,{ariaLabel:`${e.bandLabel} Wi-Fi 보안 방식`,className:`mt-2`,disabled:t,id:`wifi-security-${e.section}`,onChange:e=>{let t=e;u(t),(t===`none`||t===`keep`)&&f(``)},options:C,value:l,variant:`emphasized`}),L(`span`,{class:`mt-2 block text-xs text-slate-500`,children:[`현재: `,Sr(e)]})]}),L(`label`,{class:`block lg:col-span-2`,children:[L(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`새 비밀번호`}),L(`input`,{autocomplete:`new-password`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:t||l===`none`||v,onInput:e=>f(e.currentTarget.value),placeholder:v?`고급 보안 설정은 기존 LuCI에서 변경합니다`:e.passwordConfigured?`비워 두면 기존 비밀번호를 유지합니다`:`8자 이상의 비밀번호를 입력하세요`,type:`password`,value:d}),L(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`저장된 비밀번호는 일반 설정 조회에 노출되지 않습니다. QR 코드에는 비밀번호가 포함됩니다.`})]})]}),L(`div`,{class:`mt-6 flex flex-col gap-4 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[L(`label`,{class:`inline-flex min-h-11 items-center gap-3 text-sm font-extrabold text-slate-800`,children:[L(`input`,{checked:s,class:`size-5 accent-teal-700`,disabled:t,onChange:e=>c(e.currentTarget.checked),type:`checkbox`}),`이 Wi-Fi 사용`]}),L(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl border-0 bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white shadow-sm transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:t||!x,type:`submit`,children:[L(ut,{class:`size-5 ${n?`animate-pulse`:``}`}),n?`적용 중`:`설정 저장`]})]}),p?L(yr,{load:h,onClose:()=>m(!1)}):null,g?L(`p`,{class:`mt-4 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:g}):null]})}function Tr({feedback:e,onDismiss:t}){return L(`div`,{"aria-live":`polite`,class:`mb-5 flex flex-col gap-3 rounded-2xl border px-4 py-3 text-sm sm:flex-row sm:items-center sm:justify-between ${e.kind===`success`?`border-emerald-200 bg-emerald-50 text-emerald-900`:e.kind===`warning`?`border-amber-200 bg-amber-50 text-amber-900`:`border-red-200 bg-red-50 text-red-900`}`,children:[L(`p`,{class:`m-0 font-bold leading-6`,children:e.message}),L(`button`,{class:`min-h-11 w-full shrink-0 rounded-lg border border-current bg-transparent sm:min-h-9 sm:w-auto px-3 py-1.5 text-xs font-extrabold`,onClick:t,type:`button`,children:`닫기`})]})}function Er({data:e,error:t,feedback:n,loading:r,updatingSection:i,onDismissFeedback:a,onRetry:o,onUpdate:s,onUpdateGuest:c,onLoadQr:l,onLoadGuestQr:u}){return r?L(zn,{}):t?L(Bn,{message:t,onRetry:o}):e?L(v,{children:[n?L(Tr,{feedback:n,onDismiss:a}):null,L(`section`,{class:`mb-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-amber-950 sm:p-6`,children:[L(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-amber-700`,children:`연결 주의`}),L(`h2`,{class:`mt-2 mb-0 text-lg font-extrabold`,children:`Wi-Fi 이름이나 비밀번호를 바꾸면 현재 연결이 끊어집니다`}),L(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-amber-900/80`,children:`변경한 Wi-Fi 이름과 비밀번호로 다시 연결하면 SmartSafeHub를 계속 사용할 수 있습니다. VLAN 등 고급 무선 옵션은 기존 LuCI에서 관리합니다.`})]}),L(V,{eyebrow:`Wireless`,title:`기본 Wi-Fi`,description:`무선 네트워크의 이름, 비밀번호, 보안 방식과 QR 코드를 관리합니다.`}),e.networks.length?L(`section`,{"aria-label":`기본 Wi-Fi 설정`,class:`grid gap-5 xl:grid-cols-2`,children:e.networks.map(e=>L(wr,{busy:i!==null,network:e,onUpdate:s,onLoadQr:l,saving:i===e.section},e.section))}):L(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 text-center shadow-sm shadow-slate-900/5 sm:p-8`,children:[L(We,{class:`mx-auto size-10 text-slate-400`}),L(`h2`,{class:`mt-4 mb-0 text-lg font-extrabold text-slate-950`,children:`관리할 기본 Wi-Fi를 찾지 못했습니다`}),L(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:`기존 LuCI에서 AP 모드의 무선 네트워크를 먼저 구성해 주세요.`})]}),e.guest&&L(v,{children:[L(`div`,{role:`separator`,"aria-label":`기본 Wi-Fi와 게스트 Wi-Fi 구분`,class:`mt-5 w-full border-t border-slate-200`}),L(`div`,{class:`mt-5`,children:L(V,{eyebrow:`Guest network`,title:`방문자용 네트워크`,description:`기본 네트워크와 분리된 게스트 Wi-Fi를 관리합니다.`})}),L(br,{guest:e.guest,busy:i!==null,saving:i===`ssh_guest`,onUpdate:c,onLoadQr:u})]}),e.guestError&&L(`section`,{class:`mt-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-sm text-amber-900`,role:`status`,children:[`게스트 Wi-Fi 정보를 불러오지 못했습니다. 패키지를 설치한 직후라면 로그아웃 후 다시 로그인해 주세요.`,L(`button`,{class:`ml-3 underline font-bold`,onClick:o,type:`button`,children:`다시 시도`})]})]}):null}function Dr({timestamp:e,fallback:t=`기록 없음`}){let[n,r]=F(()=>Date.now()/1e3),i=typeof e==`number`&&Number.isFinite(e)&&e>0&&e<=864e10;if(I(()=>{if(!i)return;r(Date.now()/1e3);let e=window.setInterval(()=>r(Date.now()/1e3),6e4);return()=>window.clearInterval(e)},[e,i]),!i||e==null)return L(`span`,{children:t});let a=Wt(e);return L(`span`,{class:`inline-flex max-w-full flex-wrap items-center gap-1`,children:[L(`time`,{class:`min-w-0`,dateTime:new Date(e*1e3).toISOString(),title:a,children:Kt(e,n)}),L(`details`,{class:`group inline-flex max-w-full flex-wrap items-center gap-1 align-middle`,children:[L(`summary`,{"aria-label":`정확한 날짜 및 시간 확인`,class:`inline-flex size-6 cursor-pointer list-none items-center justify-center rounded-full text-slate-400 transition hover:text-teal-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-teal-500 [&::-webkit-details-marker]:hidden`,title:`정확한 날짜 및 시간 확인`,children:L(`svg`,{"aria-hidden":`true`,class:`size-3.5`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,viewBox:`0 0 24 24`,children:[L(`circle`,{cx:`12`,cy:`12`,r:`9`}),L(`path`,{d:`M12 11v5m0-8h.01`,strokeLinecap:`round`})]})}),L(`span`,{class:`hidden max-w-full break-words rounded-md bg-slate-100 px-2 py-1 text-xs font-semibold text-slate-700 group-open:inline-block`,children:a})]})]})}function Or(e){return e.trim().toLowerCase().replace(/\.+$/,``)}function kr(e){return e.length===0||e.length>253||!e.includes(`.`)||!/^[a-z0-9.-]+$/.test(e)?!1:e.split(`.`).every(e=>e.length>0&&e.length<=63&&/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(e))}function Ar({action:e,kind:t,onAddRule:n,onDeleteRule:r,rules:i,recommendedDomains:a,recommendedKnown:o,recommendedRules:s,onRequestRevoke:c,revokeBusy:l}){let[u,d]=F(``),[f,p]=F(``),[m,h]=F(null),[g,_]=F(!0),[v,y]=F(null),b=t===`allow`,x=e!==null,S=Te(()=>{let e=f.trim().toLowerCase();return e?i.filter(t=>t.includes(e)):i},[i,f]),C=f.trim().length>0,w=b&&o?S.filter(e=>a.includes(e)):[],T=b&&o?S.filter(e=>!a.includes(e)):S,E=b?s.filter(e=>!C||e.title.toLowerCase().includes(f.trim().toLowerCase())||e.domains.some(e=>e.includes(f.trim().toLowerCase()))):[],D=C||(v??(s.length||w.length)<=3),O=C||g;async function k(e){e.preventDefault();let r=Or(u);kr(r)?(h(null),await n(t,r,()=>{d(e=>Or(e)===r?``:e)})):h(`example.com 형식의 도메인을 입력해 주세요. URL, IP 주소, 와일드카드는 사용할 수 없습니다.`)}let A=b?{badge:`bg-emerald-100 text-emerald-800`,button:`border-emerald-700 bg-emerald-700 text-white hover:border-emerald-800 hover:bg-emerald-800 focus-visible:ring-emerald-100`,icon:`bg-emerald-50 text-emerald-700`,label:`허용 목록`,description:`직접 허용하거나 웹사이트 추천으로 추가된 도메인을 관리합니다.`,empty:`등록된 허용 도메인이 없습니다.`}:{badge:`bg-red-100 text-red-800`,button:`border-red-700 bg-red-700 text-white hover:border-red-800 hover:bg-red-800 focus-visible:ring-red-100`,icon:`bg-red-50 text-red-700`,label:`차단 목록`,description:`SafeShield 기본 목록에 없더라도 직접 차단할 도메인을 등록합니다.`,empty:`등록된 차단 도메인이 없습니다.`};function j(n){let i=b&&o&&a.includes(n),s=!b||o?i?`추천 규칙`:`직접 추가`:null,c=e?.operation===`delete`&&e.action===t&&e.domain===n;return L(`li`,{class:`flex min-w-0 items-center justify-between gap-3 px-3.5 py-3`,children:[L(`div`,{class:`flex min-w-0 flex-1 flex-wrap items-center gap-2`,children:L(`code`,{class:`min-w-0 break-all font-mono text-sm font-semibold text-slate-800`,children:n})}),i?L(`span`,{class:`shrink-0 rounded-full bg-teal-50 px-2.5 py-1 text-[11px] font-bold text-teal-800`,title:`추천 규칙의 적용과 해제는 웹사이트에서 관리합니다.`,children:`웹사이트 관리`}):L(`button`,{"aria-label":`${n} ${A.label}에서 삭제`,class:`inline-flex size-9 shrink-0 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-500 transition hover:border-red-200 hover:bg-red-50 hover:text-red-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-red-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:x||i,onClick:()=>void r(t,n),title:s===`직접 추가`?`직접 추가한 규칙 삭제`:`삭제`,type:`button`,children:L(ft,{class:`size-4 ${c?`animate-pulse`:``}`})})]},n)}return L(`article`,{class:`min-w-0 overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm shadow-slate-900/5`,children:[L(`div`,{class:`border-b border-slate-200 p-4 sm:p-6`,children:[L(`div`,{class:`flex min-w-0 items-start gap-3`,children:[L(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl ${A.icon}`,children:L(b?ut:Ue,{class:`size-6`})}),L(`div`,{class:`min-w-0`,children:[L(`div`,{class:`flex flex-wrap items-center gap-2`,children:[L(`h2`,{class:`m-0 text-xl font-extrabold tracking-tight text-slate-950`,children:A.label}),L(`span`,{class:`rounded-full px-2.5 py-1 text-xs font-extrabold ${A.badge}`,children:i.length})]}),L(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:A.description})]})]}),L(`form`,{class:`mt-5`,onSubmit:k,children:[L(`label`,{class:`block text-xs font-extrabold text-slate-600`,for:`${t}-domain`,children:`새 도메인`}),L(`div`,{class:`mt-2 flex flex-col gap-2 sm:flex-row`,children:[L(`input`,{"aria-describedby":m?`${t}-domain-error`:void 0,"aria-invalid":m?!0:void 0,autocomplete:`off`,class:`min-h-11 min-w-0 flex-1 rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:x,id:`${t}-domain`,onInput:e=>d(e.currentTarget.value),placeholder:`example.com`,spellcheck:!1,type:`text`,value:u}),L(`button`,{class:`inline-flex min-h-11 w-full shrink-0 items-center justify-center gap-2 rounded-xl border px-4 py-2.5 text-sm font-extrabold transition focus:outline-none focus-visible:ring-4 disabled:cursor-not-allowed disabled:opacity-50 sm:w-auto ${A.button}`,disabled:x||u.trim().length===0,type:`submit`,children:[L(dt,{class:`size-4`}),e?.operation===`add`&&e.action===t?`추가 중…`:`추가`]})]}),m?L(`p`,{class:`mt-2 mb-0 text-xs font-semibold leading-5 text-red-700`,id:`${t}-domain-error`,children:m}):null]})]}),L(`div`,{class:`p-4 sm:p-6`,children:[L(`label`,{class:`relative block`,for:`${t}-search`,children:[L(`span`,{class:`sr-only`,children:[A.label,` 검색`]}),L(`span`,{class:`pointer-events-none absolute inset-y-0 left-0 flex w-11 items-center justify-center text-slate-400`,children:L(pt,{class:`size-4`})}),L(`input`,{class:`min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 py-2.5 pr-4 pl-11 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100`,id:`${t}-search`,onInput:e=>p(e.currentTarget.value),placeholder:`${A.label} 검색`,type:`search`,value:f})]}),b&&o?L(`div`,{class:`mt-4 overflow-hidden rounded-xl border border-slate-200`,children:[L(`section`,{"aria-label":`직접 추가한 허용 규칙`,children:[L(`button`,{"aria-controls":`allow-manual-domains`,"aria-expanded":O,class:`flex min-h-14 w-full items-center justify-between gap-3 ssh-rule-group-toggle bg-slate-50 px-4 py-3 text-left focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>_(!O),type:`button`,children:[L(`span`,{class:`min-w-0 text-sm font-extrabold text-slate-800`,children:[`직접 추가한 규칙 `,L(`span`,{class:`ml-1 rounded-full bg-white px-2 py-0.5 text-xs font-bold text-slate-600`,children:[T.length,C?`개 검색됨`:`개`]})]}),L(`span`,{"aria-hidden":`true`,class:`shrink-0 text-sm font-bold text-slate-500`,children:O?`접기 −`:`펼치기 +`})]}),L(`div`,{hidden:!O,id:`allow-manual-domains`,children:T.length?L(`ul`,{class:`m-0 max-h-[20rem] list-none divide-y divide-slate-200 overflow-y-auto p-0`,children:T.map(j)}):L(`p`,{class:`m-0 px-4 py-5 text-sm text-slate-500`,children:C?`검색 결과가 없습니다.`:`직접 추가한 허용 도메인이 없습니다.`})})]}),L(`section`,{"aria-label":`웹사이트 추천 규칙`,class:`border-t border-slate-200`,children:[L(`button`,{"aria-controls":`allow-recommended-domains`,"aria-expanded":D,class:`flex min-h-14 w-full items-center justify-between gap-3 ssh-rule-group-toggle bg-slate-50 px-4 py-3 text-left focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>y(!D),type:`button`,children:[L(`span`,{class:`min-w-0 text-sm font-extrabold text-slate-800`,children:[`추천 규칙 `,L(`span`,{class:`ml-1 rounded-full bg-white px-2 py-0.5 text-xs font-bold text-teal-800`,children:[!C&&s.length?s.length:w.length,C?`개 검색됨`:`개`]})]}),L(`span`,{"aria-hidden":`true`,class:`shrink-0 text-sm font-bold text-slate-500`,children:D?`접기 −`:`펼치기 +`})]}),L(`div`,{hidden:!D,id:`allow-recommended-domains`,children:[E.length?L(`ul`,{class:`m-0 max-h-[22rem] list-none divide-y divide-slate-200 overflow-y-auto p-0`,children:E.map(e=>L(`li`,{class:`flex min-w-0 flex-wrap items-center justify-between gap-3 px-3.5 py-3`,children:[L(`div`,{class:`min-w-0 flex-1`,children:[L(`strong`,{class:`block break-words text-sm text-slate-900`,children:e.title}),L(`div`,{class:`mt-1 flex flex-wrap gap-1.5`,children:e.domains.map(e=>L(`code`,{class:`break-all text-xs text-slate-600`,children:e},e))})]}),c?L(`button`,{class:`shrink-0 rounded-lg border border-red-200 px-3 py-2 text-xs font-bold text-red-700 hover:bg-red-50 disabled:opacity-50`,disabled:l||x,onClick:()=>c(e),type:`button`,children:`적용 해제`}):L(`span`,{class:`text-xs text-slate-500`,children:`웹사이트 관리`})]},e.id))}):w.length?L(`ul`,{class:`m-0 max-h-[20rem] list-none divide-y divide-slate-200 overflow-y-auto p-0`,children:w.map(j)}):L(`p`,{class:`m-0 px-4 py-5 text-sm text-slate-500`,children:C?`검색 결과가 없습니다.`:`추천으로 추가된 허용 도메인이 없습니다.`}),C?null:L(`p`,{class:`m-0 border-t border-slate-100 px-4 py-3 text-xs leading-5 text-slate-500`,children:`추천 규칙은 이 공유기에서 적용 해제할 수 있습니다. 새 규칙의 적용은 SmartSafeHub 웹사이트에서 관리해 주세요.`})]})]})]}):L(`div`,{class:`mt-4 max-h-[28rem] overflow-y-auto rounded-xl border border-slate-200`,children:S.length?L(`ul`,{class:`m-0 list-none divide-y divide-slate-200 p-0`,children:S.map(j)}):L(`div`,{class:`px-5 py-10 text-center`,children:[L(mt,{class:`mx-auto size-8 text-slate-300`}),L(`p`,{class:`mt-3 mb-0 text-sm font-bold text-slate-600`,children:C?`검색 결과가 없습니다.`:A.empty})]})})]})]})}function jr({action:e,data:t,error:n,feedback:r,loading:i,onAddRule:a,onDeleteRule:o,onDismissFeedback:s,onRetry:c,onLoadRecommendedRulesStatus:l,onSyncRecommendedRules:u,onRevokeRecommendedRule:d}){let[f,p]=F(null),[m,h]=F(!1),[g,_]=F(!1),[y,b]=F(null),[x,S]=F(!1),[C,w]=F(!1),[T,E]=F(!1),D=we(null),O=we(null),k=we(c);k.current=c;let[A,j]=F(null),[M,ee]=F(null),te=f?.domains??[],ne=f?.rules??[],re=Ee(e=>{p(e),h(!0);let t=JSON.stringify([e.revision,e.domains,e.rules.map(e=>e.id),e.syncStatus]);O.current!==null&&O.current!==t&&k.current(),O.current=t,e.syncStatus===`confirmed`&&D.current===null&&ee(null),D.current!==null&&e.syncStatus===`confirmed`&&!e.rules.some(e=>e.id===D.current)&&(D.current=null,w(!1),E(!1),ee(null),j(`추천 규칙 적용 해제를 확인했습니다.`))},[]);I(()=>{if(!l)return;let e=l,t=!0,n=!1;function r(){n||g||x||(n=!0,e().then(e=>{t&&re(e)}).catch(()=>{}).finally(()=>{n=!1}))}r();let i=window.setInterval(r,15e3),a=()=>r(),o=()=>{document.hidden||r()};return window.addEventListener(`focus`,a),document.addEventListener(`visibilitychange`,o),()=>{t=!1,window.clearInterval(i),window.removeEventListener(`focus`,a),document.removeEventListener(`visibilitychange`,o)}},[t?.allow.join(` -`),l,g,x,re]),I(()=>{if(!C)return;let e=window.setTimeout(()=>E(!0),6e4);return()=>window.clearTimeout(e)},[C]);async function ie(){if(!(!u||g||x)){_(!0),ee(null),j(null);try{let e=await u();re(e),j(e.syncStatus===`confirmed`?`서버에서 규칙을 가져와 SafeShield 허용 목록을 확인했습니다.`:`추천 규칙 상태를 확인 중입니다. 진행 결과는 자동으로 갱신됩니다.`),c()}catch{ee(`추천 규칙을 동기화하지 못했습니다. 서버 연결 및 기기 등록 상태를 확인해 주세요.`)}finally{_(!1)}}}async function ae(){if(!y||x||!d)return;let e=y.id;D.current=e,S(!0),w(!0),E(!1),ee(null),j(null);try{let t=await d(e);re(t),b(null),D.current!==null&&j(`적용 해제 요청을 처리했습니다. 공유기의 허용 목록을 확인하고 있습니다.`),k.current()}catch{b(null),ee(`적용 해제 결과를 아직 확인하지 못했습니다. 공유기의 상태를 자동으로 다시 확인합니다.`);try{let e=await l?.();e&&re(e)}catch{}}finally{S(!1)}}let oe=f?.syncStage,se=f?.syncStatus===`pending`,ce=f?.syncStatus===`delayed`,le=f?.syncStatus===`failed`,N=oe===`server_sync`?`서버 동기화 중`:oe===`safeshield_refreshing`?`SafeShield 갱신 중`:oe===`applying`?`추천 규칙 적용 중`:oe===`verifying`?`허용 목록 확인 중`:ce?`재확인 지연`:le?`동기화 실패`:se?`동기화 대기`:`허용 목록 확인`,ue=oe===`safeshield_refreshing`&&se?`SafeShield가 보호 목록을 갱신하고 있습니다. 갱신이 끝나면 추천 규칙을 자동으로 다시 확인합니다.`:oe===`applying`&&se?`추천 규칙을 SafeShield 허용 목록에 반영하고 있습니다.`:oe===`verifying`&&se?`SafeShield 허용 목록에서 추천 규칙 반영 결과를 확인하고 있습니다.`:oe===`server_sync`&&se?`SmartSafeHub 서버에서 최신 추천 규칙을 확인하고 있습니다.`:ce?`서버 응답이 지연되고 있습니다. 이미 확인한 허용 규칙은 유지되며 자동으로 다시 시도합니다.`:le?f?.syncReason===`auth_rejected`?`SmartSafeHub 기기 인증이 거부되었습니다. 공유기 계정 연결 상태를 확인해 주세요.`:f?.syncReason===`api_rejected`?`서버가 추천 규칙 요청을 거부했습니다. Hub API 배포 상태를 확인해 주세요.`:f?.syncReason===`invalid_response`?`서버 응답을 확인할 수 없습니다. 규칙은 유지되며 다음 동기화에서 다시 확인합니다.`:`추천 규칙 반영을 완료하지 못했습니다. 다음 자동 동기화에서 다시 시도합니다.`:se?`추천 규칙의 적용 결과를 기다리고 있습니다.`:null,de=C&&D.current!==null?{tone:`amber`,label:T?`적용 해제 처리 지연`:`적용 해제 확인 중`,description:T?`적용 해제 확인이 지연되고 있습니다. SafeShield 갱신 중이라면 완료 후 자동으로 재확인합니다.`:ue??`적용 해제 상태를 확인하고 있습니다. 확인되면 목록과 상태가 자동 갱신됩니다.`}:se||ce||le?{tone:le?`red`:`amber`,label:N,description:ue??``}:M?{tone:`red`,label:`상태 확인 필요`,description:M}:f?.syncWarning?{tone:`amber`,label:`서버 재확인 지연`,description:`이미 확인한 허용 규칙은 유지되며 자동으로 다시 시도합니다.`}:A?{tone:`green`,label:`허용 목록 확인`,description:A}:null;return i&&!t?L(zn,{}):n&&!t?L(Bn,{message:n,onRetry:c}):t?L(v,{children:[y?L(`div`,{class:`fixed inset-0 z-50 flex items-center justify-center bg-slate-950/70 p-4`,role:`presentation`,onClick:()=>{x||b(null)},children:L(`section`,{"aria-labelledby":`recommended-revoke-title`,"aria-modal":`true`,class:`w-full max-w-md rounded-2xl border border-slate-200 bg-white p-5 shadow-xl`,onClick:e=>e.stopPropagation(),role:`dialog`,children:[L(`h2`,{class:`m-0 text-lg font-extrabold text-slate-950`,id:`recommended-revoke-title`,children:`추천 규칙 적용 해제`}),L(`p`,{class:`mt-3 text-sm text-slate-700`,children:[L(`strong`,{children:y.title}),` 규칙을 이 공유기에서 해제할까요?`]}),L(`p`,{class:`mt-2 text-xs leading-5 text-slate-600`,children:[`포함된 도메인 `,y.domains.length,`개를 다시 확인합니다. 직접 추가한 허용 규칙과 다른 추천 규칙에 필요한 도메인은 유지됩니다.`]}),L(`div`,{class:`mt-5 flex justify-end gap-2`,children:[L(`button`,{class:`rounded-lg border border-slate-200 px-4 py-2 text-sm font-bold text-slate-700 disabled:cursor-wait disabled:opacity-50`,disabled:x,onClick:()=>b(null),type:`button`,children:`취소`}),L(`button`,{class:`inline-flex min-w-24 items-center justify-center gap-2 rounded-lg bg-red-700 px-4 py-2 text-sm font-bold text-white transition hover:bg-red-800 disabled:cursor-progress disabled:bg-red-700 disabled:opacity-80`,"aria-busy":x,disabled:x,onClick:()=>void ae(),type:`button`,children:[x?L(`svg`,{class:`size-4 animate-spin`,"aria-hidden":`true`,viewBox:`0 0 24 24`,fill:`none`,children:[L(`circle`,{cx:`12`,cy:`12`,r:`9`,stroke:`currentColor`,"stroke-width":`3`,opacity:`0.25`}),L(`path`,{d:`M21 12a9 9 0 0 0-9-9`,stroke:`currentColor`,"stroke-width":`3`,"stroke-linecap":`round`})]}):null,L(`span`,{role:`status`,children:x?`해제 중…`:`적용 해제`})]})]})]})}):null,L(V,{eyebrow:`Local overrides`,title:`사용자 도메인 규칙`,description:`허용 목록은 오탐을 해제하고, 차단 목록은 원하는 도메인을 SafeShield 보호 목록에 추가합니다.`}),L(`section`,{"aria-label":`규칙 개수 요약`,class:`min-w-0`,children:L(`dl`,{class:`m-0 grid grid-cols-1 gap-3 sm:grid-cols-3`,children:[L(`div`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white px-5 py-4 shadow-sm shadow-slate-900/5`,children:[L(`dt`,{class:`text-sm font-extrabold text-emerald-700`,children:`허용 도메인`}),L(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight text-slate-950`,children:[t.counts.allow,L(`span`,{class:`ml-1 text-sm font-bold text-slate-500`,children:`개`})]}),L(`p`,{class:`mt-1 mb-0 text-xs text-slate-500`,children:`차단하지 않도록 등록한 도메인`})]}),L(`div`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white px-5 py-4 shadow-sm shadow-slate-900/5`,children:[L(`dt`,{class:`text-sm font-extrabold text-red-700`,children:`차단 도메인`}),L(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight text-slate-950`,children:[t.counts.block,L(`span`,{class:`ml-1 text-sm font-bold text-slate-500`,children:`개`})]}),L(`p`,{class:`mt-1 mb-0 text-xs text-slate-500`,children:`추가로 차단하도록 등록한 도메인`})]}),L(`div`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white px-5 py-4 shadow-sm shadow-slate-900/5`,children:[L(`dt`,{class:`text-sm font-extrabold text-slate-600`,children:`전체 등록 규칙`}),L(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight text-slate-950`,children:[t.counts.total,L(`span`,{class:`ml-1 text-sm font-bold text-slate-500`,children:`개`})]}),L(`p`,{class:`mt-1 mb-0 text-xs text-slate-500`,children:`허용 및 차단 규칙의 합계`})]})]})}),L(`div`,{class:`mt-7`,children:L(V,{eyebrow:`Recommendations`,title:`추천 사용자 규칙`,description:`웹사이트에서 선택한 권장 허용 규칙의 동기화 상태를 확인하고 관리합니다.`})}),L(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,"aria-label":`추천 사용자 규칙`,children:[L(`div`,{class:`flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between`,children:[L(`div`,{class:`min-w-0 flex-1`,children:[L(`div`,{class:`flex flex-wrap items-center gap-2`,children:[L(`span`,{class:`grid size-8 place-items-center rounded-lg bg-teal-50 text-teal-700`,children:L(ut,{class:`size-4`})}),L(`h3`,{class:`m-0 text-base font-extrabold text-slate-950`,children:`동기화 상태`}),l?L(`span`,{"aria-live":`polite`,class:`rounded-full px-2.5 py-1 text-xs font-bold ${f?.syncStatus===`confirmed`?`bg-emerald-100 text-emerald-800`:f?.syncStatus===`failed`?`bg-red-100 text-red-800`:`bg-amber-100 text-amber-800`}`,children:f?.syncStatus===`confirmed`?`허용 목록 확인`:N}):null]}),L(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:`웹사이트에서 선택한 허용 규칙을 약 30초마다 확인합니다. 적용 해제는 이 공유기에서도 할 수 있습니다.`}),L(`div`,{class:`mt-2 flex flex-wrap items-center gap-x-4 gap-y-1 text-xs font-semibold text-slate-600`,children:[L(`span`,{children:[`추천으로 추가 `,L(`strong`,{class:`text-teal-800`,children:[m?te.length:`—`,`개 도메인`]})]}),f?.syncStatus===`confirmed`?L(`span`,{children:[`허용 확인 `,L(`strong`,{class:`text-emerald-800`,children:[f.confirmedDomains.length,`개`]})]}):null,f?.lastCheckedAt?L(`span`,{children:[f.syncWarning?`최근 재확인 시도`:`최근 확인`,`: `,L(Dr,{timestamp:f.lastCheckedAt})]}):null]})]}),L(`div`,{class:`flex w-full flex-wrap gap-2 sm:w-auto lg:shrink-0`,children:[u?L(`button`,{class:`inline-flex min-h-10 flex-1 items-center justify-center rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-800 transition hover:bg-slate-50 disabled:cursor-wait disabled:opacity-60 sm:flex-none`,disabled:g,onClick:()=>void ie(),type:`button`,children:g?`동기화 중…`:`지금 동기화`}):null,L(`a`,{class:`inline-flex min-h-10 flex-1 items-center justify-center rounded-xl border border-teal-700 bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 sm:flex-none`,href:`https://www.smartsafehub.com/dashboard/recommended-rules/`,target:`_blank`,rel:`noopener noreferrer`,children:`추천 규칙 보기 ↗`})]})]}),de?L(`div`,{"aria-live":`polite`,class:`mt-3 flex items-start gap-2 rounded-xl px-3 py-2.5 text-sm ${de.tone===`red`?`bg-red-50 text-red-800`:de.tone===`green`?`bg-emerald-50 text-emerald-800`:`bg-amber-50 text-amber-800`}`,role:`status`,children:[L(`span`,{"aria-hidden":`true`,class:`mt-1 size-2 shrink-0 rounded-full ${de.tone===`red`?`bg-red-500`:de.tone===`green`?`bg-emerald-500`:`bg-amber-500`}`}),L(`div`,{class:`min-w-0`,children:[L(`strong`,{children:de.label}),L(`p`,{class:`mt-1 mb-0 leading-5`,children:de.description})]})]}):null,L(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`추천 규칙 동기화는 SafeShield 차단 목록 갱신과 별개입니다. 허용 목록 확인은 DNS 처리나 서비스 재생 성공을 보장하지 않습니다.`})]}),t.applyLocalOverrides?null:L(`section`,{class:`mt-4 flex items-start gap-3 rounded-2xl border border-amber-200 bg-amber-50 p-4`,role:`alert`,children:[L(B,{class:`mt-0.5 size-5 shrink-0 text-amber-700`}),L(`div`,{children:[L(`p`,{class:`m-0 text-sm font-extrabold text-amber-950`,children:`로컬 규칙 적용이 꺼져 있습니다`}),L(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-amber-800`,children:`규칙은 저장되지만 SafeShield의 apply_local_overrides 설정을 켜기 전까지 DNS에 반영되지 않습니다.`})]})]}),t.safeshieldEnabled?null:L(`section`,{class:`mt-4 flex items-start gap-3 rounded-2xl border border-slate-200 bg-slate-100 p-4`,role:`status`,children:[L(Ue,{class:`mt-0.5 size-5 shrink-0 text-slate-600`}),L(`div`,{children:[L(`p`,{class:`m-0 text-sm font-extrabold text-slate-950`,children:`SafeShield가 비활성화되어 있습니다`}),L(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-600`,children:`규칙을 미리 저장할 수 있으며, SafeShield를 켜고 차단 목록을 갱신하면 적용됩니다.`})]})]}),r?L(`section`,{"aria-live":`polite`,class:`mt-4 flex flex-col items-start gap-3 rounded-2xl border border-teal-200 bg-teal-50 sm:flex-row sm:justify-between p-4`,children:[L(`div`,{class:`flex min-w-0 items-start gap-3`,children:[L(ut,{class:`mt-0.5 size-5 shrink-0 text-teal-700`}),L(`p`,{class:`m-0 text-sm font-semibold leading-6 text-teal-950`,children:r})]}),L(`button`,{class:`shrink-0 rounded-lg border-0 bg-transparent px-2 py-1 text-xs font-extrabold text-teal-800 hover:bg-teal-100`,onClick:s,type:`button`,children:`닫기`})]}):null,n&&t?L(`section`,{"aria-live":`assertive`,class:`mt-4 flex items-start gap-3 rounded-2xl border border-red-200 bg-red-50 p-4`,children:[L(B,{class:`mt-0.5 size-5 shrink-0 text-red-700`}),L(`p`,{class:`m-0 text-sm font-semibold leading-6 text-red-900`,children:n})]}):null,L(`section`,{class:`mt-5 grid gap-5 xl:grid-cols-2`,children:[L(Ar,{action:e,kind:`allow`,onAddRule:a,onDeleteRule:o,rules:t.allow,recommendedDomains:te,recommendedKnown:m,recommendedRules:ne,...d?{onRequestRevoke:b}:{},revokeBusy:x}),L(Ar,{action:e,kind:`block`,onAddRule:a,onDeleteRule:o,rules:t.block,recommendedDomains:te,recommendedKnown:m,recommendedRules:ne,revokeBusy:x})]})]}):L(Bn,{message:`사용자 규칙 응답이 비어 있습니다.`,onRetry:c})}function Mr(e,t){if(!e||!t)return`unknown`;if(e===t)return`same`;let n=/^(\d+)\.(\d+)\.(\d+)(?:-r(\d+))?$/,r=n.exec(e),i=n.exec(t);if(!r||!i)return`different`;for(let e=1;e<=4;e+=1){let t=BigInt(r[e]||`0`),n=BigInt(i[e]||`0`);if(t>n)return`newer`;if(t=1048576?`${(e/1048576).toFixed(1)} MB`:`${(e/1024).toFixed(1)} KB`}function Pr(e){switch(e.phase){case`checking`:return`확인 중`;case`downloading`:return`다운로드 중`;case`verifying`:return`검증 중`;case`ready`:return`설치 준비 완료`;case`flashing`:return`설치 중`;case`error`:return`확인 필요`;default:return e.updateAvailable?`업데이트 가능`:e.lastCheckAt?`최신 상태`:`확인 전`}}function Fr(e){return e.phase===`error`?`bg-rose-50 text-rose-700 ring-rose-200`:e.phase===`checking`||e.phase===`downloading`||e.phase===`verifying`||e.phase===`flashing`?`bg-sky-50 text-sky-700 ring-sky-200`:e.phase===`ready`||e.updateAvailable?`bg-amber-50 text-amber-800 ring-amber-200`:e.lastCheckAt?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function Ir(e){return e.phase===`checking`||e.phase===`downloading`||e.phase===`verifying`||e.phase===`flashing`?L(z,{class:`size-3.5 animate-spin`}):e.phase===`error`?L(B,{class:`size-3.5`}):e.phase===`ready`||e.updateAvailable?L(it,{class:`size-3.5`}):e.lastCheckAt?L(ut,{class:`size-3.5`}):L(tt,{class:`size-3.5`})}function Lr({checked:e,disabled:t,onChange:n}){return L(`button`,{"aria-checked":e,"aria-label":`현재 설정 유지`,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${e?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:t,onClick:()=>n(!e),role:`switch`,type:`button`,children:L(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${e?`left-6`:`left-1`}`})})}function Rr({action:e,actionError:t,data:n,software:r,error:i,loading:a,message:o,reconnecting:s,uploadProgress:c,onCheck:l,onDiscard:u,onDismissFeedback:d,onInstall:f,onPrepare:p,onRetry:m,onUpload:h}){let g=we(null),[_,y]=F(null),[b,x]=F(!0),[S,C]=F(!1);I(()=>{n?.prepared&&x(n.prepared.allowBackup)},[n?.prepared]);let w=e!==null||n?.phase===`checking`||n?.phase===`downloading`||n?.phase===`verifying`||n?.phase===`flashing`,T=n?.phase===`ready`?n.prepared:null,E=e===`check`||n?.phase===`checking`,D=e===`prepare`||n?.phase===`downloading`||n?.phase===`verifying`,O=e===`upload`||e===`validate-upload`,k=n?.release?.bundledSoftware?.smartsafehub??null,A=r?.packages.find(e=>e.name===`luci-app-smartsafehub`)?.installedVersion??null,j=Mr(k,A),M=async()=>{_&&await h(_)&&(y(null),g.current&&(g.current.value=``))};return L(`article`,{class:`min-w-0 overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm shadow-slate-900/5`,"data-component":`firmware-update-card`,children:[L(`div`,{class:`p-5 sm:p-6`,children:[L(`div`,{class:`flex flex-col gap-5 lg:flex-row lg:items-start lg:justify-between`,children:[L(`div`,{class:`flex min-w-0 gap-4`,children:[L(`span`,{class:`grid size-12 shrink-0 place-items-center rounded-2xl bg-sky-50 text-sky-700`,children:L(We,{class:`size-6`})}),L(`div`,{class:`min-w-0`,children:[L(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-sky-700`,children:`Firmware update`}),L(`h2`,{class:`mt-2 mb-0 text-xl font-black text-slate-950 sm:text-2xl`,children:`펌웨어 업데이트`}),L(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500 lg:whitespace-nowrap`,children:`시스템 펌웨어를 확인하고 설치합니다. 온라인·수동 설치는 안전성 검증 후 진행됩니다.`})]})]}),n?L(`div`,{class:`flex shrink-0 flex-col gap-2 sm:flex-row lg:justify-end`,children:[L(`span`,{class:`inline-flex min-h-11 items-center justify-center gap-1.5 rounded-xl px-3 py-2 text-xs font-extrabold ring-1 ring-inset ${Fr(n)}`,children:[Ir(n),Pr(n)]}),L(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-800 transition hover:bg-slate-50 disabled:cursor-wait disabled:opacity-60`,disabled:w||T!==null,onClick:l,type:`button`,children:[L(z,{class:`size-4 ${E?`animate-spin`:``}`}),E?`확인 중...`:`펌웨어 확인`]}),n.updateAvailable&&!T?L(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl bg-sky-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-sky-800 disabled:cursor-wait disabled:opacity-60`,disabled:w,onClick:p,type:`button`,children:[D?L(z,{class:`size-4 animate-spin`}):L(it,{class:`size-4`}),D?`준비 중...`:`다운로드 및 검증`]}):null]}):null]}),t||o?L(`div`,{class:`mt-5 flex flex-col gap-3 rounded-xl border px-4 py-3 text-sm font-bold sm:flex-row sm:items-center sm:justify-between ${t?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[L(`span`,{children:t||o}),L(`button`,{class:`shrink-0 self-start rounded-lg px-3 py-1.5 text-xs font-extrabold hover:bg-black/5 sm:self-auto`,onClick:d,type:`button`,children:`닫기`})]}):null,s||n?.phase===`flashing`?L(`div`,{class:`mt-5 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:p-5`,role:`status`,children:L(`div`,{class:`flex gap-3`,children:[L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-amber-700 ring-1 ring-inset ring-amber-200`,children:L(z,{class:`size-5 animate-spin`})}),L(`div`,{children:[L(`strong`,{class:`block text-sm font-black text-amber-950`,children:`펌웨어를 설치하고 재부팅하고 있습니다.`}),L(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-amber-800`,children:`전원을 끄지 마세요. 현재 주소에서 공유기가 다시 응답하면 SmartSafeHub가 자동으로 새로고침됩니다.`})]})]})}):null,i&&!n?L(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 text-sm text-rose-800`,children:[L(`p`,{class:`m-0 font-bold`,children:i}),L(`button`,{class:`mt-3 rounded-lg border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700`,onClick:m,type:`button`,children:`다시 시도`})]}):a&&!n?L(`div`,{class:`mt-5 flex items-center gap-3 rounded-xl bg-slate-50 p-4 text-sm font-bold text-slate-500`,children:[L(z,{class:`size-4 animate-spin`}),`펌웨어 상태를 확인하고 있습니다.`]}):n?L(v,{children:[n.lastError?L(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 sm:p-5`,children:L(`div`,{class:`flex gap-3`,children:[L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-rose-700 ring-1 ring-inset ring-rose-200`,children:L(B,{class:`size-5`})}),L(`div`,{class:`min-w-0 flex-1`,children:[L(`strong`,{class:`block text-sm font-black text-rose-950`,children:`펌웨어 작업을 완료하지 못했습니다.`}),L(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-rose-800`,children:n.lastError.message}),L(`details`,{class:`mt-3 rounded-lg border border-rose-200 bg-white p-3`,children:[L(`summary`,{class:`cursor-pointer text-xs font-extrabold text-rose-800`,children:`상세 정보 보기`}),L(`p`,{class:`mt-2 mb-0 break-all font-mono text-[11px] text-slate-600`,children:n.lastError.code})]})]})]})}):null,n.current.metadataAvailable?null:L(`div`,{class:`mt-5 rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-xs leading-5 text-amber-900`,children:[L(`strong`,{class:`block font-extrabold`,children:`현재 펌웨어의 버전 정보를 완전히 확인할 수 없습니다.`}),L(`span`,{class:`mt-1 block text-amber-800`,children:`새 펌웨어를 설치하면 이후부터 정확한 설치 버전을 자동으로 확인할 수 있습니다.`}),L(`details`,{class:`mt-2`,children:[L(`summary`,{class:`cursor-pointer font-extrabold text-amber-800`,children:`기술 상세 보기`}),L(`p`,{class:`mt-2 mb-0 break-all font-mono text-[11px] leading-5 text-amber-800`,children:`SmartSafeHub build ID metadata is missing. Future images should include /usr/share/smartsafehub/firmware.json.`})]})]}),L(`dl`,{class:`mt-5 grid overflow-hidden rounded-xl border border-slate-200 bg-slate-200 sm:grid-cols-2 xl:grid-cols-4`,children:[L(`div`,{class:`bg-white p-4`,children:[L(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Device`}),L(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black text-slate-950`,children:n.current.deviceCode||n.current.boardName||`미확인`})]}),L(`div`,{class:`bg-white p-4`,children:[L(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Current version`}),L(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black text-slate-950`,children:n.current.releaseVersion||`미확인`}),n.current.buildId?L(`span`,{class:`mt-1 block break-all text-[11px] leading-5 text-slate-400`,children:[`빌드 ID `,n.current.buildId]}):n.current.openwrtVersion?L(`span`,{class:`mt-1 block text-[11px] leading-5 text-slate-400`,children:[`OpenWrt `,n.current.openwrtVersion]}):null]}),L(`div`,{class:`bg-white p-4`,children:[L(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Available version`}),L(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black ${n.updateAvailable?`text-amber-700`:`text-slate-950`}`,children:n.lastCheckAt?n.release?.version?`${n.release.version}${n.updateAvailable?``:` · 최신`}`:n.updateAvailable?`새 펌웨어`:`최신 버전`:`미확인`}),n.release?.buildId?L(`span`,{class:`mt-1 block break-all text-[11px] leading-5 text-slate-400`,children:[`빌드 ID `,n.release.buildId]}):null]}),L(`div`,{class:`bg-white p-4`,children:[L(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Last check`}),L(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-black text-slate-950`,children:L(Dr,{fallback:`아직 없음`,timestamp:n.lastCheckAt})})]})]})]}):null,n?.updateAvailable&&n.release?L(`section`,{class:`mt-5 rounded-xl border border-sky-200 bg-sky-50/60 p-4 sm:p-5`,"data-section":`available-firmware`,children:[L(`div`,{class:`flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-4`,children:[L(`div`,{children:[L(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-sky-700`,children:`Available firmware`}),L(`h3`,{class:`mt-2 mb-0 text-lg font-black text-slate-950`,children:`새 펌웨어가 있습니다.`}),L(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:[`펌웨어 `,n.release.version||`미확인`,` · `,Nr(n.release.sysupgrade.sizeBytes),` · `,(n.release.channel||n.settings.channel)===`beta`?`Beta`:`Stable`]})]}),L(`div`,{class:`flex shrink-0 flex-wrap items-center justify-start gap-2 sm:justify-end`,children:[L(`span`,{class:`rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-sky-700 ring-1 ring-inset ring-sky-200`,children:n.release.version||`Latest`}),k?L(`span`,{class:`inline-flex items-center gap-1.5 rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-slate-700 ring-1 ring-inset ring-sky-200`,"data-section":`firmware-bundled-software-chip`,children:[L(`span`,{class:`text-[11px] uppercase tracking-[0.12em] text-slate-500`,children:`관리 SW`}),L(`span`,{class:`text-slate-950`,children:k})]}):null]})]}),k?L(`div`,{class:`mt-4 rounded-xl border border-sky-100 bg-white p-4`,"data-section":`firmware-bundled-software`,children:[L(`div`,{class:`flex flex-wrap items-center justify-between gap-2`,children:[L(`span`,{class:`text-xs font-extrabold text-slate-800`,children:`포함된 관리 소프트웨어`}),L(`div`,{class:`flex flex-wrap items-center gap-2`,children:[L(`span`,{class:`text-sm font-black text-slate-950`,children:k}),j===`same`?L(`span`,{class:`rounded-full bg-emerald-50 px-2.5 py-1 text-[11px] font-extrabold text-emerald-700 ring-1 ring-inset ring-emerald-200`,children:`현재 버전과 동일`}):null]})]}),L(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-600`,children:j===`same`?`관리 소프트웨어는 이미 같은 버전입니다. 펌웨어 업데이트는 시스템 구성 요소를 갱신합니다.`:j===`older`?`현재 설치된 관리 소프트웨어(${A})보다 이전 버전이 포함되어 있습니다. 펌웨어 설치 전 버전을 확인해 주세요.`:j===`newer`?`현재 설치된 관리 소프트웨어(${A})보다 새 버전이 포함되어 있습니다.`:A?`현재 설치 버전 ${A} · 펌웨어 포함 버전 ${k}`:`이 펌웨어에 포함된 관리 소프트웨어 버전입니다.`})]}):null,n.release.releaseNotes.length?L(`ul`,{class:`mt-4 mb-0 space-y-2 rounded-xl bg-white p-4 pl-9 text-sm leading-6 text-slate-700 ring-1 ring-inset ring-sky-100`,children:n.release.releaseNotes.map((e,t)=>L(`li`,{children:e},`${t}-${e}`))}):null]}):null,T?L(`section`,{class:`mt-5 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:p-5`,"data-section":`prepared-firmware`,children:L(`div`,{class:`flex gap-4`,children:[L(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-white text-amber-700 ring-1 ring-inset ring-amber-200`,children:L(ut,{class:`size-5`})}),L(`div`,{class:`min-w-0 flex-1`,children:[L(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-amber-700`,children:`Verified image`}),L(`h3`,{class:`mt-2 mb-0 text-lg font-black text-amber-950`,children:`설치할 펌웨어가 준비되었습니다.`}),L(`p`,{class:`mt-2 mb-0 break-all text-sm leading-6 text-amber-900`,children:[T.filename||`firmware.bin`,` · `,Nr(T.sizeBytes)]}),T.sha256?L(`p`,{class:`mt-2 mb-0 break-all font-mono text-[11px] leading-5 text-amber-800`,children:[`SHA-256 `,T.sha256]}):null,L(`div`,{class:`mt-5 flex items-start justify-between gap-4 rounded-xl border border-amber-200 bg-white p-4`,children:[L(`div`,{children:[L(`strong`,{class:`block text-sm font-black text-slate-950`,children:`현재 설정 유지`}),L(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:`Wi-Fi, SafeShield, SmartSafeHub 설정을 유지합니다.`}),T.allowBackup?null:L(`span`,{class:`mt-2 block text-xs font-bold text-rose-700`,children:`이 이미지는 설정 유지 업그레이드를 지원하지 않습니다.`})]}),L(Lr,{checked:b,disabled:!T.allowBackup,onChange:x})]}),S?L(`div`,{class:`mt-4 rounded-xl border border-rose-200 bg-rose-50 p-4`,children:[L(`strong`,{class:`block text-sm font-black text-rose-950`,children:`펌웨어 설치를 시작할까요?`}),L(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-rose-800`,children:`설치 중 전원을 끄면 장치가 복구 불가능한 상태가 될 수 있습니다. 이미지 검증은 설치 직전에 다시 수행됩니다.`}),L(`div`,{class:`mt-4 flex flex-wrap justify-end gap-2`,children:[L(`button`,{class:`min-h-10 rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700`,onClick:()=>C(!1),type:`button`,children:`취소`}),L(`button`,{class:`min-h-10 rounded-lg bg-rose-700 px-3 py-2 text-xs font-extrabold text-white`,onClick:()=>{C(!1),f(b)},type:`button`,children:`설치 시작`})]})]}):L(`div`,{class:`mt-4 flex flex-wrap justify-end gap-2`,children:[L(`button`,{class:`min-h-10 rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700`,disabled:e===`discard`,onClick:()=>void u(),type:`button`,children:`파일 삭제`}),L(`button`,{class:`inline-flex min-h-10 items-center gap-2 rounded-lg bg-rose-700 px-4 py-2 text-xs font-extrabold text-white`,onClick:()=>C(!0),type:`button`,children:[L(Je,{class:`size-4`}),`펌웨어 설치`]})]})]})]})}):null]}),L(`details`,{class:`group mx-5 mb-5 rounded-xl border border-slate-200 bg-slate-50/70 sm:mx-6 sm:mb-6`,"data-layout":`firmware-card-subsection`,"data-section":`manual-firmware`,children:[L(`summary`,{class:`flex cursor-pointer list-none items-center justify-between gap-4 px-4 py-4 sm:px-5 [&::-webkit-details-marker]:hidden`,children:[L(`div`,{class:`flex min-w-0 items-center gap-3`,children:[L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-slate-600 ring-1 ring-inset ring-slate-200`,children:L(it,{class:`size-5 rotate-180`})}),L(`div`,{class:`min-w-0`,children:[L(`strong`,{class:`block text-sm font-black text-slate-950`,children:`수동 펌웨어 설치`}),L(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:`펌웨어 파일(.bin)을 직접 업로드하여 검증한 뒤 설치합니다.`})]})]}),L(`span`,{class:`shrink-0 rounded-full bg-white px-3 py-1.5 text-[11px] font-extrabold text-slate-600 ring-1 ring-inset ring-slate-200 group-open:hidden`,children:`열기`}),L(`span`,{class:`hidden shrink-0 rounded-full bg-white px-3 py-1.5 text-[11px] font-extrabold text-slate-600 ring-1 ring-inset ring-slate-200 group-open:inline-flex`,children:`닫기`})]}),L(`div`,{class:`border-t border-slate-200 px-5 pb-5 pt-3 sm:px-6`,children:[L(`p`,{class:`mt-0 mb-4 text-xs leading-5 text-slate-500 lg:whitespace-nowrap`,children:"이 장치에 맞는 Sysupgrade 이미지(.bin)만 사용하세요. 업로드한 파일은 이미지 검증과 `sysupgrade --test`를 모두 통과해야 설치할 수 있으며 강제 설치는 제공하지 않습니다."}),L(`div`,{class:`rounded-xl border border-slate-200 bg-white p-4 sm:p-5`,"data-layout":`firmware-file-picker`,children:[L(`input`,{accept:`.bin,application/octet-stream`,"aria-label":`펌웨어 파일 선택`,class:`sr-only`,disabled:w||T!==null,onChange:e=>y(e.currentTarget.files?.[0]??null),ref:g,type:`file`}),L(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between`,children:[L(`div`,{class:`flex min-w-0 items-center gap-3`,children:[L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-50 text-slate-500 ring-1 ring-inset ring-slate-200`,children:L(it,{class:`size-5 rotate-180`})}),L(`div`,{class:`min-w-0`,children:[L(`strong`,{class:`block truncate text-sm font-black text-slate-900`,children:_?_.name:`펌웨어 파일을 선택하세요`}),L(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:_?`${Nr(_.size)} · Sysupgrade 이미지 (.bin)`:`이 장치에 맞는 Sysupgrade 이미지 (.bin)를 선택합니다.`})]})]}),L(`div`,{class:`flex shrink-0 flex-wrap gap-2 sm:justify-end`,children:[L(`button`,{class:`inline-flex min-h-10 items-center justify-center rounded-lg border border-slate-300 bg-white px-3.5 py-2 text-xs font-extrabold text-slate-700 transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50`,disabled:w||T!==null,onClick:()=>g.current?.click(),type:`button`,children:_?`다른 파일 선택`:`파일 선택`}),L(`button`,{class:`inline-flex min-h-10 items-center justify-center gap-2 rounded-lg bg-slate-900 px-3.5 py-2 text-xs font-extrabold text-white transition hover:bg-slate-800 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!_||w||T!==null,onClick:()=>void M(),type:`button`,children:[O?L(z,{class:`size-4 animate-spin`}):L(it,{class:`size-4 rotate-180`}),O?`처리 중...`:`업로드 및 검증`]})]})]}),c===null?null:L(`div`,{class:`mt-4 border-t border-slate-100 pt-4`,children:[L(`div`,{class:`mb-2 flex items-center justify-between gap-3 text-xs font-bold text-slate-600`,children:[L(`span`,{children:`업로드 중`}),L(`span`,{children:[c,`%`]})]}),L(`div`,{class:`h-2 overflow-hidden rounded-full bg-slate-200`,children:L(`div`,{class:`h-full rounded-full bg-sky-600 transition-[width]`,style:{width:`${Math.max(0,Math.min(100,c))}%`}})})]})]})]})]})]})}var zr=Array.from({length:24},(e,t)=>{let n=String(t).padStart(2,`0`);return{value:n,label:`${n}시`}}),Br=Array.from({length:60},(e,t)=>{let n=String(t).padStart(2,`0`);return{value:n,label:`${n}분`}});function Vr(e){let t=/^([01]\d|2[0-3]):([0-5]\d)$/.exec(e);return{hour:t?.[1]??`03`,minute:t?.[2]??`00`}}function Hr({ariaLabel:e,className:t=``,disabled:n=!1,id:r,onChange:i,value:a,variant:o=`default`}){let{hour:s,minute:c}=Vr(a),l=(e,t)=>{i(`${e}:${t}`)};return L(`div`,{"aria-label":e,class:`ssh-time-select ${t}`.trim(),"data-time-select":r,role:`group`,children:[L(Pn,{ariaLabel:`${e} 시`,disabled:n,id:`${r}-hour`,onChange:e=>l(e,c),options:zr,value:s,variant:o}),L(Pn,{ariaLabel:`${e} 분`,disabled:n,id:`${r}-minute`,onChange:e=>l(s,e),options:Br,value:c,variant:o})]})}var Ur=7200;function Wr(e,t=Math.floor(Date.now()/1e3)){return!e||!e.settings.checkEnabled||e.phase===`checking`||!e.lastCheckAt?!1:Math.max(0,t-e.lastCheckAt)>Math.max(e.settings.checkIntervalSeconds*2,Ur)}var Gr=[{value:3600,label:`1시간마다`},{value:21600,label:`6시간마다`},{value:43200,label:`12시간마다`},{value:86400,label:`24시간마다`}],Kr=`luci-app-smartsafehub`;function qr(e){return e?new Date(e*1e3).toLocaleString(`ko-KR`,{dateStyle:`medium`,timeStyle:`short`}):`아직 없음`}function Jr(e){return e===`stable`?`Stable`:e===`beta`?`Beta`:`미확인`}function Yr(e){return e===`stable`?`bg-emerald-50 text-emerald-700 ring-emerald-200`:e===`beta`?`bg-amber-50 text-amber-700 ring-amber-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function Xr(e){return e.code===`UPDATES_INDEX_REFRESH_FAILED`?{title:`패키지 저장소를 확인하지 못했습니다.`,description:`OpenWrt 패키지 저장소 동기화 또는 네트워크 상태가 일시적으로 불안정할 수 있습니다. 잠시 후 업데이트 확인을 다시 실행해 주세요.`}:e.code===`UPDATES_INSTALL_FAILED`?{title:`관리 소프트웨어 업데이트 설치에 실패했습니다.`,description:`패키지 설치가 완료되지 않았습니다. 네트워크 연결과 저장 공간을 확인한 뒤 다시 시도해 주세요.`}:{title:`최근 업데이트 작업을 완료하지 못했습니다.`,description:`잠시 후 다시 시도해 주세요. 문제가 반복되면 상세 정보를 확인해 주세요.`}}function Zr(e,t){return e.phase===`checking`?`업데이트 확인 중`:e.phase===`installing`?`업데이트 설치 중`:e.phase===`error`?`확인 필요`:e.updateCount>0?`업데이트 가능`:t?`업데이트 확인 지연`:e.lastCheckAt?`최신 상태`:`확인 전`}function Qr(e,t){return e.phase===`error`?`bg-rose-50 text-rose-700 ring-rose-200`:e.phase===`checking`||e.phase===`installing`?`bg-sky-50 text-sky-700 ring-sky-200`:e.updateCount>0||t?`bg-amber-50 text-amber-800 ring-amber-200`:e.lastCheckAt?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function $r(e,t){return e.phase===`checking`||e.phase===`installing`?L(z,{class:`size-3.5 shrink-0 animate-spin`}):e.phase===`error`?L(B,{class:`size-3.5 shrink-0`}):e.updateCount>0?L(it,{class:`size-3.5 shrink-0`}):t?L(B,{class:`size-3.5 shrink-0`}):e.lastCheckAt?L(ut,{class:`size-3.5 shrink-0`}):L(tt,{class:`size-3.5 shrink-0`})}function ei({checked:e,disabled:t=!1,label:n,onChange:r}){return L(`button`,{"aria-checked":e,"aria-label":n,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${e?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:t,onClick:()=>r(!e),role:`switch`,type:`button`,children:L(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${e?`left-6`:`left-1`}`})})}function ti({action:e,actionError:t,data:n,firmware:r,error:i,loading:a,message:o,onCheck:s,onDismissFeedback:c,onInstall:l,onRetry:u,onSaveSettings:d}){let[f,p]=F(!0),[m,h]=F(21600),[g,_]=F(!1),[y,b]=F(`03:00`),[x,S]=F(!1),[C,w]=F(!1);I(()=>{n&&!x&&(p(n.settings.checkEnabled),h(n.settings.checkIntervalSeconds),_(n.settings.autoInstall),b(n.settings.autoInstallTime))},[n,x]);let T=e===`check`||n?.phase===`checking`,E=e===`install`||n?.phase===`installing`,D=T||E,O=Wr(n),k=n?.phase===`error`&&n.lastError?.code===`UPDATES_INDEX_REFRESH_FAILED`,A=n?.lastError?Xr(n.lastError):null,j=n?.packages.find(e=>e.name===Kr)??n?.packages[0]??null,M=r?.updateAvailable?r.release?.bundledSoftware?.smartsafehub:null,ee=!(!n?.lastCheckAt||n.updateCount!==0||O||j?.name!==Kr)&&Mr(M,j?.installedVersion)===`same`,te=(e={})=>n?(e.checkEnabled??f)!==n.settings.checkEnabled||(e.checkIntervalSeconds??m)!==n.settings.checkIntervalSeconds||(e.autoInstall??g)!==n.settings.autoInstall||(e.autoInstallTime??y)!==n.settings.autoInstallTime:!1,ne=async()=>{await d({checkEnabled:f,checkIntervalSeconds:m,autoInstall:g,autoInstallTime:y})&&S(!1)};return L(`article`,{class:`min-w-0 overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm shadow-slate-900/5 ${n?`grid xl:grid-cols-[minmax(0,0.95fr)_minmax(0,1.05fr)]`:``}`,"data-component":`management-software-update-card`,"data-layout":`management-software-sections`,children:[L(`section`,{class:`min-w-0 xl:col-start-1 xl:row-start-1`,"data-section":`software-update-status`,children:[L(`div`,{class:`p-5 sm:p-6`,children:[L(`div`,{class:`flex flex-col gap-5 lg:flex-row lg:items-start lg:justify-between`,children:[L(`div`,{class:`flex min-w-0 gap-4`,children:[L(`span`,{class:`grid size-12 shrink-0 place-items-center rounded-2xl bg-teal-50 text-teal-700`,children:L(Je,{class:`size-6`})}),L(`div`,{class:`min-w-0`,children:[L(`div`,{class:`flex flex-wrap items-center gap-2`,children:[L(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-teal-700`,children:`Management software`}),n?L(`span`,{class:`inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-extrabold ring-1 ring-inset ${Qr(n,O)}`,children:[L(`span`,{"aria-hidden":`true`,class:`flex items-center justify-center`,children:$r(n,O)}),Zr(n,O)]}):null]}),L(`h2`,{class:`mt-2 mb-0 text-xl font-black text-slate-950 sm:text-2xl`,children:`관리 소프트웨어 업데이트`}),L(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500 xl:whitespace-nowrap`,children:`새 버전을 확인하고 안전하게 설치합니다.`})]})]}),n?L(`div`,{class:`flex shrink-0 flex-col gap-2 sm:flex-row lg:justify-end`,children:[L(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-800 transition hover:bg-slate-50 disabled:cursor-wait disabled:opacity-60`,disabled:D,onClick:s,type:`button`,children:[L(z,{class:`size-4 ${T?`animate-spin`:``}`}),T?`확인 중...`:`업데이트 확인`]}),n.updateCount>0&&!C?L(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:cursor-wait disabled:opacity-60`,disabled:D,onClick:()=>w(!0),type:`button`,children:[E?L(z,{class:`size-4 animate-spin`}):L(it,{class:`size-4`}),E?`설치 중...`:`업데이트 설치`]}):null]}):null]}),(t||o)&&L(`div`,{class:`mt-5 flex flex-col gap-3 rounded-xl border px-4 py-3 text-sm font-bold sm:flex-row sm:items-center sm:justify-between ${t?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[L(`span`,{children:t||o}),L(`button`,{class:`shrink-0 self-start rounded-lg px-3 py-1.5 text-xs font-extrabold hover:bg-black/5 sm:self-auto`,onClick:c,type:`button`,children:`닫기`})]}),E?L(`div`,{"aria-busy":`true`,"aria-live":`polite`,class:`mt-5 rounded-xl border border-sky-200 bg-sky-50 p-4 sm:p-5`,children:[L(`div`,{class:`flex items-start gap-3`,children:[L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-sky-700 ring-1 ring-inset ring-sky-200`,children:L(z,{"aria-hidden":`true`,class:`size-5 animate-spin`})}),L(`div`,{class:`min-w-0`,children:[L(`h3`,{class:`m-0 text-sm font-black text-sky-950`,children:`관리 소프트웨어를 업데이트하고 있습니다.`}),L(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-sky-800`,children:`설치가 완료되면 이 화면이 자동으로 갱신됩니다. 작업 중에는 웹 연결이 잠시 끊길 수 있습니다.`})]})]}),L(`div`,{"aria-hidden":`true`,class:`ssh-update-progress-track mt-4`,children:L(`span`,{class:`ssh-update-progress-bar`})})]}):null,i&&!n?L(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 text-sm text-rose-800`,children:[L(`p`,{class:`m-0 font-bold`,children:i}),L(`button`,{class:`mt-3 rounded-lg border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700`,onClick:u,type:`button`,children:`다시 시도`})]}):a&&!n?L(`div`,{class:`mt-5 flex items-center gap-3 rounded-xl bg-slate-50 p-4 text-sm font-bold text-slate-500`,children:[L(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-xl bg-white text-teal-700 ring-1 ring-inset ring-slate-200`,children:L(z,{"aria-hidden":`true`,class:`size-4 animate-spin`})}),L(`span`,{children:`관리 소프트웨어 업데이트 상태를 확인하고 있습니다.`})]}):n?L(v,{children:[n.lastError&&A?L(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 sm:p-5`,children:L(`div`,{class:`flex items-start gap-3`,children:[L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-rose-700 ring-1 ring-inset ring-rose-200`,children:L(B,{class:`size-5`})}),L(`div`,{class:`min-w-0 flex-1`,children:[L(`p`,{class:`m-0 text-sm font-extrabold text-rose-950`,children:A.title}),L(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-rose-800`,children:A.description}),n.lastError.at?L(`p`,{class:`mt-2 mb-0 text-xs font-bold text-rose-700`,children:[`발생 시각 `,qr(n.lastError.at)]}):null,L(`details`,{class:`mt-3 rounded-lg border border-rose-200 bg-white p-3`,children:[L(`summary`,{class:`cursor-pointer text-xs font-extrabold text-rose-800`,children:`상세 정보 보기`}),L(`div`,{class:`mt-3 grid gap-2 text-xs leading-5 text-slate-600`,children:[L(`p`,{class:`m-0`,children:[`오류 코드 `,L(`strong`,{class:`font-black text-slate-900`,children:n.lastError.code})]}),L(`pre`,{class:`m-0 max-h-40 overflow-auto whitespace-pre-wrap break-words rounded-lg bg-slate-50 p-3 font-mono text-[11px] leading-5 text-slate-700`,children:n.lastError.message})]})]})]})]})}):null,C?L(`div`,{class:`mt-5 flex flex-col gap-3 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:flex-row sm:items-center sm:justify-between`,children:[L(`div`,{class:`min-w-0`,children:[L(`strong`,{class:`block text-sm font-black text-amber-900`,children:`관리 소프트웨어를 지금 업데이트할까요?`}),L(`span`,{class:`mt-1 block text-xs leading-5 text-amber-800`,children:`설치 중 SmartSafeHub 웹 화면 연결이 잠시 끊길 수 있습니다.`})]}),L(`div`,{class:`flex shrink-0 gap-2`,children:[L(`button`,{class:`min-h-10 rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700`,disabled:D,onClick:()=>w(!1),type:`button`,children:`취소`}),L(`button`,{class:`min-h-10 rounded-lg bg-amber-700 px-3 py-2 text-xs font-extrabold text-white disabled:opacity-60`,disabled:D,onClick:()=>{w(!1),l()},type:`button`,children:`설치 시작`})]})]}):null]}):null]}),n?L(`div`,{class:`px-5 pb-5 sm:px-6 sm:pb-6`,children:[L(`h3`,{class:`mb-3 text-sm font-black text-slate-950`,children:`현재 상태`}),L(`dl`,{class:`grid overflow-hidden rounded-xl border border-slate-200 bg-slate-200 sm:grid-cols-2`,children:[L(`div`,{class:`bg-white p-4`,children:[L(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Installed`}),L(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black text-slate-950`,children:j?.installedVersion||`미확인`})]}),L(`div`,{class:`bg-white p-4`,children:[L(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Available`}),L(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black ${j?.updateAvailable||O?`text-amber-700`:`text-slate-950`}`,children:!n.lastCheckAt||k&&!j?.updateAvailable?`미확인`:j?.updateAvailable&&j.availableVersion?j.availableVersion:O?`확인 필요`:`최신 버전`})]}),L(`div`,{class:`bg-white p-4`,children:[L(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Last check`}),L(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-black text-slate-950`,children:L(Dr,{fallback:`아직 없음`,timestamp:n.lastCheckAt})})]}),L(`div`,{class:`bg-white p-4`,children:[L(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Auto install`}),L(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-black text-slate-950`,children:n.settings.autoInstall?`켜짐 · ${n.settings.autoInstallTime}`:`꺼짐`})]})]})]}):null,n&&n.updateCount===0&&n.lastCheckAt?O?L(`section`,{class:`mx-5 mb-5 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:mx-6 sm:mb-6 sm:p-5`,"data-section":`software-update-result`,children:L(`div`,{class:`flex gap-3`,children:[L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-amber-700 ring-1 ring-inset ring-amber-200`,children:L(B,{class:`size-5`})}),L(`div`,{children:[L(`h3`,{class:`m-0 text-base font-black text-amber-950`,children:`업데이트 확인이 지연되고 있습니다.`}),L(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-amber-800`,children:[`마지막 업데이트 확인: `,L(Dr,{timestamp:n.lastCheckAt}),`. 자동 확인 상태를 점검하거나 업데이트 확인을 실행해 주세요.`]})]})]})}):L(`section`,{class:`mx-5 mb-5 rounded-xl border border-emerald-200 bg-emerald-50 p-4 sm:mx-6 sm:mb-6 sm:p-5`,"data-section":`software-update-result`,children:L(`div`,{class:`flex gap-3`,children:[L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-emerald-700`,children:L(ut,{class:`size-5`})}),L(`div`,{children:[L(`h3`,{class:`m-0 text-base font-black text-emerald-950`,children:`최신 버전을 사용 중입니다.`}),L(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-emerald-800`,children:[`마지막 업데이트 확인: `,L(Dr,{timestamp:n.lastCheckAt}),`.`]}),ee?L(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-emerald-800`,"data-section":`software-firmware-match`,children:[`새 펌웨어에도 동일한 관리 소프트웨어(`,M,`)가 포함되어 있어 별도로 업데이트할 필요가 없습니다.`]}):null]})]})}):null,n&&n.updateCount===0&&!n.lastCheckAt?L(`section`,{class:`mx-5 mb-5 rounded-xl border border-slate-200 bg-slate-50 p-4 sm:mx-6 sm:mb-6 sm:p-5`,"data-section":`software-update-result`,children:L(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between`,children:[L(`div`,{class:`flex min-w-0 gap-3`,children:[L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-slate-500 ring-1 ring-inset ring-slate-200`,children:L(z,{class:`size-5`})}),L(`div`,{class:`min-w-0`,children:[L(`h3`,{class:`m-0 text-base font-black text-slate-900`,children:`업데이트 상태를 아직 확인하지 않았습니다.`}),L(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-600`,children:`업데이트 확인을 실행하면 현재 설치 버전과 사용 가능한 최신 버전을 확인합니다.`})]})]}),L(`button`,{class:`inline-flex min-h-10 shrink-0 items-center justify-center gap-2 rounded-xl border border-slate-300 bg-white px-4 py-2 text-sm font-extrabold text-slate-800 transition hover:border-teal-300 hover:text-teal-700 disabled:cursor-wait disabled:opacity-60`,disabled:D,onClick:s,type:`button`,children:[L(z,{class:`size-4`}),`지금 확인`]})]})}):null]}),n?L(v,{children:[L(`section`,{class:`min-w-0 border-t border-slate-200 p-5 sm:p-6 xl:col-start-2 xl:row-start-1 xl:row-span-2 xl:self-stretch xl:border-t-0 xl:border-l`,"data-section":`software-update-settings`,children:[L(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between`,children:[L(`div`,{class:`flex min-w-0 gap-4`,children:[L(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-600`,children:L(Ye,{class:`size-5`})}),L(`div`,{class:`min-w-0`,children:[L(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Settings`}),L(`h3`,{class:`mt-2 mb-0 text-lg font-black text-slate-950`,children:`자동 업데이트`}),L(`p`,{class:`mt-2 mb-0 max-w-3xl text-sm leading-6 text-slate-500`,children:`관리 소프트웨어의 자동 확인과 자동 설치를 설정합니다.`})]})]}),x?L(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 self-start items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[L(B,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]}):null]}),L(`div`,{class:`ssh-software-settings-grid mt-4`,children:[L(`div`,{class:`ssh-software-settings-channel rounded-xl border border-slate-200 p-4 sm:p-5`,children:L(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[L(`div`,{class:`min-w-0`,children:[L(`strong`,{class:`block text-sm font-black text-slate-950`,children:`업데이트 채널`}),L(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:`현재 관리 소프트웨어 업데이트를 확인하는 배포 채널입니다.`})]}),L(`span`,{class:`inline-flex min-h-9 shrink-0 items-center justify-center rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${Yr(n.settings.channel)}`,title:`현재 업데이트 확인 채널`,children:Jr(n.settings.channel)})]})}),L(`div`,{class:`min-w-0 overflow-hidden rounded-xl border border-slate-200 p-4 sm:p-5`,children:[L(`div`,{class:`flex min-w-0 items-start justify-between gap-4`,children:[L(`div`,{class:`min-w-0`,children:L(`strong`,{class:`block text-sm font-black text-slate-950`,children:`자동으로 업데이트 확인`})}),L(ei,{checked:f,label:`자동 업데이트 확인`,onChange:e=>{p(e),S(te({checkEnabled:e}))}})]}),L(`div`,{class:`mt-4 block`,children:[L(`span`,{class:`text-xs font-extrabold text-slate-700`,children:`확인 주기`}),L(Pn,{ariaLabel:`업데이트 확인 주기`,className:`mt-2`,disabled:!f,id:`software-update-check-interval`,onChange:e=>{let t=Number(e);h(t),S(te({checkIntervalSeconds:t}))},options:Gr.map(e=>({value:String(e.value),label:e.label})),value:String(m),variant:`emphasized`})]})]}),L(`div`,{class:`min-w-0 overflow-hidden rounded-xl border border-slate-200 p-4 sm:p-5`,children:[L(`div`,{class:`flex min-w-0 items-start justify-between gap-4`,children:[L(`div`,{class:`min-w-0`,children:L(`strong`,{class:`block text-sm font-black text-slate-950`,children:`자동으로 업데이트 설치`})}),L(ei,{checked:g,label:`자동 업데이트 설치`,onChange:e=>{_(e),S(te({autoInstall:e}))}})]}),L(`div`,{class:`mt-4 min-w-0`,children:[L(`span`,{class:`text-xs font-extrabold text-slate-700`,children:`설치 시각`}),L(Hr,{ariaLabel:`자동 업데이트 설치 시각`,className:`mt-2`,disabled:!g,id:`software-update-auto-install-time`,onChange:e=>{b(e),S(te({autoInstallTime:e}))},value:y,variant:`emphasized`})]})]})]}),g?L(`p`,{class:`mt-4 mb-0 rounded-xl bg-amber-50 px-4 py-3 text-xs font-bold leading-5 text-amber-800`,children:`자동 설치 중에는 SmartSafeHub 웹 화면 연결이 잠시 끊길 수 있습니다.`}):null,L(`div`,{class:`mt-5 flex flex-col gap-3 border-t border-slate-100 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[L(`p`,{class:`m-0 text-xs leading-5 text-slate-500`,children:[`마지막 설치: `,qr(n.lastInstallAt)]}),L(`button`,{class:`inline-flex min-h-11 items-center justify-center rounded-xl bg-slate-900 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-slate-800 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!x||e===`settings`||D,onClick:()=>void ne(),type:`button`,children:e===`settings`?`저장 중`:`자동 업데이트 설정 저장`})]})]}),n.updateCount>0?L(`section`,{class:`border-t border-slate-200 p-5 sm:p-6 xl:col-start-1 xl:row-start-2`,"data-section":`software-update-release-notes`,children:[L(`div`,{class:`flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-4`,children:[L(`div`,{children:[L(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-teal-700`,children:`Release notes`}),L(`h3`,{class:`mt-2 mb-0 text-lg font-black text-slate-950`,children:`업데이트 내용`}),L(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500`,children:`현재 설치된 버전 이후 포함되는 주요 변경 사항입니다.`})]}),n.releaseNotes.length?L(`span`,{class:`shrink-0 rounded-full bg-slate-100 px-3 py-1.5 text-xs font-extrabold text-slate-600`,children:n.releaseNotes.length===1?`1개 릴리즈`:`${n.releaseNotes.length}개 릴리즈`}):null]}),n.releaseNotes.length?L(`div`,{class:`mt-5 grid gap-3`,children:[n.releaseNotes.map(e=>L(`article`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4 sm:p-5`,children:[L(`div`,{class:`flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between sm:gap-4`,children:[L(`strong`,{class:`break-all text-sm font-black text-slate-950`,children:e.version}),e.date?L(`span`,{class:`text-xs font-bold text-slate-500`,children:e.date}):null]}),e.summary?L(`p`,{class:`mt-3 mb-0 text-sm leading-6 text-slate-700`,children:e.summary}):null,e.sections.length?L(`details`,{class:`mt-4 rounded-lg border border-slate-200 bg-white p-3`,open:n.releaseNotes.length===1,children:[L(`summary`,{class:`cursor-pointer text-xs font-extrabold text-slate-800`,children:`자세한 변경 사항`}),L(`div`,{class:`mt-3 grid gap-4`,children:e.sections.map(t=>L(`section`,{children:[L(`h4`,{class:`m-0 text-xs font-extrabold text-slate-700`,children:t.title}),L(`ul`,{class:`mt-2 mb-0 space-y-1.5 pl-5 text-xs leading-5 text-slate-600`,children:t.items.map((n,r)=>L(`li`,{children:n},`${e.version}-${t.title}-${r}`))})]},`${e.version}-${t.title}`))})]}):null]},e.version)),n.releaseNotesComplete?null:L(`p`,{class:`m-0 rounded-xl bg-amber-50 px-4 py-3 text-xs font-bold leading-5 text-amber-800`,children:`일부 릴리즈 노트를 불러오지 못했습니다. 업데이트 확인과 설치는 계속 사용할 수 있습니다.`})]}):L(`p`,{class:`mt-4 mb-0 rounded-xl bg-slate-50 px-4 py-3 text-sm text-slate-500`,children:`릴리즈 노트를 불러오지 못했습니다. 업데이트 확인과 설치는 계속 사용할 수 있습니다.`})]}):null]}):null]})}function ni({action:e,actionError:t,data:n,error:r,firmware:i,loading:a,message:o,onCheck:s,onDismissFeedback:c,onInstall:l,onRetry:u,onSaveSettings:d}){return L(`section`,{class:`min-w-0 space-y-5`,children:[L(`div`,{children:L(V,{eyebrow:`Firmware`,title:`시스템 펌웨어`,description:`공유기 운영체제의 새 버전을 확인하고 설치합니다.`})}),L(Rr,{action:i.action,actionError:i.actionError,data:i.data,software:n,error:i.error,loading:i.loading,message:i.message,reconnecting:i.reconnecting,uploadProgress:i.uploadProgress,onCheck:()=>void i.check(),onDiscard:i.discard,onDismissFeedback:i.dismissFeedback,onInstall:i.install,onPrepare:()=>void i.prepare(),onRetry:()=>void i.refresh(),onUpload:i.upload}),L(`div`,{class:`pt-2`,children:L(V,{eyebrow:`Software`,title:`관리 소프트웨어`,description:`SmartSafeHub 관리 화면 및 서비스의 업데이트를 확인합니다.`})}),L(ti,{firmware:i.data,action:e,actionError:t,data:n,error:r,loading:a,message:o,onCheck:s,onDismissFeedback:c,onInstall:l,onRetry:u,onSaveSettings:d})]})}var ri={"#home":`home`,"#activity":`activity`,"#network":`network`,"#network/internet":`network`,"#network/lan":`network`,"#wan":`network`,"#lan":`network`,"#wifi":`wifi`,"#iptv":`iptv`,"#devices":`devices`,"#safeshield":`safeshield`,"#rules":`rules`,"#account":`account`,"#system":`system`,"#settings":`settings`,"#settings/diagnostics":`settings`,"#settings/time":`settings`,"#settings/management":`settings`};function ii(){return ri[window.location.hash]??`home`}function ai(){let[e,t]=F(ii);return I(()=>{let e=()=>t(ii());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),e}function oi(e){return e===`#lan`||e===`#network/lan`?`lan`:`internet`}function si(e){return e===`#settings/time`?`time`:e===`#settings/management`?`management`:`diagnostics`}function ci(){let e=window.location.hash;return{network:oi(e),settings:si(e)}}function li(){let[e,t]=F(ci);return I(()=>{let e=()=>t(ci());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),e}function ui({active:e,label:t,tabs:n}){return L(`nav`,{"aria-label":t,class:`mb-5 min-w-0`,role:`tablist`,children:L(`div`,{class:`grid w-full min-w-0 gap-2 ${n.length===3?`grid-cols-3 sm:max-w-[592px]`:`grid-cols-2 sm:max-w-[392px]`}`,children:n.map(t=>{let r=t.id===e;return L(`a`,{"aria-controls":`${t.id}-panel`,"aria-selected":r,class:`flex min-h-11 min-w-0 items-center justify-center rounded-xl border px-2 py-2.5 text-center text-[11px] font-extrabold leading-5 transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-teal-500 sm:px-4 sm:text-sm ${r?`border-teal-200 bg-teal-50 text-teal-800`:`border-slate-200 bg-white text-slate-600 hover:border-teal-200 hover:text-teal-700`}`,href:t.href,id:`${t.id}-tab`,role:`tab`,tabIndex:r?0:-1,onKeyDown:e=>{if(![`ArrowLeft`,`ArrowRight`,`Home`,`End`].includes(e.key))return;e.preventDefault();let r=n.findIndex(e=>e.id===t.id),i=e.key===`Home`?0:e.key===`End`?n.length-1:(r+(e.key===`ArrowRight`?1:-1)+n.length)%n.length,a=e.currentTarget.parentElement?.children[i];a?.focus(),a?.click()},children:t.label},t.id)})})})}var di=[{value:`all`,label:`전체`},{value:`online`,label:`현재 연결`},{value:`wifi`,label:`Wi-Fi`},{value:`ethernet`,label:`유선/기타`},{value:`offline`,label:`최근 기기`}],fi=new Intl.Collator(`ko`),pi=new Intl.DateTimeFormat(`ko-KR`,{month:`numeric`,day:`numeric`,hour:`2-digit`,minute:`2-digit`});function mi(e){switch(e){case`wifi`:return`Wi-Fi`;case`ethernet`:return`유선/기타`;default:return`연결 방식 미확인`}}function hi(e){return e.hostname??e.ipv4Address??`이름 없는 기기`}function gi(e){return e===null?null:e>=-50?`매우 좋음`:e>=-60?`좋음`:e>=-70?`보통`:`약함`}function _i(e){if(e===null||e<0)return null;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}일 ${n}시간`:n>0?`${n}시간 ${r}분`:`${Math.max(r,1)}분`}function vi(e){return e.leaseActive?e.leaseExpiresAt===null?`DHCP 임대 활성`:`DHCP ${pi.format(new Date(e.leaseExpiresAt*1e3))}까지`:null}function yi(e,t){switch(t){case`online`:return e.online;case`wifi`:return e.online&&e.connection===`wifi`;case`ethernet`:return e.online&&e.connection===`ethernet`;case`offline`:return!e.online;default:return!0}}function bi({device:e}){return L(`span`,{class:`inline-flex items-center gap-2 rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${e.online?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}`,children:[L(`span`,{class:`size-2 rounded-full ${e.online?`bg-emerald-500`:`bg-slate-400`}`}),e.online?`현재 연결`:`최근 임대`]})}function xi({device:e}){let t=gi(e.signalDbm),n=_i(e.connectedSeconds),r=vi(e);return L(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:[L(`div`,{class:`flex min-w-0 flex-col items-start gap-4 sm:flex-row sm:justify-between`,children:[L(`div`,{class:`flex min-w-0 items-start gap-3`,children:[L(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl ${e.connection===`wifi`?`bg-teal-50 text-teal-700`:e.connection===`ethernet`?`bg-blue-50 text-blue-700`:`bg-slate-100 text-slate-600`}`,children:e.connection===`wifi`?L(Xe,{class:`size-6`}):e.connection===`ethernet`?L(Qe,{class:`size-6`}):L(Ge,{class:`size-6`})}),L(`div`,{class:`min-w-0`,children:[L(`h3`,{class:`m-0 break-words text-base font-extrabold text-slate-950`,children:hi(e)}),L(`p`,{class:`mt-1 mb-0 break-all font-mono text-xs leading-5 text-slate-500`,children:e.mac})]})]}),L(`span`,{class:`shrink-0 self-start`,children:L(bi,{device:e})})]}),L(`dl`,{class:`mt-5 grid gap-3 text-sm sm:grid-cols-2`,children:[L(`div`,{class:`rounded-xl bg-slate-50 p-3.5`,children:[L(`dt`,{class:`text-xs font-bold text-slate-500`,children:`IP 주소`}),L(`dd`,{class:`mt-1.5 mb-0 ml-0 font-extrabold text-slate-900`,children:e.ipv4Address??`확인되지 않음`})]}),L(`div`,{class:`rounded-xl bg-slate-50 p-3.5`,children:[L(`dt`,{class:`text-xs font-bold text-slate-500`,children:`연결 방식`}),L(`dd`,{class:`mt-1.5 mb-0 ml-0 font-extrabold text-slate-900`,children:mi(e.connection)})]})]}),L(`div`,{class:`mt-4 flex flex-wrap gap-2 text-xs font-bold text-slate-600`,children:[e.ssid?L(`span`,{class:`rounded-full bg-teal-50 px-3 py-1.5 text-teal-800`,children:[e.ssid,e.bandLabel?` · ${e.bandLabel}`:``]}):null,t?L(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:[`신호 `,t,` · `,e.signalDbm,` dBm`]}):null,n?L(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:[`연결 `,n]}):null,r?L(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:r}):null,e.interface?L(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:e.interface}):null]})]})}function Si({data:e,error:t,loading:n,onRetry:r}){let[i,a]=F(``),[o,s]=F(`all`),c=Te(()=>{if(!e)return[];let t=i.trim().toLocaleLowerCase();return[...e.devices].filter(e=>yi(e,o)).filter(e=>!t||[e.hostname,e.ipv4Address,e.mac,e.ssid].filter(e=>!!e).some(e=>e.toLocaleLowerCase().includes(t))).sort((e,t)=>e.online===t.online?e.connection===t.connection?fi.compare(hi(e),hi(t)):e.connection===`wifi`?-1:1:e.online?-1:1)},[e,o,i]);return n?L(zn,{}):t?L(Bn,{message:t,onRetry:r}):e?L(v,{children:[L(V,{eyebrow:`Overview`,title:`연결 기기 현황`,description:`네트워크에 연결되었거나 최근 확인된 기기를 요약합니다.`}),L(`section`,{"aria-label":`연결 기기 요약`,class:`grid gap-4 sm:grid-cols-2 xl:grid-cols-4`,children:[L(Ci,{description:`${e.totals.offline}대는 최근 DHCP 임대에서 확인`,icon:L(Ge,{class:`size-6`}),label:`확인된 기기`,value:e.totals.known}),L(Ci,{description:`Wi-Fi 또는 ARP에서 현재 확인됨`,icon:L(tt,{class:`size-6`}),label:`현재 연결`,value:e.totals.online}),L(Ci,{description:`무선 AP에 연결된 기기`,icon:L(Xe,{class:`size-6`}),label:`Wi-Fi`,value:e.totals.wireless}),L(Ci,{description:`LAN ARP에서 확인된 비무선 기기`,icon:L(Qe,{class:`size-6`}),label:`유선/기타`,value:e.totals.ethernet})]}),L(`section`,{class:`mt-7`,"aria-label":`기기 목록 및 필터`,children:[L(V,{eyebrow:`Device inventory`,title:`기기 목록`,description:`연결된 기기를 검색하고 무선·유선 상태별로 확인합니다.`}),L(`div`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:L(`div`,{class:`flex min-w-0 flex-col gap-3 lg:flex-row lg:items-center lg:justify-between`,children:[L(`div`,{class:`ssh-touch-scroll flex min-w-0 gap-2 overflow-x-auto pb-1 lg:flex-1`,role:`group`,"aria-label":`기기 필터`,children:di.map(e=>L(`button`,{"aria-pressed":o===e.value,class:`min-h-10 shrink-0 rounded-xl border px-4 py-2 text-sm font-extrabold transition ${o===e.value?`border-teal-700 bg-teal-700 text-white`:`border-slate-200 bg-white text-slate-600 hover:bg-slate-50 hover:text-slate-950`}`,onClick:()=>s(e.value),type:`button`,children:e.label},e.value))}),L(`label`,{class:`relative block w-full lg:w-72 lg:shrink-0 xl:w-80`,children:[L(`span`,{class:`sr-only`,children:`기기 검색`}),L(`span`,{class:`pointer-events-none absolute inset-y-0 left-0 flex w-11 items-center justify-center text-slate-400`,children:L(pt,{class:`size-5`})}),L(`input`,{class:`min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 py-2.5 pr-4 pl-11 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100`,onInput:e=>a(e.currentTarget.value),placeholder:`이름, IP, MAC 또는 SSID 검색`,type:`search`,value:i})]})]})})]}),c.length?L(`section`,{"aria-live":`polite`,class:`mt-5 grid gap-4 lg:grid-cols-2`,children:c.map(e=>L(xi,{device:e},e.id))}):L(`section`,{class:`mt-5 rounded-2xl border border-dashed border-slate-300 bg-white p-5 text-center sm:p-8`,children:[L(Ge,{class:`mx-auto size-10 text-slate-400`}),L(`h2`,{class:`mt-4 mb-0 text-lg font-extrabold text-slate-950`,children:`조건에 맞는 기기가 없습니다`}),L(`p`,{class:`mt-2 mb-0 text-sm text-slate-600`,children:`검색어 또는 필터를 변경해 주세요.`})]}),L(`p`,{class:`mt-5 mb-0 rounded-xl bg-slate-100 px-4 py-3 text-xs leading-5 text-slate-600`,children:`유선/기타 상태는 ARP 테이블을 기준으로 하며, 최근 DHCP 임대는 기기가 연결 해제된 뒤에도 일정 시간 남을 수 있습니다.`})]}):null}function Ci({description:e,icon:t,label:n,value:r}){return L(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:[L(`div`,{class:`flex items-start justify-between gap-4`,children:[L(`div`,{children:[L(`p`,{class:`m-0 text-xs font-bold uppercase tracking-[0.14em] text-slate-500`,children:n}),L(`p`,{class:`mt-3 mb-0 text-3xl font-black tracking-tight text-slate-950`,children:r})]}),L(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:t})]}),L(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:e})]})}function wi(e){return e+.5|0}var Ti=(e,t,n)=>Math.max(Math.min(e,n),t);function Ei(e){return Ti(wi(e*2.55),0,255)}function Di(e){return Ti(wi(e*255),0,255)}function Oi(e){return Ti(wi(e/2.55)/100,0,1)}function ki(e){return Ti(wi(e*100),0,100)}var Ai={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},ji=[...`0123456789ABCDEF`],Mi=e=>ji[e&15],Ni=e=>ji[(e&240)>>4]+ji[e&15],Pi=e=>(e&240)>>4==(e&15),Fi=e=>Pi(e.r)&&Pi(e.g)&&Pi(e.b)&&Pi(e.a);function Ii(e){var t=e.length,n;return e[0]===`#`&&(t===4||t===5?n={r:255&Ai[e[1]]*17,g:255&Ai[e[2]]*17,b:255&Ai[e[3]]*17,a:t===5?Ai[e[4]]*17:255}:(t===7||t===9)&&(n={r:Ai[e[1]]<<4|Ai[e[2]],g:Ai[e[3]]<<4|Ai[e[4]],b:Ai[e[5]]<<4|Ai[e[6]],a:t===9?Ai[e[7]]<<4|Ai[e[8]]:255})),n}var Li=(e,t)=>e<255?t(e):``;function Ri(e){var t=Fi(e)?Mi:Ni;return e?`#`+t(e.r)+t(e.g)+t(e.b)+Li(e.a,t):void 0}var zi=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Bi(e,t,n){let r=t*Math.min(n,1-n),i=(t,i=(t+e/30)%12)=>n-r*Math.max(Math.min(i-3,9-i,1),-1);return[i(0),i(8),i(4)]}function Vi(e,t,n){let r=(r,i=(r+e/60)%6)=>n-n*t*Math.max(Math.min(i,4-i,1),0);return[r(5),r(3),r(1)]}function Hi(e,t,n){let r=Bi(e,1,.5),i;for(t+n>1&&(i=1/(t+n),t*=i,n*=i),i=0;i<3;i++)r[i]*=1-t-n,r[i]+=t;return r}function Ui(e,t,n,r,i){return e===i?(t-n)/r+(t.5?l/(2-i-a):l/(i+a),s=Ui(t,n,r,l,i),s=s*60+.5),[s|0,c||0,o]}function Gi(e,t,n,r){return(Array.isArray(t)?e(t[0],t[1],t[2]):e(t,n,r)).map(Di)}function Ki(e,t,n){return Gi(Bi,e,t,n)}function qi(e,t,n){return Gi(Hi,e,t,n)}function Ji(e,t,n){return Gi(Vi,e,t,n)}function Yi(e){return(e%360+360)%360}function Xi(e){let t=zi.exec(e),n=255,r;if(!t)return;t[5]!==r&&(n=t[6]?Ei(+t[5]):Di(+t[5]));let i=Yi(+t[2]),a=t[3]/100,o=t[4]/100;return r=t[1]===`hwb`?qi(i,a,o):t[1]===`hsv`?Ji(i,a,o):Ki(i,a,o),{r:r[0],g:r[1],b:r[2],a:n}}function Zi(e,t){var n=Wi(e);n[0]=Yi(n[0]+t),n=Ki(n),e.r=n[0],e.g=n[1],e.b=n[2]}function Qi(e){if(!e)return;let t=Wi(e),n=t[0],r=ki(t[1]),i=ki(t[2]);return e.a<255?`hsla(${n}, ${r}%, ${i}%, ${Oi(e.a)})`:`hsl(${n}, ${r}%, ${i}%)`}var $i={x:`dark`,Z:`light`,Y:`re`,X:`blu`,W:`gr`,V:`medium`,U:`slate`,A:`ee`,T:`ol`,S:`or`,B:`ra`,C:`lateg`,D:`ights`,R:`in`,Q:`turquois`,E:`hi`,P:`ro`,O:`al`,N:`le`,M:`de`,L:`yello`,F:`en`,K:`ch`,G:`arks`,H:`ea`,I:`ightg`,J:`wh`},ea={OiceXe:`f0f8ff`,antiquewEte:`faebd7`,aqua:`ffff`,aquamarRe:`7fffd4`,azuY:`f0ffff`,beige:`f5f5dc`,bisque:`ffe4c4`,black:`0`,blanKedOmond:`ffebcd`,Xe:`ff`,XeviTet:`8a2be2`,bPwn:`a52a2a`,burlywood:`deb887`,caMtXe:`5f9ea0`,KartYuse:`7fff00`,KocTate:`d2691e`,cSO:`ff7f50`,cSnflowerXe:`6495ed`,cSnsilk:`fff8dc`,crimson:`dc143c`,cyan:`ffff`,xXe:`8b`,xcyan:`8b8b`,xgTMnPd:`b8860b`,xWay:`a9a9a9`,xgYF:`6400`,xgYy:`a9a9a9`,xkhaki:`bdb76b`,xmagFta:`8b008b`,xTivegYF:`556b2f`,xSange:`ff8c00`,xScEd:`9932cc`,xYd:`8b0000`,xsOmon:`e9967a`,xsHgYF:`8fbc8f`,xUXe:`483d8b`,xUWay:`2f4f4f`,xUgYy:`2f4f4f`,xQe:`ced1`,xviTet:`9400d3`,dAppRk:`ff1493`,dApskyXe:`bfff`,dimWay:`696969`,dimgYy:`696969`,dodgerXe:`1e90ff`,fiYbrick:`b22222`,flSOwEte:`fffaf0`,foYstWAn:`228b22`,fuKsia:`ff00ff`,gaRsbSo:`dcdcdc`,ghostwEte:`f8f8ff`,gTd:`ffd700`,gTMnPd:`daa520`,Way:`808080`,gYF:`8000`,gYFLw:`adff2f`,gYy:`808080`,honeyMw:`f0fff0`,hotpRk:`ff69b4`,RdianYd:`cd5c5c`,Rdigo:`4b0082`,ivSy:`fffff0`,khaki:`f0e68c`,lavFMr:`e6e6fa`,lavFMrXsh:`fff0f5`,lawngYF:`7cfc00`,NmoncEffon:`fffacd`,ZXe:`add8e6`,ZcSO:`f08080`,Zcyan:`e0ffff`,ZgTMnPdLw:`fafad2`,ZWay:`d3d3d3`,ZgYF:`90ee90`,ZgYy:`d3d3d3`,ZpRk:`ffb6c1`,ZsOmon:`ffa07a`,ZsHgYF:`20b2aa`,ZskyXe:`87cefa`,ZUWay:`778899`,ZUgYy:`778899`,ZstAlXe:`b0c4de`,ZLw:`ffffe0`,lime:`ff00`,limegYF:`32cd32`,lRF:`faf0e6`,magFta:`ff00ff`,maPon:`800000`,VaquamarRe:`66cdaa`,VXe:`cd`,VScEd:`ba55d3`,VpurpN:`9370db`,VsHgYF:`3cb371`,VUXe:`7b68ee`,VsprRggYF:`fa9a`,VQe:`48d1cc`,VviTetYd:`c71585`,midnightXe:`191970`,mRtcYam:`f5fffa`,mistyPse:`ffe4e1`,moccasR:`ffe4b5`,navajowEte:`ffdead`,navy:`80`,Tdlace:`fdf5e6`,Tive:`808000`,TivedBb:`6b8e23`,Sange:`ffa500`,SangeYd:`ff4500`,ScEd:`da70d6`,pOegTMnPd:`eee8aa`,pOegYF:`98fb98`,pOeQe:`afeeee`,pOeviTetYd:`db7093`,papayawEp:`ffefd5`,pHKpuff:`ffdab9`,peru:`cd853f`,pRk:`ffc0cb`,plum:`dda0dd`,powMrXe:`b0e0e6`,purpN:`800080`,YbeccapurpN:`663399`,Yd:`ff0000`,Psybrown:`bc8f8f`,PyOXe:`4169e1`,saddNbPwn:`8b4513`,sOmon:`fa8072`,sandybPwn:`f4a460`,sHgYF:`2e8b57`,sHshell:`fff5ee`,siFna:`a0522d`,silver:`c0c0c0`,skyXe:`87ceeb`,UXe:`6a5acd`,UWay:`708090`,UgYy:`708090`,snow:`fffafa`,sprRggYF:`ff7f`,stAlXe:`4682b4`,tan:`d2b48c`,teO:`8080`,tEstN:`d8bfd8`,tomato:`ff6347`,Qe:`40e0d0`,viTet:`ee82ee`,JHt:`f5deb3`,wEte:`ffffff`,wEtesmoke:`f5f5f5`,Lw:`ffff00`,LwgYF:`9acd32`};function ta(){let e={},t=Object.keys(ea),n=Object.keys($i),r,i,a,o,s;for(r=0;r>16&255,a>>8&255,a&255]}return e}var na;function ra(e){na||(na=ta(),na.transparent=[0,0,0,0]);let t=na[e.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}var ia=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function aa(e){let t=ia.exec(e),n=255,r,i,a;if(t){if(t[7]!==r){let e=+t[7];n=t[8]?Ei(e):Ti(e*255,0,255)}return r=+t[1],i=+t[3],a=+t[5],r=255&(t[2]?Ei(r):Ti(r,0,255)),i=255&(t[4]?Ei(i):Ti(i,0,255)),a=255&(t[6]?Ei(a):Ti(a,0,255)),{r,g:i,b:a,a:n}}}function oa(e){return e&&(e.a<255?`rgba(${e.r}, ${e.g}, ${e.b}, ${Oi(e.a)})`:`rgb(${e.r}, ${e.g}, ${e.b})`)}var sa=e=>e<=.0031308?e*12.92:e**(1/2.4)*1.055-.055,ca=e=>e<=.04045?e/12.92:((e+.055)/1.055)**2.4;function la(e,t,n){let r=ca(Oi(e.r)),i=ca(Oi(e.g)),a=ca(Oi(e.b));return{r:Di(sa(r+n*(ca(Oi(t.r))-r))),g:Di(sa(i+n*(ca(Oi(t.g))-i))),b:Di(sa(a+n*(ca(Oi(t.b))-a))),a:e.a+n*(t.a-e.a)}}function ua(e,t,n){if(e){let r=Wi(e);r[t]=Math.max(0,Math.min(r[t]+r[t]*n,t===0?360:1)),r=Ki(r),e.r=r[0],e.g=r[1],e.b=r[2]}}function da(e,t){return e&&Object.assign(t||{},e)}function fa(e){var t={r:0,g:0,b:0,a:255};return Array.isArray(e)?e.length>=3&&(t={r:e[0],g:e[1],b:e[2],a:255},e.length>3&&(t.a=Di(e[3]))):(t=da(e,{r:0,g:0,b:0,a:1}),t.a=Di(t.a)),t}function pa(e){return e.charAt(0)===`r`?aa(e):Xi(e)}var ma=class e{constructor(t){if(t instanceof e)return t;let n=typeof t,r;n===`object`?r=fa(t):n===`string`&&(r=Ii(t)||ra(t)||pa(t)),this._rgb=r,this._valid=!!r}get valid(){return this._valid}get rgb(){var e=da(this._rgb);return e&&(e.a=Oi(e.a)),e}set rgb(e){this._rgb=fa(e)}rgbString(){return this._valid?oa(this._rgb):void 0}hexString(){return this._valid?Ri(this._rgb):void 0}hslString(){return this._valid?Qi(this._rgb):void 0}mix(e,t){if(e){let n=this.rgb,r=e.rgb,i,a=t===i?.5:t,o=2*a-1,s=n.a-r.a,c=((o*s===-1?o:(o+s)/(1+o*s))+1)/2;i=1-c,n.r=255&c*n.r+i*r.r+.5,n.g=255&c*n.g+i*r.g+.5,n.b=255&c*n.b+i*r.b+.5,n.a=a*n.a+(1-a)*r.a,this.rgb=n}return this}interpolate(e,t){return e&&(this._rgb=la(this._rgb,e._rgb,t)),this}clone(){return new e(this.rgb)}alpha(e){return this._rgb.a=Di(e),this}clearer(e){let t=this._rgb;return t.a*=1-e,this}greyscale(){let e=this._rgb;return e.r=e.g=e.b=wi(e.r*.3+e.g*.59+e.b*.11),this}opaquer(e){let t=this._rgb;return t.a*=1+e,this}negate(){let e=this._rgb;return e.r=255-e.r,e.g=255-e.g,e.b=255-e.b,this}lighten(e){return ua(this._rgb,2,e),this}darken(e){return ua(this._rgb,2,-e),this}saturate(e){return ua(this._rgb,1,e),this}desaturate(e){return ua(this._rgb,1,-e),this}rotate(e){return Zi(this._rgb,e),this}};function ha(){}var ga=(()=>{let e=0;return()=>e++})();function U(e){return e==null}function W(e){if(Array.isArray&&Array.isArray(e))return!0;let t=Object.prototype.toString.call(e);return t.slice(0,7)===`[object`&&t.slice(-6)===`Array]`}function G(e){return e!==null&&Object.prototype.toString.call(e)===`[object Object]`}function _a(e){return(typeof e==`number`||e instanceof Number)&&isFinite(+e)}function va(e,t){return _a(e)?e:t}function K(e,t){return e===void 0?t:e}var ya=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100:+e/t,ba=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100*t:+e;function q(e,t,n){if(e&&typeof e.call==`function`)return e.apply(n,t)}function J(e,t,n,r){let i,a,o;if(W(e)){if(a=e.length,r)for(i=a-1;i>=0;i--)t.call(n,e[i],i);else for(i=0;ie,x:e=>e.x,y:e=>e.y};function ka(e){let t=e.split(`.`),n=[],r=``;for(let e of t)r+=e,r.endsWith(`\\`)?r=r.slice(0,-1)+`.`:(n.push(r),r=``);return n}function Aa(e){let t=ka(e);return e=>{for(let n of t){if(n===``)break;e=e&&e[n]}return e}}function ja(e,t){return(Oa[t]||(Oa[t]=Aa(t)))(e)}function Ma(e){return e.charAt(0).toUpperCase()+e.slice(1)}var Na=e=>e!==void 0,Pa=e=>typeof e==`function`,Fa=(e,t)=>{if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0};function Ia(e){return e.type===`mouseup`||e.type===`click`||e.type===`contextmenu`}var Y=Math.PI,X=2*Y,La=X+Y,Ra=1/0,za=Y/180,Z=Y/2,Ba=Y/4,Va=Y*2/3,Ha=Math.log10,Ua=Math.sign;function Wa(e,t,n){return Math.abs(e-t)e-t).pop(),t}function qa(e){return typeof e==`symbol`||typeof e==`object`&&!!e&&!(Symbol.toPrimitive in e||`toString`in e||`valueOf`in e)}function Ja(e){return!qa(e)&&!isNaN(parseFloat(e))&&isFinite(e)}function Ya(e,t){let n=Math.round(e);return n-t<=e&&n+t>=e}function Xa(e,t,n){let r,i,a;for(r=0,i=e.length;rc&&l=Math.min(t,n)-r&&e<=Math.max(t,n)+r}function co(e,t,n){n=n||(n=>e[n]1;)a=i+r>>1,n(a)?i=a:r=a;return{lo:i,hi:r}}var lo=(e,t,n,r)=>co(e,n,r?r=>{let i=e[r][t];return ie[r][t]co(e,n,r=>e[r][t]>=n);function fo(e,t,n){let r=0,i=e.length;for(;rr&&e[i-1]>n;)i--;return r>0||i{let n=`_onData`+Ma(t),r=e[t];Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value(...t){let i=r.apply(this,t);return e._chartjs.listeners.forEach(e=>{typeof e[n]==`function`&&e[n](...t)}),i}})}))}function ho(e,t){let n=e._chartjs;if(!n)return;let r=n.listeners,i=r.indexOf(t);i!==-1&&r.splice(i,1),!(r.length>0)&&(po.forEach(t=>{delete e[t]}),delete e._chartjs)}function go(e){let t=new Set(e);return t.size===e.length?e:Array.from(t)}var _o=function(){return typeof window>`u`?function(e){return e()}:window.requestAnimationFrame}();function vo(e,t){let n=[],r=!1;return function(...i){n=i,r||(r=!0,_o.call(window,()=>{r=!1,e.apply(t,n)}))}}function yo(e,t){let n;return function(...r){return t?(clearTimeout(n),n=setTimeout(e,t,r)):e.apply(this,r),t}}var bo=e=>e===`start`?`left`:e===`end`?`right`:`center`,xo=(e,t,n)=>e===`start`?t:e===`end`?n:(t+n)/2;function So(e,t,n){let r=t.length,i=0,a=r;if(e._sorted){let{iScale:o,vScale:s,_parsed:c}=e,l=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null,u=o.axis,{min:d,max:f,minDefined:p,maxDefined:m}=o.getUserBounds();if(p){if(i=Math.min(lo(c,u,d).lo,n?r:lo(t,u,o.getPixelForValue(d)).lo),l){let e=c.slice(0,i+1).reverse().findIndex(e=>!U(e[s.axis]));i-=Math.max(0,e)}i=ao(i,0,r-1)}if(m){let e=Math.max(lo(c,o.axis,f,!0).hi+1,n?0:lo(t,u,o.getPixelForValue(f),!0).hi+1);if(l){let t=c.slice(e-1).findIndex(e=>!U(e[s.axis]));e+=Math.max(0,t)}a=ao(e,i,r)-i}else a=r-i}return{start:i,count:a}}function Co(e){let{xScale:t,yScale:n,_scaleRanges:r}=e,i={xmin:t.min,xmax:t.max,ymin:n.min,ymax:n.max};if(!r)return e._scaleRanges=i,!0;let a=r.xmin!==t.min||r.xmax!==t.max||r.ymin!==n.min||r.ymax!==n.max;return Object.assign(r,i),a}var wo=e=>e===0||e===1,To=(e,t,n)=>-(2**(10*--e)*Math.sin((e-t)*X/n)),Eo=(e,t,n)=>2**(-10*e)*Math.sin((e-t)*X/n)+1,Do={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>-e*(e-2),easeInOutQuad:e=>(e/=.5)<1?.5*e*e:-.5*(--e*(e-2)-1),easeInCubic:e=>e*e*e,easeOutCubic:e=>--e*e*e+1,easeInOutCubic:e=>(e/=.5)<1?.5*e*e*e:.5*((e-=2)*e*e+2),easeInQuart:e=>e*e*e*e,easeOutQuart:e=>-(--e*e*e*e-1),easeInOutQuart:e=>(e/=.5)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2),easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>--e*e*e*e*e+1,easeInOutQuint:e=>(e/=.5)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2),easeInSine:e=>-Math.cos(e*Z)+1,easeOutSine:e=>Math.sin(e*Z),easeInOutSine:e=>-.5*(Math.cos(Y*e)-1),easeInExpo:e=>e===0?0:2**(10*(e-1)),easeOutExpo:e=>e===1?1:-(2**(-10*e))+1,easeInOutExpo:e=>wo(e)?e:e<.5?.5*2**(10*(e*2-1)):.5*(-(2**(-10*(e*2-1)))+2),easeInCirc:e=>e>=1?e:-(Math.sqrt(1-e*e)-1),easeOutCirc:e=>Math.sqrt(1- --e*e),easeInOutCirc:e=>(e/=.5)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1),easeInElastic:e=>wo(e)?e:To(e,.075,.3),easeOutElastic:e=>wo(e)?e:Eo(e,.075,.3),easeInOutElastic(e){let t=.1125,n=.45;return wo(e)?e:e<.5?.5*To(e*2,t,n):.5+.5*Eo(e*2-1,t,n)},easeInBack(e){return e*e*(2.70158*e-1.70158)},easeOutBack(e){return--e*e*(2.70158*e+1.70158)+1},easeInOutBack(e){let t=1.70158;return(e/=.5)<1?.5*(e*e*(((t*=1.525)+1)*e-t)):.5*((e-=2)*e*(((t*=1.525)+1)*e+t)+2)},easeInBounce:e=>1-Do.easeOutBounce(1-e),easeOutBounce(e){let t=7.5625,n=2.75;return e<1/n?t*e*e:e<2/n?t*(e-=1.5/n)*e+.75:e<2.5/n?t*(e-=2.25/n)*e+.9375:t*(e-=2.625/n)*e+.984375},easeInOutBounce:e=>e<.5?Do.easeInBounce(e*2)*.5:Do.easeOutBounce(e*2-1)*.5+.5};function Oo(e){if(e&&typeof e==`object`){let t=e.toString();return t===`[object CanvasPattern]`||t===`[object CanvasGradient]`}return!1}function ko(e){return Oo(e)?e:new ma(e)}function Ao(e){return Oo(e)?e:new ma(e).saturate(.5).darken(.1).hexString()}var jo=[`x`,`y`,`borderWidth`,`radius`,`tension`],Mo=[`color`,`borderColor`,`backgroundColor`];function No(e){e.set(`animation`,{delay:void 0,duration:1e3,easing:`easeOutQuart`,fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),e.describe(`animation`,{_fallback:!1,_indexable:!1,_scriptable:e=>e!==`onProgress`&&e!==`onComplete`&&e!==`fn`}),e.set(`animations`,{colors:{type:`color`,properties:Mo},numbers:{type:`number`,properties:jo}}),e.describe(`animations`,{_fallback:`animation`}),e.set(`transitions`,{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:`transparent`},visible:{type:`boolean`,duration:0}}},hide:{animations:{colors:{to:`transparent`},visible:{type:`boolean`,easing:`linear`,fn:e=>e|0}}}})}function Po(e){e.set(`layout`,{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}var Fo=new Map;function Io(e,t){t=t||{};let n=e+JSON.stringify(t),r=Fo.get(n);return r||(r=new Intl.NumberFormat(e,t),Fo.set(n,r)),r}function Lo(e,t,n){return Io(t,n).format(e)}var Ro={values(e){return W(e)?e:``+e},numeric(e,t,n){if(e===0)return`0`;let r=this.chart.options.locale,i,a=e;if(n.length>1){let t=Math.max(Math.abs(n[0].value),Math.abs(n[n.length-1].value));(t<1e-4||t>0x38d7ea4c68000)&&(i=`scientific`),a=zo(e,n)}let o=Ha(Math.abs(a)),s=isNaN(o)?1:Math.max(Math.min(-1*Math.floor(o),20),0),c={notation:i,minimumFractionDigits:s,maximumFractionDigits:s};return Object.assign(c,this.options.ticks.format),Lo(e,r,c)},logarithmic(e,t,n){if(e===0)return`0`;let r=n[t].significand||e/10**Math.floor(Ha(e));return[1,2,3,5,10,15].includes(r)||t>.8*n.length?Ro.numeric.call(this,e,t,n):``}};function zo(e,t){let n=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(n)>=1&&e!==Math.floor(e)&&(n=e-Math.floor(e)),n}var Bo={formatters:Ro};function Vo(e){e.set(`scale`,{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:`ticks`,clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(e,t)=>t.lineWidth,tickColor:(e,t)=>t.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:``,padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:``,padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Bo.formatters.values,minor:{},major:{},align:`center`,crossAlign:`near`,showLabelBackdrop:!1,backdropColor:`rgba(255, 255, 255, 0.75)`,backdropPadding:2}}),e.route(`scale.ticks`,`color`,``,`color`),e.route(`scale.grid`,`color`,``,`borderColor`),e.route(`scale.border`,`color`,``,`borderColor`),e.route(`scale.title`,`color`,``,`color`),e.describe(`scale`,{_fallback:!1,_scriptable:e=>!e.startsWith(`before`)&&!e.startsWith(`after`)&&e!==`callback`&&e!==`parser`,_indexable:e=>e!==`borderDash`&&e!==`tickBorderDash`&&e!==`dash`}),e.describe(`scales`,{_fallback:`scale`}),e.describe(`scale.ticks`,{_scriptable:e=>e!==`backdropPadding`&&e!==`callback`,_indexable:e=>e!==`backdropPadding`})}var Ho=Object.create(null),Uo=Object.create(null);function Wo(e,t){if(!t)return e;let n=t.split(`.`);for(let t=0,r=n.length;te.chart.platform.getDevicePixelRatio(),this.elements={},this.events=[`mousemove`,`mouseout`,`click`,`touchstart`,`touchmove`],this.font={family:`'Helvetica Neue', 'Helvetica', 'Arial', sans-serif`,size:12,style:`normal`,lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(e,t)=>Ao(t.backgroundColor),this.hoverBorderColor=(e,t)=>Ao(t.borderColor),this.hoverColor=(e,t)=>Ao(t.color),this.indexAxis=`x`,this.interaction={mode:`nearest`,intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(e),this.apply(t)}set(e,t){return Go(this,e,t)}get(e){return Wo(this,e)}describe(e,t){return Go(Uo,e,t)}override(e,t){return Go(Ho,e,t)}route(e,t,n,r){let i=Wo(this,e),a=Wo(this,n),o=`_`+t;Object.defineProperties(i,{[o]:{value:i[t],writable:!0},[t]:{enumerable:!0,get(){let e=this[o],t=a[r];return G(e)?Object.assign({},t,e):K(e,t)},set(e){this[o]=e}}})}apply(e){e.forEach(e=>e(this))}}({_scriptable:e=>!e.startsWith(`on`),_indexable:e=>e!==`events`,hover:{_fallback:`interaction`},interaction:{_scriptable:!1,_indexable:!1}},[No,Po,Vo]);function Ko(e){return!e||U(e.size)||U(e.family)?null:(e.style?e.style+` `:``)+(e.weight?e.weight+` `:``)+e.size+`px `+e.family}function qo(e,t,n,r,i){let a=t[i];return a||(a=t[i]=e.measureText(i).width,n.push(i)),a>r&&(r=a),r}function Jo(e,t,n,r){r=r||{};let i=r.data=r.data||{},a=r.garbageCollect=r.garbageCollect||[];r.font!==t&&(i=r.data={},a=r.garbageCollect=[],r.font=t),e.save(),e.font=t;let o=0,s=n.length,c,l,u,d,f;for(c=0;cn.length){for(c=0;c0&&e.stroke()}}function $o(e,t,n){return n=n||.5,!t||e&&e.x>t.left-n&&e.xt.top-n&&e.y0&&a.strokeColor!==``,c,l;for(e.save(),e.font=i.string,is(e,a),c=0;c+e||0;function ps(e,t){let n={},r=G(t),i=r?Object.keys(t):t,a=G(e)?r?n=>K(e[n],e[t[n]]):t=>e[t]:()=>e;for(let e of i)n[e]=fs(a(e));return n}function ms(e){return ps(e,{top:`y`,right:`x`,bottom:`y`,left:`x`})}function hs(e){return ps(e,[`topLeft`,`topRight`,`bottomLeft`,`bottomRight`])}function gs(e){let t=ms(e);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function _s(e,t){e=e||{},t=t||Q.font;let n=K(e.size,t.size);typeof n==`string`&&(n=parseInt(n,10));let r=K(e.style,t.style);r&&!(``+r).match(us)&&(console.warn(`Invalid font style specified: "`+r+`"`),r=void 0);let i={family:K(e.family,t.family),lineHeight:ds(K(e.lineHeight,t.lineHeight),n),size:n,style:r,weight:K(e.weight,t.weight),string:``};return i.string=Ko(i),i}function vs(e,t,n,r){let i=!0,a,o,s;for(a=0,o=e.length;an&&e===0?0:e+t;return{min:o(r,-Math.abs(a)),max:o(i,a)}}function bs(e,t){return Object.assign(Object.create(e),t)}function xs(e,t=[``],n,r,i=()=>e[0]){let a=n||e;return r===void 0&&(r=Ls(`_fallback`,e)),new Proxy({[Symbol.toStringTag]:`Object`,_cacheable:!0,_scopes:e,_rootScopes:a,_fallback:r,_getTarget:i,override:n=>xs([n,...e],t,a,r)},{deleteProperty(t,n){return delete t[n],delete t._keys,delete e[0][n],!0},get(n,r){return Es(n,r,()=>Is(r,t,e,n))},getOwnPropertyDescriptor(e,t){return Reflect.getOwnPropertyDescriptor(e._scopes[0],t)},getPrototypeOf(){return Reflect.getPrototypeOf(e[0])},has(e,t){return Rs(e).includes(t)},ownKeys(e){return Rs(e)},set(e,t,n){let r=e._storage||(e._storage=i());return e[t]=r[t]=n,delete e._keys,!0}})}function Ss(e,t,n,r){let i={_cacheable:!1,_proxy:e,_context:t,_subProxy:n,_stack:new Set,_descriptors:Cs(e,r),setContext:t=>Ss(e,t,n,r),override:i=>Ss(e.override(i),t,n,r)};return new Proxy(i,{deleteProperty(t,n){return delete t[n],delete e[n],!0},get(e,t,n){return Es(e,t,()=>Ds(e,t,n))},getOwnPropertyDescriptor(t,n){return t._descriptors.allKeys?Reflect.has(e,n)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(e,n)},getPrototypeOf(){return Reflect.getPrototypeOf(e)},has(t,n){return Reflect.has(e,n)},ownKeys(){return Reflect.ownKeys(e)},set(t,n,r){return e[n]=r,delete t[n],!0}})}function Cs(e,t={scriptable:!0,indexable:!0}){let{_scriptable:n=t.scriptable,_indexable:r=t.indexable,_allKeys:i=t.allKeys}=e;return{allKeys:i,scriptable:n,indexable:r,isScriptable:Pa(n)?n:()=>n,isIndexable:Pa(r)?r:()=>r}}var ws=(e,t)=>e?e+Ma(t):t,Ts=(e,t)=>G(t)&&e!==`adapters`&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function Es(e,t,n){if(Object.prototype.hasOwnProperty.call(e,t)||t===`constructor`)return e[t];let r=n();return e[t]=r,r}function Ds(e,t,n){let{_proxy:r,_context:i,_subProxy:a,_descriptors:o}=e,s=r[t];return Pa(s)&&o.isScriptable(t)&&(s=Os(t,s,e,n)),W(s)&&s.length&&(s=ks(t,s,e,o.isIndexable)),Ts(t,s)&&(s=Ss(s,i,a&&a[t],o)),s}function Os(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_stack:s}=n;if(s.has(e))throw Error(`Recursion detected: `+Array.from(s).join(`->`)+`->`+e);s.add(e);let c=t(a,o||r);return s.delete(e),Ts(e,c)&&(c=Ns(i._scopes,i,e,c)),c}function ks(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_descriptors:s}=n;if(a.index!==void 0&&r(e))return t[a.index%t.length];if(G(t[0])){let n=t,r=i._scopes.filter(e=>e!==n);t=[];for(let c of n){let n=Ns(r,i,e,c);t.push(Ss(n,a,o&&o[e],s))}}return t}function As(e,t,n){return Pa(e)?e(t,n):e}var js=(e,t)=>e===!0?t:typeof e==`string`?ja(t,e):void 0;function Ms(e,t,n,r,i){for(let a of t){let t=js(n,a);if(t){e.add(t);let a=As(t._fallback,n,i);if(a!==void 0&&a!==n&&a!==r)return a}else if(t===!1&&r!==void 0&&n!==r)return null}return!1}function Ns(e,t,n,r){let i=t._rootScopes,a=As(t._fallback,n,r),o=[...e,...i],s=new Set;s.add(r);let c=Ps(s,o,n,a||n,r);return c===null||a!==void 0&&a!==n&&(c=Ps(s,o,a,c,r),c===null)?!1:xs(Array.from(s),[``],i,a,()=>Fs(t,n,r))}function Ps(e,t,n,r,i){for(;n;)n=Ms(e,t,n,r,i);return n}function Fs(e,t,n){let r=e._getTarget();t in r||(r[t]={});let i=r[t];return W(i)&&G(n)?n:i||{}}function Is(e,t,n,r){let i;for(let a of t)if(i=Ls(ws(a,e),n),i!==void 0)return Ts(e,i)?Ns(n,r,e,i):i}function Ls(e,t){for(let n of t){if(!n)continue;let t=n[e];if(t!==void 0)return t}}function Rs(e){let t=e._keys;return t||(t=e._keys=zs(e._scopes)),t}function zs(e){let t=new Set;for(let n of e)for(let e of Object.keys(n).filter(e=>!e.startsWith(`_`)))t.add(e);return Array.from(t)}function Bs(e,t,n,r){let{iScale:i}=e,{key:a=`r`}=this._parsing,o=Array(r),s,c,l,u;for(s=0,c=r;ste===`x`?`y`:`x`;function Ws(e,t,n,r){let i=e.skip?t:e,a=t,o=n.skip?t:n,s=to(a,i),c=to(o,a),l=s/(s+c),u=c/(s+c);l=isNaN(l)?0:l,u=isNaN(u)?0:u;let d=r*l,f=r*u;return{previous:{x:a.x-d*(o.x-i.x),y:a.y-d*(o.y-i.y)},next:{x:a.x+f*(o.x-i.x),y:a.y+f*(o.y-i.y)}}}function Gs(e,t,n){let r=e.length,i,a,o,s,c,l=Hs(e,0);for(let u=0;u!e.skip)),t.cubicInterpolationMode===`monotone`)qs(e,i);else{let n=r?e[e.length-1]:e[0];for(a=0,o=e.length;ae.ownerDocument.defaultView.getComputedStyle(e,null);function tc(e,t){return ec(e).getPropertyValue(t)}var nc=[`top`,`right`,`bottom`,`left`];function rc(e,t,n){let r={};n=n?`-`+n:``;for(let i=0;i<4;i++){let a=nc[i];r[a]=parseFloat(e[t+`-`+a+n])||0}return r.width=r.left+r.right,r.height=r.top+r.bottom,r}var ic=(e,t,n)=>(e>0||t>0)&&(!n||!n.shadowRoot);function ac(e,t){let n=e.touches,r=n&&n.length?n[0]:e,{offsetX:i,offsetY:a}=r,o=!1,s,c;if(ic(i,a,e.target))s=i,c=a;else{let e=t.getBoundingClientRect();s=r.clientX-e.left,c=r.clientY-e.top,o=!0}return{x:s,y:c,box:o}}function oc(e,t){if(`native`in e)return e;let{canvas:n,currentDevicePixelRatio:r}=t,i=ec(n),a=i.boxSizing===`border-box`,o=rc(i,`padding`),s=rc(i,`border`,`width`),{x:c,y:l,box:u}=ac(e,n),d=o.left+(u&&s.left),f=o.top+(u&&s.top),{width:p,height:m}=t;return a&&(p-=o.width+s.width,m-=o.height+s.height),{x:Math.round((c-d)/p*n.width/r),y:Math.round((l-f)/m*n.height/r)}}function sc(e,t,n){let r,i;if(t===void 0||n===void 0){let a=e&&Qs(e);if(!a)t=e.clientWidth,n=e.clientHeight;else{let e=a.getBoundingClientRect(),o=ec(a),s=rc(o,`border`,`width`),c=rc(o,`padding`);t=e.width-c.width-s.width,n=e.height-c.height-s.height,r=$s(o.maxWidth,a,`clientWidth`),i=$s(o.maxHeight,a,`clientHeight`)}}return{width:t,height:n,maxWidth:r||Ra,maxHeight:i||Ra}}var cc=e=>Math.round(e*10)/10;function lc(e,t,n,r){let i=ec(e),a=rc(i,`margin`),o=$s(i.maxWidth,e,`clientWidth`)||Ra,s=$s(i.maxHeight,e,`clientHeight`)||Ra,c=sc(e,t,n),{width:l,height:u}=c;if(i.boxSizing===`content-box`){let e=rc(i,`border`,`width`),t=rc(i,`padding`);l-=t.width+e.width,u-=t.height+e.height}return l=Math.max(0,l-a.width),u=Math.max(0,r?l/r:u-a.height),l=cc(Math.min(l,o,c.maxWidth)),u=cc(Math.min(u,s,c.maxHeight)),l&&!u&&(u=cc(l/2)),(t!==void 0||n!==void 0)&&r&&c.height&&u>c.height&&(u=c.height,l=cc(Math.floor(u*r))),{width:l,height:u}}function uc(e,t,n){let r=t||1,i=cc(e.height*r),a=cc(e.width*r);e.height=cc(e.height),e.width=cc(e.width);let o=e.canvas;return o.style&&(n||!o.style.height&&!o.style.width)&&(o.style.height=`${e.height}px`,o.style.width=`${e.width}px`),e.currentDevicePixelRatio!==r||o.height!==i||o.width!==a?(e.currentDevicePixelRatio=r,o.height=i,o.width=a,e.ctx.setTransform(r,0,0,r,0,0),!0):!1}var dc=function(){let e=!1;try{let t={get passive(){return e=!0,!1}};Zs()&&(window.addEventListener(`test`,null,t),window.removeEventListener(`test`,null,t))}catch{}return e}();function fc(e,t){let n=tc(e,t),r=n&&n.match(/^(\d+)(\.\d+)?px$/);return r?+r[1]:void 0}function pc(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:e.y+n*(t.y-e.y)}}function mc(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:r===`middle`?n<.5?e.y:t.y:r===`after`?n<1?e.y:t.y:n>0?t.y:e.y}}function hc(e,t,n,r){let i={x:e.cp2x,y:e.cp2y},a={x:t.cp1x,y:t.cp1y},o=pc(e,i,n),s=pc(i,a,n),c=pc(a,t,n);return pc(pc(o,s,n),pc(s,c,n),n)}var gc=function(e,t){return{x(n){return e+e+t-n},setWidth(e){t=e},textAlign(e){return e===`center`?e:e===`right`?`left`:`right`},xPlus(e,t){return e-t},leftForLtr(e,t){return e-t}}},_c=function(){return{x(e){return e},setWidth(e){},textAlign(e){return e},xPlus(e,t){return e+t},leftForLtr(e,t){return e}}};function vc(e,t,n){return e?gc(t,n):_c()}function yc(e,t){let n,r;(t===`ltr`||t===`rtl`)&&(n=e.canvas.style,r=[n.getPropertyValue(`direction`),n.getPropertyPriority(`direction`)],n.setProperty(`direction`,t,`important`),e.prevTextDirection=r)}function bc(e,t){t!==void 0&&(delete e.prevTextDirection,e.canvas.style.setProperty(`direction`,t[0],t[1]))}function xc(e){return e===`angle`?{between:io,compare:no,normalize:ro}:{between:so,compare:(e,t)=>e-t,normalize:e=>e}}function Sc({start:e,end:t,count:n,loop:r,style:i}){return{start:e%n,end:t%n,loop:r&&(t-e+1)%n===0,style:i}}function Cc(e,t,n){let{property:r,start:i,end:a}=n,{between:o,normalize:s}=xc(r),c=t.length,{start:l,end:u,loop:d}=e,f,p;if(d){for(l+=c,u+=c,f=0,p=c;fc(i,y,_)&&s(i,y)!==0,x=()=>s(a,_)===0||c(a,y,_),S=()=>h||b(),C=()=>!h||x();for(let e=u,n=u;e<=d;++e)v=t[e%o],!v.skip&&(_=l(v[r]),_!==y&&(h=c(_,i,a),g===null&&S()&&(g=s(_,i)===0?e:n),g!==null&&C()&&(m.push(Sc({start:g,end:e,loop:f,count:o,style:p})),g=null),n=e,y=_));return g!==null&&m.push(Sc({start:g,end:d,loop:f,count:o,style:p})),m}function Tc(e,t){let n=[],r=e.segments;for(let i=0;ii&&e[a%t].skip;)a--;return a%=t,{start:i,end:a}}function Dc(e,t,n,r){let i=e.length,a=[],o=t,s=e[t],c;for(c=t+1;c<=n;++c){let n=e[c%i];n.skip||n.stop?s.skip||(r=!1,a.push({start:t%i,end:(c-1)%i,loop:r}),t=o=n.stop?c:null):(o=c,s.skip&&(t=c)),s=n}return o!==null&&a.push({start:t%i,end:o%i,loop:r}),a}function Oc(e,t){let n=e.points,r=e.options.spanGaps,i=n.length;if(!i)return[];let a=!!e._loop,{start:o,end:s}=Ec(n,i,a,r);return r===!0?kc(e,[{start:o,end:s,loop:a}],n,t):kc(e,Dc(n,o,sr({chart:e,initial:t.initial,numSteps:a,currentStep:Math.min(n-t.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=_o.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(e=Date.now()){let t=0;this._charts.forEach((n,r)=>{if(!n.running||!n.items.length)return;let i=n.items,a=i.length-1,o=!1,s;for(;a>=0;--a)s=i[a],s._active?(s._total>n.duration&&(n.duration=s._total),s.tick(e),o=!0):(i[a]=i[i.length-1],i.pop());o&&(r.draw(),this._notify(r,n,e,`progress`)),i.length||(n.running=!1,this._notify(r,n,e,`complete`),n.initial=!1),t+=i.length}),this._lastDate=e,t===0&&(this._running=!1)}_getAnims(e){let t=this._charts,n=t.get(e);return n||(n={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},t.set(e,n)),n}listen(e,t,n){this._getAnims(e).listeners[t].push(n)}add(e,t){t&&t.length&&this._getAnims(e).items.push(...t)}has(e){return this._getAnims(e).items.length>0}start(e){let t=this._charts.get(e);t&&(t.running=!0,t.start=Date.now(),t.duration=t.items.reduce((e,t)=>Math.max(e,t._duration),0),this._refresh())}running(e){if(!this._running)return!1;let t=this._charts.get(e);return!(!t||!t.running||!t.items.length)}stop(e){let t=this._charts.get(e);if(!t||!t.items.length)return;let n=t.items,r=n.length-1;for(;r>=0;--r)n[r].cancel();t.items=[],this._notify(e,t,Date.now(),`complete`)}remove(e){return this._charts.delete(e)}},Bc=`transparent`,Vc={boolean(e,t,n){return n>.5?t:e},color(e,t,n){let r=ko(e||Bc),i=r.valid&&ko(t||Bc);return i&&i.valid?i.mix(r,n).hexString():t},number(e,t,n){return e+(t-e)*n}},Hc=class{constructor(e,t,n,r){let i=t[n];r=vs([e.to,r,i,e.from]);let a=vs([e.from,i,r]);this._active=!0,this._fn=e.fn||Vc[e.type||typeof a],this._easing=Do[e.easing]||Do.linear,this._start=Math.floor(Date.now()+(e.delay||0)),this._duration=this._total=Math.floor(e.duration),this._loop=!!e.loop,this._target=t,this._prop=n,this._from=a,this._to=r,this._promises=void 0}active(){return this._active}update(e,t,n){if(this._active){this._notify(!1);let r=this._target[this._prop],i=n-this._start,a=this._duration-i;this._start=n,this._duration=Math.floor(Math.max(a,e.duration)),this._total+=i,this._loop=!!e.loop,this._to=vs([e.to,t,r,e.from]),this._from=vs([e.from,r,t])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(e){let t=e-this._start,n=this._duration,r=this._prop,i=this._from,a=this._loop,o=this._to,s;this._active=i!==o&&(a||t1?2-s:s,s=this._easing(Math.min(1,Math.max(0,s))),this._target[r]=this._fn(i,o,s)):(this._target[r]=o,this._notify(!0))}wait(){let e=this._promises||(this._promises=[]);return new Promise((t,n)=>{e.push({res:t,rej:n})})}_notify(e){let t=e?`res`:`rej`,n=this._promises||[];for(let e=0;e{let i=e[r];if(!G(i))return;let a={};for(let e of t)a[e]=i[e];(W(i.properties)&&i.properties||[r]).forEach(e=>{(e===r||!n.has(e))&&n.set(e,a)})})}_animateOptions(e,t){let n=t.options,r=Gc(e,n);if(!r)return[];let i=this._createAnimations(r,n);return n.$shared&&Wc(e.options.$animations,n).then(()=>{e.options=n},()=>{}),i}_createAnimations(e,t){let n=this._properties,r=[],i=e.$animations||(e.$animations={}),a=Object.keys(t),o=Date.now(),s;for(s=a.length-1;s>=0;--s){let c=a[s];if(c.charAt(0)===`$`)continue;if(c===`options`){r.push(...this._animateOptions(e,t));continue}let l=t[c],u=i[c],d=n.get(c);if(u){if(d&&u.active()){u.update(d,l,o);continue}u.cancel()}!d||!d.duration?e[c]=l:(i[c]=u=new Hc(d,e,c,l),r.push(u))}return r}update(e,t){if(this._properties.size===0){Object.assign(e,t);return}let n=this._createAnimations(e,t);if(n.length)return zc.add(this._chart,n),!0}};function Wc(e,t){let n=[],r=Object.keys(t);for(let t=0;t0||!n&&t<0)return i.index}return null}function rl(e,t){let{chart:n,_cachedMeta:r}=e,i=n._stacks||(n._stacks={}),{iScale:a,vScale:o,index:s}=r,c=a.axis,l=o.axis,u=$c(a,o,r),d=t.length,f;for(let e=0;en[e].axis===t).shift()}function al(e,t){return bs(e,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:`default`,type:`dataset`})}function ol(e,t,n){return bs(e,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:n,index:t,mode:`default`,type:`data`})}function sl(e,t){let n=e.controller.index,r=e.vScale&&e.vScale.axis;if(r){t=t||e._parsed;for(let e of t){let t=e._stacks;if(!t||t[r]===void 0||t[r][n]===void 0)return;delete t[r][n],t[r]._visualValues!==void 0&&t[r]._visualValues[n]!==void 0&&delete t[r]._visualValues[n]}}}var cl=e=>e===`reset`||e===`none`,ll=(e,t)=>t?e:Object.assign({},e),ul=(e,t,n)=>e&&!t.hidden&&t._stacked&&{keys:Yc(n,!0),values:null},dl=class{constructor(e,t){this.chart=e,this._ctx=e.ctx,this.index=t,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){let e=this._cachedMeta;this.configure(),this.linkScales(),e._stacked=Qc(e.vScale,e),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled(`filler`)&&console.warn(`Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options`)}updateIndex(e){this.index!==e&&sl(this._cachedMeta),this.index=e}linkScales(){let e=this.chart,t=this._cachedMeta,n=this.getDataset(),r=(e,t,n,r)=>e===`x`?t:e===`r`?r:n,i=t.xAxisID=K(n.xAxisID,il(e,`x`)),a=t.yAxisID=K(n.yAxisID,il(e,`y`)),o=t.rAxisID=K(n.rAxisID,il(e,`r`)),s=t.indexAxis,c=t.iAxisID=r(s,i,a,o),l=t.vAxisID=r(s,a,i,o);t.xScale=this.getScaleForId(i),t.yScale=this.getScaleForId(a),t.rScale=this.getScaleForId(o),t.iScale=this.getScaleForId(c),t.vScale=this.getScaleForId(l)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(e){return this.chart.scales[e]}_getOtherScale(e){let t=this._cachedMeta;return e===t.iScale?t.vScale:t.iScale}reset(){this._update(`reset`)}_destroy(){let e=this._cachedMeta;this._data&&ho(this._data,this),e._stacked&&sl(e)}_dataCheck(){let e=this.getDataset(),t=e.data||(e.data=[]),n=this._data;if(G(t)){let e=this._cachedMeta;this._data=Zc(t,e)}else if(n!==t){if(n){ho(n,this);let e=this._cachedMeta;sl(e),e._parsed=[]}t&&Object.isExtensible(t)&&mo(t,this),this._syncList=[],this._data=t}}addElements(){let e=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(e.dataset=new this.datasetElementType)}buildOrUpdateElements(e){let t=this._cachedMeta,n=this.getDataset(),r=!1;this._dataCheck();let i=t._stacked;t._stacked=Qc(t.vScale,t),t.stack!==n.stack&&(r=!0,sl(t),t.stack=n.stack),this._resyncElements(e),(r||i!==t._stacked)&&(rl(this,t._parsed),t._stacked=Qc(t.vScale,t))}configure(){let e=this.chart.config,t=e.datasetScopeKeys(this._type),n=e.getOptionScopes(this.getDataset(),t,!0);this.options=e.createResolver(n,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(e,t){let{_cachedMeta:n,_data:r}=this,{iScale:i,_stacked:a}=n,o=i.axis,s=e===0&&t===r.length||n._sorted,c=e>0&&n._parsed[e-1],l,u,d;if(this._parsing===!1)n._parsed=r,n._sorted=!0,d=r;else{d=W(r[e])?this.parseArrayData(n,r,e,t):G(r[e])?this.parseObjectData(n,r,e,t):this.parsePrimitiveData(n,r,e,t);let i=()=>u[o]===null||c&&u[o]t||u=0;--d)if(!p()){this.updateRangeFromParsed(c,e,f,s);break}}return c}getAllParsedValues(e){let t=this._cachedMeta._parsed,n=[],r,i,a;for(r=0,i=t.length;r=0&&ethis.getContext(n,r,t),u);return p.$shared&&(p.$shared=s,i[a]=Object.freeze(ll(p,s))),p}_resolveAnimations(e,t,n){let r=this.chart,i=this._cachedDataOpts,a=`animation-${t}`,o=i[a];if(o)return o;let s;if(r.options.animation!==!1){let r=this.chart.config,i=r.datasetAnimationScopeKeys(this._type,t),a=r.getOptionScopes(this.getDataset(),i);s=r.createResolver(a,this.getContext(e,n,t))}let c=new Uc(r,s&&s.animations);return s&&s._cacheable&&(i[a]=Object.freeze(c)),c}getSharedOptions(e){if(e.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},e))}includeOptions(e,t){return!t||cl(e)||this.chart._animationsDisabled}_getSharedOptions(e,t){let n=this.resolveDataElementOptions(e,t),r=this._sharedOptions,i=this.getSharedOptions(n),a=this.includeOptions(t,i)||i!==r;return this.updateSharedOptions(i,t,n),{sharedOptions:i,includeOptions:a}}updateElement(e,t,n,r){cl(r)?Object.assign(e,n):this._resolveAnimations(t,r).update(e,n)}updateSharedOptions(e,t,n){e&&!cl(t)&&this._resolveAnimations(void 0,t).update(e,n)}_setStyle(e,t,n,r){e.active=r;let i=this.getStyle(t,r);this._resolveAnimations(t,n,r).update(e,{options:!r&&this.getSharedOptions(i)||i})}removeHoverStyle(e,t,n){this._setStyle(e,n,`active`,!1)}setHoverStyle(e,t,n){this._setStyle(e,n,`active`,!0)}_removeDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!1)}_setDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!0)}_resyncElements(e){let t=this._data,n=this._cachedMeta.data;for(let[e,t,n]of this._syncList)this[e](t,n);this._syncList=[];let r=n.length,i=t.length,a=Math.min(i,r);a&&this.parse(0,a),i>r?this._insertElements(r,i-r,e):i{for(e.length+=t,o=e.length-1;o>=a;o--)e[o]=e[o-t]};for(s(i),o=e;oe-t))}return e._cache.$bar}function pl(e){let t=e.iScale,n=fl(t,e.type),r=t._length,i,a,o,s,c=()=>{o!==32767&&o!==-32768&&(Na(s)&&(r=Math.min(r,Math.abs(o-s)||r)),s=o)};for(i=0,a=n.length;i0?i[e-1]:null,s=eMath.abs(s)&&(c=s,l=o),t[n.axis]=l,t._custom={barStart:c,barEnd:l,start:i,end:a,min:o,max:s}}function _l(e,t,n,r){return W(e)?gl(e,t,n,r):t[n.axis]=n.parse(e,r),t}function vl(e,t,n,r){let i=e.iScale,a=e.vScale,o=i.getLabels(),s=i===a,c=[],l,u,d,f;for(l=n,u=n+r;l=n?1:-1):Ua(e)}function xl(e){let t,n,r,i,a;return e.horizontal?(t=e.base>e.x,n=`left`,r=`right`):(t=e.basee.controller.options.grouped),i=n.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(t),s=o&&o[n.axis],c=e=>{let t=e._parsed.find(e=>e[n.axis]===s),r=t&&t[e.vScale.axis];if(U(r)||isNaN(r))return!0};for(let n of r)if(!(t!==void 0&&c(n))&&((i===!1||a.indexOf(n.stack)===-1||i===void 0&&n.stack===void 0)&&a.push(n.stack),n.index===e))break;return a.length||a.push(void 0),a}_getStackCount(e){return this._getStacks(void 0,e).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){let e=this.chart.scales,t=this.chart.options.indexAxis;return Object.keys(e).filter(n=>e[n].axis===t).shift()}_getAxis(){let e={},t=this.getFirstScaleIdForIndexAxis();for(let n of this.chart.data.datasets)e[K(this.chart.options.indexAxis===`x`?n.xAxisID:n.yAxisID,t)]=!0;return Object.keys(e)}_getStackIndex(e,t,n){let r=this._getStacks(e,n),i=t===void 0?-1:r.indexOf(t);return i===-1?r.length-1:i}_getRuler(){let e=this.options,t=this._cachedMeta,n=t.iScale,r=[],i,a;for(i=0,a=t.data.length;i=0;--n)t=Math.max(t,e[n].size(this.resolveDataElementOptions(n))/2);return t>0&&t}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart.data.labels||[],{xScale:r,yScale:i}=t,a=this.getParsed(e),o=r.getLabelForValue(a.x),s=i.getLabelForValue(a.y),c=a._custom;return{label:n[e]||``,value:`(`+o+`, `+s+(c?`, `+c:``)+`)`}}update(e){let t=this._cachedMeta.data;this.updateElements(t,0,t.length,e)}updateElements(e,t,n,r){let i=r===`reset`,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:s,includeOptions:c}=this._getSharedOptions(t,r),l=a.axis,u=o.axis;for(let d=t;dio(e,s,c,!0)?1:Math.max(t,t*n,r,r*n),m=(e,t,r)=>io(e,s,c,!0)?-1:Math.min(t,t*n,r,r*n),h=p(0,l,d),g=p(Z,u,f),_=m(Y,l,d),v=m(Y+Z,u,f);r=(h-_)/2,i=(g-v)/2,a=-(h+_)/2,o=-(g+v)/2}return{ratioX:r,ratioY:i,offsetX:a,offsetY:o}}var Al=class extends dl{constructor(e,t){super(e,t),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(e,t){let n=this.getDataset().data,r=this._cachedMeta;if(this._parsing===!1)r._parsed=n;else{let i=e=>+n[e];if(G(n[e])){let{key:e=`value`}=this._parsing;i=t=>+ja(n[t],e)}let a,o;for(a=e,o=e+t;a0&&!isNaN(e)?Math.abs(e)/t*X:0}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart,r=n.data.labels||[],i=Lo(t._parsed[e],n.options.locale);return{label:r[e]||``,value:i}}getMaxBorderWidth(e){let t=0,n=this.chart,r,i,a,o,s;if(!e){for(r=0,i=n.data.datasets.length;re!==`spacing`,_indexable:e=>e!==`spacing`&&!e.startsWith(`borderDash`)&&!e.startsWith(`hoverBorderDash`)}),$(Al,`overrides`,{aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){let t=e.data,{labels:{pointStyle:n,textAlign:r,color:i,useBorderRadius:a,borderRadius:o}}=e.legend.options;return t.labels.length&&t.datasets.length?t.labels.map((t,s)=>{let c=e.getDatasetMeta(0).controller.getStyle(s);return{text:t,fillStyle:c.backgroundColor,fontColor:i,hidden:!e.getDataVisibility(s),lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:c.borderWidth,strokeStyle:c.borderColor,textAlign:r,pointStyle:n,borderRadius:a&&(o||c.borderRadius),index:s}}):[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}}});var jl=class extends dl{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(e){let t=this._cachedMeta,{dataset:n,data:r=[],_dataset:i}=t,a=this.chart._animationsDisabled,{start:o,count:s}=So(t,r,a);this._drawStart=o,this._drawCount=s,Co(t)&&(o=0,s=r.length),n._chart=this.chart,n._datasetIndex=this.index,n._decimated=!!i._decimated,n.points=r;let c=this.resolveDatasetElementOptions(e);this.options.showLine||(c.borderWidth=0),c.segment=this.options.segment,this.updateElement(n,void 0,{animated:!a,options:c},e),this.updateElements(r,o,s,e)}updateElements(e,t,n,r){let i=r===`reset`,{iScale:a,vScale:o,_stacked:s,_dataset:c}=this._cachedMeta,{sharedOptions:l,includeOptions:u}=this._getSharedOptions(t,r),d=a.axis,f=o.axis,{spanGaps:p,segment:m}=this.options,h=Ja(p)?p:1/0,g=this.chart._animationsDisabled||i||r===`none`,_=t+n,v=e.length,y=t>0&&this.getParsed(t-1);for(let n=0;n=_){v.skip=!0;continue}let b=this.getParsed(n),x=U(b[f]),S=v[d]=a.getPixelForValue(b[d],n),C=v[f]=i||x?o.getBasePixel():o.getPixelForValue(s?this.applyStack(o,b,s):b[f],n);v.skip=isNaN(S)||isNaN(C)||x,v.stop=n>0&&Math.abs(b[d]-y[d])>h,m&&(v.parsed=b,v.raw=c.data[n]),u&&(v.options=l||this.resolveDataElementOptions(n,p.active?`active`:r)),g||this.updateElement(p,n,v,r),y=b}}getMaxOverflow(){let e=this._cachedMeta,t=e.dataset,n=t.options&&t.options.borderWidth||0,r=e.data||[];if(!r.length)return n;let i=r[0].size(this.resolveDataElementOptions(0)),a=r[r.length-1].size(this.resolveDataElementOptions(r.length-1));return Math.max(n,i,a)/2}draw(){let e=this._cachedMeta;e.dataset.updateControlPoints(this.chart.chartArea,e.iScale.axis),super.draw()}};$(jl,`id`,`line`),$(jl,`defaults`,{datasetElementType:`line`,dataElementType:`point`,showLine:!0,spanGaps:!1}),$(jl,`overrides`,{scales:{_index_:{type:`category`},_value_:{type:`linear`}}});var Ml=class extends dl{constructor(e,t){super(e,t),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart,r=n.data.labels||[],i=Lo(t._parsed[e].r,n.options.locale);return{label:r[e]||``,value:i}}parseObjectData(e,t,n,r){return Bs.bind(this)(e,t,n,r)}update(e){let t=this._cachedMeta.data;this._updateRadius(),this.updateElements(t,0,t.length,e)}getMinMax(){let e=this._cachedMeta,t={min:1/0,max:-1/0};return e.data.forEach((e,n)=>{let r=this.getParsed(n).r;!isNaN(r)&&this.chart.getDataVisibility(n)&&(rt.max&&(t.max=r))}),t}_updateRadius(){let e=this.chart,t=e.chartArea,n=e.options,r=Math.min(t.right-t.left,t.bottom-t.top),i=Math.max(r/2,0),a=(i-Math.max(n.cutoutPercentage?i/100*n.cutoutPercentage:1,0))/e.getVisibleDatasetCount();this.outerRadius=i-a*this.index,this.innerRadius=this.outerRadius-a}updateElements(e,t,n,r){let i=r===`reset`,a=this.chart,o=a.options.animation,s=this._cachedMeta.rScale,c=s.xCenter,l=s.yCenter,u=s.getIndexAngle(0)-.5*Y,d=u,f,p=360/this.countVisibleElements();for(f=0;f{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&t++}),t}_computeAngle(e,t,n){return this.chart.getDataVisibility(e)?Za(this.resolveDataElementOptions(e,t).angle||n):0}};$(Ml,`id`,`polarArea`),$(Ml,`defaults`,{dataElementType:`arc`,animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:`number`,properties:[`x`,`y`,`startAngle`,`endAngle`,`innerRadius`,`outerRadius`]}},indexAxis:`r`,startAngle:0}),$(Ml,`overrides`,{aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){let t=e.data;if(t.labels.length&&t.datasets.length){let{labels:{pointStyle:n,color:r}}=e.legend.options;return t.labels.map((t,i)=>{let a=e.getDatasetMeta(0).controller.getStyle(i);return{text:t,fillStyle:a.backgroundColor,strokeStyle:a.borderColor,fontColor:r,lineWidth:a.borderWidth,pointStyle:n,hidden:!e.getDataVisibility(i),index:i}})}return[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}},scales:{r:{type:`radialLinear`,angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});var Nl=class extends Al{};$(Nl,`id`,`pie`),$(Nl,`defaults`,{cutout:0,rotation:0,circumference:360,radius:`100%`});var Pl=class extends dl{getLabelAndValue(e){let t=this._cachedMeta.vScale,n=this.getParsed(e);return{label:t.getLabels()[e],value:``+t.getLabelForValue(n[t.axis])}}parseObjectData(e,t,n,r){return Bs.bind(this)(e,t,n,r)}update(e){let t=this._cachedMeta,n=t.dataset,r=t.data||[],i=t.iScale.getLabels();if(n.points=r,e!==`resize`){let t=this.resolveDatasetElementOptions(e);this.options.showLine||(t.borderWidth=0);let a={_loop:!0,_fullLoop:i.length===r.length,options:t};this.updateElement(n,void 0,a,e)}this.updateElements(r,0,r.length,e)}updateElements(e,t,n,r){let i=this._cachedMeta.rScale,a=r===`reset`;for(let o=t;o0&&this.getParsed(t-1);for(let l=t;l0&&Math.abs(n[f]-v[f])>g,h&&(m.parsed=n,m.raw=c.data[l]),d&&(m.options=u||this.resolveDataElementOptions(l,t.active?`active`:r)),_||this.updateElement(t,l,m,r),v=n}this.updateSharedOptions(u,r,l)}getMaxOverflow(){let e=this._cachedMeta,t=e.data||[];if(!this.options.showLine){let e=0;for(let n=t.length-1;n>=0;--n)e=Math.max(e,t[n].size(this.resolveDataElementOptions(n))/2);return e>0&&e}let n=e.dataset,r=n.options&&n.options.borderWidth||0;if(!t.length)return r;let i=t[0].size(this.resolveDataElementOptions(0)),a=t[t.length-1].size(this.resolveDataElementOptions(t.length-1));return Math.max(r,i,a)/2}};$(Fl,`id`,`scatter`),$(Fl,`defaults`,{datasetElementType:!1,dataElementType:`point`,showLine:!1,fill:!1}),$(Fl,`overrides`,{interaction:{mode:`point`},scales:{x:{type:`linear`},y:{type:`linear`}}});function Il(){throw Error(`This method is not implemented: Check that a complete date adapter is provided.`)}var Ll={_date:class e{static override(t){Object.assign(e.prototype,t)}constructor(e){$(this,`options`,void 0),this.options=e||{}}init(){}formats(){return Il()}parse(){return Il()}format(){return Il()}add(){return Il()}diff(){return Il()}startOf(){return Il()}endOf(){return Il()}}};function Rl(e,t,n,r){let{controller:i,data:a,_sorted:o}=e,s=i._cachedMeta.iScale,c=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null;if(s&&t===s.axis&&t!==`r`&&o&&a.length){let o=s._reversePixels?uo:lo;if(!r){let r=o(a,t,n);if(c){let{vScale:t}=i._cachedMeta,{_parsed:n}=e,a=n.slice(0,r.lo+1).reverse().findIndex(e=>!U(e[t.axis]));r.lo-=Math.max(0,a);let o=n.slice(r.hi).findIndex(e=>!U(e[t.axis]));r.hi+=Math.max(0,o)}return r}if(i._sharedOptions){let e=a[0],r=typeof e.getRange==`function`&&e.getRange(t);if(r){let e=o(a,t,n-r),i=o(a,t,n+r);return{lo:e.lo,hi:i.hi}}}}return{lo:0,hi:a.length-1}}function zl(e,t,n,r,i){let a=e.getSortedVisibleDatasetMetas(),o=n[t];for(let e=0,n=a.length;e{e[o]&&e[o](t[n],i)&&(a.push({element:e,datasetIndex:r,index:c}),s=s||e.inRange(t.x,t.y,i))}),r&&!s?[]:a}var Kl={evaluateInteractionItems:zl,modes:{index(e,t,n,r){let i=oc(t,e),a=n.axis||`x`,o=n.includeInvisible||!1,s=n.intersect?Vl(e,i,a,r,o):Wl(e,i,a,!1,r,o),c=[];return s.length?(e.getSortedVisibleDatasetMetas().forEach(e=>{let t=s[0].index,n=e.data[t];n&&!n.skip&&c.push({element:n,datasetIndex:e.index,index:t})}),c):[]},dataset(e,t,n,r){let i=oc(t,e),a=n.axis||`xy`,o=n.includeInvisible||!1,s=n.intersect?Vl(e,i,a,r,o):Wl(e,i,a,!1,r,o);if(s.length>0){let t=s[0].datasetIndex,n=e.getDatasetMeta(t).data;s=[];for(let e=0;ee.pos===t)}function Yl(e,t){return e.filter(e=>ql.indexOf(e.pos)===-1&&e.box.axis===t)}function Xl(e,t){return e.sort((e,n)=>{let r=t?n:e,i=t?e:n;return r.weight===i.weight?r.index-i.index:r.weight-i.weight})}function Zl(e){let t=[],n,r,i,a,o,s;for(n=0,r=(e||[]).length;ne.box.fullSize),!0),r=Xl(Jl(t,`left`),!0),i=Xl(Jl(t,`right`)),a=Xl(Jl(t,`top`),!0),o=Xl(Jl(t,`bottom`)),s=Yl(t,`x`),c=Yl(t,`y`);return{fullSize:n,leftAndTop:r.concat(a),rightAndBottom:i.concat(c).concat(o).concat(s),chartArea:Jl(t,`chartArea`),vertical:r.concat(i).concat(c),horizontal:a.concat(o).concat(s)}}function tu(e,t,n,r){return Math.max(e[n],t[n])+Math.max(e[r],t[r])}function nu(e,t){e.top=Math.max(e.top,t.top),e.left=Math.max(e.left,t.left),e.bottom=Math.max(e.bottom,t.bottom),e.right=Math.max(e.right,t.right)}function ru(e,t,n,r){let{pos:i,box:a}=n,o=e.maxPadding;if(!G(i)){n.size&&(e[i]-=n.size);let t=r[n.stack]||{size:0,count:1};t.size=Math.max(t.size,n.horizontal?a.height:a.width),n.size=t.size/t.count,e[i]+=n.size}a.getPadding&&nu(o,a.getPadding());let s=Math.max(0,t.outerWidth-tu(o,e,`left`,`right`)),c=Math.max(0,t.outerHeight-tu(o,e,`top`,`bottom`)),l=s!==e.w,u=c!==e.h;return e.w=s,e.h=c,n.horizontal?{same:l,other:u}:{same:u,other:l}}function iu(e){let t=e.maxPadding;function n(n){let r=Math.max(t[n]-e[n],0);return e[n]+=r,r}e.y+=n(`top`),e.x+=n(`left`),n(`right`),n(`bottom`)}function au(e,t){let n=t.maxPadding;function r(e){let r={left:0,top:0,right:0,bottom:0};return e.forEach(e=>{r[e]=Math.max(t[e],n[e])}),r}return r(e?[`left`,`right`]:[`top`,`bottom`])}function ou(e,t,n,r){let i=[],a,o,s,c,l,u;for(a=0,o=e.length,l=0;a{typeof e.beforeLayout==`function`&&e.beforeLayout()});let u=c.reduce((e,t)=>t.box.options&&t.box.options.display===!1?e:e+1,0)||1,d=Object.freeze({outerWidth:t,outerHeight:n,padding:i,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/u,hBoxMaxHeight:o/2}),f=Object.assign({},i);nu(f,gs(r));let p=Object.assign({maxPadding:f,w:a,h:o,x:i.left,y:i.top},i),m=$l(c.concat(l),d);ou(s.fullSize,p,d,m),ou(c,p,d,m),ou(l,p,d,m)&&ou(c,p,d,m),iu(p),cu(s.leftAndTop,p,d,m),p.x+=p.w,p.y+=p.h,cu(s.rightAndBottom,p,d,m),e.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},J(s.chartArea,t=>{let n=t.box;Object.assign(n,e.chartArea),n.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}},uu=class{acquireContext(e,t){}releaseContext(e){return!1}addEventListener(e,t,n){}removeEventListener(e,t,n){}getDevicePixelRatio(){return 1}getMaximumSize(e,t,n,r){return t=Math.max(0,t||e.width),n=n||e.height,{width:t,height:Math.max(0,r?Math.floor(t/r):n)}}isAttached(e){return!0}updateConfig(e){}},du=class extends uu{acquireContext(e){return e&&e.getContext&&e.getContext(`2d`)||null}updateConfig(e){e.options.animation=!1}},fu=`$chartjs`,pu={touchstart:`mousedown`,touchmove:`mousemove`,touchend:`mouseup`,pointerenter:`mouseenter`,pointerdown:`mousedown`,pointermove:`mousemove`,pointerup:`mouseup`,pointerleave:`mouseout`,pointerout:`mouseout`},mu=e=>e===null||e===``;function hu(e,t){let n=e.style,r=e.getAttribute(`height`),i=e.getAttribute(`width`);if(e[fu]={initial:{height:r,width:i,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||`block`,n.boxSizing=n.boxSizing||`border-box`,mu(i)){let t=fc(e,`width`);t!==void 0&&(e.width=t)}if(mu(r)){if(e.style.height===``)e.height=e.width/(t||2);else{let t=fc(e,`height`);t!==void 0&&(e.height=t)}}return e}var gu=dc?{passive:!0}:!1;function _u(e,t,n){e&&e.addEventListener(t,n,gu)}function vu(e,t,n){e&&e.canvas&&e.canvas.removeEventListener(t,n,gu)}function yu(e,t){let n=pu[e.type]||e.type,{x:r,y:i}=oc(e,t);return{type:n,chart:t,native:e,x:r===void 0?null:r,y:i===void 0?null:i}}function bu(e,t){for(let n of e)if(n===t||n.contains(t))return!0}function xu(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t=t||bu(n.addedNodes,r),t=t&&!bu(n.removedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}function Su(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t=t||bu(n.removedNodes,r),t=t&&!bu(n.addedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}var Cu=new Map,wu=0;function Tu(){let e=window.devicePixelRatio;e!==wu&&(wu=e,Cu.forEach((t,n)=>{n.currentDevicePixelRatio!==e&&t()}))}function Eu(e,t){Cu.size||window.addEventListener(`resize`,Tu),Cu.set(e,t)}function Du(e){Cu.delete(e),Cu.size||window.removeEventListener(`resize`,Tu)}function Ou(e,t,n){let r=e.canvas,i=r&&Qs(r);if(!i)return;let a=vo((e,t)=>{let r=i.clientWidth;n(e,t),r{let t=e[0],n=t.contentRect.width,r=t.contentRect.height;(n!==0||r!==0)&&a(n,r)});return o.observe(i),Eu(e,a),o}function ku(e,t,n){n&&n.disconnect(),t===`resize`&&Du(e)}function Au(e,t,n){let r=e.canvas,i=vo(t=>{e.ctx!==null&&n(yu(t,e))},e);return _u(r,t,i),i}var ju=class extends uu{acquireContext(e,t){let n=e&&e.getContext&&e.getContext(`2d`);return n&&n.canvas===e?(hu(e,t),n):null}releaseContext(e){let t=e.canvas;if(!t[fu])return!1;let n=t[fu].initial;[`height`,`width`].forEach(e=>{let r=n[e];U(r)?t.removeAttribute(e):t.setAttribute(e,r)});let r=n.style||{};return Object.keys(r).forEach(e=>{t.style[e]=r[e]}),t.width=t.width,delete t[fu],!0}addEventListener(e,t,n){this.removeEventListener(e,t);let r=e.$proxies||(e.$proxies={});r[t]=({attach:xu,detach:Su,resize:Ou}[t]||Au)(e,t,n)}removeEventListener(e,t){let n=e.$proxies||(e.$proxies={}),r=n[t];r&&(({attach:ku,detach:ku,resize:ku}[t]||vu)(e,t,r),n[t]=void 0)}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(e,t,n,r){return lc(e,t,n,r)}isAttached(e){let t=e&&Qs(e);return!!(t&&t.isConnected)}};function Mu(e){return!Zs()||typeof OffscreenCanvas<`u`&&e instanceof OffscreenCanvas?du:ju}var Nu=class{constructor(){$(this,`x`,void 0),$(this,`y`,void 0),$(this,`active`,!1),$(this,`options`,void 0),$(this,`$animations`,void 0)}tooltipPosition(e){let{x:t,y:n}=this.getProps([`x`,`y`],e);return{x:t,y:n}}hasValue(){return Ja(this.x)&&Ja(this.y)}getProps(e,t){let n=this.$animations;if(!t||!n)return this;let r={};return e.forEach(e=>{r[e]=n[e]&&n[e].active()?n[e]._to:this[e]}),r}};$(Nu,`defaults`,{}),$(Nu,`defaultRoutes`,void 0);function Pu(e,t){let n=e.options.ticks,r=Fu(e),i=Math.min(n.maxTicksLimit||r,r),a=n.major.enabled?Lu(t):[],o=a.length,s=a[0],c=a[o-1],l=[];if(o>i)return Ru(t,l,a,o/i),l;let u=Iu(a,t,i);if(o>0){let e,n,r=o>1?Math.round((c-s)/(o-1)):null;for(zu(t,l,u,U(r)?0:s-r,s),e=0,n=o-1;ei)return t}return Math.max(i,1)}function Lu(e){let t=[],n,r;for(n=0,r=e.length;ne===`left`?`right`:e===`right`?`left`:e,Hu=(e,t,n)=>t===`top`||t===`left`?e[t]+n:e[t]-n,Uu=(e,t)=>Math.min(t||e,e);function Wu(e,t){let n=[],r=e.length/t,i=e.length,a=0;for(;ao+s)))return c}function Ku(e,t){J(e,e=>{let n=e.gc,r=n.length/2,i;if(r>t){for(i=0;in?n:t,n=r&&t>n?t:n,{min:va(t,va(n,t)),max:va(n,va(t,n))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){let e=this.chart.data;return this.options.labels||(this.isHorizontal()?e.xLabels:e.yLabels)||e.labels||[]}getLabelItems(e=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(e))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){q(this.options.beforeUpdate,[this])}update(e,t,n){let{beginAtZero:r,grace:i,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=e,this.maxHeight=t,this._margins=n=Object.assign({left:0,right:0,top:0,bottom:0},n),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+n.left+n.right:this.height+n.top+n.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=ys(this,i,r),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();let s=o=i||n<=1||!this.isHorizontal()){this.labelRotation=r;return}let l=this._getLabelSizes(),u=l.widest.width,d=l.highest.height,f=ao(this.chart.width-u,0,this.maxWidth);o=e.offset?this.maxWidth/n:f/(n-1),u+6>o&&(o=f/(n-(e.offset?.5:1)),s=this.maxHeight-qu(e.grid)-t.padding-Ju(e.title,this.chart.options.font),c=Math.sqrt(u*u+d*d),a=Qa(Math.min(Math.asin(ao((l.highest.height+6)/o,-1,1)),Math.asin(ao(s/c,-1,1))-Math.asin(ao(d/c,-1,1)))),a=Math.max(r,Math.min(i,a))),this.labelRotation=a}afterCalculateLabelRotation(){q(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){q(this.options.beforeFit,[this])}fit(){let e={width:0,height:0},{chart:t,options:{ticks:n,title:r,grid:i}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){let a=Ju(r,t.options.font);if(o?(e.width=this.maxWidth,e.height=qu(i)+a):(e.height=this.maxHeight,e.width=qu(i)+a),n.display&&this.ticks.length){let{first:t,last:r,widest:i,highest:a}=this._getLabelSizes(),s=n.padding*2,c=Za(this.labelRotation),l=Math.cos(c),u=Math.sin(c);if(o){let t=n.mirror?0:u*i.width+l*a.height;e.height=Math.min(this.maxHeight,e.height+t+s)}else{let t=n.mirror?0:l*i.width+u*a.height;e.width=Math.min(this.maxWidth,e.width+t+s)}this._calculatePadding(t,r,u,l)}}this._handleMargins(),o?(this.width=this._length=t.width-this._margins.left-this._margins.right,this.height=e.height):(this.width=e.width,this.height=this._length=t.height-this._margins.top-this._margins.bottom)}_calculatePadding(e,t,n,r){let{ticks:{align:i,padding:a},position:o}=this.options,s=this.labelRotation!==0,c=o!==`top`&&this.axis===`x`;if(this.isHorizontal()){let o=this.getPixelForTick(0)-this.left,l=this.right-this.getPixelForTick(this.ticks.length-1),u=0,d=0;s?c?(u=r*e.width,d=n*t.height):(u=n*e.height,d=r*t.width):i===`start`?d=t.width:i===`end`?u=e.width:i!==`inner`&&(u=e.width/2,d=t.width/2),this.paddingLeft=Math.max((u-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((d-l+a)*this.width/(this.width-l),0)}else{let n=t.height/2,r=e.height/2;i===`start`?(n=0,r=e.height):i===`end`&&(n=t.height,r=0),this.paddingTop=n+a,this.paddingBottom=r+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){q(this.options.afterFit,[this])}isHorizontal(){let{axis:e,position:t}=this.options;return t===`top`||t===`bottom`||e===`x`}isFullSize(){return this.options.fullSize}_convertTicksToLabels(e){this.beforeTickToLabelConversion(),this.generateTickLabels(e);let t,n;for(t=0,n=e.length;t({width:a[e]||0,height:o[e]||0});return{first:C(0),last:C(t-1),widest:C(x),highest:C(S),widths:a,heights:o}}getLabelForValue(e){return e}getPixelForValue(e,t){return NaN}getValueForPixel(e){}getPixelForTick(e){let t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e].value)}getPixelForDecimal(e){this._reversePixels&&(e=1-e);let t=this._startPixel+e*this._length;return oo(this._alignToPixels?Yo(this.chart,t,0):t)}getDecimalForPixel(e){let t=(e-this._startPixel)/this._length;return this._reversePixels?1-t:t}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){let{min:e,max:t}=this;return e<0&&t<0?t:e>0&&t>0?e:0}getContext(e){let t=this.ticks||[];if(e>=0&&eo*r?o/n:s/r:s*r0:!!e}_computeGridLineItems(e){let t=this.axis,n=this.chart,r=this.options,{grid:i,position:a,border:o}=r,s=i.offset,c=this.isHorizontal(),l=this.ticks.length+ +!!s,u=qu(i),d=[],f=o.setContext(this.getContext()),p=f.display?f.width:0,m=p/2,h=function(e){return Yo(n,e,p)},g,_,v,y,b,x,S,C,w,T,E,D;if(a===`top`)g=h(this.bottom),x=this.bottom-u,C=g-m,T=h(e.top)+m,D=e.bottom;else if(a===`bottom`)g=h(this.top),T=e.top,D=h(e.bottom)-m,x=g+m,C=this.top+u;else if(a===`left`)g=h(this.right),b=this.right-u,S=g-m,w=h(e.left)+m,E=e.right;else if(a===`right`)g=h(this.left),w=e.left,E=h(e.right)-m,b=g+m,S=this.left+u;else if(t===`x`){if(a===`center`)g=h((e.top+e.bottom)/2+.5);else if(G(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}T=e.top,D=e.bottom,x=g+m,C=x+u}else if(t===`y`){if(a===`center`)g=h((e.left+e.right)/2);else if(G(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}b=g-m,S=b-u,w=e.left,E=e.right}let O=K(r.ticks.maxTicksLimit,l),k=Math.max(1,Math.ceil(l/O));for(_=0;_0&&(a-=r/2)}f={left:a,top:i,width:r+t.width,height:n+t.height,color:e.backdropColor}}h.push({label:y,font:w,textOffset:D,options:{rotation:m,color:n,strokeColor:s,strokeWidth:l,textAlign:d,textBaseline:O,translation:[b,x],backdrop:f}})}return h}_getXAxisLabelAlignment(){let{position:e,ticks:t}=this.options;if(-Za(this.labelRotation))return e===`top`?`left`:`right`;let n=`center`;return t.align===`start`?n=`left`:t.align===`end`?n=`right`:t.align===`inner`&&(n=`inner`),n}_getYAxisLabelAlignment(e){let{position:t,ticks:{crossAlign:n,mirror:r,padding:i}}=this.options,a=this._getLabelSizes(),o=e+i,s=a.widest.width,c,l;return t===`left`?r?(l=this.right+i,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l+=s)):(l=this.right-o,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l=this.left)):t===`right`?r?(l=this.left+i,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l-=s)):(l=this.left+o,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l=this.right)):c=`right`,{textAlign:c,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;let e=this.chart,t=this.options.position;if(t===`left`||t===`right`)return{top:0,left:this.left,bottom:e.height,right:this.right};if(t===`top`||t===`bottom`)return{top:this.top,left:0,bottom:this.bottom,right:e.width}}drawBackground(){let{ctx:e,options:{backgroundColor:t},left:n,top:r,width:i,height:a}=this;t&&(e.save(),e.fillStyle=t,e.fillRect(n,r,i,a),e.restore())}getLineWidthForValue(e){let t=this.options.grid;if(!this._isVisible()||!t.display)return 0;let n=this.ticks.findIndex(t=>t.value===e);return n>=0?t.setContext(this.getContext(n)).lineWidth:0}drawGrid(e){let t=this.options.grid,n=this.ctx,r=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(e)),i,a,o=(e,t,r)=>{r.width&&r.color&&(n.save(),n.lineWidth=r.width,n.strokeStyle=r.color,n.setLineDash(r.borderDash||[]),n.lineDashOffset=r.borderDashOffset,n.beginPath(),n.moveTo(e.x,e.y),n.lineTo(t.x,t.y),n.stroke(),n.restore())};if(t.display)for(i=0,a=r.length;i{this.draw(e)}}]:[{z:r,draw:e=>{this.drawBackground(),this.drawGrid(e),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:n,draw:e=>{this.drawLabels(e)}}]}getMatchingVisibleMetas(e){let t=this.chart.getSortedVisibleDatasetMetas(),n=this.axis+`AxisID`,r=[],i,a;for(i=0,a=t.length;i{let r=n.split(`.`),i=r.pop(),a=[e].concat(r).join(`.`),o=t[n].split(`.`),s=o.pop(),c=o.join(`.`);Q.route(a,i,c,s)})}function rd(e){return`id`in e&&`defaults`in e}var id=new class{constructor(){this.controllers=new ed(dl,`datasets`,!0),this.elements=new ed(Nu,`elements`),this.plugins=new ed(Object,`plugins`),this.scales=new ed($u,`scales`),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...e){this._each(`register`,e)}remove(...e){this._each(`unregister`,e)}addControllers(...e){this._each(`register`,e,this.controllers)}addElements(...e){this._each(`register`,e,this.elements)}addPlugins(...e){this._each(`register`,e,this.plugins)}addScales(...e){this._each(`register`,e,this.scales)}getController(e){return this._get(e,this.controllers,`controller`)}getElement(e){return this._get(e,this.elements,`element`)}getPlugin(e){return this._get(e,this.plugins,`plugin`)}getScale(e){return this._get(e,this.scales,`scale`)}removeControllers(...e){this._each(`unregister`,e,this.controllers)}removeElements(...e){this._each(`unregister`,e,this.elements)}removePlugins(...e){this._each(`unregister`,e,this.plugins)}removeScales(...e){this._each(`unregister`,e,this.scales)}_each(e,t,n){[...t].forEach(t=>{let r=n||this._getRegistryForType(t);n||r.isForType(t)||r===this.plugins&&t.id?this._exec(e,r,t):J(t,t=>{let r=n||this._getRegistryForType(t);this._exec(e,r,t)})})}_exec(e,t,n){let r=Ma(e);q(n[`before`+r],[],n),t[e](n),q(n[`after`+r],[],n)}_getRegistryForType(e){for(let t=0;te.filter(e=>!t.some(t=>e.plugin.id===t.plugin.id));this._notify(r(t,n),e,`stop`),this._notify(r(n,t),e,`start`)}};function od(e){let t={},n=[],r=Object.keys(id.plugins.items);for(let e=0;e1&&pd(e[0].toLowerCase());if(t)return t}throw Error(`Cannot determine type of '${e}' axis. Please provide 'axis' or 'position' option.`)}function gd(e,t,n){if(n[t+`AxisID`]===e)return{axis:t}}function _d(e,t){if(t.data&&t.data.datasets){let n=t.data.datasets.filter(t=>t.xAxisID===e||t.yAxisID===e);if(n.length)return gd(e,`x`,n[0])||gd(e,`y`,n[0])}return{}}function vd(e,t){let n=Ho[e.type]||{scales:{}},r=t.scales||{},i=ud(e.type,t),a=Object.create(null);return Object.keys(r).forEach(t=>{let o=r[t];if(!G(o))return console.error(`Invalid scale configuration for scale: ${t}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);let s=hd(t,o,_d(t,e),Q.scales[o.type]),c=fd(s,i),l=n.scales||{};a[t]=Ea(Object.create(null),[{axis:s},o,l[s],l[c]])}),e.data.datasets.forEach(n=>{let i=n.type||e.type,o=n.indexAxis||ud(i,t),s=(Ho[i]||{}).scales||{};Object.keys(s).forEach(e=>{let t=dd(e,o),i=n[t+`AxisID`]||t;a[i]=a[i]||Object.create(null),Ea(a[i],[{axis:t},r[i],s[e]])})}),Object.keys(a).forEach(e=>{let t=a[e];Ea(t,[Q.scales[t.type],Q.scale])}),a}function yd(e){let t=e.options||(e.options={});t.plugins=K(t.plugins,{}),t.scales=vd(e,t)}function bd(e){return e=e||{},e.datasets=e.datasets||[],e.labels=e.labels||[],e}function xd(e){return e=e||{},e.data=bd(e.data),yd(e),e}var Sd=new Map,Cd=new Set;function wd(e,t){let n=Sd.get(e);return n||(n=t(),Sd.set(e,n),Cd.add(n)),n}var Td=(e,t,n)=>{let r=ja(t,n);r!==void 0&&e.add(r)},Ed=class{constructor(e){this._config=xd(e),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(e){this._config.type=e}get data(){return this._config.data}set data(e){this._config.data=bd(e)}get options(){return this._config.options}set options(e){this._config.options=e}get plugins(){return this._config.plugins}update(){let e=this._config;this.clearCache(),yd(e)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(e){return wd(e,()=>[[`datasets.${e}`,``]])}datasetAnimationScopeKeys(e,t){return wd(`${e}.transition.${t}`,()=>[[`datasets.${e}.transitions.${t}`,`transitions.${t}`],[`datasets.${e}`,``]])}datasetElementScopeKeys(e,t){return wd(`${e}-${t}`,()=>[[`datasets.${e}.elements.${t}`,`datasets.${e}`,`elements.${t}`,``]])}pluginScopeKeys(e){let t=e.id,n=this.type;return wd(`${n}-plugin-${t}`,()=>[[`plugins.${t}`,...e.additionalOptionScopes||[]]])}_cachedScopes(e,t){let n=this._scopeCache,r=n.get(e);return(!r||t)&&(r=new Map,n.set(e,r)),r}getOptionScopes(e,t,n){let{options:r,type:i}=this,a=this._cachedScopes(e,n),o=a.get(t);if(o)return o;let s=new Set;t.forEach(t=>{e&&(s.add(e),t.forEach(t=>Td(s,e,t))),t.forEach(e=>Td(s,r,e)),t.forEach(e=>Td(s,Ho[i]||{},e)),t.forEach(e=>Td(s,Q,e)),t.forEach(e=>Td(s,Uo,e))});let c=Array.from(s);return c.length===0&&c.push(Object.create(null)),Cd.has(t)&&a.set(t,c),c}chartOptionScopes(){let{options:e,type:t}=this;return[e,Ho[t]||{},Q.datasets[t]||{},{type:t},Q,Uo]}resolveNamedOptions(e,t,n,r=[``]){let i={$shared:!0},{resolver:a,subPrefixes:o}=Dd(this._resolverCache,e,r),s=a;if(kd(a,t)){i.$shared=!1,n=Pa(n)?n():n;let t=this.createResolver(e,n,o);s=Ss(a,n,t)}for(let e of t)i[e]=s[e];return i}createResolver(e,t,n=[``],r){let{resolver:i}=Dd(this._resolverCache,e,n);return G(t)?Ss(i,t,void 0,r):i}};function Dd(e,t,n){let r=e.get(t);r||(r=new Map,e.set(t,r));let i=n.join(),a=r.get(i);return a||(a={resolver:xs(t,n),subPrefixes:n.filter(e=>!e.toLowerCase().includes(`hover`))},r.set(i,a)),a}var Od=e=>G(e)&&Object.getOwnPropertyNames(e).some(t=>Pa(e[t]));function kd(e,t){let{isScriptable:n,isIndexable:r}=Cs(e);for(let i of t){let t=n(i),a=r(i),o=(a||t)&&e[i];if(t&&(Pa(o)||Od(o))||a&&W(o))return!0}return!1}var Ad=`4.5.1`,jd=[`top`,`bottom`,`left`,`right`,`chartArea`];function Md(e,t){return e===`top`||e===`bottom`||jd.indexOf(e)===-1&&t===`x`}function Nd(e,t){return function(n,r){return n[e]===r[e]?n[t]-r[t]:n[e]-r[e]}}function Pd(e){let t=e.chart,n=t.options.animation;t.notifyPlugins(`afterRender`),q(n&&n.onComplete,[e],t)}function Fd(e){let t=e.chart,n=t.options.animation;q(n&&n.onProgress,[e],t)}function Id(e){return Zs()&&typeof e==`string`?e=document.getElementById(e):e&&e.length&&(e=e[0]),e&&e.canvas&&(e=e.canvas),e}var Ld={},Rd=e=>{let t=Id(e);return Object.values(Ld).filter(e=>e.canvas===t).pop()};function zd(e,t,n){let r=Object.keys(e);for(let i of r){let r=+i;if(r>=t){let a=e[i];delete e[i],(n>0||r>t)&&(e[r+n]=a)}}}function Bd(e,t,n,r){return!n||e.type===`mouseout`?null:r?t:e}var Vd=class{static register(...e){id.add(...e),Hd()}static unregister(...e){id.remove(...e),Hd()}constructor(e,t){let n=this.config=new Ed(t),r=Id(e),i=Rd(r);if(i)throw Error(`Canvas is already in use. Chart with ID '`+i.id+`' must be destroyed before the canvas with ID '`+i.canvas.id+`' can be reused.`);let a=n.createResolver(n.chartOptionScopes(),this.getContext());this.platform=new(n.platform||(Mu(r))),this.platform.updateConfig(n);let o=this.platform.acquireContext(r,a.aspectRatio),s=o&&o.canvas,c=s&&s.height,l=s&&s.width;this.id=ga(),this.ctx=o,this.canvas=s,this.width=l,this.height=c,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new ad,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=yo(e=>this.update(e),a.resizeDelay||0),this._dataChanges=[],Ld[this.id]=this,!o||!s?console.error(`Failed to create chart: can't acquire context from the given item`):(zc.listen(this,`complete`,Pd),zc.listen(this,`progress`,Fd),this._initialize(),this.attached&&this.update())}get aspectRatio(){let{options:{aspectRatio:e,maintainAspectRatio:t},width:n,height:r,_aspectRatio:i}=this;return U(e)?t&&i?i:r?n/r:null:e}get data(){return this.config.data}set data(e){this.config.data=e}get options(){return this._options}set options(e){this.config.options=e}get registry(){return id}_initialize(){return this.notifyPlugins(`beforeInit`),this.options.responsive?this.resize():uc(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins(`afterInit`),this}clear(){return Xo(this.canvas,this.ctx),this}stop(){return zc.stop(this),this}resize(e,t){zc.running(this)?this._resizeBeforeDraw={width:e,height:t}:this._resize(e,t)}_resize(e,t){let n=this.options,r=this.canvas,i=n.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(r,e,t,i),o=n.devicePixelRatio||this.platform.getDevicePixelRatio(),s=this.width?`resize`:`attach`;this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,uc(this,o,!0)&&(this.notifyPlugins(`resize`,{size:a}),q(n.onResize,[this,a],this),this.attached&&this._doResize(s)&&this.render())}ensureScalesHaveIDs(){J(this.options.scales||{},(e,t)=>{e.id=t})}buildOrUpdateScales(){let e=this.options,t=e.scales,n=this.scales,r=Object.keys(n).reduce((e,t)=>(e[t]=!1,e),{}),i=[];t&&(i=i.concat(Object.keys(t).map(e=>{let n=t[e],r=hd(e,n),i=r===`r`,a=r===`x`;return{options:n,dposition:i?`chartArea`:a?`bottom`:`left`,dtype:i?`radialLinear`:a?`category`:`linear`}}))),J(i,t=>{let i=t.options,a=i.id,o=hd(a,i),s=K(i.type,t.dtype);(i.position===void 0||Md(i.position,o)!==Md(t.dposition))&&(i.position=t.dposition),r[a]=!0;let c=null;a in n&&n[a].type===s?c=n[a]:(c=new(id.getScale(s))({id:a,type:s,ctx:this.ctx,chart:this}),n[c.id]=c),c.init(i,e)}),J(r,(e,t)=>{e||delete n[t]}),J(n,e=>{lu.configure(this,e,e.options),lu.addBox(this,e)})}_updateMetasets(){let e=this._metasets,t=this.data.datasets.length,n=e.length;if(e.sort((e,t)=>e.index-t.index),n>t){for(let e=t;et.length&&delete this._stacks,e.forEach((e,n)=>{t.filter(t=>t===e._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){let e=[],t=this.data.datasets,n,r;for(this._removeUnreferencedMetasets(),n=0,r=t.length;n{this.getDatasetMeta(t).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins(`reset`)}update(e){let t=this.config;t.update();let n=this._options=t.createResolver(t.chartOptionScopes(),this.getContext()),r=this._animationsDisabled=!n.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins(`beforeUpdate`,{mode:e,cancelable:!0})===!1)return;let i=this.buildOrUpdateControllers();this.notifyPlugins(`beforeElementsUpdate`);let a=0;for(let e=0,t=this.data.datasets.length;e{e.reset()}),this._updateDatasets(e),this.notifyPlugins(`afterUpdate`,{mode:e}),this._layers.sort(Nd(`z`,`_idx`));let{_active:o,_lastEvent:s}=this;s?this._eventHandler(s,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){J(this.scales,e=>{lu.removeBox(this,e)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){let e=this.options;(!Fa(new Set(Object.keys(this._listeners)),new Set(e.events))||!!this._responsiveListeners!==e.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){let{_hiddenIndices:e}=this,t=this._getUniformDataChanges()||[];for(let{method:n,start:r,count:i}of t)zd(e,r,n===`_removeElements`?-i:i)}_getUniformDataChanges(){let e=this._dataChanges;if(!e||!e.length)return;this._dataChanges=[];let t=this.data.datasets.length,n=t=>new Set(e.filter(e=>e[0]===t).map((e,t)=>t+`,`+e.splice(1).join(`,`))),r=n(0);for(let e=1;ee.split(`,`)).map(e=>({method:e[1],start:+e[2],count:+e[3]}))}_updateLayout(e){if(this.notifyPlugins(`beforeLayout`,{cancelable:!0})===!1)return;lu.update(this,this.width,this.height,e);let t=this.chartArea,n=t.width<=0||t.height<=0;this._layers=[],J(this.boxes,e=>{n&&e.position===`chartArea`||(e.configure&&e.configure(),this._layers.push(...e._layers()))},this),this._layers.forEach((e,t)=>{e._idx=t}),this.notifyPlugins(`afterLayout`)}_updateDatasets(e){if(this.notifyPlugins(`beforeDatasetsUpdate`,{mode:e,cancelable:!0})!==!1){for(let e=0,t=this.data.datasets.length;e=0;--t)this._drawDataset(e[t]);this.notifyPlugins(`afterDatasetsDraw`)}_drawDataset(e){let t=this.ctx,n={meta:e,index:e.index,cancelable:!0},r=Fc(this,e);this.notifyPlugins(`beforeDatasetDraw`,n)!==!1&&(r&&es(t,r),e.controller.draw(),r&&ts(t),n.cancelable=!1,this.notifyPlugins(`afterDatasetDraw`,n))}isPointInArea(e){return $o(e,this.chartArea,this._minPadding)}getElementsAtEventForMode(e,t,n,r){let i=Kl.modes[t];return typeof i==`function`?i(this,e,n,r):[]}getDatasetMeta(e){let t=this.data.datasets[e],n=this._metasets,r=n.filter(e=>e&&e._dataset===t).pop();return r||(r={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:t&&t.order||0,index:e,_dataset:t,_parsed:[],_sorted:!1},n.push(r)),r}getContext(){return this.$context||(this.$context=bs(null,{chart:this,type:`chart`}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(e){let t=this.data.datasets[e];if(!t)return!1;let n=this.getDatasetMeta(e);return typeof n.hidden==`boolean`?!n.hidden:!t.hidden}setDatasetVisibility(e,t){let n=this.getDatasetMeta(e);n.hidden=!t}toggleDataVisibility(e){this._hiddenIndices[e]=!this._hiddenIndices[e]}getDataVisibility(e){return!this._hiddenIndices[e]}_updateVisibility(e,t,n){let r=n?`show`:`hide`,i=this.getDatasetMeta(e),a=i.controller._resolveAnimations(void 0,r);Na(t)?(i.data[t].hidden=!n,this.update()):(this.setDatasetVisibility(e,n),a.update(i,{visible:n}),this.update(t=>t.datasetIndex===e?r:void 0))}hide(e,t){this._updateVisibility(e,t,!1)}show(e,t){this._updateVisibility(e,t,!0)}_destroyDatasetMeta(e){let t=this._metasets[e];t&&t.controller&&t.controller._destroy(),delete this._metasets[e]}_stop(){let e,t;for(this.stop(),zc.remove(this),e=0,t=this.data.datasets.length;e{t.addEventListener(this,n,r),e[n]=r},r=(e,t,n)=>{e.offsetX=t,e.offsetY=n,this._eventHandler(e)};J(this.options.events,e=>n(e,r))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});let e=this._responsiveListeners,t=this.platform,n=(n,r)=>{t.addEventListener(this,n,r),e[n]=r},r=(n,r)=>{e[n]&&(t.removeEventListener(this,n,r),delete e[n])},i=(e,t)=>{this.canvas&&this.resize(e,t)},a,o=()=>{r(`attach`,o),this.attached=!0,this.resize(),n(`resize`,i),n(`detach`,a)};a=()=>{this.attached=!1,r(`resize`,i),this._stop(),this._resize(0,0),n(`attach`,o)},t.isAttached(this.canvas)?o():a()}unbindEvents(){J(this._listeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._listeners={},J(this._responsiveListeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._responsiveListeners=void 0}updateHoverStyle(e,t,n){let r=n?`set`:`remove`,i,a,o,s;for(t===`dataset`&&(i=this.getDatasetMeta(e[0].datasetIndex),i.controller[`_`+r+`DatasetHoverStyle`]()),o=0,s=e.length;o{let n=this.getDatasetMeta(e);if(!n)throw Error(`No dataset found at index `+e);return{datasetIndex:e,element:n.data[t],index:t}});xa(n,t)||(this._active=n,this._lastEvent=null,this._updateHoverStyles(n,t))}notifyPlugins(e,t,n){return this._plugins.notify(this,e,t,n)}isPluginEnabled(e){return this._plugins._cache.filter(t=>t.plugin.id===e).length===1}_updateHoverStyles(e,t,n){let r=this.options.hover,i=(e,t)=>e.filter(e=>!t.some(t=>e.datasetIndex===t.datasetIndex&&e.index===t.index)),a=i(t,e),o=n?e:i(e,t);a.length&&this.updateHoverStyle(a,r.mode,!1),o.length&&r.mode&&this.updateHoverStyle(o,r.mode,!0)}_eventHandler(e,t){let n={event:e,replay:t,cancelable:!0,inChartArea:this.isPointInArea(e)},r=t=>(t.options.events||this.options.events).includes(e.native.type);if(this.notifyPlugins(`beforeEvent`,n,r)===!1)return;let i=this._handleEvent(e,t,n.inChartArea);return n.cancelable=!1,this.notifyPlugins(`afterEvent`,n,r),(i||n.changed)&&this.render(),this}_handleEvent(e,t,n){let{_active:r=[],options:i}=this,a=t,o=this._getActiveElements(e,r,n,a),s=Ia(e),c=Bd(e,this._lastEvent,n,s);n&&(this._lastEvent=null,q(i.onHover,[e,o,this],this),s&&q(i.onClick,[e,o,this],this));let l=!xa(o,r);return(l||t)&&(this._active=o,this._updateHoverStyles(o,r,t)),this._lastEvent=c,l}_getActiveElements(e,t,n,r){if(e.type===`mouseout`)return[];if(!n)return t;let i=this.options.hover;return this.getElementsAtEventForMode(e,i.mode,i,r)}};$(Vd,`defaults`,Q),$(Vd,`instances`,Ld),$(Vd,`overrides`,Ho),$(Vd,`registry`,id),$(Vd,`version`,Ad),$(Vd,`getChart`,Rd);function Hd(){return J(Vd.instances,e=>e._plugins.invalidate())}function Ud(e,t,n){let{startAngle:r,x:i,y:a,outerRadius:o,innerRadius:s,options:c}=t,{borderWidth:l,borderJoinStyle:u}=c,d=Math.min(l/o,ro(r-n));if(e.beginPath(),e.arc(i,a,o-l/2,r+d/2,n-d/2),s>0){let t=Math.min(l/s,ro(r-n));e.arc(i,a,s+l/2,n-t/2,r+t/2,!0)}else{let t=Math.min(l/2,o*ro(r-n));if(u===`round`)e.arc(i,a,t,n-Y/2,r+Y/2,!0);else if(u===`bevel`){let o=2*t*t,s=-o*Math.cos(n+Y/2)+i,c=-o*Math.sin(n+Y/2)+a,l=o*Math.cos(r+Y/2)+i,u=o*Math.sin(r+Y/2)+a;e.lineTo(s,c),e.lineTo(l,u)}}e.closePath(),e.moveTo(0,0),e.rect(0,0,e.canvas.width,e.canvas.height),e.clip(`evenodd`)}function Wd(e,t,n){let{startAngle:r,pixelMargin:i,x:a,y:o,outerRadius:s,innerRadius:c}=t,l=i/s;e.beginPath(),e.arc(a,o,s,r-l,n+l),c>i?(l=i/c,e.arc(a,o,c,n+l,r-l,!0)):e.arc(a,o,i,n+Z,r-Z),e.closePath(),e.clip()}function Gd(e){return ps(e,[`outerStart`,`outerEnd`,`innerStart`,`innerEnd`])}function Kd(e,t,n,r){let i=Gd(e.options.borderRadius),a=(n-t)/2,o=Math.min(a,r*t/2),s=e=>{let t=(n-Math.min(a,e))*r/2;return ao(e,0,Math.min(a,t))};return{outerStart:s(i.outerStart),outerEnd:s(i.outerEnd),innerStart:ao(i.innerStart,0,o),innerEnd:ao(i.innerEnd,0,o)}}function qd(e,t,n,r){return{x:n+e*Math.cos(t),y:r+e*Math.sin(t)}}function Jd(e,t,n,r,i,a){let{x:o,y:s,startAngle:c,pixelMargin:l,innerRadius:u}=t,d=Math.max(t.outerRadius+r+n-l,0),f=u>0?u+r+n+l:0,p=0,m=i-c;if(r){let e=((u>0?u-r:0)+(d>0?d-r:0))/2;p=(m-(e===0?m:m*e/(e+r)))/2}let h=(m-Math.max(.001,m*d-n/Y)/d)/2,g=c+h+p,_=i-h-p,{outerStart:v,outerEnd:y,innerStart:b,innerEnd:x}=Kd(t,f,d,_-g),S=d-v,C=d-y,w=g+v/S,T=_-y/C,E=f+b,D=f+x,O=g+b/E,k=_-x/D;if(e.beginPath(),a){let t=(w+T)/2;if(e.arc(o,s,d,w,t),e.arc(o,s,d,t,T),y>0){let t=qd(C,T,o,s);e.arc(t.x,t.y,y,T,_+Z)}let n=qd(D,_,o,s);if(e.lineTo(n.x,n.y),x>0){let t=qd(D,k,o,s);e.arc(t.x,t.y,x,_+Z,k+Math.PI)}let r=(_-x/f+(g+b/f))/2;if(e.arc(o,s,f,_-x/f,r,!0),e.arc(o,s,f,r,g+b/f,!0),b>0){let t=qd(E,O,o,s);e.arc(t.x,t.y,b,O+Math.PI,g-Z)}let i=qd(S,g,o,s);if(e.lineTo(i.x,i.y),v>0){let t=qd(S,w,o,s);e.arc(t.x,t.y,v,g-Z,w)}}else{e.moveTo(o,s);let t=Math.cos(w)*d+o,n=Math.sin(w)*d+s;e.lineTo(t,n);let r=Math.cos(T)*d+o,i=Math.sin(T)*d+s;e.lineTo(r,i)}e.closePath()}function Yd(e,t,n,r,i){let{fullCircles:a,startAngle:o,circumference:s}=t,c=t.endAngle;if(a){Jd(e,t,n,r,c,i);for(let t=0;t=Y&&p===0&&u!==`miter`&&Ud(e,t,h),a||(Jd(e,t,n,r,h,i),e.stroke())}var Zd=class extends Nu{constructor(e){super(),$(this,`circumference`,void 0),$(this,`endAngle`,void 0),$(this,`fullCircles`,void 0),$(this,`innerRadius`,void 0),$(this,`outerRadius`,void 0),$(this,`pixelMargin`,void 0),$(this,`startAngle`,void 0),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,e&&Object.assign(this,e)}inRange(e,t,n){let{angle:r,distance:i}=eo(this.getProps([`x`,`y`],n),{x:e,y:t}),{startAngle:a,endAngle:o,innerRadius:s,outerRadius:c,circumference:l}=this.getProps([`startAngle`,`endAngle`,`innerRadius`,`outerRadius`,`circumference`],n),u=(this.options.spacing+this.options.borderWidth)/2,d=K(l,o-a),f=io(r,a,o)&&a!==o,p=d>=X||f,m=so(i,s+u,c+u);return p&&m}getCenterPoint(e){let{x:t,y:n,startAngle:r,endAngle:i,innerRadius:a,outerRadius:o}=this.getProps([`x`,`y`,`startAngle`,`endAngle`,`innerRadius`,`outerRadius`],e),{offset:s,spacing:c}=this.options,l=(r+i)/2,u=(a+o+c+s)/2;return{x:t+Math.cos(l)*u,y:n+Math.sin(l)*u}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){let{options:t,circumference:n}=this,r=(t.offset||0)/4,i=(t.spacing||0)/2,a=t.circular;if(this.pixelMargin=t.borderAlign===`inner`?.33:0,this.fullCircles=n>X?Math.floor(n/X):0,n===0||this.innerRadius<0||this.outerRadius<0)return;e.save();let o=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(o)*r,Math.sin(o)*r);let s=r*(1-Math.sin(Math.min(Y,n||0)));e.fillStyle=t.backgroundColor,e.strokeStyle=t.borderColor,Yd(e,this,s,i,a),Xd(e,this,s,i,a),e.restore()}};$(Zd,`id`,`arc`),$(Zd,`defaults`,{borderAlign:`center`,borderColor:`#fff`,borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),$(Zd,`defaultRoutes`,{backgroundColor:`backgroundColor`}),$(Zd,`descriptors`,{_scriptable:!0,_indexable:e=>e!==`borderDash`});function Qd(e,t,n=t){e.lineCap=K(n.borderCapStyle,t.borderCapStyle),e.setLineDash(K(n.borderDash,t.borderDash)),e.lineDashOffset=K(n.borderDashOffset,t.borderDashOffset),e.lineJoin=K(n.borderJoinStyle,t.borderJoinStyle),e.lineWidth=K(n.borderWidth,t.borderWidth),e.strokeStyle=K(n.borderColor,t.borderColor)}function $d(e,t,n){e.lineTo(n.x,n.y)}function ef(e){return e.stepped?ns:e.tension||e.cubicInterpolationMode===`monotone`?rs:$d}function tf(e,t,n={}){let r=e.length,{start:i=0,end:a=r-1}=n,{start:o,end:s}=t,c=Math.max(i,o),l=Math.min(a,s),u=is&&a>s;return{count:r,start:c,loop:t.loop,ilen:l(o+(l?s-e:e))%a,y=()=>{h!==g&&(e.lineTo(u,g),e.lineTo(u,h),e.lineTo(u,_))};for(c&&(p=i[v(0)],e.moveTo(p.x,p.y)),f=0;f<=s;++f){if(p=i[v(f)],p.skip)continue;let t=p.x,n=p.y,r=t|0;r===m?(ng&&(g=n),u=(d*u+t)/++d):(y(),e.lineTo(t,n),m=r,d=0,h=g=n),_=n}y()}function af(e){let t=e.options,n=t.borderDash&&t.borderDash.length;return!e._decimated&&!e._loop&&!t.tension&&t.cubicInterpolationMode!==`monotone`&&!t.stepped&&!n?rf:nf}function of(e){return e.stepped?mc:e.tension||e.cubicInterpolationMode===`monotone`?hc:pc}function sf(e,t,n,r){let i=t._path;i||(i=t._path=new Path2D,t.path(i,n,r)&&i.closePath()),Qd(e,t.options),e.stroke(i)}function cf(e,t,n,r){let{segments:i,options:a}=t,o=af(t);for(let s of i)Qd(e,a,s.style),e.beginPath(),o(e,t,s,{start:n,end:n+r-1})&&e.closePath(),e.stroke()}var lf=typeof Path2D==`function`;function uf(e,t,n,r){lf&&!t.options.segment?sf(e,t,n,r):cf(e,t,n,r)}var df=class extends Nu{constructor(e){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,e&&Object.assign(this,e)}updateControlPoints(e,t){let n=this.options;if((n.tension||n.cubicInterpolationMode===`monotone`)&&!n.stepped&&!this._pointsUpdated){let r=n.spanGaps?this._loop:this._fullLoop;Xs(this._points,n,e,r,t),this._pointsUpdated=!0}}set points(e){this._points=e,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Oc(this,this.options.segment))}first(){let e=this.segments,t=this.points;return e.length&&t[e[0].start]}last(){let e=this.segments,t=this.points,n=e.length;return n&&t[e[n-1].end]}interpolate(e,t){let n=this.options,r=e[t],i=this.points,a=Tc(this,{property:t,start:r,end:r});if(!a.length)return;let o=[],s=of(n),c,l;for(c=0,l=a.length;ce!==`borderDash`&&e!==`fill`});function ff(e,t,n,r){let i=e.options,{[n]:a}=e.getProps([n],r);return Math.abs(t-a)e+t)/r.size,y:i/a}},nearest(e,t){if(!e.length)return!1;let n=t.x,r=t.y,i=1/0,a,o,s;for(a=0,o=e.length;a2&&(o.children=s>3?h.call(arguments,2):n),y(e,o,r,i,null)}function y(n,r,i,a,o){var s={type:n,props:r,key:i,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:u,__v:o||++t,__i:-1,__u:0};return!o&&e.vnode&&e.vnode(s),s}function b(e){return e.children}function x(e,t){this.props=e,this.context=t,this.__g=0}function S(e,t){if(t==null)return e.__&&S(e.__,e.__i+1);for(var n;to&&n.sort(a),t=n.shift(),o=n.length,8&t.__g&&(c=void 0,l=void 0,d=(l=(s=t).__v).__e,f=[],p=[],(m=s.__P)&&((c=g({constructor:u},l)).__v=l.__v+1,e.vnode&&e.vnode(c),P(m,c,l,s.__n,m.namespaceURI,32&l.__u?[d]:null,f,d||S(l),32&l.__u,p),c.__v=l.__v,c.__.__k[c.__i]=c,te(f,c,p),l.__=l.__e=null,c.__e!=d&&C(c)))}finally{(i=n.length)&&(r||queueMicrotask)(T)}}function E(e,t,n,r,i,a,o,s,c,l,u){var p,m,h,g,_,v,y=r.__k||f,b=t.length;for(c=D(n,t,y,c,b),p=0;pc?v--:v++,x=1)):(~l||(i>g?v--:i>1]+!!c){for(i=n-1;i>=0;i--)if((s=t[i])&&!(2&s.__u)&&a==s.key&&o==s.type)return i;for(i=n+1;i=n.__.length&&n.__.push({}),n.__[e]}function R(e){return pe=1,Ce(Fe,e)}function Ce(e,t,n){var r=Se(le++,2);if(r.t=e,!r.__c&&(r.__=[n?n(t):Fe(void 0,t),function(e){var t=r.__N?r.__N[0]:r.__[0],n=r.t(t,e);fe(t,n)||(r.__N=[n,r.__[1]],r.__c.setState({}))}],r.__c=I,!I.__f)){I.__f=!0;var i=I.shouldComponentUpdate;I.shouldComponentUpdate=function(e,t,n){var r=this.__H;if(!r)return!0;var a=!1,o=this.props!=e;if(r.__.some(function(e){e.__N&&(a=!0,fe(e.__[0],e.__N[0])||(o=!0))}),i){var s=i.call(this,e,t,n);return a?s||o:s}return!a||o}}return r.__}function z(e,t){var n=Se(le++,3);!L.__s&&Pe(n.__H,t)&&(n.__P=!0,n.__=e,n.u=t,I.__H.__h.push(n))}function we(e){return pe=5,Te(function(){return{current:e}},[])}function Te(e,t){var n=Se(le++,7);return Pe(n.__H,t)&&(n.__=e(),n.__H=t),n.__}function Ee(e,t){return pe=8,Te(function(){return e},t)}function De(){var e=Se(le++,11);if(!e.__){for(var t=I.__v;!t.__m&&t.__;)t=t.__;var n=t.__m||(t.__m=[0,0]);e.__=`P`+n[0]+`-`+n[1]++}return e.__}function Oe(){var e;do{for(;e=he.shift();)try{Me(e)}catch(t){L.__e(t,{__:(e=e.__P)&&e.__v})}for(;e=me.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(Me),t.__h.some(Ne),t.__h=[]}catch(n){t.__h=[],L.__e(n,e.__v)}}}while(he.length)}L.__b=function(e){I=null,ge&&ge(e)},L.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),xe&&xe(e,t)},L.__r=function(e){_e&&_e(e),le=0;var t=(I=e.__c).__H;t&&(ue==I?I.__h=[]:(t.__h.some(Me),t.__h.some(Ne),le=0),t.__h=[],t.__.some(function(e){e.__N&&(e.__=e.__N),e.u=e.__N=void 0})),ue=I},L.diffed=function(e){ve&&ve(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&je(me.push(t)),t.__H.__.some(function(e){e.u&&(e.__H=e.u)})),ue=I=null},L.__c=function(e,t){t.some(function(e){try{e.__h.some(Me),e.__h=e.__h.filter(function(e){return!e.__||Ne(e)})}catch(t){e.__h=[function(){throw t}]}}),ye&&ye(e,t)},L.unmount=function(e){be&&be(e);var t,n,r=e.__c;r&&r.__H&&(r.__H.__.some(function(r){try{if(r.__P&&r.__c){if(n===void 0){for(n=e.__;n&&(!n.__c||!n.__c.__P);)n=n.__;n=n&&n.__c}r.__P=n,je(he.push(r))}else Me(r)}catch(e){t=e}}),r.__H=void 0,t&&L.__e(t,r.__v))};var ke=typeof requestAnimationFrame==`function`;function Ae(e){var t,n=function(){clearTimeout(r),ke&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,35);ke&&(t=requestAnimationFrame(n))}function je(e){e!=1&&de==L.requestAnimationFrame||((de=L.requestAnimationFrame)||Ae)(Oe)}function Me(e){var t=I,n=e.__c;typeof n==`function`&&(e.__c=void 0,n()),I=t}function Ne(e){var t=I;e.__c=e.__(),I=t}function Pe(e,t){return!e||e.length!=t.length||t.some(function(t,n){return!fe(t,e[n])})}function Fe(e,t){return typeof t==`function`?t(e):t}var Ie=Object.fromEntries([{route:`home`,hash:`#home`,label:`대시보드`,title:`대시보드`,description:`네트워크, 장치와 시스템 상태를 한눈에 확인합니다.`},{route:`activity`,hash:`#activity`,label:`최근 활동`,title:`최근 활동`,description:`현재 부팅 이후 인터넷, 보호, 업데이트와 진단 상태 변화를 확인합니다.`},{route:`network`,hash:`#network`,label:`네트워크`,title:`네트워크`,description:`인터넷 연결과 내부 네트워크 주소, DHCP 및 네트워크 충돌을 한 곳에서 관리합니다.`},{route:`wifi`,hash:`#wifi`,label:`Wi-Fi`,title:`Wi-Fi`,description:`기본 무선 네트워크의 이름, 보안과 사용 상태를 관리합니다.`},{route:`iptv`,hash:`#iptv`,label:`IPTV`,title:`IPTV`,description:`SK Broadband와 LG U+ 멀티캐스트 IPTV를 설정합니다.`},{route:`devices`,hash:`#devices`,label:`연결된 기기`,title:`연결된 기기`,description:`네트워크에서 확인된 기기와 연결 방식을 살펴봅니다.`},{route:`safeshield`,hash:`#safeshield`,label:`SafeShield`,title:`SafeShield`,description:`DNS 보호 상태를 확인하고 차단 목록을 관리합니다.`},{route:`rules`,hash:`#rules`,label:`사용자 규칙`,title:`사용자 규칙`,description:`직접 허용하거나 차단할 도메인을 관리합니다.`},{route:`account`,hash:`#account`,label:`SmartSafeHub 계정`,title:`SmartSafeHub 계정`,description:`이 기기의 SmartSafeHub 계정 연결 상태와 구독 플랜을 확인합니다.`},{route:`apps`,hash:`#apps`,label:`Apps`,title:`SmartSafeHub Apps`,description:`SmartSafeHub에서 검증한 앱과 확장 기능을 살펴봅니다.`},{route:`system`,hash:`#system`,label:`업데이트`,title:`업데이트`,description:`기기의 펌웨어와 관리 소프트웨어 업데이트를 관리합니다.`},{route:`settings`,hash:`#settings`,label:`설정`,title:`설정`,description:`시스템 상태와 시간대를 확인하고 장치 관리 및 진단 기능을 설정합니다.`}].map(e=>[e.route,e])),Le=[`home`,`activity`,`network`,`wifi`,`devices`,`safeshield`,`rules`,`account`,`apps`,`system`],Re=`smartsafehub.theme`;function ze(){if(typeof window>`u`)return`light`;try{let e=window.localStorage.getItem(Re);if(e===`dark`||e===`light`)return e}catch{}return window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}function Be(e){try{window.localStorage.setItem(Re,e)}catch{}}function Ve(e){let t=document.querySelector(`meta[name="theme-color"]`);t&&(t.content=e===`dark`?`#0f172a`:`#f8fafc`),document.documentElement.style.colorScheme=e,document.body.style.backgroundColor=e===`dark`?`#020617`:`#f8fafc`}var He=Symbol.for(`pv`),Ue=0;Array.isArray;function B(t,n,r,i,a,o){n||(n={});var s,c,l=n;if(`ref`in l&&typeof t!=`function`)for(c in l={},n)c==`ref`?s=n[c]:l[c]=n[c];var u={type:t,props:l,key:r,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:He,__v:--Ue,__i:-1,__u:0};return(a||o)&&(u.__source=a,u.__self=o),e.vnode&&e.vnode(u),u}function V({children:e,title:t,...n}){return B(`svg`,{"aria-hidden":!t||void 0,fill:`none`,role:t?`img`:void 0,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`1.8`,viewBox:`0 0 24 24`,...n,children:[t?B(`title`,{children:t}):null,e]})}function We(e){return B(V,{...e,children:[B(`path`,{d:`M12 3 5 6v5c0 4.6 2.8 8.1 7 10 4.2-1.9 7-5.4 7-10V6l-7-3Z`}),B(`path`,{d:`m9 12 2 2 4-4`})]})}function Ge(e){return B(V,{...e,children:[B(`rect`,{height:`7`,rx:`2`,width:`18`,x:`3`,y:`13`}),B(`path`,{d:`M7 16.5h.01M11 16.5h.01M7 10a7 7 0 0 1 10 0M9.5 7.5a3.5 3.5 0 0 1 5 0`})]})}function Ke(e){return B(V,{...e,children:[B(`rect`,{height:`11`,rx:`2`,width:`16`,x:`4`,y:`3`}),B(`path`,{d:`M8 21h8M12 14v7`})]})}function qe(e){return B(V,{...e,children:[B(`path`,{d:`m3 11 9-8 9 8`}),B(`path`,{d:`M5 10v10h14V10M9 20v-6h6v6`})]})}function Je(e){return B(V,{...e,children:[B(`circle`,{cx:`12`,cy:`8`,r:`4`}),B(`path`,{d:`M4.5 21a7.5 7.5 0 0 1 15 0`})]})}function Ye(e){return B(V,{...e,children:[B(`rect`,{x:`3`,y:`3`,width:`7`,height:`7`,rx:`1.5`}),B(`rect`,{x:`14`,y:`3`,width:`7`,height:`7`,rx:`1.5`}),B(`rect`,{x:`3`,y:`14`,width:`7`,height:`7`,rx:`1.5`}),B(`path`,{d:`M17.5 14v7M14 17.5h7`})]})}function Xe(e){return B(V,{...e,children:[B(`rect`,{x:`2.5`,y:`3.5`,width:`7`,height:`6`,rx:`1.5`}),B(`rect`,{x:`14.5`,y:`3.5`,width:`7`,height:`6`,rx:`1.5`}),B(`rect`,{x:`8.5`,y:`15`,width:`7`,height:`6`,rx:`1.5`}),B(`path`,{d:`M6 9.5v2.5h12V9.5M12 12v3`})]})}function Ze(e){return B(V,{...e,children:[B(`path`,{d:`M7.5 7h9a5 5 0 0 1 4.9 4l.8 5a2.5 2.5 0 0 1-4 2.3L15.5 16h-7l-2.7 2.3a2.5 2.5 0 0 1-4-2.3l.8-5A5 5 0 0 1 7.5 7Z`}),B(`path`,{d:`M6.5 11v4M4.5 13h4M16 11.5h.01M18.5 13.5h.01`})]})}function Qe(e){return B(V,{...e,children:B(`path`,{d:`M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.287l-7.91 7.91a2.121 2.121 0 0 1-3-3l7.91-7.91a6 6 0 0 1 7.287-8.259c.438.12.54.662.218.984z`})})}function $e(e){return B(V,{...e,children:[B(`circle`,{cx:`12`,cy:`12`,r:`10`}),B(`path`,{d:`M8 12h.01M12 12h.01M16 12h.01`})]})}function et(e){return B(V,{...e,children:[B(`path`,{d:`M12 16V4`}),B(`path`,{d:`m7 9 5-5 5 5`}),B(`path`,{d:`M5 14v5h14v-5`})]})}function tt(e){return B(V,{...e,children:[B(`circle`,{cx:`12`,cy:`12`,r:`3`}),B(`path`,{d:`M19.4 15a1.7 1.7 0 0 0 .3 1.9l.1.1-2.8 2.8-.1-.1a1.7 1.7 0 0 0-1.9-.3 1.7 1.7 0 0 0-1 1.6v.2h-4V21a1.7 1.7 0 0 0-1-1.6 1.7 1.7 0 0 0-1.9.3l-.1.1L4.2 17l.1-.1a1.7 1.7 0 0 0 .3-1.9A1.7 1.7 0 0 0 3 14H2.8v-4H3a1.7 1.7 0 0 0 1.6-1 1.7 1.7 0 0 0-.3-1.9L4.2 7 7 4.2l.1.1a1.7 1.7 0 0 0 1.9.3A1.7 1.7 0 0 0 10 3V2.8h4V3a1.7 1.7 0 0 0 1 1.6 1.7 1.7 0 0 0 1.9-.3l.1-.1L19.8 7l-.1.1a1.7 1.7 0 0 0-.3 1.9 1.7 1.7 0 0 0 1.6 1h.2v4H21a1.7 1.7 0 0 0-1.6 1Z`})]})}function nt(e){return B(V,{...e,children:[B(`path`,{d:`M5 9.5a10 10 0 0 1 14 0M8 13a6 6 0 0 1 8 0M11 16.5a2 2 0 0 1 2 0`}),B(`path`,{d:`M12 20h.01`})]})}function rt(e){return B(V,{...e,children:[B(`path`,{d:`M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4z`}),B(`path`,{d:`M6.5 6.5h1M16.5 6.5h1M6.5 16.5h1`}),B(`path`,{d:`M14 14h2v2h-2zM18 14h2v2h-2zM16 16h2v2h-2zM18 18h2v2h-2zM14 18h1`})]})}function it(e){return B(V,{...e,children:[B(`path`,{d:`M7 3v4M17 3v4M5 7h14v4a7 7 0 0 1-14 0V7Z`}),B(`path`,{d:`M12 18v3`})]})}function at(e){return B(V,{...e,children:[B(`circle`,{cx:`12`,cy:`12`,r:`9`}),B(`path`,{d:`M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18`})]})}function ot(e){return B(V,{...e,children:[B(`rect`,{height:`13`,rx:`2`,width:`18`,x:`3`,y:`6`}),B(`path`,{d:`m8 2 4 4 4-4M8 22h8`})]})}function st(e){return B(V,{...e,children:[B(`circle`,{cx:`12`,cy:`12`,r:`9`}),B(`path`,{d:`M12 7v5l3 2`})]})}function ct(e){return B(V,{...e,children:[B(`rect`,{height:`14`,rx:`2`,width:`14`,x:`5`,y:`5`}),B(`path`,{d:`M9 9h6v6H9zM9 2v3M15 2v3M9 19v3M15 19v3M2 9h3M2 15h3M19 9h3M19 15h3`})]})}function H(e){return B(V,{...e,children:[B(`path`,{d:`M20 11a8 8 0 1 0-2.3 5.7`}),B(`path`,{d:`M20 4v7h-7`})]})}function lt(e){return B(V,{...e,children:[B(`path`,{d:`M12 2v10`}),B(`path`,{d:`M18.4 6.6a8 8 0 1 1-12.8 0`})]})}function ut(e){return B(V,{...e,children:[B(`path`,{d:`M12 3v12`}),B(`path`,{d:`m7 10 5 5 5-5`}),B(`path`,{d:`M5 21h14`})]})}function dt(e){return B(V,{...e,children:[B(`ellipse`,{cx:`12`,cy:`5`,rx:`8`,ry:`3`}),B(`path`,{d:`M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6`})]})}function ft(e){return B(V,{...e,children:[B(`circle`,{cx:`8`,cy:`15`,r:`4`}),B(`path`,{d:`m11 12 8-8M15 8l2 2M17 6l2 2`})]})}function pt(e){return B(V,{...e,children:[B(`rect`,{height:`13`,rx:`2`,width:`13`,x:`8`,y:`8`}),B(`path`,{d:`M16 8V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h3`})]})}function mt(e){return B(V,{...e,children:[B(`path`,{d:`M2.5 12s3.5-6 9.5-6 9.5 6 9.5 6-3.5 6-9.5 6-9.5-6-9.5-6Z`}),B(`circle`,{cx:`12`,cy:`12`,r:`2.5`})]})}function ht(e){return B(V,{...e,children:[B(`path`,{d:`m3 3 18 18`}),B(`path`,{d:`M10.6 6.2A8.8 8.8 0 0 1 12 6c6 0 9.5 6 9.5 6a15.5 15.5 0 0 1-2.6 3.2`}),B(`path`,{d:`M6.2 6.3C3.8 8 2.5 12 2.5 12s3.5 6 9.5 6a9.8 9.8 0 0 0 3.1-.5`}),B(`path`,{d:`M10.3 10.3a2.5 2.5 0 0 0 3.4 3.4`})]})}function gt(e){return B(V,{...e,children:[B(`rect`,{height:`17`,rx:`2`,width:`18`,x:`3`,y:`4`}),B(`path`,{d:`M8 2v4M16 2v4M3 9h18`})]})}function _t(e){return B(V,{...e,children:[B(`circle`,{cx:`12`,cy:`12`,r:`9`}),B(`path`,{d:`m8 12 2.5 2.5L16 9`})]})}function U(e){return B(V,{...e,children:[B(`path`,{d:`M10.3 4.2 2.7 17.5A2 2 0 0 0 4.4 20h15.2a2 2 0 0 0 1.7-2.5L13.7 4.2a2 2 0 0 0-3.4 0Z`}),B(`path`,{d:`M12 9v4M12 17h.01`})]})}function vt(e){return B(V,{...e,children:B(`path`,{d:`M12 5v14M5 12h14`})})}function yt(e){return B(V,{...e,children:B(`path`,{d:`M4 7h16M9 7V4h6v3M7 7l1 13h8l1-13M10 11v5M14 11v5`})})}function bt(e){return B(V,{...e,children:[B(`circle`,{cx:`11`,cy:`11`,r:`7`}),B(`path`,{d:`m20 20-4-4`})]})}function xt(e){return B(V,{...e,children:[B(`path`,{d:`M8 6h12M8 12h12M8 18h12`}),B(`path`,{d:`M4 6h.01M4 12h.01M4 18h.01`})]})}function St(e){return B(V,{...e,children:[B(`path`,{d:`M10 5H6a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h4`}),B(`path`,{d:`M14 8l4 4-4 4M8 12h10`})]})}function Ct(e){return B(V,{...e,children:B(`path`,{d:`M4 7h16M4 12h16M4 17h16`})})}function wt(e){return B(V,{...e,children:B(`path`,{d:`m6 9 6 6 6-6`})})}function Tt(e){return B(V,{...e,children:B(`path`,{d:`m6 6 12 12M18 6 6 18`})})}function Et(e){return B(V,{...e,children:B(`path`,{d:`m15 18-6-6 6-6`})})}function Dt(e){return B(V,{...e,children:B(`path`,{d:`m9 18 6-6-6-6`})})}function Ot(e){return B(V,{...e,children:B(`path`,{d:`M20.7 13.2A8.5 8.5 0 1 1 10.8 3.3 6.7 6.7 0 0 0 20.7 13.2Z`})})}function kt(e){return B(V,{...e,children:[B(`circle`,{cx:`12`,cy:`12`,r:`4`}),B(`path`,{d:`M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41`})]})}function At({description:e,loading:t,onRefresh:n,onToggleTheme:r,refreshing:i,theme:a,title:o}){return B(`header`,{class:`ssh-product-hero border-b border-slate-200 bg-white px-4 py-4 sm:px-6 md:h-[4.5rem] md:py-0 lg:px-8 xl:px-10`,children:B(`div`,{class:`flex w-full items-center justify-between gap-4 md:h-full`,children:[B(`div`,{class:`min-w-0`,children:[B(`p`,{class:`m-0 text-[0.68rem] font-extrabold uppercase tracking-[0.18em] text-teal-700`,children:`SmartSafeHub`}),B(`div`,{class:`mt-1 flex min-w-0 items-baseline gap-3`,children:[B(`h1`,{class:`m-0 truncate text-xl font-black tracking-tight text-slate-950 sm:text-2xl`,children:o}),B(`p`,{class:`m-0 hidden truncate text-sm text-slate-500 lg:block`,children:e})]})]}),B(`div`,{class:`flex shrink-0 items-center gap-2`,children:[B(`button`,{"aria-label":a===`dark`?`라이트 모드로 전환`:`다크 모드로 전환`,class:`ssh-product-header-action hidden h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white text-slate-600 shadow-sm transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 md:inline-flex`,onClick:r,title:a===`dark`?`라이트 모드`:`다크 모드`,type:`button`,children:B(a===`dark`?kt:Ot,{class:`size-5`})}),B(`button`,{"aria-busy":i,"aria-label":i?`새로고침 중`:`현재 화면 새로고침`,class:`ssh-product-header-action hidden h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white shadow-sm transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-wait disabled:opacity-60 md:inline-flex ${i?`text-teal-700`:`text-slate-600`}`,disabled:t||i,onClick:n,title:i?`새로고침 중`:`새로고침`,type:`button`,children:i?B(H,{class:`size-5 animate-spin`}):B(H,{class:`size-5`})})]})]})})}var jt=`/cgi-bin/luci`;function Mt(){let e=window.location.pathname,t=e.indexOf(`/cgi-bin/luci`);return t>=0?e.slice(0,t+13):jt}function Nt(e){let t=e.startsWith(`/`)?e:`/${e}`;return`${Mt()}${t}`}function Pt(e){return Nt(e)}var Ft=[{label:`Overview`,routes:[`home`,`activity`]},{label:`Network`,routes:[`network`,`wifi`,`iptv`,`devices`]},{label:`Security`,routes:[`safeshield`,`rules`]},{label:`Explore`,routes:[`apps`]},{label:`System`,routes:[`account`,`system`,`settings`]}];function It({route:e}){switch(e){case`home`:return B(qe,{class:`size-5`});case`activity`:return B(st,{class:`size-5`});case`network`:return B(at,{class:`size-5`});case`wifi`:return B(nt,{class:`size-5`});case`iptv`:return B(ot,{class:`size-5`});case`devices`:return B(Ke,{class:`size-5`});case`safeshield`:return B(We,{class:`size-5`});case`rules`:return B(Je,{class:`size-5`});case`account`:return B(ft,{class:`size-5`});case`apps`:return B(Ye,{class:`size-5`});case`system`:return B(et,{class:`size-5`});case`settings`:return B(tt,{class:`size-5`})}}function Lt({theme:e}){return B(e===`dark`?kt:Ot,{class:`size-5`})}function Rt(e){return e===`dark`?`라이트 모드`:`다크 모드`}function zt(e,t=!1,n){let r=t?`justify-center px-2`:`gap-3 px-3`;return e?`relative flex min-h-11 min-w-0 items-center rounded-xl py-2.5 text-sm font-extrabold no-underline transition ${r} bg-teal-50 text-teal-800 ring-1 ring-inset ring-teal-200`:n===`apps`?`ssh-apps-nav-link relative flex min-h-11 min-w-0 items-center rounded-xl py-2.5 text-sm font-extrabold no-underline transition ${r}`:`relative flex min-h-11 min-w-0 items-center rounded-xl py-2.5 text-sm font-extrabold text-slate-600 no-underline transition ${r} hover:bg-slate-50 hover:text-slate-950`}function Bt(e){return e===`apps`?`앱으로 확장하기`:null}function Vt({accountRegistered:e,collapsed:t=!1,route:n,updateCount:r,demo:i=!1}){return B(`div`,{class:t?`space-y-3`:`space-y-5`,children:Ft.filter(e=>!i||e.routes.some(e=>Le.includes(e))).map((a,o)=>B(`section`,{"aria-label":a.label,class:t&&o>0?`border-t border-slate-100 pt-3`:void 0,children:[t?null:B(`p`,{class:`mb-2 px-3 text-[0.65rem] font-black uppercase tracking-[0.18em] text-slate-400`,children:a.label}),B(`div`,{class:`space-y-1`,children:a.routes.filter(e=>!i||Le.includes(e)).map(i=>{let a=Ie[i],o=n===i;return B(`a`,{"aria-current":o?`page`:void 0,"aria-label":i===`account`&&e===!1?`${a.label} (계정 연결 필요)`:t?a.label:void 0,class:zt(o,t,i),href:a.hash,title:i===`account`&&e===!1?`SmartSafeHub 계정 연결 필요`:t?a.label:void 0,children:[B(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg ${o?`bg-teal-700 text-white`:`bg-slate-100 text-slate-500`}`,children:B(It,{route:i})}),t?null:B(`span`,{class:`flex min-w-0 flex-1 items-center gap-2`,children:[B(`span`,{class:`min-w-0 flex-1`,children:[B(`span`,{class:`block truncate`,children:a.label}),Bt(i)?B(`span`,{class:`ssh-apps-nav-description mt-0.5 block truncate text-[11px] font-semibold tracking-normal`,children:Bt(i)}):null]}),i===`iptv`?B(`span`,{class:`rounded-full border border-amber-300 bg-amber-100 px-1.5 py-0.5 text-[9px] font-black uppercase tracking-[0.08em] text-amber-800`,children:`Beta`}):null]}),t&&i===`iptv`?B(`span`,{"aria-label":`Beta 기능`,class:`absolute right-0.5 top-0.5 inline-flex size-5 items-center justify-center rounded-full border border-amber-300 bg-amber-100 text-[13px] font-extrabold leading-none text-amber-900 shadow-sm ring-2 ring-white`,children:`β`}):null,i===`account`&&e===!1?B(`span`,{"aria-label":`계정 연결 필요`,class:`ssh-account-nav-dot ${t?`ssh-account-nav-dot-collapsed`:``}`,"aria-hidden":`true`,title:`계정 연결 필요`}):null,i===`system`&&r>0?t?B(`span`,{"aria-label":`${r}개의 업데이트 유형`,class:`ssh-update-nav-badge`,"data-collapsed":`true`,children:r}):B(`span`,{class:`ssh-update-nav-badge`,"data-collapsed":`false`,children:r}):null]},i)})})]},a.label))})}function Ht({accountRegistered:e,collapsed:t,loading:n,onRefresh:r,onToggleCollapsed:i,onToggleTheme:a,refreshing:o,route:s,theme:c,title:l,updateCount:u,demo:d=!1}){let[f,p]=R(!1),m=Rt(c);return z(()=>{p(!1)},[s]),z(()=>{if(!f)return;let e=e=>{e.key===`Escape`&&p(!1)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[f]),B(b,{children:[B(`nav`,{"aria-label":`SmartSafeHub 모바일 메뉴`,class:`ssh-mobile-navigation sticky top-0 z-40 border-b border-slate-200 bg-white/95 px-4 shadow-sm shadow-slate-900/5 backdrop-blur md:hidden`,children:[B(`div`,{class:`flex min-h-16 items-center justify-between gap-3`,children:[B(`a`,{class:`flex min-w-0 items-center gap-3 no-underline`,href:`#home`,children:[B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-950 text-teal-300`,children:B(We,{class:`size-5`})}),B(`span`,{class:`min-w-0`,children:[B(`strong`,{class:`block truncate text-sm font-black text-slate-950`,children:`SmartSafeHub`}),B(`span`,{class:`block truncate text-xs font-semibold text-slate-500`,children:l})]})]}),B(`div`,{class:`flex shrink-0 items-center gap-2`,children:[B(`button`,{"aria-label":`${m}로 전환`,class:`inline-flex size-11 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white text-slate-600 transition hover:border-slate-300 hover:bg-slate-50 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:a,title:m,type:`button`,children:B(Lt,{theme:c})}),B(`button`,{"aria-busy":o,"aria-label":o?`새로고침 중`:`현재 화면 새로고침`,class:`inline-flex size-11 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white transition hover:border-slate-300 hover:bg-slate-50 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-wait disabled:opacity-60 ${o?`text-teal-700`:`text-slate-600`}`,disabled:n||o,onClick:r,title:o?`새로고침 중`:`새로고침`,type:`button`,children:o?B(H,{class:`size-5 animate-spin`}):B(H,{class:`size-5`})}),B(`button`,{"aria-controls":`smartsafehub-mobile-menu`,"aria-expanded":f,"aria-label":f?`모바일 메뉴 닫기`:`모바일 메뉴 열기`,class:`inline-flex size-11 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white text-slate-700 transition hover:bg-slate-50 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:()=>p(e=>!e),type:`button`,children:B(f?Tt:Ct,{class:`size-5`})})]})]}),f?B(`div`,{class:`ssh-mobile-menu border-t border-slate-100 py-4`,id:`smartsafehub-mobile-menu`,children:[B(Vt,{accountRegistered:e,demo:d,route:s,updateCount:u}),d?null:B(`div`,{class:`mt-5 space-y-1 border-t border-slate-100 pt-4`,children:B(`a`,{class:`${zt(!1)} text-rose-700 hover:bg-rose-50 hover:text-rose-800`,href:Pt(`/admin/logout`),children:[B(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg bg-rose-50 text-rose-600`,children:B(St,{class:`size-5`})}),`로그아웃`]})})]}):null]}),B(`aside`,{class:`hidden min-h-screen border-r border-slate-200 bg-white md:flex md:flex-col`,"data-collapsed":t?`true`:`false`,children:B(`div`,{class:`sticky top-0 flex h-screen flex-col`,children:[B(`div`,{class:`flex h-[4.5rem] min-h-[4.5rem] shrink-0 items-center border-b border-slate-100 ${t?`justify-center px-2`:`gap-3 px-4`}`,children:[B(`a`,{"aria-label":`SmartSafeHub Dashboard`,class:`flex items-center no-underline ${t?`justify-center`:`min-w-0 flex-1 gap-3`}`,href:`#home`,title:t?`SmartSafeHub`:void 0,children:[B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-950 text-teal-300 shadow-sm shadow-slate-950/10`,children:B(We,{class:`size-5`})}),t?null:B(`div`,{class:`min-w-0`,children:[B(`strong`,{class:`block truncate text-sm font-black tracking-tight text-slate-950`,children:`SmartSafeHub`}),B(`span`,{class:`block text-[0.68rem] font-bold uppercase tracking-[0.14em] text-slate-400`,children:`Home Gateway`})]})]}),B(`button`,{"aria-controls":`smartsafehub-desktop-navigation`,"aria-expanded":!t,"aria-label":t?`사이드바 펼치기`:`사이드바 접기`,class:`ssh-sidebar-toggle absolute right-0 top-[4.5rem] z-20 inline-flex size-7 translate-x-1/2 -translate-y-1/2 shrink-0 items-center justify-center rounded-full transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:i,title:t?`사이드바 펼치기`:`사이드바 접기`,type:`button`,children:B(t?Dt:Et,{class:`size-4`})})]}),B(`nav`,{"aria-label":`SmartSafeHub 메뉴`,class:`flex-1 overflow-y-auto py-5 ${t?`px-2`:`px-3`}`,id:`smartsafehub-desktop-navigation`,children:B(Vt,{accountRegistered:e,collapsed:t,demo:d,route:s,updateCount:u})}),d?null:B(`div`,{class:`border-t border-slate-100 ${t?`p-2`:`p-3`}`,children:B(`a`,{"aria-label":`SmartSafeHub에서 로그아웃`,class:`${zt(!1,t)} mt-1 text-rose-700 hover:bg-rose-50 hover:text-rose-800`,href:Pt(`/admin/logout`),title:t?`로그아웃`:void 0,children:[B(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg bg-rose-50 text-rose-600`,children:B(St,{class:`size-5`})}),t?null:`로그아웃`]})})]})})]})}var Ut=`smartsafehub.sidebar.collapsed`;function Wt(){if(typeof window>`u`)return!1;try{return window.localStorage.getItem(Ut)===`1`}catch{return!1}}function Gt({accountRegistered:e,children:t,loading:n,onRefresh:r,refreshing:i,route:a,updateCount:o,demo:s=!1}){let c=Ie[a],[l,u]=R(Wt),[d,f]=R(ze);return z(()=>{try{window.localStorage.setItem(Ut,l?`1`:`0`)}catch{}},[l]),z(()=>{Be(d),Ve(d)},[d]),B(`div`,{class:`ssh-app min-h-screen bg-slate-50 text-slate-950 md:grid md:transition-[grid-template-columns] md:duration-200 md:ease-out ${l?`md:grid-cols-[5rem_minmax(0,1fr)]`:`md:grid-cols-[16rem_minmax(0,1fr)]`}`,"data-theme":d,children:[B(Ht,{accountRegistered:e,demo:s,collapsed:l,loading:n,onRefresh:r,onToggleCollapsed:()=>u(e=>!e),onToggleTheme:()=>f(e=>e===`dark`?`light`:`dark`),refreshing:i,route:a,theme:d,title:c.title,updateCount:o}),B(`div`,{class:`min-w-0 md:min-h-screen`,children:[B(At,{description:c.description,loading:n,onRefresh:r,onToggleTheme:()=>f(e=>e===`dark`?`light`:`dark`),refreshing:i,theme:d,title:c.title}),B(`main`,{class:`ssh-product-main w-full max-w-[1600px] bg-slate-50 px-4 pb-8 sm:px-6 sm:pb-10 lg:px-8 lg:pb-12 xl:px-10 ${n?`pt-2 sm:pt-2 lg:pt-3`:`pt-5 sm:pt-6 lg:pt-8`}`,children:t})]})]})}function W({action:e,description:t,eyebrow:n,id:r,title:i}){return B(`div`,{class:`ssh-section-heading mb-4 min-w-0`,children:[B(`p`,{class:`m-0 text-[0.68rem] font-black uppercase tracking-[0.18em] text-teal-700`,children:n}),B(`div`,{class:`mt-2 flex min-w-0 flex-wrap items-center justify-between gap-3`,children:[B(`h2`,{class:`m-0 min-w-0 text-xl font-black tracking-tight text-slate-950`,id:r,children:i}),e?B(`div`,{class:`shrink-0`,children:e}):null]}),B(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500`,children:t})]})}var Kt=new Intl.NumberFormat(`ko-KR`),qt=new Intl.DateTimeFormat(`ko-KR`,{dateStyle:`medium`,timeStyle:`short`});function Jt(e){if(!Number.isFinite(e)||e<0)return`확인 불가`;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}일 ${n}시간`:n>0?`${n}시간 ${r}분`:`${Math.max(r,1)}분`}function Yt(e){if(!Number.isFinite(e)||e<0)return`확인 불가`;let t=[`B`,`KB`,`MB`,`GB`],n=e,r=0;for(;n>=1024&&r864e10?`기록 없음`:!Number.isFinite(t)||e>t+300||t-e>=604800?Qt(e):$t(e,t)}function tn(e){let t=/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z$/.exec(e??``);if(!t)return null;let[,n,r,i,a,o,s]=t,c=Date.UTC(Number(n),Number(r)-1,Number(i),Number(a),Number(o),Number(s)),l=new Date(c);return l.getUTCFullYear()!==Number(n)||l.getUTCMonth()+1!==Number(r)||l.getUTCDate()!==Number(i)||l.getUTCHours()!==Number(a)||l.getUTCMinutes()!==Number(o)||l.getUTCSeconds()!==Number(s)||c<=0?null:c/1e3}function nn(e){if(!Number.isFinite(e)||e<=0)return`확인 불가`;let t=Math.floor(e/3600),n=Math.floor(e%3600/60);return t>0?n>0?`${t}시간 ${n}분`:`${t}시간`:`${n}분`}function rn(e){let t=Math.max(0,e.total),n=e.free+e.buffered+e.cached,r=Math.min(t,Math.max(0,e.available>0?e.available:n)),i=Math.max(0,t-r);return{used:i,percent:t>0?i/t*100:0}}function an(e,t){let n=e.metadata[t];return typeof n==`string`&&n.trim().length>0?n.trim():null}function on(e,t){let n=e.metadata[t];return typeof n==`number`&&Number.isFinite(n)?n:null}function sn(e,t){let n=e.metadata[t];return typeof n==`boolean`?n:null}function cn(e,t){let n=an(e,`error_code`);return n?`${t} (오류 코드: ${n})`:t}function ln(e){let t=Math.max(0,Math.floor(e));if(t<60)return`${t}초`;let n=Math.floor(t/60),r=t%60;if(n<60)return r>0?`${n}분 ${r}초`:`${n}분`;let i=Math.floor(n/60),a=n%60;return a>0?`${i}시간 ${a}분`:`${i}시간`}function un(e){let t=an(e,`from_version`),n=an(e,`to_version`);return t&&n?`${t} → ${n}`:n?`${n} 버전이 적용되었습니다.`:null}function dn(e){return e?e.toUpperCase():null}function fn(e){switch(e){case`dhcp`:return`자동 IP(DHCP)`;case`pppoe`:return`PPPoE`;case`static`:return`고정 IPv4`;default:return e.toUpperCase()}}function pn(e){switch(e.eventType){case`system.booted`:return{title:`공유기 부팅 감지`,description:`공유기가 켜지거나 재시작된 것을 확인했습니다.`};case`network.internet.disconnected`:return{title:`인터넷 연결 끊김 감지`,description:`공유기에서 인터넷 연결을 확인할 수 없었습니다.`};case`network.internet.recovered`:{let t=on(e,`downtime_seconds`);return{title:`인터넷 연결 복구`,description:t!==null&&t>0?`약 ${ln(t)} 동안 인터넷 연결이 확인되지 않았습니다.`:`공유기에서 인터넷 연결을 다시 확인했습니다.`}}case`safeshield.protection.enabled`:return{title:`SafeShield 보호 활성화`,description:`DNS 보호 기능이 활성화되었습니다.`};case`safeshield.protection.disabled`:return{title:`SafeShield 보호 비활성화`,description:`DNS 보호 기능이 비활성화되었습니다.`};case`safeshield.blocklist.updated`:{let t=on(e,`domain_count`),n=an(e,`artifact_version`),r=[];return t!==null&&t>0&&r.push(`${G(t)}개 도메인 적용`),n&&r.push(`목록 ${n}`),{title:`SafeShield 차단 목록 업데이트 완료`,description:r.length>0?r.join(` · `):`최신 차단 목록을 적용했습니다.`}}case`safeshield.blocklist.update_failed`:return{title:`SafeShield 차단 목록 업데이트 실패`,description:cn(e,`차단 목록을 업데이트하지 못했습니다.`)};case`safeshield.statistics.enabled`:return{title:`SafeShield 차단 통계 수집 활성화`,description:`기기별 차단 통계 수집을 활성화했습니다.`};case`safeshield.statistics.disabled`:return{title:`SafeShield 차단 통계 수집 비활성화`,description:`기기별 차단 통계 수집을 비활성화했습니다.`};case`safeshield.rule.added`:return{title:an(e,`rule_action`)===`allow`?`사용자 허용 규칙 추가`:`사용자 차단 규칙 추가`,description:`SafeShield 사용자 규칙이 변경되었습니다.`};case`safeshield.rule.removed`:return{title:an(e,`rule_action`)===`allow`?`사용자 허용 규칙 삭제`:`사용자 차단 규칙 삭제`,description:`SafeShield 사용자 규칙이 변경되었습니다.`};case`settings.scheduled_reboot.updated`:{let t=sn(e,`enabled`);return{title:`예약 재부팅 설정 변경`,description:t===!0?`예약 재부팅 설정을 저장하고 새 일정에 적용했습니다.`:t===!1?`예약 재부팅을 비활성화했습니다.`:`예약 재부팅 설정을 변경했습니다.`}}case`settings.software_updates.updated`:return{title:`관리 소프트웨어 업데이트 설정 변경`,description:sn(e,`auto_install`)===!0?`자동 설치를 포함한 업데이트 설정을 저장했습니다.`:`관리 소프트웨어 업데이트 설정을 저장했습니다.`};case`settings.health_reporter.enabled`:return{title:`원격 상태 보고 활성화`,description:`장치 상태를 SmartSafeHub Cloud에 보고하도록 설정했습니다.`};case`settings.health_reporter.disabled`:return{title:`원격 상태 보고 비활성화`,description:`SmartSafeHub Cloud로의 장치 상태 보고를 중지했습니다.`};case`settings.activity_cloud_sync.enabled`:return{title:`Cloud 활동 기록 전송 활성화`,description:`이후 발생하는 활동을 SmartSafeHub Cloud에 전송하도록 설정했습니다.`};case`settings.activity_cloud_sync.disabled`:return{title:`Cloud 활동 기록 전송 비활성화`,description:`Cloud 전송을 중지했습니다. 로컬 최근 활동은 계속 기록됩니다.`};case`settings.timezone.updated`:{let t=an(e,`zonename`);return{title:`시간대 설정 변경`,description:t?`공유기 시간대를 ${t}(으)로 변경했습니다.`:`공유기 시간대를 변경했습니다.`}}case`settings.wifi.updated`:return{title:`Wi-Fi 설정 변경`,description:`Wi-Fi 설정을 저장하고 무선 네트워크에 적용했습니다.`};case`settings.wan.updated`:{let t=an(e,`protocol`);return{title:`인터넷 설정 변경`,description:t?`${fn(t)} 방식으로 WAN 설정을 변경했습니다.`:`WAN 인터넷 연결 설정을 변경했습니다.`}}case`settings.lan.updated`:return{title:`LAN 설정 변경`,description:`내부 네트워크 및 DHCP 설정을 변경했습니다.`};case`settings.iptv.updated`:{let t=sn(e,`enabled`),n=an(e,`provider`),r=n===`skb`?`SK Broadband`:n===`lgu`?`LG U+`:null;return{title:`IPTV 설정 변경`,description:t===!1?`IPTV 기능을 비활성화했습니다.`:r?`${r} IPTV 설정을 적용했습니다.`:`IPTV 설정을 적용했습니다.`}}case`software.update.completed`:return{title:`관리 소프트웨어 업데이트 완료`,description:un(e)};case`software.update.failed`:return{title:`관리 소프트웨어 업데이트 실패`,description:cn(e,`관리 소프트웨어를 업데이트하지 못했습니다.`)};case`firmware.update.started`:return{title:`펌웨어 업데이트 시작`,description:`펌웨어 설치를 시작했습니다. 완료 과정에서 공유기가 재부팅됩니다.`};case`firmware.update.failed`:return{title:`펌웨어 업데이트 실패`,description:cn(e,`펌웨어 설치 준비 또는 검증에 실패했습니다.`)};case`license.activated`:{let t=dn(an(e,`to_plan`));return{title:`요금제 활성화`,description:t?`${t} 요금제가 활성화되었습니다.`:`요금제가 활성화되었습니다.`}}case`license.changed`:{let t=dn(an(e,`from_plan`)),n=dn(an(e,`to_plan`));return{title:`요금제 변경`,description:t&&n?`${t} → ${n}`:n?`${n} 요금제로 변경되었습니다.`:`요금제 상태가 변경되었습니다.`}}case`license.cleared`:return{title:`계정 권한 해제`,description:an(e,`reason`)===`manual`?`이 공유기에서 계정 권한 연결을 해제했습니다.`:`서버의 계정 권한 상태가 반영되어 이 공유기의 권한 연결이 해제되었습니다.`};case`health.issue.started`:{let t=on(e,`warning_count`)??0,n=on(e,`critical_count`)??0,r=[];return n>0&&r.push(`이상 ${G(n)}건`),t>0&&r.push(`주의 ${G(t)}건`),{title:`확인이 필요한 장치 상태 발견`,description:r.length>0?r.join(` · `):`장치 상태에서 확인이 필요한 항목이 발견되었습니다.`}}case`health.issue.changed`:{let t=on(e,`warning_count`)??0,n=on(e,`critical_count`)??0,r=[];return n>0&&r.push(`이상 ${G(n)}건`),t>0&&r.push(`주의 ${G(t)}건`),{title:`확인이 필요한 장치 상태 변경`,description:r.length>0?r.join(` · `):`확인이 필요한 장치 상태 항목이 변경되었습니다.`}}case`health.issue.resolved`:return{title:`장치 상태 정상으로 복구`,description:`이전에 확인이 필요했던 장치 상태가 정상으로 돌아왔습니다.`};default:return{title:`SmartSafeHub 활동`,description:`장치에서 새로운 활동이 기록되었습니다.`}}}function mn(e){return e===`error`?{icon:B(U,{class:`size-4`}),surface:`bg-rose-50 text-rose-700 ring-rose-200`}:e===`warning`?{icon:B(U,{class:`size-4`}),surface:`bg-amber-50 text-amber-800 ring-amber-200`}:e===`success`?{icon:B(_t,{class:`size-4`}),surface:`bg-emerald-50 text-emerald-700 ring-emerald-200`}:{icon:B(st,{class:`size-4`}),surface:`bg-slate-100 text-slate-600 ring-slate-200`}}function hn(e){let t=new Date(e*1e3);return new Intl.DateTimeFormat(`ko-KR`,{hour:`2-digit`,minute:`2-digit`,hour12:!1}).format(t)}function gn(e){let t=new Date(e*1e3);return`${t.getFullYear()}-${t.getMonth()+1}-${t.getDate()}`}function _n(e){let t=new Date(e*1e3),n=new Date,r=new Date(n.getFullYear(),n.getMonth(),n.getDate()),i=new Date(t.getFullYear(),t.getMonth(),t.getDate()),a=Math.round((r.getTime()-i.getTime())/864e5);return a===0?`오늘`:a===1?`어제`:new Intl.DateTimeFormat(`ko-KR`,{month:`long`,day:`numeric`,weekday:`short`}).format(t)}function vn({compact:e=!1,events:t}){if(t.length===0)return B(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 px-4 py-5 text-center`,children:[B(st,{class:`mx-auto size-5 text-slate-400`}),B(`p`,{class:`mt-2 mb-0 text-sm font-extrabold text-slate-700`,children:`아직 기록된 활동이 없습니다.`}),B(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`상태가 실제로 변경되면 이곳에 시간순으로 기록됩니다.`})]});let n=``;return B(`div`,{class:e?`space-y-2`:`space-y-1`,children:t.map(t=>{let r=pn(t),i=mn(t.severity),a=gn(t.occurredAt),o=!e&&a!==n;return n=a,B(`div`,{children:[o?B(`p`,{class:`mt-5 mb-2 first:mt-0 text-xs font-black text-slate-500`,children:_n(t.occurredAt)}):null,B(`article`,{class:`relative flex min-w-0 gap-3 ${e?`border-b border-slate-100 py-3 first:pt-0 last:border-b-0 last:pb-0`:`rounded-xl px-2 py-3 hover:bg-slate-50`}`,children:[B(`div`,{class:`w-12 shrink-0 pt-1 text-xs font-bold tabular-nums text-slate-400`,children:B(`time`,{dateTime:new Date(t.occurredAt*1e3).toISOString(),title:Qt(t.occurredAt),children:hn(t.occurredAt)})}),B(`span`,{class:`mt-0.5 grid size-8 shrink-0 place-items-center rounded-full ring-1 ring-inset ${i.surface}`,children:i.icon}),B(`div`,{class:`min-w-0 flex-1`,children:[B(`p`,{class:`m-0 text-sm font-black leading-5 text-slate-950`,children:r.title}),r.description?B(`p`,{class:`mt-1 mb-0 break-words text-xs font-medium leading-5 text-slate-500`,children:r.description}):null]})]})]},t.eventId)})})}function yn({error:e,loading:t,onRetry:n}){return t?B(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 px-4 py-5 text-center`,children:[B(H,{class:`mx-auto size-5 animate-spin text-teal-700`}),B(`p`,{class:`mt-2 mb-0 text-sm font-bold text-slate-500`,children:`최근 활동을 불러오는 중입니다.`})]}):e?B(`div`,{class:`rounded-xl border border-amber-200 bg-amber-50/70 px-4 py-4`,children:B(`div`,{class:`flex items-start gap-3`,children:[B(U,{class:`mt-0.5 size-5 shrink-0 text-amber-700`}),B(`div`,{class:`min-w-0 flex-1`,children:[B(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:`최근 활동을 불러오지 못했습니다.`}),B(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:e}),n?B(`button`,{class:`mt-3 inline-flex min-h-9 items-center justify-center rounded-lg border border-amber-300 bg-white px-3 text-xs font-extrabold text-amber-800 transition hover:bg-amber-50`,onClick:n,type:`button`,children:`다시 시도`}):null]})]})}):null}function bn(e){return e.enabled?e.eligible===!1||e.phase===`ineligible`?{label:`계정 연결 필요`,description:`SmartSafeHub 계정을 연결하면 이후 발생하는 활동을 Cloud에 자동으로 동기화할 수 있습니다.`,tone:`bg-slate-100 text-slate-600 ring-slate-200`}:e.phase===`error`?{label:`동기화 확인 필요`,description:`최근 Cloud 전송을 완료하지 못했습니다. 로컬 활동 기록은 계속 보관됩니다.`,tone:`bg-amber-50 text-amber-800 ring-amber-200`}:e.phase===`syncing`?{label:`동기화 중`,description:`새 활동을 SmartSafeHub Cloud에 전송하고 있습니다.`,tone:`bg-teal-50 text-teal-800 ring-teal-200`}:e.eligible===!0?{label:`자동 동기화`,description:`새 활동이 생기면 SmartSafeHub Cloud에 자동으로 안전하게 전송합니다.`,tone:`bg-emerald-50 text-emerald-800 ring-emerald-200`}:{label:`확인 중`,description:`Cloud 활동 기록 사용 가능 여부를 확인하고 있습니다.`,tone:`bg-slate-100 text-slate-600 ring-slate-200`}:e.eligible===!1?{label:`계정 연결 필요`,description:`SmartSafeHub 계정을 연결하면 Free에서도 Cloud 활동 기록을 사용할 수 있습니다.`,tone:`bg-slate-100 text-slate-600 ring-slate-200`}:{label:`Cloud 전송 꺼짐`,description:`활동 기록은 이 공유기에만 저장됩니다. Cloud에는 새로운 활동을 전송하지 않습니다.`,tone:`bg-slate-100 text-slate-700 ring-slate-200`}}function xn(e){if(e.eligible!==!0)return`—`;if(e.retentionDays>0)return`${e.retentionDays}일`;switch(e.plan?.toLowerCase()){case`free`:return`7일`;case`pro`:case`ultimate`:return`90일`;default:return`확인 중`}}function Sn({actionError:e,actionMessage:t,cloud:n,onDismissFeedback:r,onSetEnabled:i,saving:a}){let o=bn(n),s=n.plan?.toUpperCase()??null,c=n.eligible===!0,l=n.enabled||c;return B(`section`,{"aria-label":`Cloud 활동 기록 설정`,class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:[B(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[B(`div`,{class:`min-w-0 flex-1`,children:[B(`div`,{class:`flex flex-wrap items-center gap-2`,children:B(`span`,{class:`rounded-full px-2.5 py-1 text-xs font-extrabold ring-1 ring-inset ${o.tone}`,children:a?`설정 중`:o.label})}),B(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:o.description})]}),B(`div`,{class:`flex shrink-0 items-center justify-end gap-3 sm:justify-start`,children:[B(`span`,{class:`text-xs font-bold text-slate-600`,children:[`Cloud 전송 `,n.enabled?`켜짐`:`꺼짐`]}),B(`button`,{"aria-checked":n.enabled,"aria-label":`Cloud 활동 기록 전송 사용`,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${n.enabled?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:a||!l,onClick:()=>i(!n.enabled),role:`switch`,type:`button`,children:B(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${n.enabled?`left-6`:`left-1`}`})})]})]}),(e||t)&&B(`div`,{class:`mt-4 flex min-w-0 items-start justify-between gap-3 rounded-xl border px-4 py-3 text-sm font-bold ${e?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,role:e?`alert`:`status`,children:[B(`span`,{class:`min-w-0`,children:e||t}),B(`button`,{class:`shrink-0 rounded-lg px-2 py-1 text-xs font-extrabold hover:bg-black/5`,onClick:r,type:`button`,children:`닫기`})]}),n.enabled?B(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`Cloud 전송을 끄면 아직 전송하지 않은 대기 기록이 삭제됩니다. 공유기의 로컬 기록은 유지됩니다.`}):null,B(`div`,{class:`mt-4 flex flex-wrap items-center gap-x-5 gap-y-1 border-t border-slate-200 pt-3 text-xs font-semibold text-slate-500`,children:[B(`span`,{children:[`마지막 동기화: `,n.lastSuccessAt>0?$t(n.lastSuccessAt):`아직 없음`]}),B(`span`,{children:[`Cloud 보관: `,xn(n)]}),n.pendingEvents>0?B(`span`,{children:[`전송 대기: `,G(n.pendingEvents),`건`]}):null]}),n.enabled&&n.phase===`error`&&n.lastErrorCode?B(`p`,{class:`mt-3 mb-0 text-xs font-semibold text-amber-700`,children:[`오류 코드: `,B(`code`,{children:n.lastErrorCode})]}):null,B(`details`,{class:`mt-3 border-t border-slate-200 pt-3`,children:[B(`summary`,{class:`cursor-pointer text-xs font-extrabold text-teal-700 hover:text-teal-800 focus-visible:rounded focus-visible:outline focus-visible:outline-2 focus-visible:outline-teal-500`,children:`Cloud 동기화 상세 정보`}),B(`dl`,{class:`mt-3 grid gap-3 sm:grid-cols-4`,children:[B(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[B(`dt`,{class:`text-xs font-bold text-slate-500`,children:`멤버십`}),B(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:s??(n.eligible===!1?`Free`:`확인 중`)})]}),B(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[B(`dt`,{class:`text-xs font-bold text-slate-500`,children:`전송 대기`}),B(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:[G(n.pendingEvents),`건`]})]}),B(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[B(`dt`,{class:`text-xs font-bold text-slate-500`,children:`마지막 동기화`}),B(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:n.lastSuccessAt>0?$t(n.lastSuccessAt):`아직 없음`})]}),B(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[B(`dt`,{class:`text-xs font-bold text-slate-500`,children:`Cloud 보관`}),B(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:xn(n)})]})]}),B(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`SmartSafeHub 계정에 연결된 Free는 최근 7일, Pro와 Ultimate는 최근 90일 동안 Cloud 활동 기록을 보관합니다. 끄면 전송 대기 데이터와 임시 인증 정보를 삭제하며, 다시 켠 뒤 새로 발생한 활동부터 Cloud에 전송합니다. 로컬 최근 활동은 항상 유지됩니다.`})]})]})}function Cn({actionError:e,actionMessage:t,data:n,error:r,loading:i,onDismissActionFeedback:a,onRetry:o,onSetCloudSync:s,savingCloudSync:c}){let[l,u]=R(20),d=n?.events??[],f=d.slice(0,l),p=d.length-f.length;return B(`div`,{class:`min-w-0 space-y-6`,children:[B(`section`,{"aria-labelledby":`activity-cloud-title`,class:`min-w-0`,children:[B(W,{id:`activity-cloud-title`,eyebrow:`Cloud history`,title:`Cloud 활동 기록`,description:`활동 기록을 Cloud에 자동으로 전송할지 설정합니다. 공유기 내 최근 활동은 항상 기록됩니다.`}),B(Sn,{actionError:e,actionMessage:t,cloud:n?.cloud??{enabled:!1,phase:`preparing`,eligible:null,plan:null,retentionDays:0,pendingEvents:0,lastAttemptAt:0,lastSuccessAt:0,lastUploadedCount:0,lastErrorCode:null,nextSyncAt:0},onDismissFeedback:a,onSetEnabled:s,saving:c})]}),B(`section`,{"aria-labelledby":`activity-history-title`,class:`min-w-0`,children:[B(W,{id:`activity-history-title`,eyebrow:`Local history`,title:`현재 부팅 이후의 최근 활동`,description:`인터넷, SafeShield, 업데이트, 계정 권한과 주요 설정에서 실제 상태가 변경된 시점만 기록합니다.`,action:B(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5 text-xs font-extrabold text-slate-600 ring-1 ring-inset ring-slate-200`,children:[`최대 `,n?.maxEvents??128,`건`]})}),B(`div`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:i||r&&!n?B(yn,{error:r,loading:i,onRetry:o}):B(b,{children:[B(vn,{events:f}),d.length>20?B(`div`,{class:`mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-slate-200 pt-4`,children:[B(`p`,{class:`m-0 text-xs font-semibold text-slate-500`,children:[G(f.length),` / `,G(d.length),`건 표시 중`]}),B(`div`,{class:`flex flex-wrap items-center gap-2`,children:[l>20?B(`button`,{class:`inline-flex min-h-10 items-center justify-center rounded-xl border border-slate-200 bg-white px-4 py-2 text-xs font-extrabold text-slate-700 transition hover:bg-slate-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>u(20),type:`button`,children:`최신 20건만 보기`}):null,p>0?B(`button`,{class:`inline-flex min-h-10 items-center justify-center rounded-xl border border-teal-200 bg-teal-50 px-4 py-2 text-xs font-extrabold text-teal-800 transition hover:bg-teal-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>u(e=>Math.min(e+20,d.length)),type:`button`,children:[`이전 활동 더 보기 (`,G(Math.min(20,p)),`건)`]}):null]})]}):null]})})]}),B(`aside`,{class:`rounded-2xl border border-slate-200 bg-slate-50 px-5 py-4`,children:[B(`p`,{class:`m-0 text-sm font-extrabold text-slate-800`,children:`로컬 활동 기록 안내`}),B(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`이 기록은 공유기의 메모리 영역에만 보관되어 재부팅하면 초기화됩니다. 직접 설정을 변경한 작업은 성공 시점에 즉시 기록하고, 인터넷 및 장치 진단처럼 외부 상태를 확인해야 하는 항목은 실제 상태 변화가 관찰된 경우에만 추가합니다.`})]})]})}function wn(e){return!Number.isFinite(e)||e<0?`—`:e<1024?`${Math.round(e)} B`:e<1024**2?`${(e/1024).toFixed(1)} KB`:e<1024**3?`${(e/1024**2).toFixed(1)} MB`:`${(e/1024**3).toFixed(1)} GB`}function Tn(e){if(!e||!Number.isSafeInteger(e.totalBytes)||!Number.isSafeInteger(e.availableBytes)||e.totalBytes<=0||e.availableBytes<0||e.availableBytes>e.totalBytes||e.mount!==`/overlay`&&e.mount!==`/`)return null;let t=e.availableBytes/e.totalBytes;return{availablePercent:Math.round(t*100),availableRatio:t,availableText:wn(e.availableBytes),usedText:wn(e.totalBytes-e.availableBytes),totalText:wn(e.totalBytes),level:t<=.1?`critical`:t<=.2?`warning`:`normal`}}var En=2*Math.PI*39;function Dn({storage:e}){let t=Tn(e),n=t?(t.availableRatio*En).toFixed(2):`0`;return B(`aside`,{"aria-label":`앱 설치 저장 공간`,"data-level":t?.level??`unavailable`,class:`ssh-apps-storage-card flex min-w-0 items-center gap-3 rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5`,children:[B(`div`,{class:`ssh-apps-storage-ring relative grid size-24 shrink-0 place-items-center`,"data-level":t?.level??`unavailable`,children:[B(`svg`,{"aria-hidden":`true`,class:`size-24`,viewBox:`0 0 96 96`,children:[B(`circle`,{class:`ssh-apps-storage-track`,cx:`48`,cy:`48`,r:`39`}),t&&t.availableRatio>0?B(`circle`,{class:`ssh-apps-storage-free`,cx:`48`,cy:`48`,r:`39`,"stroke-dasharray":`${n} ${En.toFixed(2)}`}):null]}),B(`div`,{class:`absolute inset-0 flex flex-col items-center justify-center text-center`,children:[B(`strong`,{class:`text-lg leading-6 font-black text-slate-950`,children:t?`${t.availablePercent}%`:`—`}),B(`span`,{class:`text-[10px] font-bold text-slate-500`,children:`여유`})]})]}),B(`div`,{"aria-live":`polite`,class:`min-w-0 flex-1`,children:[B(`h3`,{class:`m-0 text-sm font-black text-slate-950`,children:`저장 공간`}),t?B(b,{children:[B(`p`,{class:`ssh-apps-storage-available mb-0 mt-1 text-base font-extrabold text-teal-700`,children:[t.availableText,` 남음`]}),B(`p`,{class:`mb-0 mt-1 text-[11px] leading-4 text-slate-500`,title:`앱 설치 가능 용량을 기준으로 계산하며, 파일시스템 예약 공간이 사용량에 포함될 수 있습니다.`,children:[`사용 `,t.usedText,` / 전체 `,t.totalText]})]}):B(`p`,{class:`mb-0 mt-1 text-xs leading-5 text-slate-500`,children:`용량 정보를 확인할 수 없습니다.`})]})]})}function On(e){switch(e){case`network`:return`network`;case`security`:return`security`;case`entertainment`:return`entertainment`;case`utilities`:return`utilities`;case`other`:return`other`;case`smart_home`:case`iot`:return`smart_home`;default:return`other`}}function kn({category:e,class:t}){switch(e){case`all`:return B(Ye,{class:t});case`network`:return B(Xe,{class:t});case`security`:return B(We,{class:t});case`smart_home`:return B(qe,{class:t});case`entertainment`:return B(Ze,{class:t});case`utilities`:return B(Qe,{class:t});case`other`:return B($e,{class:t});default:return B($e,{class:t})}}function An(e,t){return e instanceof Error?e.message:t}function jn(e){return!e||typeof e.path!=`string`||e.path.length>160?null:e.type===`static`?e.path===`/retro-arcade/`?e.path:null:e.type===`luci`&&/^\/cgi-bin\/luci\/admin\/[a-z0-9_-]+(?:\/[a-z0-9_-]+)*$/.test(e.path)?e.path:null}var Mn=`smartsafehub:apps:dismissed-operation:v1`;function Nn(e){return!e||e.phase===`idle`?``:e.operationId?`operation:${e.operationId}`:`legacy:${e.phase}:${e.action}:${e.appId}:${e.code}`}function Pn(){try{return typeof window>`u`?null:window.localStorage.getItem(Mn)}catch{return null}}function Fn(e){if(e)try{typeof window<`u`&&window.localStorage.setItem(Mn,e)}catch{}}var In={E21:`서버에서 승인 정보를 확인하지 못했습니다. 인터넷 연결을 확인해 주세요.`,E22:`이 펌웨어에서 승인되지 않은 앱입니다.`,E24:`공유기의 패키지 아키텍처와 앱이 일치하지 않습니다.`,E25:`배포 저장소가 승인 당시와 달라졌거나 접근할 수 없습니다. 관리자 확인 후 다시 시도해 주세요.`,E26:`앱 설치에 필요한 메모리 또는 저장 공간이 부족합니다.`,E27:`승인된 패키지 정보가 올바르지 않습니다.`,E28:`이전에 설치한 앱의 구성이 현재 승인 정보와 다릅니다.`,E29:`동일한 패키지가 이미 다른 방법으로 설치되어 있습니다.`,E31:`앱 파일을 다운로드하지 못했습니다.`,E32:`다운로드된 앱 파일이 올바르지 않습니다.`,E33:`앱 파일의 검증 값이 일치하지 않습니다.`,E34:`패키지 설치 사전 확인에 실패했습니다.`,E35:`패키지를 설치하지 못했습니다.`,E37:`공식 OpenWrt LuCI 저장소가 승인 당시와 다릅니다. 관리자에게 확인해 주세요.`,E38:`기존 공유 라이브러리의 버전이 승인된 버전과 달라 설치할 수 없습니다.`,E51:`SmartSafeHub Apps에서 관리하는 앱만 업데이트할 수 있습니다.`,E52:`현재 설치 버전과 승인된 업데이트가 일치하지 않습니다. 앱 구성과 업데이트 버전을 확인해 주세요.`,E53:`다른 시스템 패키지 변경이 필요하여 앱 업데이트를 중단했습니다.`,E54:`앱 업데이트에 실패했습니다. 일부 패키지가 변경되었을 수 있으니 관리자에게 확인해 주세요.`,E55:`업데이트 후 설치 기록을 저장하지 못했습니다. 관리자에게 확인해 주세요.`,E41:`SmartSafeHub Apps에서 설치한 앱만 여기서 제거할 수 있습니다.`,E44:`기존 시스템에 영향을 줄 수 있어 앱 제거가 차단됐습니다.`,E45:`앱 제거에 실패했습니다.`},Ln=[{id:`all`,label:`전체`},{id:`network`,label:`네트워크`},{id:`security`,label:`보안`},{id:`smart_home`,label:`스마트홈`},{id:`entertainment`,label:`엔터테인먼트`},{id:`utilities`,label:`도구`},{id:`other`,label:`기타`}];function Rn({action:e}){let t=e===`remove`;return B(`span`,{"aria-live":`polite`,class:`inline-flex items-center gap-1.5 text-xs font-bold ${t?`text-red-700`:`text-teal-700`}`,role:`status`,children:[B(`svg`,{"aria-hidden":`true`,class:`size-4 animate-spin`,fill:`none`,viewBox:`0 0 24 24`,children:[B(`circle`,{cx:`12`,cy:`12`,r:`9`,stroke:`currentColor`,"stroke-width":`3`,opacity:`0.25`}),B(`path`,{d:`M21 12a9 9 0 0 0-9-9`,stroke:`currentColor`,"stroke-width":`3`,"stroke-linecap":`round`})]}),t?`제거 중…`:e===`update`?`업데이트 중…`:`설치 중…`]})}function zn({data:e,error:t,loading:n,refreshing:r,onRetry:i,installStatus:a,metrics:o,statusError:s,onRefreshStatus:c,onInstall:l,onUpdate:u,onRemove:d,demo:f=!1,onDemoAction:p}){let[m,h]=R(`all`),[g,_]=R(``),[v,y]=R(null),[x,S]=R(null),C=we(null),w=we(null),[T,E]=R(null),[D,O]=R(Pn),k=e,A=k?.apps??[],j=k&&!t&&!n&&!r&&!s?Object.entries(a?.installed??{}).filter(([e,t])=>t.retired===!0&&t.managed&&!A.some(t=>t.id===e)):[],M=a?.restore,N=a?.job,P=N?.phase===`starting`||N?.phase===`running`,F=M?.phase===`starting`||M?.phase===`running`,ee=Nn(N),te=e=>{O(e),Fn(e)},ne=N&&N.phase!==`idle`&&ee!==D;z(()=>{if(N?.phase!==`success`||!ne)return;let e=window.setTimeout(()=>te(ee),7e3);return()=>window.clearTimeout(e)},[ee,N?.phase,ne]);let re=N?.action===`install`||N?.action===`update`||N?.action===`remove`?N.action:null,ie=Te(()=>A.filter(e=>(m===`all`||On(e.category)===m)&&`${e.name} ${e.summary}`.toLocaleLowerCase().includes(g.trim().toLocaleLowerCase())),[A,m,g]);z(()=>{if(!x)return;C.current?.focus();let e=e=>{e.key===`Escape`&&(e.preventDefault(),S(null),w.current?.focus())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[x]);let ae=()=>{S(null),w.current?.focus()},oe=(e,t)=>{!a||s||v!==null||P||F||(w.current=t,S(e))},se=async(e,t)=>{if(!(!a||s||v!==null||P||F)){if(f)t===`remove`&&ae(),p?.();else if((t!==`update`||window.confirm(`${e.name} 앱을 최신 승인 버전으로 업데이트하시겠습니까?\n\n업데이트 중 공유기를 재부팅하지 마세요.`))&&(t!==`install`||window.confirm(`${e.name} 앱을 설치하시겠습니까?\n\n앱을 변경하는 동안 공유기를 재부팅하지 마세요.`))){t===`remove`&&ae(),E(null),y({appId:e.id,action:t});try{t===`install`?await l(e.id):t===`update`?await u(e.id):await d(e.id),c()}catch(t){E(An(t,`${e.name} 앱 작업을 시작하지 못했습니다.`))}finally{y(null)}}}};return B(`section`,{class:`min-w-0 space-y-6`,children:[x?B(`div`,{class:`fixed inset-0 z-50 flex items-center justify-center bg-slate-950/70 p-4`,onClick:e=>{e.target===e.currentTarget&&ae()},role:`presentation`,children:B(`div`,{"aria-describedby":`apps-remove-description`,"aria-labelledby":`apps-remove-title`,"aria-modal":`true`,class:`w-full max-w-md rounded-2xl border border-slate-200 bg-white p-5 shadow-xl`,onKeyDown:e=>{e.key===`Tab`&&(e.shiftKey&&e.target===C.current?(e.preventDefault(),e.currentTarget.querySelector(`[data-confirm-remove]`)?.focus()):!e.shiftKey&&e.target instanceof HTMLButtonElement&&e.target.hasAttribute(`data-confirm-remove`)&&(e.preventDefault(),C.current?.focus()))},role:`dialog`,children:[B(`h2`,{class:`m-0 text-lg font-extrabold text-slate-950`,id:`apps-remove-title`,children:`앱 제거 확인`}),B(`p`,{class:`mt-3 break-words text-sm text-slate-700`,id:`apps-remove-description`,children:[B(`strong`,{children:x.name}),` 앱을 이 공유기에서 제거하시겠습니까?`]}),B(`p`,{class:`mt-2 text-xs leading-5 text-slate-600`,children:`앱에서 제공하던 기능을 더 이상 사용할 수 없습니다. 제거하는 동안 공유기를 재부팅하지 마세요.`}),B(`div`,{class:`mt-5 flex justify-end gap-2`,children:[B(`button`,{class:`min-h-10 rounded-lg border border-slate-200 bg-white px-4 text-sm font-bold text-slate-700 transition hover:bg-slate-50`,onClick:ae,ref:C,type:`button`,children:`취소`}),B(`button`,{class:`min-h-10 rounded-lg bg-red-700 px-4 text-sm font-bold text-white transition hover:bg-red-800 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-100 disabled:opacity-50`,"data-confirm-remove":!0,disabled:!a||!!s||v!==null||P||F,onClick:()=>void se(x,`remove`),type:`button`,children:`앱 제거`})]})]})}):null,B(`div`,{class:`min-w-0`,children:[B(W,{eyebrow:`SmartSafeHub Apps`,title:`Apps`,description:`SmartSafeHub에서 직접 검증한 앱으로 공유기의 기능을 확장하세요.`}),B(`div`,{class:`grid min-w-0 gap-3 lg:grid-cols-[minmax(0,1fr)_minmax(0,18.5rem)]`,children:[B(`div`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:[B(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[B(`div`,{class:`flex min-w-0 items-center gap-3`,children:[B(`span`,{class:`grid size-12 shrink-0 place-items-center rounded-2xl bg-teal-50 text-teal-700`,children:B(Ye,{class:`size-6`})}),B(`div`,{class:`min-w-0`,children:[B(`h3`,{class:`m-0 text-base font-black text-slate-950`,children:`검증된 앱`}),B(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`현재 펌웨어에서 확인된 앱만 표시합니다.`})]})]}),B(`div`,{class:`flex flex-wrap items-center gap-2`,children:[B(`span`,{class:`rounded-full border border-teal-200 bg-teal-50 px-3 py-1 text-xs font-bold text-teal-800`,children:k?`${A.length}개`:`확인 전`}),t&&k?B(`span`,{class:`rounded-full border border-amber-200 bg-amber-50 px-2 py-1 text-[11px] font-semibold text-amber-800`,title:t,role:`status`,children:`이전 목록`}):null,B(`button`,{class:`inline-flex min-h-10 items-center gap-2 rounded-xl border border-slate-200 bg-white px-3 text-xs font-bold text-slate-700 transition hover:border-teal-300 hover:text-teal-700 disabled:opacity-50`,disabled:n||r,onClick:i,type:`button`,children:[B(H,{class:`size-4 ${r?`animate-spin`:``}`}),r?`확인 중`:`목록 새로고침`]})]})]}),B(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`검증된 APK를 설치·업데이트·제거할 수 있습니다. 작업 중에는 다른 앱 작업을 시작할 수 없습니다.`})]}),B(Dn,{storage:o?.storage})]})]}),M&&(M.phase===`starting`||M.phase===`running`||M.phase===`failed`)?B(`div`,{"aria-live":`polite`,class:`rounded-2xl border p-4 text-sm ${M.phase===`failed`?`border-amber-300 bg-amber-50 text-amber-900`:`border-teal-200 bg-teal-50 text-teal-900`}`,role:`status`,children:[B(`strong`,{children:M.phase===`failed`?`Apps 자동 복원을 완료하지 못했습니다.`:`펌웨어 업데이트 후 Apps를 복원하는 중입니다.`}),M.appId?B(`span`,{children:[` · `,M.appId]}):null,M.phase===`failed`?B(`p`,{class:`mb-0 mt-1 text-xs`,children:[In[M.code]??`승인·연결·설치 상태를 확인해 주세요.`,` 필요한 경우 앱 카드에서 설치 마무리를 진행할 수 있습니다.`]}):B(`p`,{class:`mb-0 mt-1 text-xs`,children:`검증된 패키지만 다시 설치합니다. 완료될 때까지 앱 설치·제거를 시작하지 마세요.`})]}):null,ne&&N?B(`div`,{"aria-live":`polite`,class:`rounded-2xl border p-4 text-sm ${N.phase===`failed`?`border-rose-200 bg-rose-50 text-rose-800`:P&&N.action===`remove`?`border-red-200 bg-red-50 text-red-800`:`border-teal-200 bg-teal-50 text-teal-900`}`,role:`status`,children:B(`div`,{class:`flex items-start justify-between gap-3`,children:[B(`div`,{class:`min-w-0`,children:[P?N.action===`remove`?`앱 제거 중`:N.action===`update`?`앱 업데이트 중`:`앱 설치 중`:N.phase===`success`?`마지막 앱 작업 완료`:`마지막 앱 작업 실패`,N.appId?` · ${N.appId}`:``,N.code&&N.code!==`NONE`?` · 오류 코드 ${N.code}`:``,N.phase===`failed`&&N.code&&In[N.code]?B(`p`,{class:`mb-0 mt-1 text-xs`,children:In[N.code]}):null,P?B(`p`,{class:`mb-0 mt-1 text-xs`,children:[N.action===`remove`?`앱 제거와 패키지 정리가 진행 중입니다.`:N.action===`update`?`승인된 버전으로 앱을 업데이트하고 있습니다.`:`설치 확인과 패키지 처리가 진행 중입니다.`,` 화면을 닫아도 작업은 계속됩니다.`]}):null]}),P?null:B(`button`,{"aria-label":`앱 작업 알림 닫기`,class:`shrink-0 rounded-lg px-2 py-1 text-xs font-bold hover:bg-black/5 focus-visible:outline-none focus-visible:ring-2`,onClick:()=>te(ee),type:`button`,children:`닫기 ×`})]})}):null,T?B(`p`,{class:`rounded-xl border border-rose-200 bg-rose-50 p-4 text-sm text-rose-800`,role:`alert`,children:T}):null,s?B(`div`,{class:`rounded-xl border border-amber-200 bg-amber-50 p-4 text-sm text-amber-900`,role:`alert`,children:[`설치 상태를 확인하지 못했습니다. 설치 및 제거 버튼이 비활성화됩니다. `,B(`button`,{class:`underline`,onClick:c,type:`button`,children:`다시 확인`})]}):null,t&&!k?B(`div`,{class:`rounded-2xl border border-rose-200 bg-rose-50 p-5`,role:`alert`,children:[B(`p`,{class:`m-0 text-sm font-bold text-rose-800`,children:`앱 목록을 불러오지 못했습니다.`}),B(`p`,{class:`mt-2 mb-0 text-sm text-rose-700`,children:t}),B(`button`,{class:`mt-3 rounded-lg border border-rose-300 px-3 py-2 text-xs font-bold text-rose-800`,onClick:i,type:`button`,children:`다시 시도`})]}):null,n&&!k?B(`div`,{"aria-live":`polite`,class:`rounded-2xl border border-slate-200 bg-white p-8 text-center text-sm text-slate-500`,role:`status`,children:`검증된 앱 목록을 확인하는 중입니다.`}):null,k?B(b,{children:[A.length>0?B(`div`,{class:`space-y-4`,children:[B(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[B(`div`,{class:`flex flex-wrap items-center gap-2`,role:`group`,"aria-label":`앱 카테고리`,children:Ln.map(e=>B(`button`,{class:`inline-flex min-h-10 items-center gap-1.5 rounded-xl border px-3 text-xs font-bold ${m===e.id?`border-teal-400 bg-teal-50 text-teal-800`:`border-slate-200 bg-white text-slate-600`}`,onClick:()=>h(e.id),type:`button`,children:[B(kn,{category:e.id,class:`size-4 shrink-0`}),e.label]},e.id))}),B(`input`,{"aria-label":`앱 검색`,class:`min-h-10 w-full rounded-xl border border-slate-200 bg-white px-3 text-sm text-slate-900 outline-none focus:border-teal-500 sm:w-52`,onInput:e=>_(e.currentTarget.value),placeholder:`앱 검색`,type:`search`,value:g})]}),B(`div`,{class:`grid min-w-0 gap-3 sm:grid-cols-2 xl:grid-cols-3`,children:ie.map(e=>{let t=a?.installed[e.id],n=t?.installed??!1,r=o?.installedSizes?.[e.id],i=n&&typeof r==`number`&&Number.isSafeInteger(r)&&r>=0?wn(r):null,c=t?.managed??!1,l=!!(n&&c&&t?.updateAvailable),u=n?t?.installedVersion:null,d=!!(n&&u&&(l||u!==e.version)),m=v?.appId===e.id?v.action:P&&N?.appId===e.id?re:null,h=!a||!!s||v!==null||P||F,g=c&&(n||!!t?.partial),_=n&&t?.webUiReady?jn(e.webUi):null;return B(`article`,{class:`flex min-w-0 flex-col rounded-2xl border border-slate-200 bg-white p-5 shadow-sm`,children:[B(`div`,{class:`flex min-w-0 items-start gap-3`,children:[B(`span`,{class:`grid size-14 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-600`,children:B(kn,{category:On(e.category),class:`size-7`})}),B(`div`,{class:`min-w-0 flex-1`,children:[B(`div`,{class:`flex min-w-0 flex-wrap items-start justify-between gap-x-3 gap-y-2`,children:[B(`h3`,{class:`m-0 min-w-0 flex-1 break-words text-sm font-black text-slate-950`,children:e.name}),n&&c?B(`span`,{class:`ssh-apps-installed-badge shrink-0 rounded-full border px-2 py-0.5 text-[11px] font-bold`,children:`✓ 설치됨`}):null]}),B(`div`,{class:`mt-1 flex flex-wrap items-center gap-x-2 gap-y-1`,children:[B(`span`,{class:`text-xs text-slate-500`,title:n?`공유기에 설치된 대표 APK 패키지 버전입니다.`:`현재 제공 중인 승인 버전입니다.`,children:n?u?`설치 v${u}`:`설치 버전 확인 불가`:`v${e.version}`}),l?B(`span`,{class:`ssh-apps-update-badge rounded-full border px-2 py-0.5 text-[11px] font-bold`,children:`업데이트 가능`}):null]}),d||i!==null?B(`p`,{class:`mb-0 mt-1 flex min-w-0 flex-wrap items-center gap-x-1.5 gap-y-0.5 text-[11px] text-slate-500`,children:[d?B(`span`,{title:`현재 서버가 승인한 앱 릴리스 버전입니다. 설치된 APK 패키지의 버전과 다를 수 있습니다.`,children:[`제공 v`,e.version]}):null,d&&i!==null?B(`span`,{"aria-hidden":`true`,children:`·`}):null,i===null?null:B(`span`,{title:`설치된 APK 패키지의 용량 합계입니다. 앱 데이터 및 캐시는 포함되지 않습니다.`,children:[`설치 용량 약 `,i]})]}):null]})]}),B(`p`,{class:`mt-4 mb-4 min-h-10 break-words text-sm leading-5 text-slate-600`,children:e.summary}),B(`div`,{class:`mt-auto flex flex-wrap items-center justify-between gap-2 border-t border-slate-100 pt-3`,children:[B(`span`,{class:`text-xs font-bold text-teal-700`,children:`✓ 검증된 앱`}),m?B(Rn,{action:m}):B(`span`,{class:`flex flex-wrap items-center gap-2`,children:[c&&t?.partial&&!n?B(`button`,{class:`min-h-9 rounded-lg border border-teal-300 bg-white px-3 text-xs font-bold text-teal-800 hover:bg-teal-50 disabled:opacity-50`,disabled:h,onClick:()=>void se(e,`install`),type:`button`,children:`설치 마무리`}):null,l?B(`button`,{class:`ssh-apps-update-button min-h-9 rounded-lg border px-3 text-xs font-bold transition disabled:opacity-50`,disabled:h,onClick:()=>void se(e,`update`),type:`button`,children:`업데이트`}):null,_?f?B(`button`,{"aria-label":`${e.name} 데모 실행 안내`,class:`inline-flex min-h-9 items-center rounded-lg border border-teal-700 bg-teal-700 px-3 text-xs font-bold text-white transition hover:bg-teal-800`,onClick:p,type:`button`,children:`열기 ↗`}):B(`a`,{"aria-label":`${e.name} 새 탭에서 열기`,class:`inline-flex min-h-9 items-center rounded-lg border border-teal-700 bg-teal-700 px-3 text-xs font-bold text-white transition hover:bg-teal-800`,href:_,rel:`noopener noreferrer`,target:`_blank`,children:`열기 ↗`}):n&&e.webUi?B(`span`,{class:`text-xs text-amber-700`,title:`이 앱의 웹 UI 패키지를 설치해야 열 수 있습니다.`,children:`웹 UI 미설치`}):null,n&&!c?B(`span`,{class:`text-xs text-slate-500`,title:`공유기 소프트웨어 메뉴 또는 SSH로 설치한 앱은 Apps에서 제거하지 않습니다.`,children:`기존에 설치됨`}):t?.partial&&!c?B(`span`,{class:`text-xs text-amber-700`,children:`일부 패키지 설치됨`}):B(`button`,{class:`min-h-9 rounded-lg border bg-white px-3 text-xs font-bold transition focus-visible:outline-none focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-50 ${g?`border-red-300 text-red-700 hover:bg-red-50 focus-visible:ring-red-100`:`border-teal-300 text-teal-800 hover:bg-teal-50 focus-visible:ring-teal-200`}`,disabled:h||!!t?.partial&&!c,onClick:t=>g?oe(e,t.currentTarget):void se(e,`install`),type:`button`,children:g?`제거`:c?`재설치`:`설치`})]})]})]},e.id)})}),ie.length===0?B(`p`,{class:`rounded-xl bg-slate-100 p-5 text-center text-sm text-slate-600`,children:`검색 조건에 맞는 앱이 없습니다.`}):null]}):B(`div`,{class:`rounded-2xl border border-dashed border-slate-300 bg-white px-5 py-12 text-center`,children:[B(Ye,{class:`mx-auto size-10 text-slate-400`}),B(`h3`,{class:`mt-4 mb-2 text-base font-black text-slate-900`,children:`아직 등록된 앱이 없습니다.`}),B(`p`,{class:`m-0 text-sm leading-6 text-slate-500`,children:`현재 기기와 펌웨어에 대해 승인된 앱이 준비되면 이곳에서 확인할 수 있습니다.`})]}),B(`p`,{class:`text-xs text-slate-400`,children:[`기기 `,k.deviceCode,` · 펌웨어 `,k.firmwareBuildId,` · `,k.channel,` 채널`]})]}):null,j.length>0?B(`div`,{class:`rounded-2xl border border-amber-200 bg-amber-50 p-5`,children:[B(`h3`,{class:`m-0 text-sm font-black text-amber-900`,children:`제공이 중단된 앱`}),B(`p`,{class:`mb-3 mt-1 text-xs text-amber-800`,children:`현재 승인 목록에서 제외되었지만 기기에 남아 있는 앱입니다. 설치는 불가능하며 제거할 수 있습니다.`}),B(`div`,{class:`space-y-2`,children:j.map(([e])=>{let t=v?.appId===e?v.action:P&&N?.appId===e?re:null;return B(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[B(`span`,{class:`break-all text-sm text-amber-900`,children:e}),t?B(Rn,{action:t}):B(`button`,{class:`min-h-9 rounded-lg border border-red-300 bg-white px-3 text-xs font-bold text-red-700 transition hover:bg-red-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!a||P||F||v!==null||!!s,onClick:t=>oe({id:e,name:e,summary:``,description:``,category:``,version:``},t.currentTarget),type:`button`,children:`제거`})]},e)})})]}):null]})}function Bn(){return B(`section`,{"aria-busy":`true`,"aria-live":`polite`,class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:B(`div`,{class:`flex items-center gap-4`,children:[B(H,{class:`size-8 shrink-0 animate-spin text-teal-700`}),B(`div`,{class:`min-w-0 text-left`,children:B(`h2`,{class:`m-0 text-lg font-extrabold text-slate-950`,children:`장치 상태를 확인하고 있습니다`})})]})})}function Vn({message:e,onRetry:t}){return B(`section`,{"aria-live":`assertive`,class:`rounded-2xl border border-red-200 bg-red-50 p-5 sm:p-6`,children:[B(`p`,{class:`m-0 text-xs font-bold uppercase tracking-[0.16em] text-red-700`,children:`연결 오류`}),B(`h2`,{class:`mt-2 mb-0 text-lg font-extrabold text-red-950`,children:`장치 상태를 불러오지 못했습니다`}),B(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-red-800`,children:e}),B(`button`,{class:`mt-5 inline-flex min-h-10 items-center justify-center gap-2 rounded-xl border-0 bg-red-700 px-4 py-2 text-sm font-bold text-white shadow-sm transition hover:bg-red-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-red-200`,onClick:t,type:`button`,children:[B(H,{class:`size-4`}),`다시 시도`]})]})}var Hn=`https://www.smartsafehub.com/dashboard/devices/`;async function Un(e){if(navigator.clipboard?.writeText)try{await navigator.clipboard.writeText(e);return}catch{}let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`readonly`,``),t.style.position=`fixed`,t.style.inset=`0 auto auto -9999px`,t.style.opacity=`0`,document.body.appendChild(t),t.select(),t.setSelectionRange(0,e.length);let n=document.execCommand(`copy`);if(t.remove(),!n)throw Error(`clipboard_copy_failed`)}function Wn(e){return(e||`free`).toUpperCase()}function Gn(e){return e===`FREE`?`free`:e===`PRO`?`pro`:e===`ULTIMATE`?`ultimate`:`paid`}function Kn({plan:e}){let t=Gn(e),n=t!==`free`;return B(`span`,{class:`ssh-safeshield-plan-badge`,"data-compact":`false`,"data-tier":t,title:n?`${e} 멤버십`:`무료 플랜`,children:[B(`span`,{"aria-hidden":`true`,class:`ssh-safeshield-plan-badge-mark`,children:n?`✦`:`•`}),B(`span`,{children:e})]})}function qn(e){if(!e.pairingCode||!e.pairingExpiresAt)return!1;let t=Date.parse(e.pairingExpiresAt);return Number.isFinite(t)&&t<=Date.now()}function Jn({data:e,error:t,loading:n,pairingBusy:r,refreshing:i,syncError:a,onRequestPairing:o,onRetry:s,demo:c=!1,onDemoAction:l}){let[u,d]=R(null),[f,p]=R(!1);if(z(()=>{if(!f)return;let e=window.setTimeout(()=>p(!1),1800);return()=>window.clearTimeout(e)},[f]),n&&!e)return B(Bn,{});if(t&&!e)return B(Vn,{message:t,onRetry:s});let m=e,h=m?.accountRegistered===!0,g=Wn(m?.plan??null),_=m?qn(m):!1,v=!h&&!_?m?.pairingCode:null,y=r||m?.pairingOperation?.phase===`starting`||m?.pairingOperation?.phase===`running`;async function b(){d(null),p(!1);try{await o()}catch{d(`계정 연결 코드를 발급하지 못했습니다. 잠시 후 다시 시도해 주세요.`)}}async function x(){if(v)try{await Un(v),d(null),p(!0)}catch{p(!1),d(`연결 코드를 복사하지 못했습니다. 코드를 직접 선택해 복사해 주세요.`)}}return B(`div`,{class:`min-w-0`,children:[B(W,{eyebrow:`Account connection`,title:`기기 계정 연결`,description:`계정에 연결하면 웹사이트에서 기기를 관리하고 Cloud 기능과 구독 권한을 사용할 수 있습니다.`}),B(`div`,{class:`grid items-start gap-5 xl:items-stretch xl:grid-cols-[minmax(0,1.2fr)_minmax(18rem,0.8fr)]`,children:[B(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:h-full`,children:h?B(`div`,{children:[B(`div`,{class:`flex items-center gap-3`,children:[B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-full bg-emerald-100 text-emerald-700`,children:B(_t,{class:`size-5`})}),B(`div`,{children:[B(`p`,{class:`m-0 text-base font-black text-slate-950`,children:`SmartSafeHub 계정에 연결됨`}),B(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-600`,children:`이 기기가 계정과 정상적으로 연결되어 있습니다. 연결 코드는 더 이상 필요하지 않습니다.`})]})]}),c?B(`button`,{class:`mt-5 inline-flex min-h-11 items-center justify-center rounded-xl border border-emerald-700 bg-emerald-700 px-4 py-2 text-sm font-extrabold text-white transition hover:bg-emerald-800`,onClick:l,type:`button`,children:`웹사이트에서 기기 관리`}):B(`a`,{class:`mt-5 inline-flex min-h-11 items-center justify-center rounded-xl border border-emerald-700 bg-emerald-700 px-4 py-2 text-sm font-extrabold text-white no-underline transition hover:bg-emerald-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-emerald-100`,href:Hn,rel:`noopener noreferrer`,target:`_blank`,children:`웹사이트에서 기기 관리`}),B(`p`,{class:`mt-4 mb-0 border-t border-slate-100 pt-4 text-xs font-semibold leading-5 text-slate-500`,children:`웹사이트에서 기기 등록을 해제하면 공유기도 다음 계정 상태 동기화에서 자동으로 연결 해제를 반영합니다.`})]}):B(`div`,{children:[B(`div`,{children:[B(`div`,{class:`flex flex-wrap items-center justify-between gap-2`,children:[B(`p`,{class:`m-0 text-sm font-black text-slate-900`,children:`계정 연결 코드`}),B(`span`,{class:`inline-flex items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-[0.7rem] font-black text-amber-800`,children:[B(st,{class:`size-3.5`}),`10분 동안 유효`]})]}),B(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-500`,children:`코드를 발급한 뒤 smartsafehub.com에 로그인하여 기기를 연결하세요.`})]}),v?B(`div`,{class:`mt-4 flex flex-col gap-3 rounded-2xl border border-teal-200 bg-teal-50 p-4 sm:flex-row sm:items-center sm:justify-between`,role:`group`,"aria-label":`계정 연결 코드`,children:[B(`div`,{class:`min-w-0`,children:[B(`span`,{class:`block text-[0.7rem] font-black text-teal-700`,children:`연결 코드`}),B(`code`,{class:`mt-1 block select-all break-all font-mono text-2xl font-black tracking-[0.14em] text-slate-950`,children:v})]}),B(`button`,{"aria-label":`계정 연결 코드 복사`,class:`inline-flex min-h-11 shrink-0 items-center justify-center gap-2 rounded-xl border border-teal-300 bg-white px-4 text-sm font-black text-teal-800 transition hover:bg-teal-100 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:()=>void x(),type:`button`,children:[B(f?_t:pt,{class:`size-4`}),B(`span`,{"aria-live":`polite`,children:f?`복사됨`:`복사`})]})]}):_?B(`p`,{class:`mt-4 mb-0 rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm font-bold text-amber-800`,children:`이전 연결 코드가 만료되었습니다. 새 코드를 발급해 주세요.`}):null,B(`button`,{class:`mt-4 inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl border border-teal-700 bg-teal-700 px-4 py-2 text-sm font-black text-white transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:y,onClick:()=>void b(),type:`button`,children:[y?B(H,{class:`size-4 animate-spin`}):null,y?`발급 중…`:v?`새 코드 발급`:`연결 코드 발급`]}),m?.pairingOperation?.phase===`failed`?B(`p`,{class:`mt-3 mb-0 text-sm font-semibold text-red-700`,children:`연결 코드 발급에 실패했습니다. 다시 시도해 주세요.`}):null,u?B(`p`,{class:`mt-3 mb-0 text-sm font-semibold text-red-700`,children:u}):null]})}),B(`aside`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:h-full`,children:[B(`p`,{class:`m-0 text-[0.68rem] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Device status`}),B(`h2`,{class:`mt-2 mb-0 text-lg font-black tracking-tight text-slate-950`,children:`연결 상태`}),B(`dl`,{class:`mt-5 mb-0 grid gap-4`,children:[B(`div`,{class:`flex items-center justify-between gap-4 border-b border-slate-100 pb-4`,children:[B(`dt`,{class:`text-sm font-bold text-slate-500`,children:`계정`}),B(`dd`,{class:`m-0 text-sm font-black ${h?`text-emerald-700`:`text-slate-700`}`,children:h?`연결됨`:`연결 필요`})]}),B(`div`,{class:`flex items-center justify-between gap-4 border-b border-slate-100 pb-4`,children:[B(`dt`,{class:`text-sm font-bold text-slate-500`,children:`요금제`}),B(`dd`,{class:`m-0 flex min-w-0 flex-wrap items-center justify-end gap-2`,children:[B(Kn,{plan:g}),g===`FREE`?B(`span`,{class:`ssh-safeshield-plan-caption`,children:`기본 플랜`}):null]})]}),B(`div`,{class:`flex items-center justify-between gap-4`,children:[B(`dt`,{class:`text-sm font-bold text-slate-500`,children:`마지막 확인`}),B(`dd`,{class:`m-0 text-sm font-black text-slate-700`,children:$t(m?.lastSuccessAt??0)})]})]}),i?B(`p`,{class:`mt-5 mb-0 text-xs font-bold text-teal-700`,children:`최신 상태를 확인하고 있습니다…`}):null,a?h?B(`p`,{class:`mt-5 mb-0 text-xs font-semibold leading-5 text-slate-500`,children:`최신 상태 확인이 지연되고 있습니다. 마지막으로 확인된 연결 상태를 표시합니다.`}):B(`p`,{class:`mt-5 mb-0 rounded-xl border border-amber-200 bg-amber-50 px-3 py-2 text-xs font-bold leading-5 text-amber-800`,children:[a,` 로컬에 저장된 마지막 상태를 표시합니다.`]}):null]})]})]})}var Yn=Object.assign;function Xn(e,t){for(var n in e)if(n!=`__source`&&e[n]!==t[n])return!0;for(var r in t)if(r!=`__source`&&!(r in e))return!0;return!1}var Zn=/^(-|f[lo].*[^se]$|g.{5,}[^ps]$|z|o[pr]|(W.{5})?[lL]i.*(t|mp)$|an|(bo|s).{4}Im|sca|m.{6}[ds]|ta|c.*[st]$|wido|ini|asp|fill|st)/;function Qn(e,t){function n(e){var n=this.props.ref;return n!=e.ref&&n&&(typeof n==`function`?n(null):n.current=null),t?!t(this.props,e)||n!=e.ref:Xn(this.props,e)}function r(t){return this.shouldComponentUpdate=n,v(e,t)}return r.displayName=`Memo(`+(e.displayName||e.name)+`)`,r.prototype.isReactComponent=!0,r.type=e,r}function $n(e,t){var n=ce(e,t);return n.containerInfo=t,n}var er=Symbol.for(`react.element`),tr=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(?!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,nr=/[A-Z0-9]/g,rr=typeof document<`u`,ir=function(e){return/fil|che|rad/.test(e)};x.prototype.isReactComponent=!0,[`componentWillMount`,`componentWillReceiveProps`,`componentWillUpdate`].forEach(function(e){Object.defineProperty(x.prototype,e,{configurable:!0,get:function(){return this[`UNSAFE_`+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})});var ar=e.event;e.event=function(e){return ar&&(e=ar(e)),e.persist=function(){},e.isPropagationStopped=function(){return this.cancelBubble},e.isDefaultPrevented=function(){return this.defaultPrevented},e.nativeEvent=e};var or={configurable:!0,get:function(){return this.class}},sr=e.vnode;e.vnode=function(e){if(typeof e.type==`string`)(function(e){var t=e.props,n=e.type,r={},i=n.indexOf(`-`)==-1;for(var a in t){var o=t[a];if(!(a==`value`&&`defaultValue`in t&&o==null||rr&&a==`children`&&n==`noscript`||a==`class`||a==`className`)){if(a==`style`&&o&&o.constructor==Object){var s=void 0;for(var c in o)typeof o[c]!=`number`||Zn.test(c)||(s||(s=o=Yn({},o)),o[c]+=`px`)}else if(a==`defaultValue`&&`value`in t&&t.value==null)a=`value`;else if(a==`download`&&!0===o)o=``;else if(a==`translate`&&o===`no`)o=!1;else if(a[0]==`o`&&a[1]==`n`){var l=a.toLowerCase();l==`ondoubleclick`?a=`ondblclick`:l!=`onchange`||n!=`input`&&n!=`textarea`||ir(t.type)?l==`onfocus`?a=`onfocusin`:l==`onblur`&&(a=`onfocusout`):l=a=`oninput`,l==`oninput`&&r[a=l]&&(a=`oninputCapture`)}else i&&tr.test(a)?a=a.replace(nr,`-$&`).toLowerCase():o===null&&(o=void 0);r[a]=o}}n==`select`&&(r.multiple&&Array.isArray(r.value)&&(r.value=k(t.children).forEach(function(e){e.props.selected=r.value.indexOf(e.props.value)!=-1})),r.defaultValue!=null&&(r.value=k(t.children).forEach(function(e){e.props.selected=r.multiple?r.defaultValue.indexOf(e.props.value)!=-1:r.defaultValue==e.props.value}))),t.class&&!t.className?(r.class=t.class,Object.defineProperty(r,"className",or)):t.className&&(r.class=r.className=t.className),e.props=r})(e);else if(typeof e.type==`function`&&(`ref`in e.props&&`prototype`in e.type&&e.type.prototype.render&&(e.ref=e.props.ref,delete e.props.ref),e.type.defaultProps)){var t=Yn({},e.props);for(var n in e.type.defaultProps)t[n]===void 0&&(t[n]=e.type.defaultProps[n]);e.props=t}e.ref&&!(`ref`in e.props)&&Object.defineProperty(e.props,"ref",{value:e.ref,configurable:!0,writable:!0}),e.$$typeof=er,sr&&sr(e)};var cr=8,lr=256,ur=8;function dr(e){return e.findIndex(e=>!e.disabled)}function fr(e){for(let t=e.length-1;t>=0;--t)if(!e[t]?.disabled)return t;return-1}function pr(e,t,n){if(e.length===0)return-1;let r=t;for(let t=0;te.value===t&&!e.disabled);return n>=0?n:dr(e)}function hr({ariaLabel:e,className:t=``,disabled:n=!1,id:r,onChange:i,options:a,value:o,variant:s=`default`}){let c=De(),l=r??`ssh-custom-select-${c}`,u=`${l}-menu`,d=we(null),f=we(null),p=we(null),m=we([]),[h,g]=R(!1),[_,v]=R(()=>mr(a,o)),[y,b]=R(`bottom`),[x,S]=R(lr),[C,w]=R({}),[T,E]=R(null),D=Te(()=>a.find(e=>e.value===o)??a[0]??null,[a,o]),O=()=>{let e=f.current;if(!e)return;let t=e.getBoundingClientRect(),n=Math.min(lr,Math.max(44,a.length*42+12)),r=window.innerHeight-t.bottom-ur,i=t.top-ur,o=rr?`top`:`bottom`,s=Math.min(t.width,Math.max(0,window.innerWidth-16)),c=Math.max(ur,Math.min(t.left,window.innerWidth-s-ur)),l=o===`bottom`?r:i;b(o),S(Math.max(44,Math.min(lr,Math.floor(l)))),w({left:`${c}px`,width:`${s}px`,...o===`bottom`?{top:`${t.bottom+cr}px`}:{bottom:`${window.innerHeight-t.top+cr}px`}})},k=(e=!1)=>{g(!1),e&&window.requestAnimationFrame(()=>f.current?.focus())},A=e=>{e<0||(v(e),window.requestAnimationFrame(()=>m.current[e]?.focus()))},j=e=>{let t=a[e];t&&!t.disabled&&(i(t.value),g(!1),window.requestAnimationFrame(()=>f.current?.focus()))},M=e=>{n||a.length===0||(O(),g(!0),A(e??mr(a,o)))};z(()=>{let e=d.current?.closest(`.ssh-app`);if(e){E(e);return}let t=d.current?.getRootNode();t instanceof ShadowRoot?E(t):typeof document<`u`&&E(document.body)},[]),z(()=>{v(mr(a,o)),m.current=m.current.slice(0,a.length)},[a,o]),z(()=>{if(!h)return;O();let e=e=>{let t=e.composedPath();d.current&&t.includes(d.current)||p.current&&t.includes(p.current)||k()},t=e=>{e.key===`Escape`&&(e.preventDefault(),k(!0))},n=()=>O();return document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t),window.addEventListener(`resize`,n),window.addEventListener(`scroll`,n,!0),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t),window.removeEventListener(`resize`,n),window.removeEventListener(`scroll`,n,!0)}},[h,a.length]),z(()=>{n&&h&&k()},[n,h]);let N=s===`emphasized`?`min-h-11 border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100`:`min-h-11 border border-slate-300 bg-slate-50 px-3 py-2.5 text-sm font-bold text-slate-900 focus:border-teal-500 focus:ring-2 focus:ring-teal-100`,P=h?B(`div`,{"aria-label":`${e} 목록`,class:`ssh-custom-select-menu fixed z-[1000] overflow-hidden rounded-xl border border-slate-200 bg-white p-1.5 shadow-xl shadow-slate-950/10`,id:u,ref:p,role:`listbox`,style:C,children:B(`div`,{class:`overflow-y-auto overscroll-contain`,style:{maxHeight:`${x}px`},children:a.map((e,t)=>{let n=e.value===o;return B(`button`,{"aria-selected":n,class:`flex min-h-10 w-full items-center justify-between gap-3 rounded-lg px-3 py-2.5 text-left text-sm font-bold transition ${n?`bg-teal-50 text-teal-800`:`text-slate-700 hover:bg-slate-50`} ${e.disabled?`cursor-not-allowed opacity-50`:``}`,disabled:e.disabled,onClick:()=>j(t),onFocus:()=>v(t),onKeyDown:e=>{switch(e.key){case`ArrowDown`:e.preventDefault(),A(pr(a,t,1));break;case`ArrowUp`:e.preventDefault(),A(pr(a,t,-1));break;case`Home`:e.preventDefault(),A(dr(a));break;case`End`:e.preventDefault(),A(fr(a));break;case`Enter`:case` `:e.preventDefault(),j(t);break;case`Escape`:e.preventDefault(),k(!0);break;case`Tab`:g(!1)}},ref:e=>{m.current[t]=e},role:`option`,tabIndex:_===t?0:-1,type:`button`,children:[B(`span`,{class:`min-w-0 truncate`,children:e.label}),n?B(`span`,{"aria-hidden":`true`,class:`size-2 shrink-0 rounded-full bg-teal-500`}):null]},e.value)})})}):null;return B(`div`,{class:`relative ${t}`,ref:d,children:[B(`button`,{"aria-controls":u,"aria-expanded":h,"aria-haspopup":`listbox`,"aria-label":e,class:`ssh-custom-select-trigger flex w-full cursor-pointer items-center justify-between gap-3 rounded-xl text-left outline-none transition disabled:cursor-not-allowed disabled:bg-slate-100 disabled:text-slate-400 disabled:opacity-60 ${N}`,disabled:n,id:l,onClick:()=>{h?k():(O(),g(!0))},onKeyDown:e=>{switch(e.key){case`ArrowDown`:e.preventDefault(),M(h?pr(a,_,1):mr(a,o));break;case`ArrowUp`:e.preventDefault(),M(h?pr(a,_,-1):mr(a,o));break;case`Home`:e.preventDefault(),M(dr(a));break;case`End`:e.preventDefault(),M(fr(a));break;case`Enter`:case` `:e.preventDefault(),h?k():M();break;case`Escape`:h&&(e.preventDefault(),k())}},ref:f,type:`button`,children:[B(`span`,{class:`min-w-0 truncate`,children:D?.label??`선택하세요`}),B(wt,{"aria-hidden":`true`,class:`size-4 shrink-0 text-slate-400 transition-transform ${h?`rotate-180`:``}`})]}),P&&T?$n(P,T):null,B(`span`,{class:`sr-only`,"aria-live":`polite`,children:y===`top`?`선택 목록이 위쪽에 열렸습니다.`:``})]})}function gr(e){let t=e.split(`.`);return[t[0]??``,t[1]??``,t[2]??``,t[3]??``]}function _r(e){return e.replace(/\D/g,``).slice(0,3)}function vr(e){return e.every(e=>e===``)?``:e.join(`.`)}function yr({disabled:e=!1,label:t,value:n,onChange:r}){let i=gr(n),a=(e,t)=>{let n=[...i];n[e]=_r(t),r(vr(n))};return B(`div`,{class:`ssh-ipv4-segments mt-2 min-h-11`,"aria-label":`${t} 입력`,children:i.map((n,r)=>B(`div`,{class:`ssh-ipv4-segment`,children:[B(`input`,{"aria-label":`${t} ${r+1}번째 옥텟`,autocomplete:`off`,class:`min-h-11 w-full min-w-0 max-w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-1.5 py-2.5 text-center text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100 sm:px-2`,disabled:e,inputMode:`numeric`,maxLength:3,onInput:e=>a(r,e.currentTarget.value),pattern:`[0-9]*`,spellcheck:!1,value:n}),rt);function Cr(e){return br.includes(e)}function wr(e){switch(e){case`dhcp`:return`자동 IP (DHCP)`;case`pppoe`:return`PPPoE`;case`static`:return`고정 IPv4`;default:return e?e.toUpperCase():`확인 전`}}function Tr(e){return{protocol:e.configuration.protocol,pppoeUsername:e.configuration.pppoe.username,pppoePassword:``,staticAddress:e.configuration.static.address??``,staticPrefixLength:e.configuration.static.prefixLength??24,staticGateway:e.configuration.static.gateway??``,dnsPrimary:e.configuration.static.dns[0]??``,dnsSecondary:e.configuration.static.dns[1]??``}}function Er(e){return e.trim()}function Dr(e,t){let n=Tr(t);return e.protocol===n.protocol?e.protocol===`dhcp`||!Cr(e.protocol)?!1:e.protocol===`pppoe`?Er(e.pppoeUsername)!==n.pppoeUsername||e.pppoePassword.length>0:Er(e.staticAddress)!==n.staticAddress||e.staticPrefixLength!==n.staticPrefixLength||Er(e.staticGateway)!==n.staticGateway||Er(e.dnsPrimary)!==n.dnsPrimary||Er(e.dnsSecondary)!==n.dnsSecondary:!0}function Or(e){let t=e.trim().split(`.`);return t.length===4&&t.every(e=>{if(!/^(0|[1-9][0-9]{0,2})$/.test(e))return!1;let t=Number(e);return t>=0&&t<=255})}function kr(e){let t=e;return Array.from({length:4},()=>{if(t>=8)return t-=8,255;if(t<=0)return 0;let e=256-2**(8-t);return t=0,e}).join(`.`)}function Ar(e){if(!Number.isFinite(e)||e<=0)return`연결 시간 확인 전`;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}일 ${n}시간 연결됨`:n>0?`${n}시간 ${r}분 연결됨`:`${Math.max(1,r)}분 연결됨`}function jr({feedback:e,onDismiss:t}){return B(`div`,{"aria-live":`polite`,class:`mb-5 rounded-2xl border px-4 py-4 text-sm ${e.kind===`success`?`border-emerald-200 bg-emerald-50 text-emerald-900`:e.kind===`warning`?`border-amber-200 bg-amber-50 text-amber-950`:`border-red-200 bg-red-50 text-red-900`}`,children:B(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[B(`p`,{class:`m-0 font-bold leading-6`,children:e.message}),B(`button`,{class:`min-h-10 shrink-0 rounded-lg border border-current bg-transparent px-3 py-1.5 text-xs font-extrabold`,onClick:t,type:`button`,children:`닫기`})]})})}function Mr({data:e,busy:t,onReconnect:n}){let r=e.status,i=r.connected;return B(`section`,{class:`grid gap-4 lg:grid-cols-3`,"aria-label":`인터넷 연결 상태`,children:[B(`article`,{class:`rounded-2xl border p-5 shadow-sm shadow-slate-900/5 ${i?`border-emerald-200 bg-emerald-50 text-emerald-950`:`border-amber-200 bg-amber-50 text-amber-950`}`,children:[B(`div`,{class:`flex items-start justify-between gap-3`,children:[B(`span`,{class:`grid size-10 place-items-center rounded-xl ${i?`bg-emerald-100 text-emerald-700`:`bg-amber-100 text-amber-700`}`,children:B(i?_t:U,{class:`size-5`})}),B(`button`,{class:`inline-flex min-h-10 items-center justify-center gap-2 rounded-xl border border-current bg-transparent px-3 py-2 text-xs font-extrabold transition disabled:cursor-wait disabled:opacity-60`,disabled:t,onClick:n,type:`button`,children:[B(H,{class:`size-4 ${t?`animate-spin`:``}`}),`재연결`]})]}),B(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] opacity-70`,children:`인터넷 상태`}),B(`p`,{class:`mt-2 mb-0 text-xl font-black`,children:r.pending?`연결 중`:i?`연결됨`:`연결 안 됨`}),B(`p`,{class:`mt-1 mb-0 text-sm font-semibold leading-6 opacity-80`,children:[wr(r.protocol??e.configuration.protocol),` · `,Ar(r.uptimeSeconds)]})]}),B(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[B(`span`,{class:`grid size-10 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:B(at,{class:`size-5`})}),B(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`WAN IPv4`}),B(`p`,{class:`mt-2 mb-0 break-all text-xl font-black text-slate-950`,children:r.address?`${r.address}${r.prefixLength===null?``:`/${r.prefixLength}`}`:`주소 없음`}),B(`p`,{class:`mt-1 mb-0 text-sm font-semibold text-slate-600`,children:r.device?`인터페이스 ${r.device}`:`인터페이스 확인 전`})]}),B(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[B(`span`,{class:`grid size-10 place-items-center rounded-xl bg-slate-100 text-slate-700`,children:B(Ge,{class:`size-5`})}),B(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`Gateway · DNS`}),B(`p`,{class:`mt-2 mb-0 break-all text-base font-black text-slate-950`,children:r.gateway??`Gateway 확인 전`}),B(`p`,{class:`mt-1 mb-0 break-all text-sm font-semibold leading-6 text-slate-600`,children:r.dns.length>0?r.dns.join(` · `):`DNS 확인 전`})]})]})}function Nr({action:e,data:t,error:n,feedback:r,loading:i,onDismissFeedback:a,onReconnect:o,onRetry:s,onSave:c}){let[l,u]=R({protocol:`dhcp`,pppoeUsername:``,pppoePassword:``,staticAddress:``,staticPrefixLength:24,staticGateway:``,dnsPrimary:``,dnsSecondary:``}),[d,f]=R(!1),[p,m]=R(!1),[h,g]=R(null);z(()=>{t&&!d&&(u(Tr(t)),g(null))},[t,d]);let _=Te(()=>{let e=[{value:`dhcp`,label:`자동 IP (DHCP)`},{value:`pppoe`,label:`PPPoE`},{value:`static`,label:`고정 IPv4`}];return t&&!t.configuration.supported&&e.unshift({value:t.configuration.protocol,label:`현재 설정 (${t.configuration.protocol})`}),e},[t]);if(i)return B(Bn,{});if(n)return B(Vn,{message:n,onRetry:s});if(!t)return null;let v=e!==null,y=e=>{u(n=>{let r={...n,...e};return f(Dr(r,t)),r}),g(null)},x=async e=>{if(e.preventDefault(),!Cr(l.protocol))g(`DHCP, PPPoE 또는 고정 IPv4 중 하나를 선택해 주세요.`);else{if(l.protocol===`pppoe`){if(!Er(l.pppoeUsername)){g(`PPPoE 사용자명을 입력해 주세요.`);return}if((t.configuration.protocol!==`pppoe`||!t.configuration.pppoe.passwordConfigured)&&l.pppoePassword.length===0){g(`PPPoE 연결을 시작하려면 비밀번호를 입력해 주세요.`);return}}if(l.protocol===`static`){if(!Or(l.staticAddress)){g(`고정 IPv4 주소를 올바르게 입력해 주세요.`);return}if(!Or(l.staticGateway)){g(`기본 게이트웨이를 올바르게 입력해 주세요.`);return}if(!Or(l.dnsPrimary)){g(`기본 DNS 서버를 올바르게 입력해 주세요.`);return}if(Er(l.dnsSecondary)&&!Or(l.dnsSecondary)){g(`보조 DNS 서버를 올바르게 입력해 주세요.`);return}}window.confirm(`인터넷 연결 설정을 적용하면 WAN 연결이 다시 시작되어 인터넷이 잠시 끊길 수 있습니다. 계속하시겠습니까?`)&&await c({protocol:l.protocol,pppoeUsername:Er(l.pppoeUsername),pppoePassword:l.pppoePassword,pppoePasswordChanged:l.pppoePassword.length>0,staticAddress:Er(l.staticAddress),staticPrefixLength:l.staticPrefixLength,staticGateway:Er(l.staticGateway),dnsPrimary:Er(l.dnsPrimary),dnsSecondary:Er(l.dnsSecondary)})&&(u(e=>({...e,pppoePassword:``})),f(!1))}};return B(b,{children:[r?B(jr,{feedback:r,onDismiss:a}):null,B(W,{eyebrow:`Overview`,title:`인터넷 연결 상태`,description:`WAN 연결 상태와 네트워크 정보를 확인합니다.`}),B(Mr,{data:t,busy:v,onReconnect:()=>{window.confirm(`WAN 연결을 다시 시작합니다. 인터넷이 잠시 끊길 수 있습니다. 계속하시겠습니까?`)&&o()}}),t.configuration.supported?null:B(`section`,{class:`mt-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-amber-950 sm:p-6`,children:B(`div`,{class:`flex items-start gap-3`,children:[B(U,{class:`mt-0.5 size-5 shrink-0 text-amber-700`}),B(`div`,{children:[B(`h2`,{class:`m-0 text-base font-black`,children:`현재 WAN 방식은 직접 관리하지 않습니다`}),B(`p`,{class:`mt-2 mb-0 text-sm font-semibold leading-6 text-amber-900/80`,children:[`현재 설정은 `,t.configuration.protocol,`입니다. 아래에서 DHCP, PPPoE 또는 고정 IPv4를 선택해 저장하면 해당 방식으로 전환합니다.`]})]})]})}),B(`div`,{class:`mt-7`,children:B(W,{eyebrow:`Internet`,title:`인터넷 연결 설정`,description:`통신사 또는 상위 네트워크 환경에 맞는 WAN 연결 방식을 선택합니다.`})}),B(`form`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void x(e),children:[d?B(`div`,{class:`mb-5 flex justify-end`,children:B(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 self-start items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[B(U,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]})}):null,B(`div`,{children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`연결 방식`}),B(hr,{ariaLabel:`WAN 연결 방식`,className:`mt-2 max-w-xl`,disabled:v,id:`wan-protocol`,onChange:e=>y(e===`static`&&!Er(l.dnsSecondary)?{protocol:e,dnsSecondary:xr}:{protocol:e}),options:_,value:l.protocol,variant:`emphasized`}),B(`span`,{class:`mt-2 block text-xs font-semibold leading-5 text-slate-500`,children:`대부분의 가정용 인터넷과 상위 공유기 연결은 자동 IP(DHCP)를 사용합니다.`})]}),l.protocol===`pppoe`?B(`div`,{class:`mt-6 grid gap-5 lg:grid-cols-2`,children:[B(`label`,{class:`block`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`PPPoE 사용자명`}),B(`input`,{autocomplete:`username`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:v,onInput:e=>y({pppoeUsername:e.currentTarget.value}),spellcheck:!1,value:l.pppoeUsername})]}),B(`label`,{class:`block`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`PPPoE 비밀번호`}),B(`span`,{class:`relative mt-2 block`,children:[B(`input`,{autocomplete:`new-password`,class:`min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 pr-12 text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:v,onInput:e=>y({pppoePassword:e.currentTarget.value}),placeholder:t.configuration.protocol===`pppoe`&&t.configuration.pppoe.passwordConfigured?`변경할 때만 입력`:`PPPoE 비밀번호`,...p?{type:`text`}:{type:`password`},value:l.pppoePassword}),B(`button`,{"aria-label":p?`비밀번호 숨기기`:`비밀번호 표시`,class:`absolute inset-y-0 right-1 grid w-10 place-items-center rounded-lg border-0 bg-transparent text-slate-500`,disabled:v,onClick:()=>m(e=>!e),type:`button`,children:B(p?ht:mt,{class:`size-5`})})]}),B(`span`,{class:`mt-2 block text-xs text-slate-500`,children:t.configuration.protocol===`pppoe`&&t.configuration.pppoe.passwordConfigured?`비워 두면 현재 저장된 비밀번호를 그대로 사용합니다.`:`통신사에서 제공한 PPPoE 비밀번호를 입력해 주세요.`})]})]}):null,l.protocol===`static`?B(`div`,{class:`mt-6 grid gap-5 lg:grid-cols-2`,children:[B(`label`,{class:`block`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`IPv4 주소`}),B(yr,{disabled:v,label:`IPv4 주소`,onChange:e=>y({staticAddress:e}),value:l.staticAddress})]}),B(`div`,{class:`block`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`서브넷 마스크`}),B(hr,{ariaLabel:`WAN 서브넷 마스크`,className:`mt-2`,disabled:v,id:`wan-static-prefix-length`,onChange:e=>y({staticPrefixLength:Number(e)}),options:Sr.map(e=>({value:String(e),label:`/${e} · ${kr(e)}`})),value:String(l.staticPrefixLength),variant:`emphasized`})]}),B(`label`,{class:`block`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`기본 게이트웨이`}),B(yr,{disabled:v,label:`기본 게이트웨이`,onChange:e=>y({staticGateway:e}),value:l.staticGateway})]}),B(`label`,{class:`block`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`기본 DNS`}),B(yr,{disabled:v,label:`기본 DNS`,onChange:e=>y({dnsPrimary:e}),value:l.dnsPrimary})]}),B(`label`,{class:`block lg:col-start-2`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`보조 DNS (선택)`}),B(yr,{disabled:v,label:`보조 DNS`,onChange:e=>y({dnsSecondary:e}),value:l.dnsSecondary})]})]}):null,l.protocol===`dhcp`?B(`div`,{class:`mt-6 rounded-xl border border-slate-200 bg-slate-50 px-4 py-4 text-sm font-semibold leading-6 text-slate-600`,children:`상위 공유기 또는 통신사 장비에서 IP 주소, 기본 게이트웨이와 DNS 정보를 자동으로 받습니다. 별도의 계정이나 고정 주소가 없다면 이 방식을 사용하세요.`}):null,h?B(`p`,{class:`mt-5 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:h}):null,B(`div`,{class:`mt-6 flex flex-col gap-3 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[B(`p`,{class:`m-0 text-xs font-semibold leading-5 text-slate-500`,children:`설정 저장 후 WAN만 다시 연결하며 LAN 관리 페이지와 내부 네트워크 설정은 유지됩니다.`}),B(`button`,{class:`inline-flex min-h-11 w-full shrink-0 items-center justify-center gap-2 rounded-xl border-0 bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white shadow-sm transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:v||!d,type:`submit`,children:[B(_t,{class:`size-5 ${e===`saving`?`animate-pulse`:``}`}),e===`saving`?`저장 중`:`설정 저장`]})]})]})]})}var Pr=[16,20,22,23,24,25,26,27,28],Fr=[[`30m`,`30분`],[`1h`,`1시간`],[`6h`,`6시간`],[`12h`,`12시간`],[`24h`,`24시간`],[`3d`,`3일`],[`7d`,`7일`]];function Ir(e){let t=e.trim().split(`.`);return t.length===4&&t.every(e=>{if(!/^(0|[1-9][0-9]{0,2})$/.test(e))return!1;let t=Number(e);return t>=0&&t<=255})}function Lr(e){let t=gr(e);return t.slice(0,3).some(e=>e===``||Number(e)>255)?null:t.slice(0,3).join(`.`)}function Rr(e){return gr(e)[3]}function zr(e){let t=Lr(e.lan.address),n=Rr(e.dhcp.start??``),r=Rr(e.dhcp.end??``);return{ipAddress:e.lan.address,prefixLength:e.lan.prefixLength,dhcpEnabled:e.dhcp.enabled,dhcpStart:t&&n?`${t}.${n}`:e.dhcp.start??``,dhcpEnd:t&&r?`${t}.${r}`:e.dhcp.end??``,leaseTime:e.dhcp.leaseTime}}function Br({disabled:e,label:t,lanAddress:n,value:r,onChange:i}){let a=Lr(n),o=a?.split(`.`)??[``,``,``],s=Rr(r),c=e=>{let t=_r(e);i(a&&t!==``?`${a}.${t}`:t)};return B(`label`,{class:`block`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:t}),B(`div`,{class:`ssh-ipv4-segments mt-2 min-h-11`,"aria-label":`${t} 입력`,children:[o.map((e,t)=>B(`div`,{class:`ssh-ipv4-segment`,children:[B(`span`,{class:`grid min-h-11 w-full min-w-0 max-w-full place-items-center rounded-xl border border-slate-200 bg-slate-100 px-1.5 py-2.5 text-center text-sm font-bold text-slate-500 sm:px-2`,children:e||`—`}),B(`span`,{"aria-hidden":`true`,class:`ssh-ipv4-separator text-sm font-black text-slate-400`,children:`.`})]},t)),B(`div`,{class:`ssh-ipv4-segment`,children:B(`input`,{"aria-label":`${t} 마지막 옥텟`,autocomplete:`off`,class:`min-h-11 w-full min-w-0 max-w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-1.5 py-2.5 text-center text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100 sm:px-2`,disabled:e||!a,inputMode:`numeric`,maxLength:3,onInput:e=>c(e.currentTarget.value),pattern:`[0-9]*`,spellcheck:!1,value:s})})]}),B(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`앞 3개 주소는 공유기 IP 주소와 동일하게 유지됩니다.`})]})}function Vr(e){return`${window.location.protocol}//${e}${window.location.pathname}${window.location.search}${window.location.hash}`}function Hr({feedback:e,onDismiss:t}){return B(`div`,{"aria-live":`polite`,class:`mb-5 rounded-2xl border px-4 py-4 text-sm ${e.kind===`success`?`border-emerald-200 bg-emerald-50 text-emerald-900`:e.kind===`warning`?`border-amber-200 bg-amber-50 text-amber-950`:`border-red-200 bg-red-50 text-red-900`}`,children:[B(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[B(`p`,{class:`m-0 font-bold leading-6`,children:e.message}),B(`button`,{class:`min-h-10 shrink-0 rounded-lg border border-current bg-transparent px-3 py-1.5 text-xs font-extrabold`,onClick:t,type:`button`,children:`닫기`})]}),e.newAddress?B(`a`,{class:`mt-3 inline-flex min-h-10 items-center rounded-lg border border-current px-3 py-2 font-extrabold underline underline-offset-2`,href:Vr(e.newAddress),children:[`새 공유기 주소 `,e.newAddress,`로 연결`]}):null]})}function Ur({data:e}){let t=e.conflict.detected;return B(`section`,{class:`grid gap-4 lg:grid-cols-3`,"aria-label":`내부 네트워크 상태`,children:[B(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[B(`span`,{class:`grid size-10 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:B(Ge,{class:`size-5`})}),B(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`SmartSafeHub LAN`}),B(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:e.lan.subnet}),B(`p`,{class:`mt-1 mb-0 text-sm font-semibold text-slate-600`,children:[`공유기 주소 `,e.lan.address]})]}),B(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[B(`span`,{class:`grid size-10 place-items-center rounded-xl bg-slate-100 text-slate-700`,children:B(at,{class:`size-5`})}),B(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`상위 네트워크`}),B(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:e.wan.subnet??`확인 전`}),B(`p`,{class:`mt-1 mb-0 text-sm font-semibold text-slate-600`,children:e.wan.connected?`WAN ${e.wan.address??`주소 확인 중`}`:`WAN 연결 후 자동으로 확인합니다.`})]}),B(`article`,{class:`rounded-2xl border p-5 shadow-sm shadow-slate-900/5 ${t?`border-red-200 bg-red-50 text-red-950`:`border-emerald-200 bg-emerald-50 text-emerald-950`}`,children:[B(`span`,{class:`grid size-10 place-items-center rounded-xl ${t?`bg-red-100 text-red-700`:`bg-emerald-100 text-emerald-700`}`,children:B(t?U:_t,{class:`size-5`})}),B(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] opacity-70`,children:`대역 충돌`}),B(`p`,{class:`mt-2 mb-0 text-lg font-black`,children:t?`주소 대역이 겹칩니다`:`충돌이 감지되지 않았습니다`}),B(`p`,{class:`mt-1 mb-0 text-sm font-semibold leading-6 opacity-80`,children:t?`상위 네트워크 ${e.conflict.wanSubnet??``}와 다른 LAN 대역이 필요합니다.`:e.wan.connected?`현재 WAN과 LAN이 서로 다른 IPv4 대역을 사용합니다.`:`WAN이 연결되면 상위 네트워크와의 충돌 여부를 확인합니다.`})]})]})}function Wr({action:e,data:t,error:n,feedback:r,loading:i,onApplyRecommendation:a,onDismissFeedback:o,onRetry:s,onSave:c}){let[l,u]=R(``),[d,f]=R(24),[p,m]=R(!0),[h,g]=R(``),[_,v]=R(``),[y,x]=R(`12h`),[S,C]=R(!1),[w,T]=R(null),E=(e={})=>{if(!t)return!1;let n=zr(t);return(e.ipAddress??l).trim()!==n.ipAddress||(e.prefixLength??d)!==n.prefixLength||(e.dhcpEnabled??p)!==n.dhcpEnabled||(e.dhcpStart??h).trim()!==n.dhcpStart||(e.dhcpEnd??_).trim()!==n.dhcpEnd||(e.leaseTime??y)!==n.leaseTime},D=e=>{let t=Lr(e);if(u(e),!t){C(E({ipAddress:e}));return}let n=Rr(h),r=Rr(_),i=n?`${t}.${n}`:``,a=r?`${t}.${r}`:``;g(i),v(a),C(E({ipAddress:e,dhcpStart:i,dhcpEnd:a}))},O=e=>{g(e),C(E({dhcpStart:e}))},k=e=>{v(e),C(E({dhcpEnd:e}))},A=e=>{f(e),C(E({prefixLength:e}))},j=e=>{x(e),C(E({leaseTime:e}))},M=e=>{m(e),C(E({dhcpEnabled:e}))};z(()=>{if(!t||S)return;let e=zr(t);u(e.ipAddress),f(e.prefixLength),m(e.dhcpEnabled),g(e.dhcpStart),v(e.dhcpEnd),x(e.leaseTime),T(null)},[t,S]);let N=Te(()=>{let e=[...Pr];return e.includes(d)||(e.push(d),e.sort((e,t)=>e-t)),e},[d]),P=Te(()=>{let e=[...Fr];return e.some(([e])=>e===y)||e.push([y,`현재 설정 (${y})`]),e},[y]);if(i)return B(Bn,{});if(n)return B(Vn,{message:n,onRetry:s});if(!t)return null;let F=e!==null,ee=async e=>{e.preventDefault(),Ir(l)?!Ir(h)||!Ir(_)?T(`DHCP 시작/종료 주소를 올바른 IPv4 형식으로 입력해 주세요.`):window.confirm(`내부 네트워크 설정을 적용하면 연결된 기기가 새 DHCP 정보를 받는 동안 잠시 연결이 끊길 수 있습니다. 계속하시겠습니까?`)&&(T(null),await c({ipAddress:l.trim(),prefixLength:d,dhcpEnabled:p,dhcpStart:h.trim(),dhcpEnd:_.trim(),leaseTime:y})&&C(!1)):T(`공유기 주소를 올바른 IPv4 형식으로 입력해 주세요.`)},te=async()=>{t.recommendation&&window.confirm(`상위 네트워크와 겹치지 않는 ${t.recommendation.subnet} 대역으로 자동 변경합니다. 현재 연결이 잠시 끊길 수 있습니다. 계속하시겠습니까?`)&&(T(null),await a()&&C(!1))};return B(b,{children:[r?B(Hr,{feedback:r,onDismiss:o}):null,B(W,{eyebrow:`Overview`,title:`내부 네트워크 상태`,description:`LAN 주소와 DHCP 할당 상태를 확인합니다.`}),B(Ur,{data:t}),t.conflict.detected?B(`section`,{class:`mt-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-amber-950 sm:p-6`,children:B(`div`,{class:`flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between`,children:[B(`div`,{class:`min-w-0`,children:[B(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-amber-700`,children:`자동 충돌 해결`}),B(`h2`,{class:`mt-2 mb-0 text-lg font-black`,children:`안전한 LAN 대역으로 변경할 수 있습니다`}),B(`p`,{class:`mt-2 mb-0 text-sm font-semibold leading-6 text-amber-900/80`,children:t.recommendation?`${t.recommendation.subnet} · DHCP ${t.recommendation.dhcpStart} ~ ${t.recommendation.dhcpEnd}`:`현재 활성 네트워크와 겹치지 않는 추천 대역을 찾지 못했습니다. 아래에서 직접 설정해 주세요.`})]}),t.recommendation?B(`button`,{class:`inline-flex min-h-11 shrink-0 items-center justify-center gap-2 rounded-xl border-0 bg-amber-700 px-5 py-2.5 text-sm font-extrabold text-white transition hover:bg-amber-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-amber-200 disabled:cursor-wait disabled:opacity-60`,disabled:F,onClick:()=>void te(),type:`button`,children:[B(_t,{class:`size-5 ${e===`auto`?`animate-pulse`:``}`}),e===`auto`?`변경 중`:`추천 대역으로 자동 변경`]}):null]})}):null,B(`div`,{class:`mt-7`,children:B(W,{eyebrow:`Local network`,title:`LAN 및 DHCP 설정`,description:`상위 공유기와 다른 주소 대역을 사용해야 안정적으로 라우팅할 수 있습니다.`})}),B(`form`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void ee(e),children:[S?B(`div`,{class:`mb-5 flex justify-end`,children:B(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 self-start items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[B(U,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]})}):null,B(`div`,{class:`grid gap-5 lg:grid-cols-2`,children:[B(`div`,{class:`block`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`공유기 IP 주소`}),B(yr,{disabled:F,label:`공유기 IP 주소`,onChange:D,value:l})]}),B(`div`,{class:`block`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`현재 LAN 대역`}),B(`div`,{class:`mt-2 min-h-11 rounded-xl border border-slate-200 bg-slate-50 px-4 py-3 text-sm font-bold text-slate-700`,children:t.lan.subnet}),B(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`서브넷 마스크는 아래 고급 설정에서 변경할 수 있습니다.`})]}),B(Br,{disabled:F,label:`DHCP 시작 주소`,lanAddress:l,onChange:O,value:h}),B(Br,{disabled:F,label:`DHCP 종료 주소`,lanAddress:l,onChange:k,value:_})]}),B(`details`,{class:`mt-6 rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[B(`summary`,{class:`cursor-pointer text-sm font-black text-slate-900`,children:`고급 DHCP 설정`}),B(`div`,{class:`mt-5 grid gap-5 lg:grid-cols-2`,children:[B(`div`,{class:`block`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`서브넷 마스크`}),B(hr,{ariaLabel:`서브넷 마스크`,className:`mt-2`,disabled:F,id:`lan-prefix-length`,onChange:e=>A(Number(e)),options:N.map(e=>({value:String(e),label:`/${e} · ${e===t.lan.prefixLength?t.lan.netmask:`CIDR /${e}`}`})),value:String(d),variant:`emphasized`}),B(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`일반 가정용 네트워크는 /24 사용을 권장합니다.`})]}),B(`div`,{class:`block`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`DHCP 임대 시간`}),B(hr,{ariaLabel:`DHCP 임대 시간`,className:`mt-2`,disabled:F,id:`lan-dhcp-lease-time`,onChange:j,options:P.map(([e,t])=>({value:e,label:t})),value:y,variant:`emphasized`})]}),B(`label`,{class:`inline-flex min-h-11 items-center gap-3 text-sm font-extrabold text-slate-800 lg:col-span-2`,children:[B(`input`,{checked:p,class:`size-5 accent-teal-700`,disabled:F,onChange:e=>M(e.currentTarget.checked),type:`checkbox`}),`SmartSafeHub DHCP 서버 사용`]}),B(`p`,{class:`m-0 text-xs font-semibold leading-5 text-slate-500 lg:col-span-2`,children:`DHCP를 끄면 SmartSafeHub에 연결되는 장치에 IP 주소를 자동으로 할당하지 않습니다. 별도의 DHCP 서버를 사용하는 고급 구성에서만 비활성화하세요.`})]})]}),w?B(`p`,{class:`mt-5 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:w}):null,B(`div`,{class:`mt-6 flex flex-col gap-3 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[B(`p`,{class:`m-0 text-xs font-semibold leading-5 text-slate-500`,children:`주소가 바뀌면 현재 관리 페이지 연결이 종료되며 새 IP를 받아 다시 접속해야 합니다.`}),B(`button`,{class:`inline-flex min-h-11 w-full shrink-0 items-center justify-center gap-2 rounded-xl border-0 bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white shadow-sm transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:F||!S,type:`submit`,children:[B(_t,{class:`size-5 ${e===`saving`?`animate-pulse`:``}`}),e===`saving`?`저장 중`:`설정 저장`]})]})]})]})}var Gr={};Gr.QR8bitByte=(e,t)=>{var n=t("QRMode");function r(e){this.mode=n.MODE_8BIT_BYTE,this.data=e}r.prototype={getLength:function(){return this.data.length},write:function(e){for(var t=0;t{function n(){this.buffer=[],this.length=0}n.prototype={get:function(e){var t=Math.floor(e/8);return(this.buffer[t]>>>7-e%8&1)==1},put:function(e,t){for(var n=0;n>>t-n-1&1)==1)},getLengthInBits:function(){return this.length},putBit:function(e){var t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},e.exports=n},Gr.QRErrorCorrectLevel=(e,t)=>{e.exports={L:1,M:0,Q:3,H:2}},Gr.QRMaskPattern=(e,t)=>{e.exports={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7}},Gr.QRMath=(e,t)=>{for(var n={glog:function(e){if(e<1)throw Error(`glog(`+e+`)`);return n.LOG_TABLE[e]},gexp:function(e){for(;e<0;)e+=255;for(;e>=256;)e-=255;return n.EXP_TABLE[e]},EXP_TABLE:Array(256),LOG_TABLE:Array(256)},r=0;r<8;r++)n.EXP_TABLE[r]=1<{e.exports={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8}},Gr.QRPolynomial=(e,t)=>{var n=t("QRMath");function r(e,t){if(e.length===void 0)throw Error(e.length+`/`+t);for(var n=0;n{var n=t("QRErrorCorrectLevel");function r(e,t){this.totalCount=e,this.dataCount=t}r.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],r.getRSBlocks=function(e,t){var n=r.getRsBlockTable(e,t);if(n===void 0)throw Error(`bad rs block @ typeNumber:`+e+`/errorCorrectLevel:`+t);for(var i=n.length/3,a=[],o=0;o{var n=t("QRMode"),r=t("QRPolynomial"),i=t("QRMath"),a=t("QRMaskPattern"),o={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(e){for(var t=e<<10;o.getBCHDigit(t)-o.getBCHDigit(o.G15)>=0;)t^=o.G15<=0;)t^=o.G18<>>=1;return t},getPatternPosition:function(e){return o.PATTERN_POSITION_TABLE[e-1]},getMask:function(e,t,n){switch(e){case a.PATTERN000:return(t+n)%2==0;case a.PATTERN001:return t%2==0;case a.PATTERN010:return n%3==0;case a.PATTERN011:return(t+n)%3==0;case a.PATTERN100:return(Math.floor(t/2)+Math.floor(n/3))%2==0;case a.PATTERN101:return t*n%2+t*n%3==0;case a.PATTERN110:return(t*n%2+t*n%3)%2==0;case a.PATTERN111:return(t*n%3+(t+n)%2)%2==0;default:throw Error(`bad maskPattern:`+e)}},getErrorCorrectPolynomial:function(e){for(var t=new r([1],0),n=0;n5&&(n+=3+a-5)}for(r=0;r{var n=t("QR8bitByte"),r=t("QRUtil"),i=t("QRPolynomial"),a=t("QRRSBlock"),o=t("QRBitBuffer");function s(e,t){this.typeNumber=e,this.errorCorrectLevel=t,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}s.prototype={addData:function(e){var t=new n(e);this.dataList.push(t),this.dataCache=null},isDark:function(e,t){if(e<0||this.moduleCount<=e||t<0||this.moduleCount<=t)throw Error(e+`,`+t);return this.modules[e][t]},getModuleCount:function(){return this.moduleCount},make:function(){if(this.typeNumber<1){var e=1;for(e=1;e<40;e++){for(var t=a.getRSBlocks(e,this.errorCorrectLevel),n=new o,i=0,s=0;s=7&&this.setupTypeNumber(e),this.dataCache===null&&(this.dataCache=s.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,t)},setupPositionProbePattern:function(e,t){for(var n=-1;n<=7;n++)if(!(e+n<=-1||this.moduleCount<=e+n))for(var r=-1;r<=7;r++)t+r<=-1||this.moduleCount<=t+r||(0<=n&&n<=6&&(r===0||r===6)||0<=r&&r<=6&&(n===0||n===6)||2<=n&&n<=4&&2<=r&&r<=4?this.modules[e+n][t+r]=!0:this.modules[e+n][t+r]=!1)},getBestMaskPattern:function(){for(var e=0,t=0,n=0;n<8;n++){this.makeImpl(!0,n);var i=r.getLostPoint(this);(n===0||e>i)&&(e=i,t=n)}return t},createMovieClip:function(e,t,n){var r=e.createEmptyMovieClip(t,n),i=1;this.make();for(var a=0;a>i&1)==1,this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=n;for(var a=0;a<18;a++)n=!e&&(t>>a&1)==1,this.modules[a%3+this.moduleCount-8-3][Math.floor(a/3)]=n},setupTypeInfo:function(e,t){for(var n=this.errorCorrectLevel<<3|t,i=r.getBCHTypeInfo(n),a,o=0;o<15;o++)a=!e&&(i>>o&1)==1,o<6?this.modules[o][8]=a:o<8?this.modules[o+1][8]=a:this.modules[this.moduleCount-15+o][8]=a;for(var s=0;s<15;s++)a=!e&&(i>>s&1)==1,s<8?this.modules[8][this.moduleCount-s-1]=a:s<9?this.modules[8][15-s-1+1]=a:this.modules[8][15-s-1]=a;this.modules[this.moduleCount-8][8]=!e},mapData:function(e,t){for(var n=-1,i=this.moduleCount-1,a=7,o=0,s=this.moduleCount-1;s>0;s-=2)for(s===6&&s--;;){for(var c=0;c<2;c++)if(this.modules[i][s-c]===null){var l=!1;o>>a&1)==1),r.getMask(t,i,s-c)&&(l=!l),this.modules[i][s-c]=l,a--,a===-1&&(o++,a=7)}if(i+=n,i<0||this.moduleCount<=i){i-=n,n=-n;break}}}},s.PAD0=236,s.PAD1=17,s.createData=function(e,t,n){for(var i=a.getRSBlocks(e,t),c=new o,l=0;ld*8)throw Error(`code length overflow. (`+c.getLengthInBits()+`>`+d*8+`)`);for(c.getLengthInBits()+4<=d*8&&c.put(0,4);c.getLengthInBits()%8!=0;)c.putBit(!1);for(;!(c.getLengthInBits()>=d*8||(c.put(s.PAD0,8),c.getLengthInBits()>=d*8));)c.put(s.PAD1,8);return s.createBytes(c,i)},s.createBytes=function(e,t){for(var n=0,a=0,o=0,s=Array(t.length),c=Array(t.length),l=0;l=0?m.get(g):0}}for(var _=0,v=0;vString.fromCharCode(e)).join(``),r=new(qr(`index`))(0,qr(`QRErrorCorrectLevel`).M);r.addData(n),r.make();let i=r.getModuleCount();return Array.from({length:i},(e,t)=>Array.from({length:i},(e,n)=>!!r.isDark(t,n)))}function Yr(e,t,n){let r=e=>e.replace(/([\\;,:"])/g,`\\$1`);return`WIFI:T:${t===`none`?`nopass`:t===`sae`?`WPA3`:`WPA`};S:${r(e)};P:${r(n)};;`}function Xr(e){return`${(e.replace(/[\\/:*?"<>|\x00-\x1f\x7f]/g,`_`).replace(/[. ]+$/g,``).trim()||`Wi-Fi`).slice(0,64)}-QR.png`}function Zr(e,t,n=8){let r=(e.length+8)*n;t.fillStyle=`#ffffff`,t.fillRect(0,0,r,r),t.fillStyle=`#000000`,e.forEach((e,r)=>e.forEach((e,i)=>{e&&t.fillRect((i+4)*n,(r+4)*n,n,n)}))}function Qr({load:e,onClose:t}){let[n,r]=R(null),[i,a]=R(null),[o,s]=R(null);z(()=>{let t=!0;return e().then(e=>{if(t)try{r({ssid:e.ssid,matrix:Jr(Yr(e.ssid,e.security,e.password))})}catch{a(`QR 코드를 생성할 수 없습니다.`)}}).catch(()=>{t&&a(`Wi-Fi 정보를 불러오지 못했습니다.`)}),()=>{t=!1,r(null)}},[e]);let c=n?.matrix.length??0;return B(`div`,{class:`fixed inset-0 z-50 flex items-center justify-center bg-slate-950/70 p-4`,role:`presentation`,onClick:e=>{e.target===e.currentTarget&&t()},children:B(`section`,{role:`dialog`,"aria-modal":`true`,"aria-label":`Wi-Fi QR 코드`,class:`w-full max-w-sm rounded-2xl bg-white p-5 text-center text-slate-950 shadow-2xl sm:p-7`,children:[B(`h2`,{class:`m-0 text-xl font-extrabold`,children:`Wi-Fi QR 코드`}),B(`p`,{class:`mt-2 break-all text-sm font-semibold text-slate-600`,children:n?.ssid??`Wi-Fi 정보를 확인하는 중`}),i?B(`p`,{role:`alert`,class:`my-6 text-sm font-bold text-red-700`,children:i}):null,!n&&!i?B(`p`,{class:`my-6 text-sm`,children:`QR 코드를 만드는 중...`}):null,n?B(`div`,{class:`mx-auto my-5 w-full max-w-[288px] rounded-xl border border-slate-200 bg-white p-3`,children:B(`svg`,{class:`block h-auto w-full`,viewBox:`0 0 ${c+8} ${c+8}`,role:`img`,"aria-label":`${n.ssid} Wi-Fi 연결 QR 코드`,"shape-rendering":`crispEdges`,children:[B(`rect`,{width:c+8,height:c+8,fill:`white`}),n.matrix.map((e,t)=>e.map((e,n)=>e?B(`rect`,{x:n+4,y:t+4,width:`1`,height:`1`,fill:`black`},`${t}-${n}`):null))]})}):null,B(`p`,{class:`text-xs leading-5 text-slate-500`,children:[B(`span`,{class:`block`,children:`카메라로 스캔해 Wi-Fi에 연결하세요.`}),B(`span`,{class:`block`,children:`QR 코드에는 비밀번호가 포함됩니다.`})]}),o?B(`p`,{role:`alert`,class:`mt-3 text-sm font-bold text-red-700`,children:o}):null,n?B(`button`,{class:`mt-5 inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl bg-teal-700 px-4 font-extrabold text-white transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200`,onClick:()=>{if(n){s(null);try{let e=(n.matrix.length+8)*8,t=document.createElement(`canvas`);t.width=e,t.height=e;let r=t.getContext(`2d`);if(!r)throw Error(`Canvas is not supported`);Zr(n.matrix,r,8);let i=document.createElement(`a`);i.href=t.toDataURL(`image/png`),i.download=Xr(n.ssid),i.click()}catch{s(`QR 코드 이미지를 저장하지 못했습니다. 다시 시도해 주세요.`)}}},type:`button`,children:[B(ut,{class:`size-5`}),`QR 코드 다운로드`]}):null,B(`button`,{class:`mt-2 min-h-11 w-full rounded-xl border border-slate-300 bg-white px-4 font-extrabold text-slate-700 transition hover:bg-slate-50`,onClick:t,type:`button`,children:`닫기`})]})})}function $r({guest:e,busy:t,saving:n,onUpdate:r,onLoadQr:i}){let[a,o]=R(!1),[s,c]=R(!1),[l,u]=R(e.ssid),[d,f]=R(``),[p,m]=R(e.enabled),[h,g]=R(null);if(z(()=>{u(e.ssid),m(e.enabled),f(``),g(null)},[e]),!e.supported)return B(`section`,{class:`mt-5 rounded-2xl border border-slate-200 bg-white p-5 sm:p-6`,children:[B(`h2`,{class:`m-0 text-lg font-extrabold text-slate-900`,children:`게스트 Wi-Fi`}),B(`p`,{class:`mt-2 mb-0 text-sm text-slate-600`,children:`2.4GHz 기본 Wi-Fi 장치를 찾지 못해 게스트 Wi-Fi를 사용할 수 없습니다.`})]});let _=l.trim()!==e.ssid||p!==e.enabled||d.length>0,v=t||_||!e.enabled||!e.passwordConfigured,y=async t=>{t.preventDefault();let n=l.trim(),i=new TextEncoder().encode(n).length;i<1||i>32?g(`Wi-Fi 이름은 UTF-8 기준 1~32바이트로 입력해 주세요.`):d&&!(d.length>=8&&d.length<=63||/^[0-9a-fA-F]{64}$/.test(d))?g(`비밀번호는 8~63자 또는 64자리 16진수여야 합니다.`):p&&!e.passwordConfigured&&!d?g(`게스트 전용 비밀번호를 입력해 주세요.`):window.confirm(`게스트 Wi-Fi 설정을 적용하면 무선 연결이 잠시 끊어질 수 있습니다. 계속하시겠습니까?`)&&(g(null),await r({ssid:n,enabled:p,password:d})&&f(``))};return B(b,{children:[B(`form`,{"aria-label":`게스트 Wi-Fi 설정`,class:`mt-5 rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void y(e),children:[B(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between`,children:[B(`button`,{"aria-controls":`ssh-guest-settings`,"aria-expanded":a,"aria-label":`게스트 Wi-Fi 설정 ${a?`접기`:`펼치기`}`,class:`flex min-w-0 flex-1 items-start gap-3 rounded-xl text-left focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:()=>o(e=>!e),type:`button`,children:[B(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:B(Ge,{class:`size-6`})}),B(`span`,{class:`min-w-0 flex-1`,children:[B(`span`,{class:`block text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`2.4 GHz · 분리 네트워크`}),B(`span`,{class:`mt-2 block text-xl font-extrabold tracking-tight text-slate-950`,children:`게스트 Wi-Fi`}),B(`span`,{class:`mt-2 block break-all text-sm text-slate-600`,children:e.ssid})]}),B(wt,{class:`mt-3 size-5 shrink-0 text-slate-500 transition-transform ${a?`rotate-180`:``}`})]}),B(`div`,{class:`flex flex-wrap items-center gap-2 sm:justify-end`,children:[_&&B(`span`,{"aria-live":`polite`,class:`inline-flex items-center gap-1 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,children:[B(U,{class:`size-3.5`}),`저장되지 않음`]}),B(`button`,{"aria-label":`게스트 Wi-Fi QR 코드 보기`,class:`inline-flex min-h-10 items-center gap-2 rounded-xl border border-slate-300 bg-white px-3.5 py-2 text-sm font-extrabold text-slate-800 transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:v,onClick:()=>c(!0),title:e.enabled?void 0:`게스트 Wi-Fi를 켜고 저장하면 QR 코드를 사용할 수 있습니다.`,type:`button`,children:[B(rt,{class:`size-4 shrink-0`}),`QR 코드 보기`]}),B(`span`,{class:`rounded-full px-3 py-1.5 text-xs font-extrabold ${e.enabled?`bg-emerald-50 text-emerald-700`:`bg-slate-100 text-slate-600`}`,children:e.enabled?`사용 중`:`꺼짐`})]})]}),B(`div`,{class:a?``:`hidden`,id:`ssh-guest-settings`,children:[B(`p`,{class:`mt-5 mb-0 text-sm leading-6 text-slate-600`,children:`방문자는 인터넷만 이용하며 내부 네트워크와 공유기 관리 화면에는 접근할 수 없습니다.`}),B(`div`,{class:`mt-5 grid gap-5 lg:grid-cols-2`,children:[B(`label`,{class:`block`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`게스트 Wi-Fi 이름 (SSID)`}),B(`input`,{autocomplete:`off`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 outline-none focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:opacity-60`,disabled:t,maxLength:32,onInput:e=>u(e.currentTarget.value),value:l})]}),B(`label`,{class:`block`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`게스트 Wi-Fi 비밀번호`}),B(`input`,{autocomplete:`new-password`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 outline-none focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:opacity-60`,disabled:t,onInput:e=>f(e.currentTarget.value),placeholder:e.passwordConfigured?`비워 두면 기존 비밀번호 유지`:`8자 이상의 별도 비밀번호 입력`,type:`password`,value:d}),B(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`WPA2/WPA3 혼합 · 기본 Wi-Fi와 다른 비밀번호를 권장합니다.`})]})]}),B(`div`,{class:`mt-5 rounded-xl bg-slate-50 px-4 py-3 text-sm leading-6 text-slate-700`,children:[`내부망 접근 차단 · 게스트 기기 간 통신 차단 · SafeShield DNS 사용`,e.subnet&&B(`span`,{class:`block text-xs text-slate-500`,children:[`게스트 게이트웨이: `,e.subnet]})]}),B(`div`,{class:`mt-5 flex flex-col gap-4 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[B(`label`,{class:`inline-flex min-h-11 items-center gap-3 text-sm font-extrabold text-slate-800`,children:[B(`input`,{checked:p,class:`size-5 accent-teal-700`,disabled:t,onChange:e=>m(e.currentTarget.checked),type:`checkbox`}),`게스트 Wi-Fi 사용`]}),B(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:opacity-60 sm:w-auto`,disabled:t||!_,type:`submit`,children:[B(_t,{class:`size-5 ${n?`animate-pulse`:``}`}),n?`적용 중`:`설정 저장`]})]}),h&&B(`p`,{class:`mt-4 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:h})]})]}),s&&B(Qr,{load:i,onClose:()=>c(!1)})]})}var ei=[{value:`sae-mixed`,label:`WPA2/WPA3 혼합 (권장)`},{value:`sae`,label:`WPA3-Personal`},{value:`psk2`,label:`WPA2-Personal`},{value:`none`,label:`암호화 없음`}];function ti(e){switch(e.security){case`sae-mixed`:return`WPA2/WPA3 혼합`;case`sae`:return`WPA3-Personal`;case`psk2`:return`WPA2-Personal`;case`none`:return`암호화 없음`;default:return`고급 설정 (${e.securityRaw})`}}function ni(e){return e.length>=8&&e.length<=63||/^[0-9a-fA-F]{64}$/.test(e)}function ri({network:e,busy:t,saving:n,onUpdate:r,onLoadQr:i}){let[a,o]=R(e.ssid),[s,c]=R(e.enabled),[l,u]=R(e.security===`custom`?`keep`:e.security),[d,f]=R(``),[p,m]=R(!1),h=Ee(()=>i(e.section),[i,e.section]),[g,_]=R(null);z(()=>{o(e.ssid),c(e.enabled),u(e.security===`custom`?`keep`:e.security),f(``),_(null)},[e]);let v=e.security===`custom`&&l===`keep`,y=l===`psk2`||l===`sae-mixed`||l===`sae`,b=e.security===`custom`?`keep`:e.security,x=a.trim()!==e.ssid||s!==e.enabled||l!==b||d.length>0,S=t||x||e.security===`custom`||!e.enabled||e.security!==`none`&&!e.passwordConfigured,C=[...e.security===`custom`?[{value:`keep`,label:`현재 고급 설정 유지 (${e.securityRaw})`}]:[],...ei],w=async t=>{t.preventDefault();let n=a.trim(),i=new TextEncoder().encode(n).length;i<1||i>32?_(`SSID는 UTF-8 기준 1~32바이트로 입력해 주세요.`):d&&!ni(d)?_(`비밀번호는 8~63자 또는 64자리 16진수여야 합니다.`):y&&!e.passwordConfigured&&d.length===0?_(`보안 Wi-Fi를 사용하려면 비밀번호를 입력해 주세요.`):window.confirm(`Wi-Fi 설정을 적용하면 현재 무선 연결이 잠시 끊어질 수 있습니다. 계속하시겠습니까?`)&&(_(null),await r({section:e.section,ssid:n,security:l,password:d,enabled:s})&&f(``))};return B(`form`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void w(e),children:[B(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between`,children:[B(`div`,{class:`flex min-w-0 items-start gap-3`,children:[B(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:B(Ge,{class:`size-6`})}),B(`div`,{class:`min-w-0`,children:[B(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:e.bandLabel}),B(`h2`,{class:`mt-2 mb-0 break-words text-xl font-extrabold tracking-tight text-slate-950`,children:e.ssid||`이름 없는 Wi-Fi`}),B(`p`,{class:`mt-2 mb-0 text-sm text-slate-600`,children:[`채널 `,e.channel??`자동`,` · 연결 기기 `,e.clientCount,`대`]})]})]}),B(`div`,{class:`flex flex-wrap items-center gap-2 sm:justify-end`,children:[x?B(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[B(U,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]}):null,B(`button`,{"aria-label":`${e.bandLabel} Wi-Fi QR 코드 보기`,class:`inline-flex min-h-10 items-center gap-2 rounded-xl border border-slate-300 bg-white px-3.5 py-2 text-sm font-extrabold text-slate-800 shadow-sm transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:S,onClick:()=>m(!0),type:`button`,children:[B(rt,{class:`size-4 shrink-0`}),`QR 코드 보기`]}),B(`span`,{class:`inline-flex w-fit items-center gap-2 rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${e.runtimeUp?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}`,children:[B(`span`,{class:`size-2 rounded-full ${e.runtimeUp?`bg-emerald-500`:`bg-slate-400`}`}),e.runtimeUp?`동작 중`:e.enabled?`시작 대기`:`꺼짐`]})]})]}),B(`div`,{class:`mt-6 grid gap-5 lg:grid-cols-2`,children:[B(`label`,{class:`block`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`Wi-Fi 이름 (SSID)`}),B(`input`,{autocomplete:`off`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:t,maxLength:32,onInput:e=>o(e.currentTarget.value),value:a})]}),B(`div`,{class:`block`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`보안 방식`}),B(hr,{ariaLabel:`${e.bandLabel} Wi-Fi 보안 방식`,className:`mt-2`,disabled:t,id:`wifi-security-${e.section}`,onChange:e=>{let t=e;u(t),(t===`none`||t===`keep`)&&f(``)},options:C,value:l,variant:`emphasized`}),B(`span`,{class:`mt-2 block text-xs text-slate-500`,children:[`현재: `,ti(e)]})]}),B(`label`,{class:`block lg:col-span-2`,children:[B(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`새 비밀번호`}),B(`input`,{autocomplete:`new-password`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:t||l===`none`||v,onInput:e=>f(e.currentTarget.value),placeholder:v?`고급 보안 설정은 기존 LuCI에서 변경합니다`:e.passwordConfigured?`비워 두면 기존 비밀번호를 유지합니다`:`8자 이상의 비밀번호를 입력하세요`,type:`password`,value:d}),B(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`저장된 비밀번호는 일반 설정 조회에 노출되지 않습니다. QR 코드에는 비밀번호가 포함됩니다.`})]})]}),B(`div`,{class:`mt-6 flex flex-col gap-4 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[B(`label`,{class:`inline-flex min-h-11 items-center gap-3 text-sm font-extrabold text-slate-800`,children:[B(`input`,{checked:s,class:`size-5 accent-teal-700`,disabled:t,onChange:e=>c(e.currentTarget.checked),type:`checkbox`}),`이 Wi-Fi 사용`]}),B(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl border-0 bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white shadow-sm transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:t||!x,type:`submit`,children:[B(_t,{class:`size-5 ${n?`animate-pulse`:``}`}),n?`적용 중`:`설정 저장`]})]}),p?B(Qr,{load:h,onClose:()=>m(!1)}):null,g?B(`p`,{class:`mt-4 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:g}):null]})}function ii({feedback:e,onDismiss:t}){return B(`div`,{"aria-live":`polite`,class:`mb-5 flex flex-col gap-3 rounded-2xl border px-4 py-3 text-sm sm:flex-row sm:items-center sm:justify-between ${e.kind===`success`?`border-emerald-200 bg-emerald-50 text-emerald-900`:e.kind===`warning`?`border-amber-200 bg-amber-50 text-amber-900`:`border-red-200 bg-red-50 text-red-900`}`,children:[B(`p`,{class:`m-0 font-bold leading-6`,children:e.message}),B(`button`,{class:`min-h-11 w-full shrink-0 rounded-lg border border-current bg-transparent sm:min-h-9 sm:w-auto px-3 py-1.5 text-xs font-extrabold`,onClick:t,type:`button`,children:`닫기`})]})}function ai({data:e,error:t,feedback:n,loading:r,updatingSection:i,onDismissFeedback:a,onRetry:o,onUpdate:s,onUpdateGuest:c,onLoadQr:l,onLoadGuestQr:u}){return r?B(Bn,{}):t?B(Vn,{message:t,onRetry:o}):e?B(b,{children:[n?B(ii,{feedback:n,onDismiss:a}):null,B(`section`,{class:`mb-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-amber-950 sm:p-6`,children:[B(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-amber-700`,children:`연결 주의`}),B(`h2`,{class:`mt-2 mb-0 text-lg font-extrabold`,children:`Wi-Fi 이름이나 비밀번호를 바꾸면 현재 연결이 끊어집니다`}),B(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-amber-900/80`,children:`변경한 Wi-Fi 이름과 비밀번호로 다시 연결하면 SmartSafeHub를 계속 사용할 수 있습니다. VLAN 등 고급 무선 옵션은 기존 LuCI에서 관리합니다.`})]}),B(W,{eyebrow:`Wireless`,title:`기본 Wi-Fi`,description:`무선 네트워크의 이름, 비밀번호, 보안 방식과 QR 코드를 관리합니다.`}),e.networks.length?B(`section`,{"aria-label":`기본 Wi-Fi 설정`,class:`grid gap-5 xl:grid-cols-2`,children:e.networks.map(e=>B(ri,{busy:i!==null,network:e,onUpdate:s,onLoadQr:l,saving:i===e.section},e.section))}):B(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 text-center shadow-sm shadow-slate-900/5 sm:p-8`,children:[B(Ge,{class:`mx-auto size-10 text-slate-400`}),B(`h2`,{class:`mt-4 mb-0 text-lg font-extrabold text-slate-950`,children:`관리할 기본 Wi-Fi를 찾지 못했습니다`}),B(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:`기존 LuCI에서 AP 모드의 무선 네트워크를 먼저 구성해 주세요.`})]}),e.guest&&B(b,{children:[B(`div`,{role:`separator`,"aria-label":`기본 Wi-Fi와 게스트 Wi-Fi 구분`,class:`mt-5 w-full border-t border-slate-200`}),B(`div`,{class:`mt-5`,children:B(W,{eyebrow:`Guest network`,title:`방문자용 네트워크`,description:`기본 네트워크와 분리된 게스트 Wi-Fi를 관리합니다.`})}),B($r,{guest:e.guest,busy:i!==null,saving:i===`ssh_guest`,onUpdate:c,onLoadQr:u})]}),e.guestError&&B(`section`,{class:`mt-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-sm text-amber-900`,role:`status`,children:[`게스트 Wi-Fi 정보를 불러오지 못했습니다. 패키지를 설치한 직후라면 로그아웃 후 다시 로그인해 주세요.`,B(`button`,{class:`ml-3 underline font-bold`,onClick:o,type:`button`,children:`다시 시도`})]})]}):null}function oi({timestamp:e,fallback:t=`기록 없음`}){let[n,r]=R(()=>Date.now()/1e3),i=typeof e==`number`&&Number.isFinite(e)&&e>0&&e<=864e10;if(z(()=>{if(!i)return;r(Date.now()/1e3);let e=window.setInterval(()=>r(Date.now()/1e3),6e4);return()=>window.clearInterval(e)},[e,i]),!i||e==null)return B(`span`,{children:t});let a=Qt(e);return B(`span`,{class:`inline-flex max-w-full flex-wrap items-center gap-1`,children:[B(`time`,{class:`min-w-0`,dateTime:new Date(e*1e3).toISOString(),title:a,children:en(e,n)}),B(`details`,{class:`group inline-flex max-w-full flex-wrap items-center gap-1 align-middle`,children:[B(`summary`,{"aria-label":`정확한 날짜 및 시간 확인`,class:`inline-flex size-6 cursor-pointer list-none items-center justify-center rounded-full text-slate-400 transition hover:text-teal-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-teal-500 [&::-webkit-details-marker]:hidden`,title:`정확한 날짜 및 시간 확인`,children:B(`svg`,{"aria-hidden":`true`,class:`size-3.5`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,viewBox:`0 0 24 24`,children:[B(`circle`,{cx:`12`,cy:`12`,r:`9`}),B(`path`,{d:`M12 11v5m0-8h.01`,strokeLinecap:`round`})]})}),B(`span`,{class:`hidden max-w-full break-words rounded-md bg-slate-100 px-2 py-1 text-xs font-semibold text-slate-700 group-open:inline-block`,children:a})]})]})}function si(e,t,n,r){let i=t?e.filter(e=>e.includes(t)):e;if(!n)return{filteredRules:i,manualRules:i,managedRules:[]};let a=[],o=[];for(let e of i)(r.has(e)?o:a).push(e);return{filteredRules:i,manualRules:a,managedRules:o}}function ci(e,t){return t?e.filter(e=>e.title.toLowerCase().includes(t)||e.domains.some(e=>e.includes(t))):e}function li(e,t){return e===t||e.length===t.length&&e.every((e,n)=>e===t[n])}function ui(e,t){return e===t||e.length===t.length&&e.every((e,n)=>{let r=t[n];return r!==void 0&&e.id===r.id&&e.title===r.title&&li(e.domains,r.domains)})}function di(e,t){return{domains:li(e.domains,t.domains)?e.domains:t.domains,rules:ui(e.rules,t.rules)?e.rules:t.rules}}var fi=[],pi=[];function mi(e){return e.trim().toLowerCase().replace(/\.+$/,``)}function hi(e){return e.length===0||e.length>253||!e.includes(`.`)||!/^[a-z0-9.-]+$/.test(e)?!1:e.split(`.`).every(e=>e.length>0&&e.length<=63&&/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(e))}var gi=Qn(function({action:e,kind:t,onAddRule:n,onDeleteRule:r,rules:i,recommendedDomainSet:a,recommendedKnown:o,recommendedRules:s,onRequestRevoke:c,revokeBusy:l}){let[u,d]=R(``),[f,p]=R(``),[m,h]=R(null),[g,_]=R(!0),[v,y]=R(null),b=t===`allow`,x=e!==null,S=Te(()=>f.trim().toLowerCase(),[f]),C=S.length>0,{filteredRules:w,manualRules:T,managedRules:E}=Te(()=>si(i,S,b&&o,a),[i,S,b,o,a]),D=Te(()=>b?ci(s,S):[],[b,s,S]),O=C||(v??(s.length||E.length)<=3),k=C||g;async function A(e){e.preventDefault();let r=mi(u);hi(r)?(h(null),await n(t,r,()=>{d(e=>mi(e)===r?``:e)})):h(`example.com 형식의 도메인을 입력해 주세요. URL, IP 주소, 와일드카드는 사용할 수 없습니다.`)}let j=b?{badge:`bg-emerald-100 text-emerald-800`,button:`border-emerald-700 bg-emerald-700 text-white hover:border-emerald-800 hover:bg-emerald-800 focus-visible:ring-emerald-100`,icon:`bg-emerald-50 text-emerald-700`,label:`허용 목록`,description:`직접 허용하거나 웹사이트 추천으로 추가된 도메인을 관리합니다.`,empty:`등록된 허용 도메인이 없습니다.`}:{badge:`bg-red-100 text-red-800`,button:`border-red-700 bg-red-700 text-white hover:border-red-800 hover:bg-red-800 focus-visible:ring-red-100`,icon:`bg-red-50 text-red-700`,label:`차단 목록`,description:`SafeShield 기본 목록에 없더라도 직접 차단할 도메인을 등록합니다.`,empty:`등록된 차단 도메인이 없습니다.`};function M(n){let i=b&&o&&a.has(n),s=!b||o?i?`추천 규칙`:`직접 추가`:null,c=e?.operation===`delete`&&e.action===t&&e.domain===n;return B(`li`,{class:`flex min-w-0 items-center justify-between gap-3 px-3.5 py-3`,children:[B(`div`,{class:`flex min-w-0 flex-1 flex-wrap items-center gap-2`,children:B(`code`,{class:`min-w-0 break-all font-mono text-sm font-semibold text-slate-800`,children:n})}),i?B(`span`,{class:`shrink-0 rounded-full bg-teal-50 px-2.5 py-1 text-[11px] font-bold text-teal-800`,title:`추천 규칙의 적용과 해제는 웹사이트에서 관리합니다.`,children:`웹사이트 관리`}):B(`button`,{"aria-label":`${n} ${j.label}에서 삭제`,class:`inline-flex size-9 shrink-0 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-500 transition hover:border-red-200 hover:bg-red-50 hover:text-red-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-red-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:x||i,onClick:()=>void r(t,n),title:s===`직접 추가`?`직접 추가한 규칙 삭제`:`삭제`,type:`button`,children:B(yt,{class:`size-4 ${c?`animate-pulse`:``}`})})]},n)}return B(`article`,{class:`min-w-0 overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm shadow-slate-900/5`,children:[B(`div`,{class:`border-b border-slate-200 p-4 sm:p-6`,children:[B(`div`,{class:`flex min-w-0 items-start gap-3`,children:[B(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl ${j.icon}`,children:B(b?_t:We,{class:`size-6`})}),B(`div`,{class:`min-w-0`,children:[B(`div`,{class:`flex flex-wrap items-center gap-2`,children:[B(`h2`,{class:`m-0 text-xl font-extrabold tracking-tight text-slate-950`,children:j.label}),B(`span`,{class:`rounded-full px-2.5 py-1 text-xs font-extrabold ${j.badge}`,children:i.length})]}),B(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:j.description})]})]}),B(`form`,{class:`mt-5`,onSubmit:A,children:[B(`label`,{class:`block text-xs font-extrabold text-slate-600`,for:`${t}-domain`,children:`새 도메인`}),B(`div`,{class:`mt-2 flex flex-col gap-2 sm:flex-row`,children:[B(`input`,{"aria-describedby":m?`${t}-domain-error`:void 0,"aria-invalid":m?!0:void 0,autocomplete:`off`,class:`min-h-11 min-w-0 flex-1 rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:x,id:`${t}-domain`,onInput:e=>d(e.currentTarget.value),placeholder:`example.com`,spellcheck:!1,type:`text`,value:u}),B(`button`,{class:`inline-flex min-h-11 w-full shrink-0 items-center justify-center gap-2 rounded-xl border px-4 py-2.5 text-sm font-extrabold transition focus:outline-none focus-visible:ring-4 disabled:cursor-not-allowed disabled:opacity-50 sm:w-auto ${j.button}`,disabled:x||u.trim().length===0,type:`submit`,children:[B(vt,{class:`size-4`}),e?.operation===`add`&&e.action===t?`추가 중…`:`추가`]})]}),m?B(`p`,{class:`mt-2 mb-0 text-xs font-semibold leading-5 text-red-700`,id:`${t}-domain-error`,children:m}):null]})]}),B(`div`,{class:`p-4 sm:p-6`,children:[B(`label`,{class:`relative block`,for:`${t}-search`,children:[B(`span`,{class:`sr-only`,children:[j.label,` 검색`]}),B(`span`,{class:`pointer-events-none absolute inset-y-0 left-0 flex w-11 items-center justify-center text-slate-400`,children:B(bt,{class:`size-4`})}),B(`input`,{class:`min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 py-2.5 pr-4 pl-11 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100`,id:`${t}-search`,onInput:e=>p(e.currentTarget.value),placeholder:`${j.label} 검색`,type:`search`,value:f})]}),b&&o?B(`div`,{class:`mt-4 overflow-hidden rounded-xl border border-slate-200`,children:[B(`section`,{"aria-label":`직접 추가한 허용 규칙`,children:[B(`button`,{"aria-controls":`allow-manual-domains`,"aria-expanded":k,class:`flex min-h-14 w-full items-center justify-between gap-3 ssh-rule-group-toggle bg-slate-50 px-4 py-3 text-left focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>_(!k),type:`button`,children:[B(`span`,{class:`min-w-0 text-sm font-extrabold text-slate-800`,children:[`직접 추가한 규칙 `,B(`span`,{class:`ml-1 rounded-full bg-white px-2 py-0.5 text-xs font-bold text-slate-600`,children:[T.length,C?`개 검색됨`:`개`]})]}),B(`span`,{"aria-hidden":`true`,class:`shrink-0 text-sm font-bold text-slate-500`,children:k?`접기 −`:`펼치기 +`})]}),B(`div`,{hidden:!k,id:`allow-manual-domains`,children:T.length?B(`ul`,{class:`m-0 max-h-[20rem] list-none divide-y divide-slate-200 overflow-y-auto p-0`,children:T.map(M)}):B(`p`,{class:`m-0 px-4 py-5 text-sm text-slate-500`,children:C?`검색 결과가 없습니다.`:`직접 추가한 허용 도메인이 없습니다.`})})]}),B(`section`,{"aria-label":`웹사이트 추천 규칙`,class:`border-t border-slate-200`,children:[B(`button`,{"aria-controls":`allow-recommended-domains`,"aria-expanded":O,class:`flex min-h-14 w-full items-center justify-between gap-3 ssh-rule-group-toggle bg-slate-50 px-4 py-3 text-left focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>y(!O),type:`button`,children:[B(`span`,{class:`min-w-0 text-sm font-extrabold text-slate-800`,children:[`추천 규칙 `,B(`span`,{class:`ml-1 rounded-full bg-white px-2 py-0.5 text-xs font-bold text-teal-800`,children:[!C&&s.length?s.length:E.length,C?`개 검색됨`:`개`]})]}),B(`span`,{"aria-hidden":`true`,class:`shrink-0 text-sm font-bold text-slate-500`,children:O?`접기 −`:`펼치기 +`})]}),B(`div`,{hidden:!O,id:`allow-recommended-domains`,children:[D.length?B(`ul`,{class:`m-0 max-h-[22rem] list-none divide-y divide-slate-200 overflow-y-auto p-0`,children:D.map(e=>B(`li`,{class:`flex min-w-0 flex-wrap items-center justify-between gap-3 px-3.5 py-3`,children:[B(`div`,{class:`min-w-0 flex-1`,children:[B(`strong`,{class:`block break-words text-sm text-slate-900`,children:e.title}),B(`div`,{class:`mt-1 flex flex-wrap gap-1.5`,children:e.domains.map(e=>B(`code`,{class:`break-all text-xs text-slate-600`,children:e},e))})]}),c?B(`button`,{class:`shrink-0 rounded-lg border border-red-200 px-3 py-2 text-xs font-bold text-red-700 hover:bg-red-50 disabled:opacity-50`,disabled:l||x,onClick:()=>c(e),type:`button`,children:`적용 해제`}):B(`span`,{class:`text-xs text-slate-500`,children:`웹사이트 관리`})]},e.id))}):E.length?B(`ul`,{class:`m-0 max-h-[20rem] list-none divide-y divide-slate-200 overflow-y-auto p-0`,children:E.map(M)}):B(`p`,{class:`m-0 px-4 py-5 text-sm text-slate-500`,children:C?`검색 결과가 없습니다.`:`추천으로 추가된 허용 도메인이 없습니다.`}),C?null:B(`p`,{class:`m-0 border-t border-slate-100 px-4 py-3 text-xs leading-5 text-slate-500`,children:`추천 규칙은 이 공유기에서 적용 해제할 수 있습니다. 새 규칙의 적용은 SmartSafeHub 웹사이트에서 관리해 주세요.`})]})]})]}):B(`div`,{class:`mt-4 max-h-[28rem] overflow-y-auto rounded-xl border border-slate-200`,children:w.length?B(`ul`,{class:`m-0 list-none divide-y divide-slate-200 p-0`,children:w.map(M)}):B(`div`,{class:`px-5 py-10 text-center`,children:[B(xt,{class:`mx-auto size-8 text-slate-300`}),B(`p`,{class:`mt-3 mb-0 text-sm font-bold text-slate-600`,children:C?`검색 결과가 없습니다.`:j.empty})]})})]})]})});function _i({action:e,data:t,error:n,feedback:r,loading:i,onAddRule:a,onDeleteRule:o,onDismissFeedback:s,onRetry:c,onLoadRecommendedRulesStatus:l,onSyncRecommendedRules:u,onRevokeRecommendedRule:d}){let[f,p]=R(null),[m,h]=R(!1),[g,_]=R(!1),[v,y]=R(null),[x,S]=R(!1),[C,w]=R(!1),[T,E]=R(!1),D=we(null),O=we(null),k=we(null),A=we(c);A.current=c;let[j,M]=R(null),[N,P]=R(null),F=f?.domains??fi,ee=f?.rules??pi,te=Te(()=>new Set(F),[F]),ne=Ee(e=>{p(t=>{if(!t)return e;let{domains:n,rules:r}=di(t,e);return{...e,domains:n,rules:r}}),h(!0);let t=JSON.stringify([e.revision,e.domains]),n=!1;return e.syncStatus===`confirmed`&&k.current!==t&&(O.current!==null&&(A.current(),n=!0),k.current=t),O.current=t,D.current!==null&&e.revokeOperation?.phase===`failed`&&e.revokeOperation.argument===String(D.current)&&(D.current=null,w(!1),E(!1),P(`추천 규칙 적용 해제를 완료하지 못했습니다. 연결 상태를 확인하고 다시 시도해 주세요.`)),e.syncStatus===`confirmed`&&D.current===null&&e.revokeOperation?.phase!==`failed`&&P(null),D.current!==null&&e.syncStatus===`confirmed`&&!e.rules.some(e=>e.id===D.current)&&(D.current=null,w(!1),E(!1),P(null),M(`추천 규칙 적용 해제를 확인했습니다.`)),n},[]);z(()=>{if(!l)return;let e=l,t=!0,n=!1;function r(){n||g||x||(n=!0,e().then(e=>{t&&ne(e)}).catch(()=>{}).finally(()=>{n=!1}))}r();let i=window.setInterval(r,15e3),a=()=>r(),o=()=>{document.hidden||r()};return window.addEventListener(`focus`,a),document.addEventListener(`visibilitychange`,o),()=>{t=!1,window.clearInterval(i),window.removeEventListener(`focus`,a),document.removeEventListener(`visibilitychange`,o)}},[l,g,x,ne]),z(()=>{if(!C)return;let e=window.setTimeout(()=>E(!0),6e4);return()=>window.clearTimeout(e)},[C]);async function re(){if(!(!u||g||x)){_(!0),P(null),M(null);try{let e=await u(),t=ne(e);M(e.syncStatus===`confirmed`?`서버에서 규칙을 가져와 SafeShield 허용 목록을 확인했습니다.`:`추천 규칙 상태를 확인 중입니다. 진행 결과는 자동으로 갱신됩니다.`),e.syncStatus===`confirmed`&&!t&&c()}catch{P(`추천 규칙을 동기화하지 못했습니다. 서버 연결 및 기기 등록 상태를 확인해 주세요.`)}finally{_(!1)}}}async function ie(){if(!v||x||!d)return;let e=v.id;D.current=e,S(!0),w(!0),E(!1),P(null),M(null);try{let t=await d(e);ne(t),y(null),D.current!==null&&M(`적용 해제 요청을 처리했습니다. 공유기의 허용 목록을 확인하고 있습니다.`)}catch{y(null),P(`적용 해제 결과를 아직 확인하지 못했습니다. 공유기의 상태를 자동으로 다시 확인합니다.`);try{let e=await l?.();e&&ne(e)}catch{}}finally{S(!1)}}let ae=f?.syncStage,oe=f?.syncStatus===`pending`,se=f?.syncStatus===`delayed`,ce=f?.syncStatus===`failed`,le=ae===`server_sync`?`서버 동기화 중`:ae===`safeshield_refreshing`?`SafeShield 갱신 중`:ae===`applying`?`추천 규칙 적용 중`:ae===`verifying`?`허용 목록 확인 중`:se?`재확인 지연`:ce?`동기화 실패`:oe?`동기화 대기`:`허용 목록 확인`,I=ae===`safeshield_refreshing`&&oe?`SafeShield가 보호 목록을 갱신하고 있습니다. 갱신이 끝나면 추천 규칙을 자동으로 다시 확인합니다.`:ae===`applying`&&oe?`추천 규칙을 SafeShield 허용 목록에 반영하고 있습니다.`:ae===`verifying`&&oe?`SafeShield 허용 목록에서 추천 규칙 반영 결과를 확인하고 있습니다.`:ae===`server_sync`&&oe?`SmartSafeHub 서버에서 최신 추천 규칙을 확인하고 있습니다.`:se?`서버 응답이 지연되고 있습니다. 이미 확인한 허용 규칙은 유지되며 자동으로 다시 시도합니다.`:ce?f?.syncReason===`auth_rejected`?`SmartSafeHub 기기 인증이 거부되었습니다. 공유기 계정 연결 상태를 확인해 주세요.`:f?.syncReason===`api_rejected`?`서버가 추천 규칙 요청을 거부했습니다. Hub API 배포 상태를 확인해 주세요.`:f?.syncReason===`invalid_response`?`서버 응답을 확인할 수 없습니다. 규칙은 유지되며 다음 동기화에서 다시 확인합니다.`:`추천 규칙 반영을 완료하지 못했습니다. 다음 자동 동기화에서 다시 시도합니다.`:oe?`추천 규칙의 적용 결과를 기다리고 있습니다.`:null,ue=C&&D.current!==null?{tone:`amber`,label:T?`적용 해제 처리 지연`:`적용 해제 확인 중`,description:T?`적용 해제 확인이 지연되고 있습니다. SafeShield 갱신 중이라면 완료 후 자동으로 재확인합니다.`:I??`적용 해제 상태를 확인하고 있습니다. 확인되면 목록과 상태가 자동 갱신됩니다.`}:oe||se||ce?{tone:ce?`red`:`amber`,label:le,description:I??``}:N?{tone:`red`,label:`상태 확인 필요`,description:N}:f?.syncWarning?{tone:`amber`,label:`서버 재확인 지연`,description:`이미 확인한 허용 규칙은 유지되며 자동으로 다시 시도합니다.`}:j?{tone:`green`,label:`허용 목록 확인`,description:j}:null;return i&&!t?B(Bn,{}):n&&!t?B(Vn,{message:n,onRetry:c}):t?B(b,{children:[v?B(`div`,{class:`fixed inset-0 z-50 flex items-center justify-center bg-slate-950/70 p-4`,role:`presentation`,onClick:()=>{x||y(null)},children:B(`section`,{"aria-labelledby":`recommended-revoke-title`,"aria-modal":`true`,class:`w-full max-w-md rounded-2xl border border-slate-200 bg-white p-5 shadow-xl`,onClick:e=>e.stopPropagation(),role:`dialog`,children:[B(`h2`,{class:`m-0 text-lg font-extrabold text-slate-950`,id:`recommended-revoke-title`,children:`추천 규칙 적용 해제`}),B(`p`,{class:`mt-3 text-sm text-slate-700`,children:[B(`strong`,{children:v.title}),` 규칙을 이 공유기에서 해제할까요?`]}),B(`p`,{class:`mt-2 text-xs leading-5 text-slate-600`,children:[`포함된 도메인 `,v.domains.length,`개를 다시 확인합니다. 직접 추가한 허용 규칙과 다른 추천 규칙에 필요한 도메인은 유지됩니다.`]}),B(`div`,{class:`mt-5 flex justify-end gap-2`,children:[B(`button`,{class:`rounded-lg border border-slate-200 px-4 py-2 text-sm font-bold text-slate-700 disabled:cursor-wait disabled:opacity-50`,disabled:x,onClick:()=>y(null),type:`button`,children:`취소`}),B(`button`,{class:`inline-flex min-w-24 items-center justify-center gap-2 rounded-lg bg-red-700 px-4 py-2 text-sm font-bold text-white transition hover:bg-red-800 disabled:cursor-progress disabled:bg-red-700 disabled:opacity-80`,"aria-busy":x,disabled:x,onClick:()=>void ie(),type:`button`,children:[x?B(`svg`,{class:`size-4 animate-spin`,"aria-hidden":`true`,viewBox:`0 0 24 24`,fill:`none`,children:[B(`circle`,{cx:`12`,cy:`12`,r:`9`,stroke:`currentColor`,"stroke-width":`3`,opacity:`0.25`}),B(`path`,{d:`M21 12a9 9 0 0 0-9-9`,stroke:`currentColor`,"stroke-width":`3`,"stroke-linecap":`round`})]}):null,B(`span`,{role:`status`,children:x?`해제 중…`:`적용 해제`})]})]})]})}):null,B(W,{eyebrow:`Local overrides`,title:`사용자 도메인 규칙`,description:`허용 목록은 오탐을 해제하고, 차단 목록은 원하는 도메인을 SafeShield 보호 목록에 추가합니다.`}),B(`section`,{"aria-label":`규칙 개수 요약`,class:`min-w-0`,children:B(`dl`,{class:`m-0 grid grid-cols-1 gap-3 sm:grid-cols-3`,children:[B(`div`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white px-5 py-4 shadow-sm shadow-slate-900/5`,children:[B(`dt`,{class:`text-sm font-extrabold text-emerald-700`,children:`허용 도메인`}),B(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight text-slate-950`,children:[t.counts.allow,B(`span`,{class:`ml-1 text-sm font-bold text-slate-500`,children:`개`})]}),B(`p`,{class:`mt-1 mb-0 text-xs text-slate-500`,children:`차단하지 않도록 등록한 도메인`})]}),B(`div`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white px-5 py-4 shadow-sm shadow-slate-900/5`,children:[B(`dt`,{class:`text-sm font-extrabold text-red-700`,children:`차단 도메인`}),B(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight text-slate-950`,children:[t.counts.block,B(`span`,{class:`ml-1 text-sm font-bold text-slate-500`,children:`개`})]}),B(`p`,{class:`mt-1 mb-0 text-xs text-slate-500`,children:`추가로 차단하도록 등록한 도메인`})]}),B(`div`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white px-5 py-4 shadow-sm shadow-slate-900/5`,children:[B(`dt`,{class:`text-sm font-extrabold text-slate-600`,children:`전체 등록 규칙`}),B(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight text-slate-950`,children:[t.counts.total,B(`span`,{class:`ml-1 text-sm font-bold text-slate-500`,children:`개`})]}),B(`p`,{class:`mt-1 mb-0 text-xs text-slate-500`,children:`허용 및 차단 규칙의 합계`})]})]})}),B(`div`,{class:`mt-7`,children:B(W,{eyebrow:`Recommendations`,title:`추천 사용자 규칙`,description:`웹사이트에서 선택한 권장 허용 규칙의 동기화 상태를 확인하고 관리합니다.`})}),B(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,"aria-label":`추천 사용자 규칙`,children:[B(`div`,{class:`flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between`,children:[B(`div`,{class:`min-w-0 flex-1`,children:[B(`div`,{class:`flex flex-wrap items-center gap-2`,children:[B(`span`,{class:`grid size-8 place-items-center rounded-lg bg-teal-50 text-teal-700`,children:B(_t,{class:`size-4`})}),B(`h3`,{class:`m-0 text-base font-extrabold text-slate-950`,children:`동기화 상태`}),l?B(`span`,{"aria-live":`polite`,class:`rounded-full px-2.5 py-1 text-xs font-bold ${f?.syncStatus===`confirmed`?`bg-emerald-100 text-emerald-800`:f?.syncStatus===`failed`?`bg-red-100 text-red-800`:`bg-amber-100 text-amber-800`}`,children:f?.syncStatus===`confirmed`?`허용 목록 확인`:le}):null]}),B(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:`웹사이트에서 선택한 허용 규칙을 약 30초마다 확인합니다. 적용 해제는 이 공유기에서도 할 수 있습니다.`}),B(`div`,{class:`mt-2 flex flex-wrap items-center gap-x-4 gap-y-1 text-xs font-semibold text-slate-600`,children:[B(`span`,{children:[`추천으로 추가 `,B(`strong`,{class:`text-teal-800`,children:[m?F.length:`—`,`개 도메인`]})]}),f?.syncStatus===`confirmed`?B(`span`,{children:[`허용 확인 `,B(`strong`,{class:`text-emerald-800`,children:[f.confirmedDomains.length,`개`]})]}):null,f?.lastCheckedAt?B(`span`,{children:[f.syncWarning?`최근 재확인 시도`:`최근 확인`,`: `,B(oi,{timestamp:f.lastCheckedAt})]}):null]})]}),B(`div`,{class:`flex w-full flex-wrap gap-2 sm:w-auto lg:shrink-0`,children:[u?B(`button`,{class:`inline-flex min-h-10 flex-1 items-center justify-center rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-800 transition hover:bg-slate-50 disabled:cursor-wait disabled:opacity-60 sm:flex-none`,disabled:g,onClick:()=>void re(),type:`button`,children:g?`동기화 중…`:`지금 동기화`}):null,B(`a`,{class:`inline-flex min-h-10 flex-1 items-center justify-center rounded-xl border border-teal-700 bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 sm:flex-none`,href:`https://www.smartsafehub.com/dashboard/recommended-rules/`,target:`_blank`,rel:`noopener noreferrer`,children:`추천 규칙 보기 ↗`})]})]}),ue?B(`div`,{"aria-live":`polite`,class:`mt-3 flex items-start gap-2 rounded-xl px-3 py-2.5 text-sm ${ue.tone===`red`?`bg-red-50 text-red-800`:ue.tone===`green`?`bg-emerald-50 text-emerald-800`:`bg-amber-50 text-amber-800`}`,role:`status`,children:[B(`span`,{"aria-hidden":`true`,class:`mt-1 size-2 shrink-0 rounded-full ${ue.tone===`red`?`bg-red-500`:ue.tone===`green`?`bg-emerald-500`:`bg-amber-500`}`}),B(`div`,{class:`min-w-0`,children:[B(`strong`,{children:ue.label}),B(`p`,{class:`mt-1 mb-0 leading-5`,children:ue.description})]})]}):null,B(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`추천 규칙 동기화는 SafeShield 차단 목록 갱신과 별개입니다. 허용 목록 확인은 DNS 처리나 서비스 재생 성공을 보장하지 않습니다.`})]}),t.applyLocalOverrides?null:B(`section`,{class:`mt-4 flex items-start gap-3 rounded-2xl border border-amber-200 bg-amber-50 p-4`,role:`alert`,children:[B(U,{class:`mt-0.5 size-5 shrink-0 text-amber-700`}),B(`div`,{children:[B(`p`,{class:`m-0 text-sm font-extrabold text-amber-950`,children:`로컬 규칙 적용이 꺼져 있습니다`}),B(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-amber-800`,children:`규칙은 저장되지만 SafeShield의 apply_local_overrides 설정을 켜기 전까지 DNS에 반영되지 않습니다.`})]})]}),t.safeshieldEnabled?null:B(`section`,{class:`mt-4 flex items-start gap-3 rounded-2xl border border-slate-200 bg-slate-100 p-4`,role:`status`,children:[B(We,{class:`mt-0.5 size-5 shrink-0 text-slate-600`}),B(`div`,{children:[B(`p`,{class:`m-0 text-sm font-extrabold text-slate-950`,children:`SafeShield가 비활성화되어 있습니다`}),B(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-600`,children:`규칙을 미리 저장할 수 있으며, SafeShield를 켜고 차단 목록을 갱신하면 적용됩니다.`})]})]}),r?B(`section`,{"aria-live":`polite`,class:`mt-4 flex flex-col items-start gap-3 rounded-2xl border border-teal-200 bg-teal-50 sm:flex-row sm:justify-between p-4`,children:[B(`div`,{class:`flex min-w-0 items-start gap-3`,children:[B(_t,{class:`mt-0.5 size-5 shrink-0 text-teal-700`}),B(`p`,{class:`m-0 text-sm font-semibold leading-6 text-teal-950`,children:r})]}),B(`button`,{class:`shrink-0 rounded-lg border-0 bg-transparent px-2 py-1 text-xs font-extrabold text-teal-800 hover:bg-teal-100`,onClick:s,type:`button`,children:`닫기`})]}):null,n&&t?B(`section`,{"aria-live":`assertive`,class:`mt-4 flex items-start gap-3 rounded-2xl border border-red-200 bg-red-50 p-4`,children:[B(U,{class:`mt-0.5 size-5 shrink-0 text-red-700`}),B(`p`,{class:`m-0 text-sm font-semibold leading-6 text-red-900`,children:n})]}):null,B(`section`,{class:`mt-5 grid gap-5 xl:grid-cols-2`,children:[B(gi,{action:e,kind:`allow`,onAddRule:a,onDeleteRule:o,rules:t.allow,recommendedDomainSet:te,recommendedKnown:m,recommendedRules:ee,...d?{onRequestRevoke:y}:{},revokeBusy:x}),B(gi,{action:e,kind:`block`,onAddRule:a,onDeleteRule:o,rules:t.block,recommendedDomainSet:te,recommendedKnown:m,recommendedRules:ee,revokeBusy:x})]})]}):B(Vn,{message:`사용자 규칙 응답이 비어 있습니다.`,onRetry:c})}function vi(e,t){if(!e||!t)return`unknown`;if(e===t)return`same`;let n=/^(\d+)\.(\d+)\.(\d+)(?:-r(\d+))?$/,r=n.exec(e),i=n.exec(t);if(!r||!i)return`different`;for(let e=1;e<=4;e+=1){let t=BigInt(r[e]||`0`),n=BigInt(i[e]||`0`);if(t>n)return`newer`;if(t=1048576?`${(e/1048576).toFixed(1)} MB`:`${(e/1024).toFixed(1)} KB`}function bi(e){switch(e.phase){case`checking`:return`확인 중`;case`downloading`:return`다운로드 중`;case`verifying`:return`검증 중`;case`ready`:return`설치 준비 완료`;case`flashing`:return`설치 중`;case`error`:return`확인 필요`;default:return e.updateAvailable?`업데이트 가능`:e.lastCheckAt?`최신 상태`:`확인 전`}}function xi(e){return e.phase===`error`?`bg-rose-50 text-rose-700 ring-rose-200`:e.phase===`checking`||e.phase===`downloading`||e.phase===`verifying`||e.phase===`flashing`?`bg-sky-50 text-sky-700 ring-sky-200`:e.phase===`ready`||e.updateAvailable?`bg-amber-50 text-amber-800 ring-amber-200`:e.lastCheckAt?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function Si(e){return e.phase===`checking`||e.phase===`downloading`||e.phase===`verifying`||e.phase===`flashing`?B(H,{class:`size-3.5 animate-spin`}):e.phase===`error`?B(U,{class:`size-3.5`}):e.phase===`ready`||e.updateAvailable?B(ut,{class:`size-3.5`}):e.lastCheckAt?B(_t,{class:`size-3.5`}):B(st,{class:`size-3.5`})}function Ci({checked:e,disabled:t,onChange:n}){return B(`button`,{"aria-checked":e,"aria-label":`현재 설정 유지`,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${e?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:t,onClick:()=>n(!e),role:`switch`,type:`button`,children:B(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${e?`left-6`:`left-1`}`})})}function wi({action:e,actionError:t,data:n,software:r,error:i,loading:a,message:o,reconnecting:s,uploadProgress:c,onCheck:l,onDiscard:u,onDismissFeedback:d,onInstall:f,onPrepare:p,onRetry:m,onUpload:h}){let g=we(null),[_,v]=R(null),[y,x]=R(!0),[S,C]=R(!1);z(()=>{n?.prepared&&x(n.prepared.allowBackup)},[n?.prepared]);let w=e!==null||n?.phase===`checking`||n?.phase===`downloading`||n?.phase===`verifying`||n?.phase===`flashing`,T=n?.phase===`ready`?n.prepared:null,E=e===`check`||n?.phase===`checking`,D=e===`prepare`||n?.phase===`downloading`||n?.phase===`verifying`,O=e===`upload`||e===`validate-upload`,k=n?.release?.bundledSoftware?.smartsafehub??null,A=r?.packages.find(e=>e.name===`luci-app-smartsafehub`)?.installedVersion??null,j=vi(k,A),M=async()=>{_&&await h(_)&&(v(null),g.current&&(g.current.value=``))};return B(`article`,{class:`min-w-0 overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm shadow-slate-900/5`,"data-component":`firmware-update-card`,children:[B(`div`,{class:`p-5 sm:p-6`,children:[B(`div`,{class:`flex flex-col gap-5 lg:flex-row lg:items-start lg:justify-between`,children:[B(`div`,{class:`flex min-w-0 gap-4`,children:[B(`span`,{class:`grid size-12 shrink-0 place-items-center rounded-2xl bg-sky-50 text-sky-700`,children:B(Ge,{class:`size-6`})}),B(`div`,{class:`min-w-0`,children:[B(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-sky-700`,children:`Firmware update`}),B(`h2`,{class:`mt-2 mb-0 text-xl font-black text-slate-950 sm:text-2xl`,children:`펌웨어 업데이트`}),B(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500 lg:whitespace-nowrap`,children:`시스템 펌웨어를 확인하고 설치합니다. 온라인·수동 설치는 안전성 검증 후 진행됩니다.`})]})]}),n?B(`div`,{class:`flex shrink-0 flex-col gap-2 sm:flex-row lg:justify-end`,children:[B(`span`,{class:`inline-flex min-h-11 items-center justify-center gap-1.5 rounded-xl px-3 py-2 text-xs font-extrabold ring-1 ring-inset ${xi(n)}`,children:[Si(n),bi(n)]}),B(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-800 transition hover:bg-slate-50 disabled:cursor-wait disabled:opacity-60`,disabled:w||T!==null,onClick:l,type:`button`,children:[B(H,{class:`size-4 ${E?`animate-spin`:``}`}),E?`확인 중...`:`펌웨어 확인`]}),n.updateAvailable&&!T?B(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl bg-sky-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-sky-800 disabled:cursor-wait disabled:opacity-60`,disabled:w,onClick:p,type:`button`,children:[D?B(H,{class:`size-4 animate-spin`}):B(ut,{class:`size-4`}),D?`준비 중...`:`다운로드 및 검증`]}):null]}):null]}),t||o?B(`div`,{class:`mt-5 flex flex-col gap-3 rounded-xl border px-4 py-3 text-sm font-bold sm:flex-row sm:items-center sm:justify-between ${t?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[B(`span`,{children:t||o}),B(`button`,{class:`shrink-0 self-start rounded-lg px-3 py-1.5 text-xs font-extrabold hover:bg-black/5 sm:self-auto`,onClick:d,type:`button`,children:`닫기`})]}):null,s||n?.phase===`flashing`?B(`div`,{class:`mt-5 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:p-5`,role:`status`,children:B(`div`,{class:`flex gap-3`,children:[B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-amber-700 ring-1 ring-inset ring-amber-200`,children:B(H,{class:`size-5 animate-spin`})}),B(`div`,{children:[B(`strong`,{class:`block text-sm font-black text-amber-950`,children:`펌웨어를 설치하고 재부팅하고 있습니다.`}),B(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-amber-800`,children:`전원을 끄지 마세요. 현재 주소에서 공유기가 다시 응답하면 SmartSafeHub가 자동으로 새로고침됩니다.`})]})]})}):null,i&&!n?B(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 text-sm text-rose-800`,children:[B(`p`,{class:`m-0 font-bold`,children:i}),B(`button`,{class:`mt-3 rounded-lg border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700`,onClick:m,type:`button`,children:`다시 시도`})]}):a&&!n?B(`div`,{class:`mt-5 flex items-center gap-3 rounded-xl bg-slate-50 p-4 text-sm font-bold text-slate-500`,children:[B(H,{class:`size-4 animate-spin`}),`펌웨어 상태를 확인하고 있습니다.`]}):n?B(b,{children:[n.lastError?B(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 sm:p-5`,children:B(`div`,{class:`flex gap-3`,children:[B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-rose-700 ring-1 ring-inset ring-rose-200`,children:B(U,{class:`size-5`})}),B(`div`,{class:`min-w-0 flex-1`,children:[B(`strong`,{class:`block text-sm font-black text-rose-950`,children:`펌웨어 작업을 완료하지 못했습니다.`}),B(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-rose-800`,children:n.lastError.message}),B(`details`,{class:`mt-3 rounded-lg border border-rose-200 bg-white p-3`,children:[B(`summary`,{class:`cursor-pointer text-xs font-extrabold text-rose-800`,children:`상세 정보 보기`}),B(`p`,{class:`mt-2 mb-0 break-all font-mono text-[11px] text-slate-600`,children:n.lastError.code})]})]})]})}):null,n.current.metadataAvailable?null:B(`div`,{class:`mt-5 rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-xs leading-5 text-amber-900`,children:[B(`strong`,{class:`block font-extrabold`,children:`현재 펌웨어의 버전 정보를 완전히 확인할 수 없습니다.`}),B(`span`,{class:`mt-1 block text-amber-800`,children:`새 펌웨어를 설치하면 이후부터 정확한 설치 버전을 자동으로 확인할 수 있습니다.`}),B(`details`,{class:`mt-2`,children:[B(`summary`,{class:`cursor-pointer font-extrabold text-amber-800`,children:`기술 상세 보기`}),B(`p`,{class:`mt-2 mb-0 break-all font-mono text-[11px] leading-5 text-amber-800`,children:`SmartSafeHub build ID metadata is missing. Future images should include /usr/share/smartsafehub/firmware.json.`})]})]}),B(`dl`,{class:`mt-5 grid overflow-hidden rounded-xl border border-slate-200 bg-slate-200 sm:grid-cols-2 xl:grid-cols-4`,children:[B(`div`,{class:`bg-white p-4`,children:[B(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Device`}),B(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black text-slate-950`,children:n.current.deviceCode||n.current.boardName||`미확인`})]}),B(`div`,{class:`bg-white p-4`,children:[B(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Current version`}),B(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black text-slate-950`,children:n.current.releaseVersion||`미확인`}),n.current.buildId?B(`span`,{class:`mt-1 block break-all text-[11px] leading-5 text-slate-400`,children:[`빌드 ID `,n.current.buildId]}):n.current.openwrtVersion?B(`span`,{class:`mt-1 block text-[11px] leading-5 text-slate-400`,children:[`OpenWrt `,n.current.openwrtVersion]}):null]}),B(`div`,{class:`bg-white p-4`,children:[B(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Available version`}),B(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black ${n.updateAvailable?`text-amber-700`:`text-slate-950`}`,children:n.lastCheckAt?n.release?.version?`${n.release.version}${n.updateAvailable?``:` · 최신`}`:n.updateAvailable?`새 펌웨어`:`최신 버전`:`미확인`}),n.release?.buildId?B(`span`,{class:`mt-1 block break-all text-[11px] leading-5 text-slate-400`,children:[`빌드 ID `,n.release.buildId]}):null]}),B(`div`,{class:`bg-white p-4`,children:[B(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Last check`}),B(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-black text-slate-950`,children:B(oi,{fallback:`아직 없음`,timestamp:n.lastCheckAt})})]})]})]}):null,n?.updateAvailable&&n.release?B(`section`,{class:`mt-5 rounded-xl border border-sky-200 bg-sky-50/60 p-4 sm:p-5`,"data-section":`available-firmware`,children:[B(`div`,{class:`flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-4`,children:[B(`div`,{children:[B(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-sky-700`,children:`Available firmware`}),B(`h3`,{class:`mt-2 mb-0 text-lg font-black text-slate-950`,children:`새 펌웨어가 있습니다.`}),B(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:[`펌웨어 `,n.release.version||`미확인`,` · `,yi(n.release.sysupgrade.sizeBytes),` · `,(n.release.channel||n.settings.channel)===`beta`?`Beta`:`Stable`]})]}),B(`div`,{class:`flex shrink-0 flex-wrap items-center justify-start gap-2 sm:justify-end`,children:[B(`span`,{class:`rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-sky-700 ring-1 ring-inset ring-sky-200`,children:n.release.version||`Latest`}),k?B(`span`,{class:`inline-flex items-center gap-1.5 rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-slate-700 ring-1 ring-inset ring-sky-200`,"data-section":`firmware-bundled-software-chip`,children:[B(`span`,{class:`text-[11px] uppercase tracking-[0.12em] text-slate-500`,children:`관리 SW`}),B(`span`,{class:`text-slate-950`,children:k})]}):null]})]}),k?B(`div`,{class:`mt-4 rounded-xl border border-sky-100 bg-white p-4`,"data-section":`firmware-bundled-software`,children:[B(`div`,{class:`flex flex-wrap items-center justify-between gap-2`,children:[B(`span`,{class:`text-xs font-extrabold text-slate-800`,children:`포함된 관리 소프트웨어`}),B(`div`,{class:`flex flex-wrap items-center gap-2`,children:[B(`span`,{class:`text-sm font-black text-slate-950`,children:k}),j===`same`?B(`span`,{class:`rounded-full bg-emerald-50 px-2.5 py-1 text-[11px] font-extrabold text-emerald-700 ring-1 ring-inset ring-emerald-200`,children:`현재 버전과 동일`}):null]})]}),B(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-600`,children:j===`same`?`관리 소프트웨어는 이미 같은 버전입니다. 펌웨어 업데이트는 시스템 구성 요소를 갱신합니다.`:j===`older`?`현재 설치된 관리 소프트웨어(${A})보다 이전 버전이 포함되어 있습니다. 펌웨어 설치 전 버전을 확인해 주세요.`:j===`newer`?`현재 설치된 관리 소프트웨어(${A})보다 새 버전이 포함되어 있습니다.`:A?`현재 설치 버전 ${A} · 펌웨어 포함 버전 ${k}`:`이 펌웨어에 포함된 관리 소프트웨어 버전입니다.`})]}):null,n.release.releaseNotes.length?B(`ul`,{class:`mt-4 mb-0 space-y-2 rounded-xl bg-white p-4 pl-9 text-sm leading-6 text-slate-700 ring-1 ring-inset ring-sky-100`,children:n.release.releaseNotes.map((e,t)=>B(`li`,{children:e},`${t}-${e}`))}):null]}):null,T?B(`section`,{class:`mt-5 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:p-5`,"data-section":`prepared-firmware`,children:B(`div`,{class:`flex gap-4`,children:[B(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-white text-amber-700 ring-1 ring-inset ring-amber-200`,children:B(_t,{class:`size-5`})}),B(`div`,{class:`min-w-0 flex-1`,children:[B(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-amber-700`,children:`Verified image`}),B(`h3`,{class:`mt-2 mb-0 text-lg font-black text-amber-950`,children:`설치할 펌웨어가 준비되었습니다.`}),B(`p`,{class:`mt-2 mb-0 break-all text-sm leading-6 text-amber-900`,children:[T.filename||`firmware.bin`,` · `,yi(T.sizeBytes)]}),T.sha256?B(`p`,{class:`mt-2 mb-0 break-all font-mono text-[11px] leading-5 text-amber-800`,children:[`SHA-256 `,T.sha256]}):null,B(`div`,{class:`mt-5 flex items-start justify-between gap-4 rounded-xl border border-amber-200 bg-white p-4`,children:[B(`div`,{children:[B(`strong`,{class:`block text-sm font-black text-slate-950`,children:`현재 설정 유지`}),B(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:`Wi-Fi, SafeShield, SmartSafeHub 설정을 유지합니다.`}),T.allowBackup?null:B(`span`,{class:`mt-2 block text-xs font-bold text-rose-700`,children:`이 이미지는 설정 유지 업그레이드를 지원하지 않습니다.`})]}),B(Ci,{checked:y,disabled:!T.allowBackup,onChange:x})]}),S?B(`div`,{class:`mt-4 rounded-xl border border-rose-200 bg-rose-50 p-4`,children:[B(`strong`,{class:`block text-sm font-black text-rose-950`,children:`펌웨어 설치를 시작할까요?`}),B(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-rose-800`,children:`설치 중 전원을 끄면 장치가 복구 불가능한 상태가 될 수 있습니다. 이미지 검증은 설치 직전에 다시 수행됩니다.`}),B(`div`,{class:`mt-4 flex flex-wrap justify-end gap-2`,children:[B(`button`,{class:`min-h-10 rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700`,onClick:()=>C(!1),type:`button`,children:`취소`}),B(`button`,{class:`min-h-10 rounded-lg bg-rose-700 px-3 py-2 text-xs font-extrabold text-white`,onClick:()=>{C(!1),f(y)},type:`button`,children:`설치 시작`})]})]}):B(`div`,{class:`mt-4 flex flex-wrap justify-end gap-2`,children:[B(`button`,{class:`min-h-10 rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700`,disabled:e===`discard`,onClick:()=>void u(),type:`button`,children:`파일 삭제`}),B(`button`,{class:`inline-flex min-h-10 items-center gap-2 rounded-lg bg-rose-700 px-4 py-2 text-xs font-extrabold text-white`,onClick:()=>C(!0),type:`button`,children:[B(et,{class:`size-4`}),`펌웨어 설치`]})]})]})]})}):null]}),B(`details`,{class:`group mx-5 mb-5 rounded-xl border border-slate-200 bg-slate-50/70 sm:mx-6 sm:mb-6`,"data-layout":`firmware-card-subsection`,"data-section":`manual-firmware`,children:[B(`summary`,{class:`flex cursor-pointer list-none items-center justify-between gap-4 px-4 py-4 sm:px-5 [&::-webkit-details-marker]:hidden`,children:[B(`div`,{class:`flex min-w-0 items-center gap-3`,children:[B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-slate-600 ring-1 ring-inset ring-slate-200`,children:B(ut,{class:`size-5 rotate-180`})}),B(`div`,{class:`min-w-0`,children:[B(`strong`,{class:`block text-sm font-black text-slate-950`,children:`수동 펌웨어 설치`}),B(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:`펌웨어 파일(.bin)을 직접 업로드하여 검증한 뒤 설치합니다.`})]})]}),B(`span`,{class:`shrink-0 rounded-full bg-white px-3 py-1.5 text-[11px] font-extrabold text-slate-600 ring-1 ring-inset ring-slate-200 group-open:hidden`,children:`열기`}),B(`span`,{class:`hidden shrink-0 rounded-full bg-white px-3 py-1.5 text-[11px] font-extrabold text-slate-600 ring-1 ring-inset ring-slate-200 group-open:inline-flex`,children:`닫기`})]}),B(`div`,{class:`border-t border-slate-200 px-5 pb-5 pt-3 sm:px-6`,children:[B(`p`,{class:`mt-0 mb-4 text-xs leading-5 text-slate-500 lg:whitespace-nowrap`,children:"이 장치에 맞는 Sysupgrade 이미지(.bin)만 사용하세요. 업로드한 파일은 이미지 검증과 `sysupgrade --test`를 모두 통과해야 설치할 수 있으며 강제 설치는 제공하지 않습니다."}),B(`div`,{class:`rounded-xl border border-slate-200 bg-white p-4 sm:p-5`,"data-layout":`firmware-file-picker`,children:[B(`input`,{accept:`.bin,application/octet-stream`,"aria-label":`펌웨어 파일 선택`,class:`sr-only`,disabled:w||T!==null,onChange:e=>v(e.currentTarget.files?.[0]??null),ref:g,type:`file`}),B(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between`,children:[B(`div`,{class:`flex min-w-0 items-center gap-3`,children:[B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-50 text-slate-500 ring-1 ring-inset ring-slate-200`,children:B(ut,{class:`size-5 rotate-180`})}),B(`div`,{class:`min-w-0`,children:[B(`strong`,{class:`block truncate text-sm font-black text-slate-900`,children:_?_.name:`펌웨어 파일을 선택하세요`}),B(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:_?`${yi(_.size)} · Sysupgrade 이미지 (.bin)`:`이 장치에 맞는 Sysupgrade 이미지 (.bin)를 선택합니다.`})]})]}),B(`div`,{class:`flex shrink-0 flex-wrap gap-2 sm:justify-end`,children:[B(`button`,{class:`inline-flex min-h-10 items-center justify-center rounded-lg border border-slate-300 bg-white px-3.5 py-2 text-xs font-extrabold text-slate-700 transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50`,disabled:w||T!==null,onClick:()=>g.current?.click(),type:`button`,children:_?`다른 파일 선택`:`파일 선택`}),B(`button`,{class:`inline-flex min-h-10 items-center justify-center gap-2 rounded-lg bg-slate-900 px-3.5 py-2 text-xs font-extrabold text-white transition hover:bg-slate-800 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!_||w||T!==null,onClick:()=>void M(),type:`button`,children:[O?B(H,{class:`size-4 animate-spin`}):B(ut,{class:`size-4 rotate-180`}),O?`처리 중...`:`업로드 및 검증`]})]})]}),c===null?null:B(`div`,{class:`mt-4 border-t border-slate-100 pt-4`,children:[B(`div`,{class:`mb-2 flex items-center justify-between gap-3 text-xs font-bold text-slate-600`,children:[B(`span`,{children:`업로드 중`}),B(`span`,{children:[c,`%`]})]}),B(`div`,{class:`h-2 overflow-hidden rounded-full bg-slate-200`,children:B(`div`,{class:`h-full rounded-full bg-sky-600 transition-[width]`,style:{width:`${Math.max(0,Math.min(100,c))}%`}})})]})]})]})]})]})}var Ti=Array.from({length:24},(e,t)=>{let n=String(t).padStart(2,`0`);return{value:n,label:`${n}시`}}),Ei=Array.from({length:60},(e,t)=>{let n=String(t).padStart(2,`0`);return{value:n,label:`${n}분`}});function Di(e){let t=/^([01]\d|2[0-3]):([0-5]\d)$/.exec(e);return{hour:t?.[1]??`03`,minute:t?.[2]??`00`}}function Oi({ariaLabel:e,className:t=``,disabled:n=!1,id:r,onChange:i,value:a,variant:o=`default`}){let{hour:s,minute:c}=Di(a),l=(e,t)=>{i(`${e}:${t}`)};return B(`div`,{"aria-label":e,class:`ssh-time-select ${t}`.trim(),"data-time-select":r,role:`group`,children:[B(hr,{ariaLabel:`${e} 시`,disabled:n,id:`${r}-hour`,onChange:e=>l(e,c),options:Ti,value:s,variant:o}),B(hr,{ariaLabel:`${e} 분`,disabled:n,id:`${r}-minute`,onChange:e=>l(s,e),options:Ei,value:c,variant:o})]})}var ki=7200;function Ai(e,t=Math.floor(Date.now()/1e3)){return!e||!e.settings.checkEnabled||e.phase===`checking`||!e.lastCheckAt?!1:Math.max(0,t-e.lastCheckAt)>Math.max(e.settings.checkIntervalSeconds*2,ki)}var ji=[{value:3600,label:`1시간마다`},{value:21600,label:`6시간마다`},{value:43200,label:`12시간마다`},{value:86400,label:`24시간마다`}],Mi=`luci-app-smartsafehub`;function Ni(e){return e?new Date(e*1e3).toLocaleString(`ko-KR`,{dateStyle:`medium`,timeStyle:`short`}):`아직 없음`}function Pi(e){return e===`stable`?`Stable`:e===`beta`?`Beta`:`미확인`}function Fi(e){return e===`stable`?`bg-emerald-50 text-emerald-700 ring-emerald-200`:e===`beta`?`bg-amber-50 text-amber-700 ring-amber-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function Ii(e){return e.code===`UPDATES_INDEX_REFRESH_FAILED`?{title:`패키지 저장소를 확인하지 못했습니다.`,description:`OpenWrt 패키지 저장소 동기화 또는 네트워크 상태가 일시적으로 불안정할 수 있습니다. 잠시 후 업데이트 확인을 다시 실행해 주세요.`}:e.code===`UPDATES_INSTALL_FAILED`?{title:`관리 소프트웨어 업데이트 설치에 실패했습니다.`,description:`패키지 설치가 완료되지 않았습니다. 네트워크 연결과 저장 공간을 확인한 뒤 다시 시도해 주세요.`}:{title:`최근 업데이트 작업을 완료하지 못했습니다.`,description:`잠시 후 다시 시도해 주세요. 문제가 반복되면 상세 정보를 확인해 주세요.`}}function Li(e,t){return e.phase===`checking`?`업데이트 확인 중`:e.phase===`installing`?`업데이트 설치 중`:e.phase===`error`?`확인 필요`:e.updateCount>0?`업데이트 가능`:t?`업데이트 확인 지연`:e.lastCheckAt?`최신 상태`:`확인 전`}function Ri(e,t){return e.phase===`error`?`bg-rose-50 text-rose-700 ring-rose-200`:e.phase===`checking`||e.phase===`installing`?`bg-sky-50 text-sky-700 ring-sky-200`:e.updateCount>0||t?`bg-amber-50 text-amber-800 ring-amber-200`:e.lastCheckAt?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function zi(e,t){return e.phase===`checking`||e.phase===`installing`?B(H,{class:`size-3.5 shrink-0 animate-spin`}):e.phase===`error`?B(U,{class:`size-3.5 shrink-0`}):e.updateCount>0?B(ut,{class:`size-3.5 shrink-0`}):t?B(U,{class:`size-3.5 shrink-0`}):e.lastCheckAt?B(_t,{class:`size-3.5 shrink-0`}):B(st,{class:`size-3.5 shrink-0`})}function Bi({checked:e,disabled:t=!1,label:n,onChange:r}){return B(`button`,{"aria-checked":e,"aria-label":n,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${e?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:t,onClick:()=>r(!e),role:`switch`,type:`button`,children:B(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${e?`left-6`:`left-1`}`})})}function Vi({action:e,actionError:t,data:n,firmware:r,error:i,loading:a,message:o,onCheck:s,onDismissFeedback:c,onInstall:l,onRetry:u,onSaveSettings:d}){let[f,p]=R(!0),[m,h]=R(21600),[g,_]=R(!1),[v,y]=R(`03:00`),[x,S]=R(!1),[C,w]=R(!1);z(()=>{n&&!x&&(p(n.settings.checkEnabled),h(n.settings.checkIntervalSeconds),_(n.settings.autoInstall),y(n.settings.autoInstallTime))},[n,x]);let T=e===`check`||n?.phase===`checking`,E=e===`install`||n?.phase===`installing`,D=T||E,O=Ai(n),k=n?.phase===`error`&&n.lastError?.code===`UPDATES_INDEX_REFRESH_FAILED`,A=n?.lastError?Ii(n.lastError):null,j=n?.packages.find(e=>e.name===Mi)??n?.packages[0]??null,M=r?.updateAvailable?r.release?.bundledSoftware?.smartsafehub:null,N=!(!n?.lastCheckAt||n.updateCount!==0||O||j?.name!==Mi)&&vi(M,j?.installedVersion)===`same`,P=(e={})=>n?(e.checkEnabled??f)!==n.settings.checkEnabled||(e.checkIntervalSeconds??m)!==n.settings.checkIntervalSeconds||(e.autoInstall??g)!==n.settings.autoInstall||(e.autoInstallTime??v)!==n.settings.autoInstallTime:!1,F=async()=>{await d({checkEnabled:f,checkIntervalSeconds:m,autoInstall:g,autoInstallTime:v})&&S(!1)};return B(`article`,{class:`min-w-0 overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm shadow-slate-900/5 ${n?`grid xl:grid-cols-[minmax(0,0.95fr)_minmax(0,1.05fr)]`:``}`,"data-component":`management-software-update-card`,"data-layout":`management-software-sections`,children:[B(`section`,{class:`min-w-0 xl:col-start-1 xl:row-start-1`,"data-section":`software-update-status`,children:[B(`div`,{class:`p-5 sm:p-6`,children:[B(`div`,{class:`flex flex-col gap-5 lg:flex-row lg:items-start lg:justify-between`,children:[B(`div`,{class:`flex min-w-0 gap-4`,children:[B(`span`,{class:`grid size-12 shrink-0 place-items-center rounded-2xl bg-teal-50 text-teal-700`,children:B(et,{class:`size-6`})}),B(`div`,{class:`min-w-0`,children:[B(`div`,{class:`flex flex-wrap items-center gap-2`,children:[B(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-teal-700`,children:`Management software`}),n?B(`span`,{class:`inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-extrabold ring-1 ring-inset ${Ri(n,O)}`,children:[B(`span`,{"aria-hidden":`true`,class:`flex items-center justify-center`,children:zi(n,O)}),Li(n,O)]}):null]}),B(`h2`,{class:`mt-2 mb-0 text-xl font-black text-slate-950 sm:text-2xl`,children:`관리 소프트웨어 업데이트`}),B(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500 xl:whitespace-nowrap`,children:`새 버전을 확인하고 안전하게 설치합니다.`})]})]}),n?B(`div`,{class:`flex shrink-0 flex-col gap-2 sm:flex-row lg:justify-end`,children:[B(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-800 transition hover:bg-slate-50 disabled:cursor-wait disabled:opacity-60`,disabled:D,onClick:s,type:`button`,children:[B(H,{class:`size-4 ${T?`animate-spin`:``}`}),T?`확인 중...`:`업데이트 확인`]}),n.updateCount>0&&!C?B(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:cursor-wait disabled:opacity-60`,disabled:D,onClick:()=>w(!0),type:`button`,children:[E?B(H,{class:`size-4 animate-spin`}):B(ut,{class:`size-4`}),E?`설치 중...`:`업데이트 설치`]}):null]}):null]}),(t||o)&&B(`div`,{class:`mt-5 flex flex-col gap-3 rounded-xl border px-4 py-3 text-sm font-bold sm:flex-row sm:items-center sm:justify-between ${t?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[B(`span`,{children:t||o}),B(`button`,{class:`shrink-0 self-start rounded-lg px-3 py-1.5 text-xs font-extrabold hover:bg-black/5 sm:self-auto`,onClick:c,type:`button`,children:`닫기`})]}),E?B(`div`,{"aria-busy":`true`,"aria-live":`polite`,class:`mt-5 rounded-xl border border-sky-200 bg-sky-50 p-4 sm:p-5`,children:[B(`div`,{class:`flex items-start gap-3`,children:[B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-sky-700 ring-1 ring-inset ring-sky-200`,children:B(H,{"aria-hidden":`true`,class:`size-5 animate-spin`})}),B(`div`,{class:`min-w-0`,children:[B(`h3`,{class:`m-0 text-sm font-black text-sky-950`,children:`관리 소프트웨어를 업데이트하고 있습니다.`}),B(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-sky-800`,children:`설치가 완료되면 이 화면이 자동으로 갱신됩니다. 작업 중에는 웹 연결이 잠시 끊길 수 있습니다.`})]})]}),B(`div`,{"aria-hidden":`true`,class:`ssh-update-progress-track mt-4`,children:B(`span`,{class:`ssh-update-progress-bar`})})]}):null,i&&!n?B(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 text-sm text-rose-800`,children:[B(`p`,{class:`m-0 font-bold`,children:i}),B(`button`,{class:`mt-3 rounded-lg border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700`,onClick:u,type:`button`,children:`다시 시도`})]}):a&&!n?B(`div`,{class:`mt-5 flex items-center gap-3 rounded-xl bg-slate-50 p-4 text-sm font-bold text-slate-500`,children:[B(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-xl bg-white text-teal-700 ring-1 ring-inset ring-slate-200`,children:B(H,{"aria-hidden":`true`,class:`size-4 animate-spin`})}),B(`span`,{children:`관리 소프트웨어 업데이트 상태를 확인하고 있습니다.`})]}):n?B(b,{children:[n.lastError&&A?B(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 sm:p-5`,children:B(`div`,{class:`flex items-start gap-3`,children:[B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-rose-700 ring-1 ring-inset ring-rose-200`,children:B(U,{class:`size-5`})}),B(`div`,{class:`min-w-0 flex-1`,children:[B(`p`,{class:`m-0 text-sm font-extrabold text-rose-950`,children:A.title}),B(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-rose-800`,children:A.description}),n.lastError.at?B(`p`,{class:`mt-2 mb-0 text-xs font-bold text-rose-700`,children:[`발생 시각 `,Ni(n.lastError.at)]}):null,B(`details`,{class:`mt-3 rounded-lg border border-rose-200 bg-white p-3`,children:[B(`summary`,{class:`cursor-pointer text-xs font-extrabold text-rose-800`,children:`상세 정보 보기`}),B(`div`,{class:`mt-3 grid gap-2 text-xs leading-5 text-slate-600`,children:[B(`p`,{class:`m-0`,children:[`오류 코드 `,B(`strong`,{class:`font-black text-slate-900`,children:n.lastError.code})]}),B(`pre`,{class:`m-0 max-h-40 overflow-auto whitespace-pre-wrap break-words rounded-lg bg-slate-50 p-3 font-mono text-[11px] leading-5 text-slate-700`,children:n.lastError.message})]})]})]})]})}):null,C?B(`div`,{class:`mt-5 flex flex-col gap-3 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:flex-row sm:items-center sm:justify-between`,children:[B(`div`,{class:`min-w-0`,children:[B(`strong`,{class:`block text-sm font-black text-amber-900`,children:`관리 소프트웨어를 지금 업데이트할까요?`}),B(`span`,{class:`mt-1 block text-xs leading-5 text-amber-800`,children:`설치 중 SmartSafeHub 웹 화면 연결이 잠시 끊길 수 있습니다.`})]}),B(`div`,{class:`flex shrink-0 gap-2`,children:[B(`button`,{class:`min-h-10 rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700`,disabled:D,onClick:()=>w(!1),type:`button`,children:`취소`}),B(`button`,{class:`min-h-10 rounded-lg bg-amber-700 px-3 py-2 text-xs font-extrabold text-white disabled:opacity-60`,disabled:D,onClick:()=>{w(!1),l()},type:`button`,children:`설치 시작`})]})]}):null]}):null]}),n?B(`div`,{class:`px-5 pb-5 sm:px-6 sm:pb-6`,children:[B(`h3`,{class:`mb-3 text-sm font-black text-slate-950`,children:`현재 상태`}),B(`dl`,{class:`grid overflow-hidden rounded-xl border border-slate-200 bg-slate-200 sm:grid-cols-2`,children:[B(`div`,{class:`bg-white p-4`,children:[B(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Installed`}),B(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black text-slate-950`,children:j?.installedVersion||`미확인`})]}),B(`div`,{class:`bg-white p-4`,children:[B(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Available`}),B(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black ${j?.updateAvailable||O?`text-amber-700`:`text-slate-950`}`,children:!n.lastCheckAt||k&&!j?.updateAvailable?`미확인`:j?.updateAvailable&&j.availableVersion?j.availableVersion:O?`확인 필요`:`최신 버전`})]}),B(`div`,{class:`bg-white p-4`,children:[B(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Last check`}),B(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-black text-slate-950`,children:B(oi,{fallback:`아직 없음`,timestamp:n.lastCheckAt})})]}),B(`div`,{class:`bg-white p-4`,children:[B(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Auto install`}),B(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-black text-slate-950`,children:n.settings.autoInstall?`켜짐 · ${n.settings.autoInstallTime}`:`꺼짐`})]})]})]}):null,n&&n.updateCount===0&&n.lastCheckAt?O?B(`section`,{class:`mx-5 mb-5 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:mx-6 sm:mb-6 sm:p-5`,"data-section":`software-update-result`,children:B(`div`,{class:`flex gap-3`,children:[B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-amber-700 ring-1 ring-inset ring-amber-200`,children:B(U,{class:`size-5`})}),B(`div`,{children:[B(`h3`,{class:`m-0 text-base font-black text-amber-950`,children:`업데이트 확인이 지연되고 있습니다.`}),B(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-amber-800`,children:[`마지막 업데이트 확인: `,B(oi,{timestamp:n.lastCheckAt}),`. 자동 확인 상태를 점검하거나 업데이트 확인을 실행해 주세요.`]})]})]})}):B(`section`,{class:`mx-5 mb-5 rounded-xl border border-emerald-200 bg-emerald-50 p-4 sm:mx-6 sm:mb-6 sm:p-5`,"data-section":`software-update-result`,children:B(`div`,{class:`flex gap-3`,children:[B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-emerald-700`,children:B(_t,{class:`size-5`})}),B(`div`,{children:[B(`h3`,{class:`m-0 text-base font-black text-emerald-950`,children:`최신 버전을 사용 중입니다.`}),B(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-emerald-800`,children:[`마지막 업데이트 확인: `,B(oi,{timestamp:n.lastCheckAt}),`.`]}),N?B(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-emerald-800`,"data-section":`software-firmware-match`,children:[`새 펌웨어에도 동일한 관리 소프트웨어(`,M,`)가 포함되어 있어 별도로 업데이트할 필요가 없습니다.`]}):null]})]})}):null,n&&n.updateCount===0&&!n.lastCheckAt?B(`section`,{class:`mx-5 mb-5 rounded-xl border border-slate-200 bg-slate-50 p-4 sm:mx-6 sm:mb-6 sm:p-5`,"data-section":`software-update-result`,children:B(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between`,children:[B(`div`,{class:`flex min-w-0 gap-3`,children:[B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-slate-500 ring-1 ring-inset ring-slate-200`,children:B(H,{class:`size-5`})}),B(`div`,{class:`min-w-0`,children:[B(`h3`,{class:`m-0 text-base font-black text-slate-900`,children:`업데이트 상태를 아직 확인하지 않았습니다.`}),B(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-600`,children:`업데이트 확인을 실행하면 현재 설치 버전과 사용 가능한 최신 버전을 확인합니다.`})]})]}),B(`button`,{class:`inline-flex min-h-10 shrink-0 items-center justify-center gap-2 rounded-xl border border-slate-300 bg-white px-4 py-2 text-sm font-extrabold text-slate-800 transition hover:border-teal-300 hover:text-teal-700 disabled:cursor-wait disabled:opacity-60`,disabled:D,onClick:s,type:`button`,children:[B(H,{class:`size-4`}),`지금 확인`]})]})}):null]}),n?B(b,{children:[B(`section`,{class:`min-w-0 border-t border-slate-200 p-5 sm:p-6 xl:col-start-2 xl:row-start-1 xl:row-span-2 xl:self-stretch xl:border-t-0 xl:border-l`,"data-section":`software-update-settings`,children:[B(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between`,children:[B(`div`,{class:`flex min-w-0 gap-4`,children:[B(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-600`,children:B(tt,{class:`size-5`})}),B(`div`,{class:`min-w-0`,children:[B(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Settings`}),B(`h3`,{class:`mt-2 mb-0 text-lg font-black text-slate-950`,children:`자동 업데이트`}),B(`p`,{class:`mt-2 mb-0 max-w-3xl text-sm leading-6 text-slate-500`,children:`관리 소프트웨어의 자동 확인과 자동 설치를 설정합니다.`})]})]}),x?B(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 self-start items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[B(U,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]}):null]}),B(`div`,{class:`ssh-software-settings-grid mt-4`,children:[B(`div`,{class:`ssh-software-settings-channel rounded-xl border border-slate-200 p-4 sm:p-5`,children:B(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[B(`div`,{class:`min-w-0`,children:[B(`strong`,{class:`block text-sm font-black text-slate-950`,children:`업데이트 채널`}),B(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:`현재 관리 소프트웨어 업데이트를 확인하는 배포 채널입니다.`})]}),B(`span`,{class:`inline-flex min-h-9 shrink-0 items-center justify-center rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${Fi(n.settings.channel)}`,title:`현재 업데이트 확인 채널`,children:Pi(n.settings.channel)})]})}),B(`div`,{class:`min-w-0 overflow-hidden rounded-xl border border-slate-200 p-4 sm:p-5`,children:[B(`div`,{class:`flex min-w-0 items-start justify-between gap-4`,children:[B(`div`,{class:`min-w-0`,children:B(`strong`,{class:`block text-sm font-black text-slate-950`,children:`자동으로 업데이트 확인`})}),B(Bi,{checked:f,label:`자동 업데이트 확인`,onChange:e=>{p(e),S(P({checkEnabled:e}))}})]}),B(`div`,{class:`mt-4 block`,children:[B(`span`,{class:`text-xs font-extrabold text-slate-700`,children:`확인 주기`}),B(hr,{ariaLabel:`업데이트 확인 주기`,className:`mt-2`,disabled:!f,id:`software-update-check-interval`,onChange:e=>{let t=Number(e);h(t),S(P({checkIntervalSeconds:t}))},options:ji.map(e=>({value:String(e.value),label:e.label})),value:String(m),variant:`emphasized`})]})]}),B(`div`,{class:`min-w-0 overflow-hidden rounded-xl border border-slate-200 p-4 sm:p-5`,children:[B(`div`,{class:`flex min-w-0 items-start justify-between gap-4`,children:[B(`div`,{class:`min-w-0`,children:B(`strong`,{class:`block text-sm font-black text-slate-950`,children:`자동으로 업데이트 설치`})}),B(Bi,{checked:g,label:`자동 업데이트 설치`,onChange:e=>{_(e),S(P({autoInstall:e}))}})]}),B(`div`,{class:`mt-4 min-w-0`,children:[B(`span`,{class:`text-xs font-extrabold text-slate-700`,children:`설치 시각`}),B(Oi,{ariaLabel:`자동 업데이트 설치 시각`,className:`mt-2`,disabled:!g,id:`software-update-auto-install-time`,onChange:e=>{y(e),S(P({autoInstallTime:e}))},value:v,variant:`emphasized`})]})]})]}),g?B(`p`,{class:`mt-4 mb-0 rounded-xl bg-amber-50 px-4 py-3 text-xs font-bold leading-5 text-amber-800`,children:`자동 설치 중에는 SmartSafeHub 웹 화면 연결이 잠시 끊길 수 있습니다.`}):null,B(`div`,{class:`mt-5 flex flex-col gap-3 border-t border-slate-100 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[B(`p`,{class:`m-0 text-xs leading-5 text-slate-500`,children:[`마지막 설치: `,Ni(n.lastInstallAt)]}),B(`button`,{class:`inline-flex min-h-11 items-center justify-center rounded-xl bg-slate-900 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-slate-800 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!x||e===`settings`||D,onClick:()=>void F(),type:`button`,children:e===`settings`?`저장 중`:`자동 업데이트 설정 저장`})]})]}),n.updateCount>0?B(`section`,{class:`border-t border-slate-200 p-5 sm:p-6 xl:col-start-1 xl:row-start-2`,"data-section":`software-update-release-notes`,children:[B(`div`,{class:`flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-4`,children:[B(`div`,{children:[B(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-teal-700`,children:`Release notes`}),B(`h3`,{class:`mt-2 mb-0 text-lg font-black text-slate-950`,children:`업데이트 내용`}),B(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500`,children:`현재 설치된 버전 이후 포함되는 주요 변경 사항입니다.`})]}),n.releaseNotes.length?B(`span`,{class:`shrink-0 rounded-full bg-slate-100 px-3 py-1.5 text-xs font-extrabold text-slate-600`,children:n.releaseNotes.length===1?`1개 릴리즈`:`${n.releaseNotes.length}개 릴리즈`}):null]}),n.releaseNotes.length?B(`div`,{class:`mt-5 grid gap-3`,children:[n.releaseNotes.map(e=>B(`article`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4 sm:p-5`,children:[B(`div`,{class:`flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between sm:gap-4`,children:[B(`strong`,{class:`break-all text-sm font-black text-slate-950`,children:e.version}),e.date?B(`span`,{class:`text-xs font-bold text-slate-500`,children:e.date}):null]}),e.summary?B(`p`,{class:`mt-3 mb-0 text-sm leading-6 text-slate-700`,children:e.summary}):null,e.sections.length?B(`details`,{class:`mt-4 rounded-lg border border-slate-200 bg-white p-3`,open:n.releaseNotes.length===1,children:[B(`summary`,{class:`cursor-pointer text-xs font-extrabold text-slate-800`,children:`자세한 변경 사항`}),B(`div`,{class:`mt-3 grid gap-4`,children:e.sections.map(t=>B(`section`,{children:[B(`h4`,{class:`m-0 text-xs font-extrabold text-slate-700`,children:t.title}),B(`ul`,{class:`mt-2 mb-0 space-y-1.5 pl-5 text-xs leading-5 text-slate-600`,children:t.items.map((n,r)=>B(`li`,{children:n},`${e.version}-${t.title}-${r}`))})]},`${e.version}-${t.title}`))})]}):null]},e.version)),n.releaseNotesComplete?null:B(`p`,{class:`m-0 rounded-xl bg-amber-50 px-4 py-3 text-xs font-bold leading-5 text-amber-800`,children:`일부 릴리즈 노트를 불러오지 못했습니다. 업데이트 확인과 설치는 계속 사용할 수 있습니다.`})]}):B(`p`,{class:`mt-4 mb-0 rounded-xl bg-slate-50 px-4 py-3 text-sm text-slate-500`,children:`릴리즈 노트를 불러오지 못했습니다. 업데이트 확인과 설치는 계속 사용할 수 있습니다.`})]}):null]}):null]})}function Hi({action:e,actionError:t,data:n,error:r,firmware:i,loading:a,message:o,onCheck:s,onDismissFeedback:c,onInstall:l,onRetry:u,onSaveSettings:d}){return B(`section`,{class:`min-w-0 space-y-5`,children:[B(`div`,{children:B(W,{eyebrow:`Firmware`,title:`시스템 펌웨어`,description:`공유기 운영체제의 새 버전을 확인하고 설치합니다.`})}),B(wi,{action:i.action,actionError:i.actionError,data:i.data,software:n,error:i.error,loading:i.loading,message:i.message,reconnecting:i.reconnecting,uploadProgress:i.uploadProgress,onCheck:()=>void i.check(),onDiscard:i.discard,onDismissFeedback:i.dismissFeedback,onInstall:i.install,onPrepare:()=>void i.prepare(),onRetry:()=>void i.refresh(),onUpload:i.upload}),B(`div`,{class:`pt-2`,children:B(W,{eyebrow:`Software`,title:`관리 소프트웨어`,description:`SmartSafeHub 관리 화면 및 서비스의 업데이트를 확인합니다.`})}),B(Vi,{firmware:i.data,action:e,actionError:t,data:n,error:r,loading:a,message:o,onCheck:s,onDismissFeedback:c,onInstall:l,onRetry:u,onSaveSettings:d})]})}var Ui={"#home":`home`,"#activity":`activity`,"#network":`network`,"#network/internet":`network`,"#network/lan":`network`,"#wan":`network`,"#lan":`network`,"#wifi":`wifi`,"#iptv":`iptv`,"#devices":`devices`,"#safeshield":`safeshield`,"#rules":`rules`,"#account":`account`,"#apps":`apps`,"#system":`system`,"#settings":`settings`,"#settings/diagnostics":`settings`,"#settings/time":`settings`,"#settings/management":`settings`};function Wi(){return Ui[window.location.hash]??`home`}function Gi(){let[e,t]=R(Wi);return z(()=>{let e=()=>t(Wi());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),e}function Ki(e){return e===`#lan`||e===`#network/lan`?`lan`:`internet`}function qi(e){return e===`#settings/time`?`time`:e===`#settings/management`?`management`:`diagnostics`}function Ji(){let e=window.location.hash;return{network:Ki(e),settings:qi(e)}}function Yi(){let[e,t]=R(Ji);return z(()=>{let e=()=>t(Ji());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),e}function Xi({active:e,label:t,tabs:n}){return B(`nav`,{"aria-label":t,class:`mb-5 min-w-0`,role:`tablist`,children:B(`div`,{class:`grid w-full min-w-0 gap-2 ${n.length===3?`grid-cols-3 sm:max-w-[592px]`:`grid-cols-2 sm:max-w-[392px]`}`,children:n.map(t=>{let r=t.id===e;return B(`a`,{"aria-controls":`${t.id}-panel`,"aria-selected":r,class:`flex min-h-11 min-w-0 items-center justify-center rounded-xl border px-2 py-2.5 text-center text-[11px] font-extrabold leading-5 transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-teal-500 sm:px-4 sm:text-sm ${r?`border-teal-200 bg-teal-50 text-teal-800`:`border-slate-200 bg-white text-slate-600 hover:border-teal-200 hover:text-teal-700`}`,href:t.href,id:`${t.id}-tab`,role:`tab`,tabIndex:r?0:-1,onKeyDown:e=>{if(![`ArrowLeft`,`ArrowRight`,`Home`,`End`].includes(e.key))return;e.preventDefault();let r=n.findIndex(e=>e.id===t.id),i=e.key===`Home`?0:e.key===`End`?n.length-1:(r+(e.key===`ArrowRight`?1:-1)+n.length)%n.length,a=e.currentTarget.parentElement?.children[i];a?.focus(),a?.click()},children:t.label},t.id)})})})}var Zi=[{value:`all`,label:`전체`},{value:`online`,label:`현재 연결`},{value:`wifi`,label:`Wi-Fi`},{value:`ethernet`,label:`유선/기타`},{value:`offline`,label:`최근 기기`}],Qi=new Intl.Collator(`ko`),$i=new Intl.DateTimeFormat(`ko-KR`,{month:`numeric`,day:`numeric`,hour:`2-digit`,minute:`2-digit`});function ea(e){switch(e){case`wifi`:return`Wi-Fi`;case`ethernet`:return`유선/기타`;default:return`연결 방식 미확인`}}function ta(e){return e.hostname??e.ipv4Address??`이름 없는 기기`}function na(e){return e===null?null:e>=-50?`매우 좋음`:e>=-60?`좋음`:e>=-70?`보통`:`약함`}function ra(e){if(e===null||e<0)return null;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}일 ${n}시간`:n>0?`${n}시간 ${r}분`:`${Math.max(r,1)}분`}function ia(e){return e.leaseActive?e.leaseExpiresAt===null?`DHCP 임대 활성`:`DHCP ${$i.format(new Date(e.leaseExpiresAt*1e3))}까지`:null}function aa(e,t){switch(t){case`online`:return e.online;case`wifi`:return e.online&&e.connection===`wifi`;case`ethernet`:return e.online&&e.connection===`ethernet`;case`offline`:return!e.online;default:return!0}}function oa({device:e}){return B(`span`,{class:`inline-flex items-center gap-2 rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${e.online?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}`,children:[B(`span`,{class:`size-2 rounded-full ${e.online?`bg-emerald-500`:`bg-slate-400`}`}),e.online?`현재 연결`:`최근 임대`]})}function sa({device:e}){let t=na(e.signalDbm),n=ra(e.connectedSeconds),r=ia(e);return B(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:[B(`div`,{class:`flex min-w-0 flex-col items-start gap-4 sm:flex-row sm:justify-between`,children:[B(`div`,{class:`flex min-w-0 items-start gap-3`,children:[B(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl ${e.connection===`wifi`?`bg-teal-50 text-teal-700`:e.connection===`ethernet`?`bg-blue-50 text-blue-700`:`bg-slate-100 text-slate-600`}`,children:e.connection===`wifi`?B(nt,{class:`size-6`}):e.connection===`ethernet`?B(it,{class:`size-6`}):B(Ke,{class:`size-6`})}),B(`div`,{class:`min-w-0`,children:[B(`h3`,{class:`m-0 break-words text-base font-extrabold text-slate-950`,children:ta(e)}),B(`p`,{class:`mt-1 mb-0 break-all font-mono text-xs leading-5 text-slate-500`,children:e.mac})]})]}),B(`span`,{class:`shrink-0 self-start`,children:B(oa,{device:e})})]}),B(`dl`,{class:`mt-5 grid gap-3 text-sm sm:grid-cols-2`,children:[B(`div`,{class:`rounded-xl bg-slate-50 p-3.5`,children:[B(`dt`,{class:`text-xs font-bold text-slate-500`,children:`IP 주소`}),B(`dd`,{class:`mt-1.5 mb-0 ml-0 font-extrabold text-slate-900`,children:e.ipv4Address??`확인되지 않음`})]}),B(`div`,{class:`rounded-xl bg-slate-50 p-3.5`,children:[B(`dt`,{class:`text-xs font-bold text-slate-500`,children:`연결 방식`}),B(`dd`,{class:`mt-1.5 mb-0 ml-0 font-extrabold text-slate-900`,children:ea(e.connection)})]})]}),B(`div`,{class:`mt-4 flex flex-wrap gap-2 text-xs font-bold text-slate-600`,children:[e.ssid?B(`span`,{class:`rounded-full bg-teal-50 px-3 py-1.5 text-teal-800`,children:[e.ssid,e.bandLabel?` · ${e.bandLabel}`:``]}):null,t?B(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:[`신호 `,t,` · `,e.signalDbm,` dBm`]}):null,n?B(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:[`연결 `,n]}):null,r?B(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:r}):null,e.interface?B(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:e.interface}):null]})]})}function ca({data:e,error:t,loading:n,onRetry:r}){let[i,a]=R(``),[o,s]=R(`all`),c=Te(()=>{if(!e)return[];let t=i.trim().toLocaleLowerCase();return[...e.devices].filter(e=>aa(e,o)).filter(e=>!t||[e.hostname,e.ipv4Address,e.mac,e.ssid].filter(e=>!!e).some(e=>e.toLocaleLowerCase().includes(t))).sort((e,t)=>e.online===t.online?e.connection===t.connection?Qi.compare(ta(e),ta(t)):e.connection===`wifi`?-1:1:e.online?-1:1)},[e,o,i]);return n?B(Bn,{}):t?B(Vn,{message:t,onRetry:r}):e?B(b,{children:[B(W,{eyebrow:`Overview`,title:`연결 기기 현황`,description:`네트워크에 연결되었거나 최근 확인된 기기를 요약합니다.`}),B(`section`,{"aria-label":`연결 기기 요약`,class:`grid gap-4 sm:grid-cols-2 xl:grid-cols-4`,children:[B(la,{description:`${e.totals.offline}대는 최근 DHCP 임대에서 확인`,icon:B(Ke,{class:`size-6`}),label:`확인된 기기`,value:e.totals.known}),B(la,{description:`Wi-Fi 또는 ARP에서 현재 확인됨`,icon:B(st,{class:`size-6`}),label:`현재 연결`,value:e.totals.online}),B(la,{description:`무선 AP에 연결된 기기`,icon:B(nt,{class:`size-6`}),label:`Wi-Fi`,value:e.totals.wireless}),B(la,{description:`LAN ARP에서 확인된 비무선 기기`,icon:B(it,{class:`size-6`}),label:`유선/기타`,value:e.totals.ethernet})]}),B(`section`,{class:`mt-7`,"aria-label":`기기 목록 및 필터`,children:[B(W,{eyebrow:`Device inventory`,title:`기기 목록`,description:`연결된 기기를 검색하고 무선·유선 상태별로 확인합니다.`}),B(`div`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:B(`div`,{class:`flex min-w-0 flex-col gap-3 lg:flex-row lg:items-center lg:justify-between`,children:[B(`div`,{class:`ssh-touch-scroll flex min-w-0 gap-2 overflow-x-auto pb-1 lg:flex-1`,role:`group`,"aria-label":`기기 필터`,children:Zi.map(e=>B(`button`,{"aria-pressed":o===e.value,class:`min-h-10 shrink-0 rounded-xl border px-4 py-2 text-sm font-extrabold transition ${o===e.value?`border-teal-700 bg-teal-700 text-white`:`border-slate-200 bg-white text-slate-600 hover:bg-slate-50 hover:text-slate-950`}`,onClick:()=>s(e.value),type:`button`,children:e.label},e.value))}),B(`label`,{class:`relative block w-full lg:w-72 lg:shrink-0 xl:w-80`,children:[B(`span`,{class:`sr-only`,children:`기기 검색`}),B(`span`,{class:`pointer-events-none absolute inset-y-0 left-0 flex w-11 items-center justify-center text-slate-400`,children:B(bt,{class:`size-5`})}),B(`input`,{class:`min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 py-2.5 pr-4 pl-11 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100`,onInput:e=>a(e.currentTarget.value),placeholder:`이름, IP, MAC 또는 SSID 검색`,type:`search`,value:i})]})]})})]}),c.length?B(`section`,{"aria-live":`polite`,class:`mt-5 grid gap-4 lg:grid-cols-2`,children:c.map(e=>B(sa,{device:e},e.id))}):B(`section`,{class:`mt-5 rounded-2xl border border-dashed border-slate-300 bg-white p-5 text-center sm:p-8`,children:[B(Ke,{class:`mx-auto size-10 text-slate-400`}),B(`h2`,{class:`mt-4 mb-0 text-lg font-extrabold text-slate-950`,children:`조건에 맞는 기기가 없습니다`}),B(`p`,{class:`mt-2 mb-0 text-sm text-slate-600`,children:`검색어 또는 필터를 변경해 주세요.`})]}),B(`p`,{class:`mt-5 mb-0 rounded-xl bg-slate-100 px-4 py-3 text-xs leading-5 text-slate-600`,children:`유선/기타 상태는 ARP 테이블을 기준으로 하며, 최근 DHCP 임대는 기기가 연결 해제된 뒤에도 일정 시간 남을 수 있습니다.`})]}):null}function la({description:e,icon:t,label:n,value:r}){return B(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:[B(`div`,{class:`flex items-start justify-between gap-4`,children:[B(`div`,{children:[B(`p`,{class:`m-0 text-xs font-bold uppercase tracking-[0.14em] text-slate-500`,children:n}),B(`p`,{class:`mt-3 mb-0 text-3xl font-black tracking-tight text-slate-950`,children:r})]}),B(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:t})]}),B(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:e})]})}function ua(e){return e+.5|0}var da=(e,t,n)=>Math.max(Math.min(e,n),t);function fa(e){return da(ua(e*2.55),0,255)}function pa(e){return da(ua(e*255),0,255)}function ma(e){return da(ua(e/2.55)/100,0,1)}function ha(e){return da(ua(e*100),0,100)}var ga={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},_a=[...`0123456789ABCDEF`],va=e=>_a[e&15],ya=e=>_a[(e&240)>>4]+_a[e&15],ba=e=>(e&240)>>4==(e&15),xa=e=>ba(e.r)&&ba(e.g)&&ba(e.b)&&ba(e.a);function Sa(e){var t=e.length,n;return e[0]===`#`&&(t===4||t===5?n={r:255&ga[e[1]]*17,g:255&ga[e[2]]*17,b:255&ga[e[3]]*17,a:t===5?ga[e[4]]*17:255}:(t===7||t===9)&&(n={r:ga[e[1]]<<4|ga[e[2]],g:ga[e[3]]<<4|ga[e[4]],b:ga[e[5]]<<4|ga[e[6]],a:t===9?ga[e[7]]<<4|ga[e[8]]:255})),n}var Ca=(e,t)=>e<255?t(e):``;function wa(e){var t=xa(e)?va:ya;return e?`#`+t(e.r)+t(e.g)+t(e.b)+Ca(e.a,t):void 0}var Ta=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Ea(e,t,n){let r=t*Math.min(n,1-n),i=(t,i=(t+e/30)%12)=>n-r*Math.max(Math.min(i-3,9-i,1),-1);return[i(0),i(8),i(4)]}function Da(e,t,n){let r=(r,i=(r+e/60)%6)=>n-n*t*Math.max(Math.min(i,4-i,1),0);return[r(5),r(3),r(1)]}function Oa(e,t,n){let r=Ea(e,1,.5),i;for(t+n>1&&(i=1/(t+n),t*=i,n*=i),i=0;i<3;i++)r[i]*=1-t-n,r[i]+=t;return r}function ka(e,t,n,r,i){return e===i?(t-n)/r+(t.5?l/(2-i-a):l/(i+a),s=ka(t,n,r,l,i),s=s*60+.5),[s|0,c||0,o]}function ja(e,t,n,r){return(Array.isArray(t)?e(t[0],t[1],t[2]):e(t,n,r)).map(pa)}function Ma(e,t,n){return ja(Ea,e,t,n)}function Na(e,t,n){return ja(Oa,e,t,n)}function Pa(e,t,n){return ja(Da,e,t,n)}function Fa(e){return(e%360+360)%360}function Ia(e){let t=Ta.exec(e),n=255,r;if(!t)return;t[5]!==r&&(n=t[6]?fa(+t[5]):pa(+t[5]));let i=Fa(+t[2]),a=t[3]/100,o=t[4]/100;return r=t[1]===`hwb`?Na(i,a,o):t[1]===`hsv`?Pa(i,a,o):Ma(i,a,o),{r:r[0],g:r[1],b:r[2],a:n}}function La(e,t){var n=Aa(e);n[0]=Fa(n[0]+t),n=Ma(n),e.r=n[0],e.g=n[1],e.b=n[2]}function Ra(e){if(!e)return;let t=Aa(e),n=t[0],r=ha(t[1]),i=ha(t[2]);return e.a<255?`hsla(${n}, ${r}%, ${i}%, ${ma(e.a)})`:`hsl(${n}, ${r}%, ${i}%)`}var za={x:`dark`,Z:`light`,Y:`re`,X:`blu`,W:`gr`,V:`medium`,U:`slate`,A:`ee`,T:`ol`,S:`or`,B:`ra`,C:`lateg`,D:`ights`,R:`in`,Q:`turquois`,E:`hi`,P:`ro`,O:`al`,N:`le`,M:`de`,L:`yello`,F:`en`,K:`ch`,G:`arks`,H:`ea`,I:`ightg`,J:`wh`},Ba={OiceXe:`f0f8ff`,antiquewEte:`faebd7`,aqua:`ffff`,aquamarRe:`7fffd4`,azuY:`f0ffff`,beige:`f5f5dc`,bisque:`ffe4c4`,black:`0`,blanKedOmond:`ffebcd`,Xe:`ff`,XeviTet:`8a2be2`,bPwn:`a52a2a`,burlywood:`deb887`,caMtXe:`5f9ea0`,KartYuse:`7fff00`,KocTate:`d2691e`,cSO:`ff7f50`,cSnflowerXe:`6495ed`,cSnsilk:`fff8dc`,crimson:`dc143c`,cyan:`ffff`,xXe:`8b`,xcyan:`8b8b`,xgTMnPd:`b8860b`,xWay:`a9a9a9`,xgYF:`6400`,xgYy:`a9a9a9`,xkhaki:`bdb76b`,xmagFta:`8b008b`,xTivegYF:`556b2f`,xSange:`ff8c00`,xScEd:`9932cc`,xYd:`8b0000`,xsOmon:`e9967a`,xsHgYF:`8fbc8f`,xUXe:`483d8b`,xUWay:`2f4f4f`,xUgYy:`2f4f4f`,xQe:`ced1`,xviTet:`9400d3`,dAppRk:`ff1493`,dApskyXe:`bfff`,dimWay:`696969`,dimgYy:`696969`,dodgerXe:`1e90ff`,fiYbrick:`b22222`,flSOwEte:`fffaf0`,foYstWAn:`228b22`,fuKsia:`ff00ff`,gaRsbSo:`dcdcdc`,ghostwEte:`f8f8ff`,gTd:`ffd700`,gTMnPd:`daa520`,Way:`808080`,gYF:`8000`,gYFLw:`adff2f`,gYy:`808080`,honeyMw:`f0fff0`,hotpRk:`ff69b4`,RdianYd:`cd5c5c`,Rdigo:`4b0082`,ivSy:`fffff0`,khaki:`f0e68c`,lavFMr:`e6e6fa`,lavFMrXsh:`fff0f5`,lawngYF:`7cfc00`,NmoncEffon:`fffacd`,ZXe:`add8e6`,ZcSO:`f08080`,Zcyan:`e0ffff`,ZgTMnPdLw:`fafad2`,ZWay:`d3d3d3`,ZgYF:`90ee90`,ZgYy:`d3d3d3`,ZpRk:`ffb6c1`,ZsOmon:`ffa07a`,ZsHgYF:`20b2aa`,ZskyXe:`87cefa`,ZUWay:`778899`,ZUgYy:`778899`,ZstAlXe:`b0c4de`,ZLw:`ffffe0`,lime:`ff00`,limegYF:`32cd32`,lRF:`faf0e6`,magFta:`ff00ff`,maPon:`800000`,VaquamarRe:`66cdaa`,VXe:`cd`,VScEd:`ba55d3`,VpurpN:`9370db`,VsHgYF:`3cb371`,VUXe:`7b68ee`,VsprRggYF:`fa9a`,VQe:`48d1cc`,VviTetYd:`c71585`,midnightXe:`191970`,mRtcYam:`f5fffa`,mistyPse:`ffe4e1`,moccasR:`ffe4b5`,navajowEte:`ffdead`,navy:`80`,Tdlace:`fdf5e6`,Tive:`808000`,TivedBb:`6b8e23`,Sange:`ffa500`,SangeYd:`ff4500`,ScEd:`da70d6`,pOegTMnPd:`eee8aa`,pOegYF:`98fb98`,pOeQe:`afeeee`,pOeviTetYd:`db7093`,papayawEp:`ffefd5`,pHKpuff:`ffdab9`,peru:`cd853f`,pRk:`ffc0cb`,plum:`dda0dd`,powMrXe:`b0e0e6`,purpN:`800080`,YbeccapurpN:`663399`,Yd:`ff0000`,Psybrown:`bc8f8f`,PyOXe:`4169e1`,saddNbPwn:`8b4513`,sOmon:`fa8072`,sandybPwn:`f4a460`,sHgYF:`2e8b57`,sHshell:`fff5ee`,siFna:`a0522d`,silver:`c0c0c0`,skyXe:`87ceeb`,UXe:`6a5acd`,UWay:`708090`,UgYy:`708090`,snow:`fffafa`,sprRggYF:`ff7f`,stAlXe:`4682b4`,tan:`d2b48c`,teO:`8080`,tEstN:`d8bfd8`,tomato:`ff6347`,Qe:`40e0d0`,viTet:`ee82ee`,JHt:`f5deb3`,wEte:`ffffff`,wEtesmoke:`f5f5f5`,Lw:`ffff00`,LwgYF:`9acd32`};function Va(){let e={},t=Object.keys(Ba),n=Object.keys(za),r,i,a,o,s;for(r=0;r>16&255,a>>8&255,a&255]}return e}var Ha;function Ua(e){Ha||(Ha=Va(),Ha.transparent=[0,0,0,0]);let t=Ha[e.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}var Wa=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function Ga(e){let t=Wa.exec(e),n=255,r,i,a;if(t){if(t[7]!==r){let e=+t[7];n=t[8]?fa(e):da(e*255,0,255)}return r=+t[1],i=+t[3],a=+t[5],r=255&(t[2]?fa(r):da(r,0,255)),i=255&(t[4]?fa(i):da(i,0,255)),a=255&(t[6]?fa(a):da(a,0,255)),{r,g:i,b:a,a:n}}}function Ka(e){return e&&(e.a<255?`rgba(${e.r}, ${e.g}, ${e.b}, ${ma(e.a)})`:`rgb(${e.r}, ${e.g}, ${e.b})`)}var qa=e=>e<=.0031308?e*12.92:e**(1/2.4)*1.055-.055,Ja=e=>e<=.04045?e/12.92:((e+.055)/1.055)**2.4;function Ya(e,t,n){let r=Ja(ma(e.r)),i=Ja(ma(e.g)),a=Ja(ma(e.b));return{r:pa(qa(r+n*(Ja(ma(t.r))-r))),g:pa(qa(i+n*(Ja(ma(t.g))-i))),b:pa(qa(a+n*(Ja(ma(t.b))-a))),a:e.a+n*(t.a-e.a)}}function Xa(e,t,n){if(e){let r=Aa(e);r[t]=Math.max(0,Math.min(r[t]+r[t]*n,t===0?360:1)),r=Ma(r),e.r=r[0],e.g=r[1],e.b=r[2]}}function Za(e,t){return e&&Object.assign(t||{},e)}function Qa(e){var t={r:0,g:0,b:0,a:255};return Array.isArray(e)?e.length>=3&&(t={r:e[0],g:e[1],b:e[2],a:255},e.length>3&&(t.a=pa(e[3]))):(t=Za(e,{r:0,g:0,b:0,a:1}),t.a=pa(t.a)),t}function $a(e){return e.charAt(0)===`r`?Ga(e):Ia(e)}var eo=class e{constructor(t){if(t instanceof e)return t;let n=typeof t,r;n===`object`?r=Qa(t):n===`string`&&(r=Sa(t)||Ua(t)||$a(t)),this._rgb=r,this._valid=!!r}get valid(){return this._valid}get rgb(){var e=Za(this._rgb);return e&&(e.a=ma(e.a)),e}set rgb(e){this._rgb=Qa(e)}rgbString(){return this._valid?Ka(this._rgb):void 0}hexString(){return this._valid?wa(this._rgb):void 0}hslString(){return this._valid?Ra(this._rgb):void 0}mix(e,t){if(e){let n=this.rgb,r=e.rgb,i,a=t===i?.5:t,o=2*a-1,s=n.a-r.a,c=((o*s===-1?o:(o+s)/(1+o*s))+1)/2;i=1-c,n.r=255&c*n.r+i*r.r+.5,n.g=255&c*n.g+i*r.g+.5,n.b=255&c*n.b+i*r.b+.5,n.a=a*n.a+(1-a)*r.a,this.rgb=n}return this}interpolate(e,t){return e&&(this._rgb=Ya(this._rgb,e._rgb,t)),this}clone(){return new e(this.rgb)}alpha(e){return this._rgb.a=pa(e),this}clearer(e){let t=this._rgb;return t.a*=1-e,this}greyscale(){let e=this._rgb;return e.r=e.g=e.b=ua(e.r*.3+e.g*.59+e.b*.11),this}opaquer(e){let t=this._rgb;return t.a*=1+e,this}negate(){let e=this._rgb;return e.r=255-e.r,e.g=255-e.g,e.b=255-e.b,this}lighten(e){return Xa(this._rgb,2,e),this}darken(e){return Xa(this._rgb,2,-e),this}saturate(e){return Xa(this._rgb,1,e),this}desaturate(e){return Xa(this._rgb,1,-e),this}rotate(e){return La(this._rgb,e),this}};function to(){}var no=(()=>{let e=0;return()=>e++})();function K(e){return e==null}function q(e){if(Array.isArray&&Array.isArray(e))return!0;let t=Object.prototype.toString.call(e);return t.slice(0,7)===`[object`&&t.slice(-6)===`Array]`}function J(e){return e!==null&&Object.prototype.toString.call(e)===`[object Object]`}function ro(e){return(typeof e==`number`||e instanceof Number)&&isFinite(+e)}function io(e,t){return ro(e)?e:t}function Y(e,t){return e===void 0?t:e}var ao=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100:+e/t,oo=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100*t:+e;function so(e,t,n){if(e&&typeof e.call==`function`)return e.apply(n,t)}function X(e,t,n,r){let i,a,o;if(q(e)){if(a=e.length,r)for(i=a-1;i>=0;i--)t.call(n,e[i],i);else for(i=0;ie,x:e=>e.x,y:e=>e.y};function _o(e){let t=e.split(`.`),n=[],r=``;for(let e of t)r+=e,r.endsWith(`\\`)?r=r.slice(0,-1)+`.`:(n.push(r),r=``);return n}function vo(e){let t=_o(e);return e=>{for(let n of t){if(n===``)break;e=e&&e[n]}return e}}function yo(e,t){return(go[t]||(go[t]=vo(t)))(e)}function bo(e){return e.charAt(0).toUpperCase()+e.slice(1)}var xo=e=>e!==void 0,So=e=>typeof e==`function`,Co=(e,t)=>{if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0};function wo(e){return e.type===`mouseup`||e.type===`click`||e.type===`contextmenu`}var Z=Math.PI,Q=2*Z,To=Q+Z,Eo=1/0,Do=Z/180,Oo=Z/2,ko=Z/4,Ao=Z*2/3,jo=Math.log10,Mo=Math.sign;function No(e,t,n){return Math.abs(e-t)e-t).pop(),t}function Io(e){return typeof e==`symbol`||typeof e==`object`&&!!e&&!(Symbol.toPrimitive in e||`toString`in e||`valueOf`in e)}function Lo(e){return!Io(e)&&!isNaN(parseFloat(e))&&isFinite(e)}function Ro(e,t){let n=Math.round(e);return n-t<=e&&n+t>=e}function zo(e,t,n){let r,i,a;for(r=0,i=e.length;rc&&l=Math.min(t,n)-r&&e<=Math.max(t,n)+r}function Zo(e,t,n){n=n||(n=>e[n]1;)a=i+r>>1,n(a)?i=a:r=a;return{lo:i,hi:r}}var Qo=(e,t,n,r)=>Zo(e,n,r?r=>{let i=e[r][t];return ie[r][t]Zo(e,n,r=>e[r][t]>=n);function es(e,t,n){let r=0,i=e.length;for(;rr&&e[i-1]>n;)i--;return r>0||i{let n=`_onData`+bo(t),r=e[t];Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value(...t){let i=r.apply(this,t);return e._chartjs.listeners.forEach(e=>{typeof e[n]==`function`&&e[n](...t)}),i}})}))}function rs(e,t){let n=e._chartjs;if(!n)return;let r=n.listeners,i=r.indexOf(t);i!==-1&&r.splice(i,1),!(r.length>0)&&(ts.forEach(t=>{delete e[t]}),delete e._chartjs)}function is(e){let t=new Set(e);return t.size===e.length?e:Array.from(t)}var as=function(){return typeof window>`u`?function(e){return e()}:window.requestAnimationFrame}();function os(e,t){let n=[],r=!1;return function(...i){n=i,r||(r=!0,as.call(window,()=>{r=!1,e.apply(t,n)}))}}function ss(e,t){let n;return function(...r){return t?(clearTimeout(n),n=setTimeout(e,t,r)):e.apply(this,r),t}}var cs=e=>e===`start`?`left`:e===`end`?`right`:`center`,ls=(e,t,n)=>e===`start`?t:e===`end`?n:(t+n)/2;function us(e,t,n){let r=t.length,i=0,a=r;if(e._sorted){let{iScale:o,vScale:s,_parsed:c}=e,l=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null,u=o.axis,{min:d,max:f,minDefined:p,maxDefined:m}=o.getUserBounds();if(p){if(i=Math.min(Qo(c,u,d).lo,n?r:Qo(t,u,o.getPixelForValue(d)).lo),l){let e=c.slice(0,i+1).reverse().findIndex(e=>!K(e[s.axis]));i-=Math.max(0,e)}i=Jo(i,0,r-1)}if(m){let e=Math.max(Qo(c,o.axis,f,!0).hi+1,n?0:Qo(t,u,o.getPixelForValue(f),!0).hi+1);if(l){let t=c.slice(e-1).findIndex(e=>!K(e[s.axis]));e+=Math.max(0,t)}a=Jo(e,i,r)-i}else a=r-i}return{start:i,count:a}}function ds(e){let{xScale:t,yScale:n,_scaleRanges:r}=e,i={xmin:t.min,xmax:t.max,ymin:n.min,ymax:n.max};if(!r)return e._scaleRanges=i,!0;let a=r.xmin!==t.min||r.xmax!==t.max||r.ymin!==n.min||r.ymax!==n.max;return Object.assign(r,i),a}var fs=e=>e===0||e===1,ps=(e,t,n)=>-(2**(10*--e)*Math.sin((e-t)*Q/n)),ms=(e,t,n)=>2**(-10*e)*Math.sin((e-t)*Q/n)+1,hs={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>-e*(e-2),easeInOutQuad:e=>(e/=.5)<1?.5*e*e:-.5*(--e*(e-2)-1),easeInCubic:e=>e*e*e,easeOutCubic:e=>--e*e*e+1,easeInOutCubic:e=>(e/=.5)<1?.5*e*e*e:.5*((e-=2)*e*e+2),easeInQuart:e=>e*e*e*e,easeOutQuart:e=>-(--e*e*e*e-1),easeInOutQuart:e=>(e/=.5)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2),easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>--e*e*e*e*e+1,easeInOutQuint:e=>(e/=.5)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2),easeInSine:e=>-Math.cos(e*Oo)+1,easeOutSine:e=>Math.sin(e*Oo),easeInOutSine:e=>-.5*(Math.cos(Z*e)-1),easeInExpo:e=>e===0?0:2**(10*(e-1)),easeOutExpo:e=>e===1?1:-(2**(-10*e))+1,easeInOutExpo:e=>fs(e)?e:e<.5?.5*2**(10*(e*2-1)):.5*(-(2**(-10*(e*2-1)))+2),easeInCirc:e=>e>=1?e:-(Math.sqrt(1-e*e)-1),easeOutCirc:e=>Math.sqrt(1- --e*e),easeInOutCirc:e=>(e/=.5)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1),easeInElastic:e=>fs(e)?e:ps(e,.075,.3),easeOutElastic:e=>fs(e)?e:ms(e,.075,.3),easeInOutElastic(e){let t=.1125,n=.45;return fs(e)?e:e<.5?.5*ps(e*2,t,n):.5+.5*ms(e*2-1,t,n)},easeInBack(e){return e*e*(2.70158*e-1.70158)},easeOutBack(e){return--e*e*(2.70158*e+1.70158)+1},easeInOutBack(e){let t=1.70158;return(e/=.5)<1?.5*(e*e*(((t*=1.525)+1)*e-t)):.5*((e-=2)*e*(((t*=1.525)+1)*e+t)+2)},easeInBounce:e=>1-hs.easeOutBounce(1-e),easeOutBounce(e){let t=7.5625,n=2.75;return e<1/n?t*e*e:e<2/n?t*(e-=1.5/n)*e+.75:e<2.5/n?t*(e-=2.25/n)*e+.9375:t*(e-=2.625/n)*e+.984375},easeInOutBounce:e=>e<.5?hs.easeInBounce(e*2)*.5:hs.easeOutBounce(e*2-1)*.5+.5};function gs(e){if(e&&typeof e==`object`){let t=e.toString();return t===`[object CanvasPattern]`||t===`[object CanvasGradient]`}return!1}function _s(e){return gs(e)?e:new eo(e)}function vs(e){return gs(e)?e:new eo(e).saturate(.5).darken(.1).hexString()}var ys=[`x`,`y`,`borderWidth`,`radius`,`tension`],bs=[`color`,`borderColor`,`backgroundColor`];function xs(e){e.set(`animation`,{delay:void 0,duration:1e3,easing:`easeOutQuart`,fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),e.describe(`animation`,{_fallback:!1,_indexable:!1,_scriptable:e=>e!==`onProgress`&&e!==`onComplete`&&e!==`fn`}),e.set(`animations`,{colors:{type:`color`,properties:bs},numbers:{type:`number`,properties:ys}}),e.describe(`animations`,{_fallback:`animation`}),e.set(`transitions`,{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:`transparent`},visible:{type:`boolean`,duration:0}}},hide:{animations:{colors:{to:`transparent`},visible:{type:`boolean`,easing:`linear`,fn:e=>e|0}}}})}function Ss(e){e.set(`layout`,{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}var Cs=new Map;function ws(e,t){t=t||{};let n=e+JSON.stringify(t),r=Cs.get(n);return r||(r=new Intl.NumberFormat(e,t),Cs.set(n,r)),r}function Ts(e,t,n){return ws(t,n).format(e)}var Es={values(e){return q(e)?e:``+e},numeric(e,t,n){if(e===0)return`0`;let r=this.chart.options.locale,i,a=e;if(n.length>1){let t=Math.max(Math.abs(n[0].value),Math.abs(n[n.length-1].value));(t<1e-4||t>0x38d7ea4c68000)&&(i=`scientific`),a=Ds(e,n)}let o=jo(Math.abs(a)),s=isNaN(o)?1:Math.max(Math.min(-1*Math.floor(o),20),0),c={notation:i,minimumFractionDigits:s,maximumFractionDigits:s};return Object.assign(c,this.options.ticks.format),Ts(e,r,c)},logarithmic(e,t,n){if(e===0)return`0`;let r=n[t].significand||e/10**Math.floor(jo(e));return[1,2,3,5,10,15].includes(r)||t>.8*n.length?Es.numeric.call(this,e,t,n):``}};function Ds(e,t){let n=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(n)>=1&&e!==Math.floor(e)&&(n=e-Math.floor(e)),n}var Os={formatters:Es};function ks(e){e.set(`scale`,{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:`ticks`,clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(e,t)=>t.lineWidth,tickColor:(e,t)=>t.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:``,padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:``,padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Os.formatters.values,minor:{},major:{},align:`center`,crossAlign:`near`,showLabelBackdrop:!1,backdropColor:`rgba(255, 255, 255, 0.75)`,backdropPadding:2}}),e.route(`scale.ticks`,`color`,``,`color`),e.route(`scale.grid`,`color`,``,`borderColor`),e.route(`scale.border`,`color`,``,`borderColor`),e.route(`scale.title`,`color`,``,`color`),e.describe(`scale`,{_fallback:!1,_scriptable:e=>!e.startsWith(`before`)&&!e.startsWith(`after`)&&e!==`callback`&&e!==`parser`,_indexable:e=>e!==`borderDash`&&e!==`tickBorderDash`&&e!==`dash`}),e.describe(`scales`,{_fallback:`scale`}),e.describe(`scale.ticks`,{_scriptable:e=>e!==`backdropPadding`&&e!==`callback`,_indexable:e=>e!==`backdropPadding`})}var As=Object.create(null),js=Object.create(null);function Ms(e,t){if(!t)return e;let n=t.split(`.`);for(let t=0,r=n.length;te.chart.platform.getDevicePixelRatio(),this.elements={},this.events=[`mousemove`,`mouseout`,`click`,`touchstart`,`touchmove`],this.font={family:`'Helvetica Neue', 'Helvetica', 'Arial', sans-serif`,size:12,style:`normal`,lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(e,t)=>vs(t.backgroundColor),this.hoverBorderColor=(e,t)=>vs(t.borderColor),this.hoverColor=(e,t)=>vs(t.color),this.indexAxis=`x`,this.interaction={mode:`nearest`,intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(e),this.apply(t)}set(e,t){return Ns(this,e,t)}get(e){return Ms(this,e)}describe(e,t){return Ns(js,e,t)}override(e,t){return Ns(As,e,t)}route(e,t,n,r){let i=Ms(this,e),a=Ms(this,n),o=`_`+t;Object.defineProperties(i,{[o]:{value:i[t],writable:!0},[t]:{enumerable:!0,get(){let e=this[o],t=a[r];return J(e)?Object.assign({},t,e):Y(e,t)},set(e){this[o]=e}}})}apply(e){e.forEach(e=>e(this))}}({_scriptable:e=>!e.startsWith(`on`),_indexable:e=>e!==`events`,hover:{_fallback:`interaction`},interaction:{_scriptable:!1,_indexable:!1}},[xs,Ss,ks]);function Fs(e){return!e||K(e.size)||K(e.family)?null:(e.style?e.style+` `:``)+(e.weight?e.weight+` `:``)+e.size+`px `+e.family}function Is(e,t,n,r,i){let a=t[i];return a||(a=t[i]=e.measureText(i).width,n.push(i)),a>r&&(r=a),r}function Ls(e,t,n,r){r=r||{};let i=r.data=r.data||{},a=r.garbageCollect=r.garbageCollect||[];r.font!==t&&(i=r.data={},a=r.garbageCollect=[],r.font=t),e.save(),e.font=t;let o=0,s=n.length,c,l,u,d,f;for(c=0;cn.length){for(c=0;c0&&e.stroke()}}function Hs(e,t,n){return n=n||.5,!t||e&&e.x>t.left-n&&e.xt.top-n&&e.y0&&a.strokeColor!==``,c,l;for(e.save(),e.font=i.string,qs(e,a),c=0;c+e||0;function nc(e,t){let n={},r=J(t),i=r?Object.keys(t):t,a=J(e)?r?n=>Y(e[n],e[t[n]]):t=>e[t]:()=>e;for(let e of i)n[e]=tc(a(e));return n}function rc(e){return nc(e,{top:`y`,right:`x`,bottom:`y`,left:`x`})}function ic(e){return nc(e,[`topLeft`,`topRight`,`bottomLeft`,`bottomRight`])}function ac(e){let t=rc(e);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function oc(e,t){e=e||{},t=t||Ps.font;let n=Y(e.size,t.size);typeof n==`string`&&(n=parseInt(n,10));let r=Y(e.style,t.style);r&&!(``+r).match($s)&&(console.warn(`Invalid font style specified: "`+r+`"`),r=void 0);let i={family:Y(e.family,t.family),lineHeight:ec(Y(e.lineHeight,t.lineHeight),n),size:n,style:r,weight:Y(e.weight,t.weight),string:``};return i.string=Fs(i),i}function sc(e,t,n,r){let i=!0,a,o,s;for(a=0,o=e.length;an&&e===0?0:e+t;return{min:o(r,-Math.abs(a)),max:o(i,a)}}function lc(e,t){return Object.assign(Object.create(e),t)}function uc(e,t=[``],n,r,i=()=>e[0]){let a=n||e;return r===void 0&&(r=Ec(`_fallback`,e)),new Proxy({[Symbol.toStringTag]:`Object`,_cacheable:!0,_scopes:e,_rootScopes:a,_fallback:r,_getTarget:i,override:n=>uc([n,...e],t,a,r)},{deleteProperty(t,n){return delete t[n],delete t._keys,delete e[0][n],!0},get(n,r){return hc(n,r,()=>Tc(r,t,e,n))},getOwnPropertyDescriptor(e,t){return Reflect.getOwnPropertyDescriptor(e._scopes[0],t)},getPrototypeOf(){return Reflect.getPrototypeOf(e[0])},has(e,t){return Dc(e).includes(t)},ownKeys(e){return Dc(e)},set(e,t,n){let r=e._storage||(e._storage=i());return e[t]=r[t]=n,delete e._keys,!0}})}function dc(e,t,n,r){let i={_cacheable:!1,_proxy:e,_context:t,_subProxy:n,_stack:new Set,_descriptors:fc(e,r),setContext:t=>dc(e,t,n,r),override:i=>dc(e.override(i),t,n,r)};return new Proxy(i,{deleteProperty(t,n){return delete t[n],delete e[n],!0},get(e,t,n){return hc(e,t,()=>gc(e,t,n))},getOwnPropertyDescriptor(t,n){return t._descriptors.allKeys?Reflect.has(e,n)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(e,n)},getPrototypeOf(){return Reflect.getPrototypeOf(e)},has(t,n){return Reflect.has(e,n)},ownKeys(){return Reflect.ownKeys(e)},set(t,n,r){return e[n]=r,delete t[n],!0}})}function fc(e,t={scriptable:!0,indexable:!0}){let{_scriptable:n=t.scriptable,_indexable:r=t.indexable,_allKeys:i=t.allKeys}=e;return{allKeys:i,scriptable:n,indexable:r,isScriptable:So(n)?n:()=>n,isIndexable:So(r)?r:()=>r}}var pc=(e,t)=>e?e+bo(t):t,mc=(e,t)=>J(t)&&e!==`adapters`&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function hc(e,t,n){if(Object.prototype.hasOwnProperty.call(e,t)||t===`constructor`)return e[t];let r=n();return e[t]=r,r}function gc(e,t,n){let{_proxy:r,_context:i,_subProxy:a,_descriptors:o}=e,s=r[t];return So(s)&&o.isScriptable(t)&&(s=_c(t,s,e,n)),q(s)&&s.length&&(s=vc(t,s,e,o.isIndexable)),mc(t,s)&&(s=dc(s,i,a&&a[t],o)),s}function _c(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_stack:s}=n;if(s.has(e))throw Error(`Recursion detected: `+Array.from(s).join(`->`)+`->`+e);s.add(e);let c=t(a,o||r);return s.delete(e),mc(e,c)&&(c=Sc(i._scopes,i,e,c)),c}function vc(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_descriptors:s}=n;if(a.index!==void 0&&r(e))return t[a.index%t.length];if(J(t[0])){let n=t,r=i._scopes.filter(e=>e!==n);t=[];for(let c of n){let n=Sc(r,i,e,c);t.push(dc(n,a,o&&o[e],s))}}return t}function yc(e,t,n){return So(e)?e(t,n):e}var bc=(e,t)=>e===!0?t:typeof e==`string`?yo(t,e):void 0;function xc(e,t,n,r,i){for(let a of t){let t=bc(n,a);if(t){e.add(t);let a=yc(t._fallback,n,i);if(a!==void 0&&a!==n&&a!==r)return a}else if(t===!1&&r!==void 0&&n!==r)return null}return!1}function Sc(e,t,n,r){let i=t._rootScopes,a=yc(t._fallback,n,r),o=[...e,...i],s=new Set;s.add(r);let c=Cc(s,o,n,a||n,r);return c===null||a!==void 0&&a!==n&&(c=Cc(s,o,a,c,r),c===null)?!1:uc(Array.from(s),[``],i,a,()=>wc(t,n,r))}function Cc(e,t,n,r,i){for(;n;)n=xc(e,t,n,r,i);return n}function wc(e,t,n){let r=e._getTarget();t in r||(r[t]={});let i=r[t];return q(i)&&J(n)?n:i||{}}function Tc(e,t,n,r){let i;for(let a of t)if(i=Ec(pc(a,e),n),i!==void 0)return mc(e,i)?Sc(n,r,e,i):i}function Ec(e,t){for(let n of t){if(!n)continue;let t=n[e];if(t!==void 0)return t}}function Dc(e){let t=e._keys;return t||(t=e._keys=Oc(e._scopes)),t}function Oc(e){let t=new Set;for(let n of e)for(let e of Object.keys(n).filter(e=>!e.startsWith(`_`)))t.add(e);return Array.from(t)}function kc(e,t,n,r){let{iScale:i}=e,{key:a=`r`}=this._parsing,o=Array(r),s,c,l,u;for(s=0,c=r;ste===`x`?`y`:`x`;function Nc(e,t,n,r){let i=e.skip?t:e,a=t,o=n.skip?t:n,s=Wo(a,i),c=Wo(o,a),l=s/(s+c),u=c/(s+c);l=isNaN(l)?0:l,u=isNaN(u)?0:u;let d=r*l,f=r*u;return{previous:{x:a.x-d*(o.x-i.x),y:a.y-d*(o.y-i.y)},next:{x:a.x+f*(o.x-i.x),y:a.y+f*(o.y-i.y)}}}function Pc(e,t,n){let r=e.length,i,a,o,s,c,l=jc(e,0);for(let u=0;u!e.skip)),t.cubicInterpolationMode===`monotone`)Ic(e,i);else{let n=r?e[e.length-1]:e[0];for(a=0,o=e.length;ae.ownerDocument.defaultView.getComputedStyle(e,null);function Wc(e,t){return Uc(e).getPropertyValue(t)}var Gc=[`top`,`right`,`bottom`,`left`];function Kc(e,t,n){let r={};n=n?`-`+n:``;for(let i=0;i<4;i++){let a=Gc[i];r[a]=parseFloat(e[t+`-`+a+n])||0}return r.width=r.left+r.right,r.height=r.top+r.bottom,r}var qc=(e,t,n)=>(e>0||t>0)&&(!n||!n.shadowRoot);function Jc(e,t){let n=e.touches,r=n&&n.length?n[0]:e,{offsetX:i,offsetY:a}=r,o=!1,s,c;if(qc(i,a,e.target))s=i,c=a;else{let e=t.getBoundingClientRect();s=r.clientX-e.left,c=r.clientY-e.top,o=!0}return{x:s,y:c,box:o}}function Yc(e,t){if(`native`in e)return e;let{canvas:n,currentDevicePixelRatio:r}=t,i=Uc(n),a=i.boxSizing===`border-box`,o=Kc(i,`padding`),s=Kc(i,`border`,`width`),{x:c,y:l,box:u}=Jc(e,n),d=o.left+(u&&s.left),f=o.top+(u&&s.top),{width:p,height:m}=t;return a&&(p-=o.width+s.width,m-=o.height+s.height),{x:Math.round((c-d)/p*n.width/r),y:Math.round((l-f)/m*n.height/r)}}function Xc(e,t,n){let r,i;if(t===void 0||n===void 0){let a=e&&Vc(e);if(!a)t=e.clientWidth,n=e.clientHeight;else{let e=a.getBoundingClientRect(),o=Uc(a),s=Kc(o,`border`,`width`),c=Kc(o,`padding`);t=e.width-c.width-s.width,n=e.height-c.height-s.height,r=Hc(o.maxWidth,a,`clientWidth`),i=Hc(o.maxHeight,a,`clientHeight`)}}return{width:t,height:n,maxWidth:r||Eo,maxHeight:i||Eo}}var Zc=e=>Math.round(e*10)/10;function Qc(e,t,n,r){let i=Uc(e),a=Kc(i,`margin`),o=Hc(i.maxWidth,e,`clientWidth`)||Eo,s=Hc(i.maxHeight,e,`clientHeight`)||Eo,c=Xc(e,t,n),{width:l,height:u}=c;if(i.boxSizing===`content-box`){let e=Kc(i,`border`,`width`),t=Kc(i,`padding`);l-=t.width+e.width,u-=t.height+e.height}return l=Math.max(0,l-a.width),u=Math.max(0,r?l/r:u-a.height),l=Zc(Math.min(l,o,c.maxWidth)),u=Zc(Math.min(u,s,c.maxHeight)),l&&!u&&(u=Zc(l/2)),(t!==void 0||n!==void 0)&&r&&c.height&&u>c.height&&(u=c.height,l=Zc(Math.floor(u*r))),{width:l,height:u}}function $c(e,t,n){let r=t||1,i=Zc(e.height*r),a=Zc(e.width*r);e.height=Zc(e.height),e.width=Zc(e.width);let o=e.canvas;o.style&&(n||!o.style.height&&!o.style.width)&&(o.style.height=`${e.height}px`,o.style.width=`${e.width}px`);let s=Math.floor(i),c=Math.floor(a);return e.currentDevicePixelRatio!==r||o.height!==s||o.width!==c?(e.currentDevicePixelRatio=r,o.height=s,o.width=c,e.ctx.setTransform(r,0,0,r,0,0),!0):!1}var el=function(){let e=!1;try{let t={get passive(){return e=!0,!1}};Bc()&&(window.addEventListener(`test`,null,t),window.removeEventListener(`test`,null,t))}catch{}return e}();function tl(e,t){let n=Wc(e,t),r=n&&n.match(/^(\d+)(\.\d+)?px$/);return r?+r[1]:void 0}function nl(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:e.y+n*(t.y-e.y)}}function rl(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:r===`middle`?n<.5?e.y:t.y:r===`after`?n<1?e.y:t.y:n>0?t.y:e.y}}function il(e,t,n,r){let i={x:e.cp2x,y:e.cp2y},a={x:t.cp1x,y:t.cp1y},o=nl(e,i,n),s=nl(i,a,n),c=nl(a,t,n);return nl(nl(o,s,n),nl(s,c,n),n)}var al=function(e,t){return{x(n){return e+e+t-n},setWidth(e){t=e},textAlign(e){return e===`center`?e:e===`right`?`left`:`right`},xPlus(e,t){return e-t},leftForLtr(e,t){return e-t}}},ol=function(){return{x(e){return e},setWidth(e){},textAlign(e){return e},xPlus(e,t){return e+t},leftForLtr(e,t){return e}}};function sl(e,t,n){return e?al(t,n):ol()}function cl(e,t){let n,r;(t===`ltr`||t===`rtl`)&&(n=e.canvas.style,r=[n.getPropertyValue(`direction`),n.getPropertyPriority(`direction`)],n.setProperty(`direction`,t,`important`),e.prevTextDirection=r)}function ll(e,t){t!==void 0&&(delete e.prevTextDirection,e.canvas.style.setProperty(`direction`,t[0],t[1]))}function ul(e){return e===`angle`?{between:qo,compare:Go,normalize:Ko}:{between:Xo,compare:(e,t)=>e-t,normalize:e=>e}}function dl({start:e,end:t,count:n,loop:r,style:i}){return{start:e%n,end:t%n,loop:r&&(t-e+1)%n===0,style:i}}function fl(e,t,n){let{property:r,start:i,end:a}=n,{between:o,normalize:s}=ul(r),c=t.length,{start:l,end:u,loop:d}=e,f,p;if(d){for(l+=c,u+=c,f=0,p=c;fc(i,y,_)&&s(i,y)!==0,x=()=>s(a,_)===0||c(a,y,_),S=()=>h||b(),C=()=>!h||x();for(let e=u,n=u;e<=d;++e)v=t[e%o],!v.skip&&(_=l(v[r]),_!==y&&(h=c(_,i,a),g===null&&S()&&(g=s(_,i)===0?e:n),g!==null&&C()&&(m.push(dl({start:g,end:e,loop:f,count:o,style:p})),g=null),n=e,y=_));return g!==null&&m.push(dl({start:g,end:d,loop:f,count:o,style:p})),m}function ml(e,t){let n=[],r=e.segments;for(let i=0;ii&&e[a%t].skip;)a--;return a%=t,{start:i,end:a}}function gl(e,t,n,r){let i=e.length,a=[],o=t,s=e[t],c;for(c=t+1;c<=n;++c){let n=e[c%i];n.skip||n.stop?s.skip||(r=!1,a.push({start:t%i,end:(c-1)%i,loop:r}),t=o=n.stop?c:null):(o=c,s.skip&&(t=c)),s=n}return o!==null&&a.push({start:t%i,end:o%i,loop:r}),a}function _l(e,t){let n=e.points,r=e.options.spanGaps,i=n.length;if(!i)return[];let a=!!e._loop,{start:o,end:s}=hl(n,i,a,r);return r===!0?vl(e,[{start:o,end:s,loop:a}],n,t):vl(e,gl(n,o,sr({chart:e,initial:t.initial,numSteps:a,currentStep:Math.min(n-t.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=as.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(e=Date.now()){let t=0;this._charts.forEach((n,r)=>{if(!n.running||!n.items.length)return;let i=n.items,a=i.length-1,o=!1,s;for(;a>=0;--a)s=i[a],s._active?(s._total>n.duration&&(n.duration=s._total),s.tick(e),o=!0):(i[a]=i[i.length-1],i.pop());o&&(r.draw(),this._notify(r,n,e,`progress`)),i.length||(n.running=!1,this._notify(r,n,e,`complete`),n.initial=!1),t+=i.length}),this._lastDate=e,t===0&&(this._running=!1)}_getAnims(e){let t=this._charts,n=t.get(e);return n||(n={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},t.set(e,n)),n}listen(e,t,n){this._getAnims(e).listeners[t].push(n)}add(e,t){t&&t.length&&this._getAnims(e).items.push(...t)}has(e){return this._getAnims(e).items.length>0}start(e){let t=this._charts.get(e);t&&(t.running=!0,t.start=Date.now(),t.duration=t.items.reduce((e,t)=>Math.max(e,t._duration),0),this._refresh())}running(e){if(!this._running)return!1;let t=this._charts.get(e);return!(!t||!t.running||!t.items.length)}stop(e){let t=this._charts.get(e);if(!t||!t.items.length)return;let n=t.items,r=n.length-1;for(;r>=0;--r)n[r].cancel();t.items=[],this._notify(e,t,Date.now(),`complete`)}remove(e){return this._charts.delete(e)}},kl=`transparent`,Al={boolean(e,t,n){return n>.5?t:e},color(e,t,n){let r=_s(e||kl),i=r.valid&&_s(t||kl);return i&&i.valid?i.mix(r,n).hexString():t},number(e,t,n){return e+(t-e)*n}},jl=class{constructor(e,t,n,r){let i=t[n];r=sc([e.to,r,i,e.from]);let a=sc([e.from,i,r]);this._active=!0,this._fn=e.fn||Al[e.type||typeof a],this._easing=hs[e.easing]||hs.linear,this._start=Math.floor(Date.now()+(e.delay||0)),this._duration=this._total=Math.floor(e.duration),this._loop=!!e.loop,this._target=t,this._prop=n,this._from=a,this._to=r,this._promises=void 0}active(){return this._active}update(e,t,n){if(this._active){this._notify(!1);let r=this._target[this._prop],i=n-this._start,a=this._duration-i;this._start=n,this._duration=Math.floor(Math.max(a,e.duration)),this._total+=i,this._loop=!!e.loop,this._to=sc([e.to,t,r,e.from]),this._from=sc([e.from,r,t])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(e){let t=e-this._start,n=this._duration,r=this._prop,i=this._from,a=this._loop,o=this._to,s;this._active=i!==o&&(a||t1?2-s:s,s=this._easing(Math.min(1,Math.max(0,s))),this._target[r]=this._fn(i,o,s)):(this._target[r]=o,this._notify(!0))}wait(){let e=this._promises||(this._promises=[]);return new Promise((t,n)=>{e.push({res:t,rej:n})})}_notify(e){let t=e?`res`:`rej`,n=this._promises||[];for(let e=0;e{let i=e[r];if(!J(i))return;let a={};for(let e of t)a[e]=i[e];(q(i.properties)&&i.properties||[r]).forEach(e=>{e!==r&&n.has(e)||n.set(e,a)})})}_animateOptions(e,t){let n=t.options,r=Pl(e,n);if(!r)return[];let i=this._createAnimations(r,n);return n.$shared&&Nl(e.options.$animations,n).then(()=>{e.options=n},()=>{}),i}_createAnimations(e,t){let n=this._properties,r=[],i=e.$animations||(e.$animations={}),a=Object.keys(t),o=Date.now(),s;for(s=a.length-1;s>=0;--s){let c=a[s];if(c.charAt(0)===`$`)continue;if(c===`options`){r.push(...this._animateOptions(e,t));continue}let l=t[c],u=i[c],d=n.get(c);if(u){if(d&&u.active()){u.update(d,l,o);continue}u.cancel()}!d||!d.duration?e[c]=l:(i[c]=u=new jl(d,e,c,l),r.push(u))}return r}update(e,t){if(this._properties.size===0){Object.assign(e,t);return}let n=this._createAnimations(e,t);if(n.length)return Ol.add(this._chart,n),!0}};function Nl(e,t){let n=[],r=Object.keys(t);for(let t=0;t0||!n&&t<0)return i.index}return null}function Kl(e,t){let{chart:n,_cachedMeta:r}=e,i=n._stacks||(n._stacks={}),{iScale:a,vScale:o,index:s}=r,c=a.axis,l=o.axis,u=Hl(a,o,r),d=t.length,f;for(let e=0;en[e].axis===t).shift()}function Jl(e,t){return lc(e,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:`default`,type:`dataset`})}function Yl(e,t,n){return lc(e,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:n,index:t,mode:`default`,type:`data`})}function Xl(e,t){let n=e.controller.index,r=e.vScale&&e.vScale.axis;if(r){t=t||e._parsed;for(let e of t){let t=e._stacks;t&&t[r]!==void 0&&t[r][n]!==void 0&&(delete t[r][n],t[r]._visualValues!==void 0&&t[r]._visualValues[n]!==void 0&&delete t[r]._visualValues[n])}}}var Zl=e=>e===`reset`||e===`none`,Ql=(e,t)=>t?e:Object.assign({},e),$l=(e,t,n)=>e&&!t.hidden&&t._stacked&&{keys:Rl(n,!0),values:null},eu=class{constructor(e,t){this.chart=e,this._ctx=e.ctx,this.index=t,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){let e=this._cachedMeta;this.configure(),this.linkScales(),e._stacked=Vl(e.vScale,e),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled(`filler`)&&console.warn(`Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options`)}updateIndex(e){this.index!==e&&Xl(this._cachedMeta),this.index=e}linkScales(){let e=this.chart,t=this._cachedMeta,n=this.getDataset(),r=(e,t,n,r)=>e===`x`?t:e===`r`?r:n,i=t.xAxisID=Y(n.xAxisID,ql(e,`x`)),a=t.yAxisID=Y(n.yAxisID,ql(e,`y`)),o=t.rAxisID=Y(n.rAxisID,ql(e,`r`)),s=t.indexAxis,c=t.iAxisID=r(s,i,a,o),l=t.vAxisID=r(s,a,i,o);t.xScale=this.getScaleForId(i),t.yScale=this.getScaleForId(a),t.rScale=this.getScaleForId(o),t.iScale=this.getScaleForId(c),t.vScale=this.getScaleForId(l)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(e){return this.chart.scales[e]}_getOtherScale(e){let t=this._cachedMeta;return e===t.iScale?t.vScale:t.iScale}reset(){this._update(`reset`)}_destroy(){let e=this._cachedMeta;this._data&&rs(this._data,this),e._stacked&&Xl(e)}_dataCheck(){let e=this.getDataset(),t=e.data||(e.data=[]),n=this._data;if(J(t)){let e=this._cachedMeta;this._data=Bl(t,e)}else if(n!==t){if(n){rs(n,this);let e=this._cachedMeta;Xl(e),e._parsed=[]}t&&Object.isExtensible(t)&&ns(t,this),this._syncList=[],this._data=t}}addElements(){let e=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(e.dataset=new this.datasetElementType)}buildOrUpdateElements(e){let t=this._cachedMeta,n=this.getDataset(),r=!1;this._dataCheck();let i=t._stacked;t._stacked=Vl(t.vScale,t),t.stack!==n.stack&&(r=!0,Xl(t),t.stack=n.stack),this._resyncElements(e),(r||i!==t._stacked)&&(Kl(this,t._parsed),t._stacked=Vl(t.vScale,t))}configure(){let e=this.chart.config,t=e.datasetScopeKeys(this._type),n=e.getOptionScopes(this.getDataset(),t,!0);this.options=e.createResolver(n,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(e,t){let{_cachedMeta:n,_data:r}=this,{iScale:i,_stacked:a}=n,o=i.axis,s=e===0&&t===r.length||n._sorted,c=e>0&&n._parsed[e-1],l,u,d;if(this._parsing===!1)n._parsed=r,n._sorted=!0,d=r;else{d=q(r[e])?this.parseArrayData(n,r,e,t):J(r[e])?this.parseObjectData(n,r,e,t):this.parsePrimitiveData(n,r,e,t);let i=()=>u[o]===null||c&&u[o]t||u=0;--d)if(!p()){this.updateRangeFromParsed(c,e,f,s);break}}return c}getAllParsedValues(e){let t=this._cachedMeta._parsed,n=[],r,i,a;for(r=0,i=t.length;r=0&&ethis.getContext(n,r,t),u);return p.$shared&&(p.$shared=s,i[a]=Object.freeze(Ql(p,s))),p}_resolveAnimations(e,t,n){let r=this.chart,i=this._cachedDataOpts,a=`animation-${t}`,o=i[a];if(o)return o;let s;if(r.options.animation!==!1){let r=this.chart.config,i=r.datasetAnimationScopeKeys(this._type,t),a=r.getOptionScopes(this.getDataset(),i);s=r.createResolver(a,this.getContext(e,n,t))}let c=new Ml(r,s&&s.animations);return s&&s._cacheable&&(i[a]=Object.freeze(c)),c}getSharedOptions(e){if(e.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},e))}includeOptions(e,t){return!t||Zl(e)||this.chart._animationsDisabled}_getSharedOptions(e,t){let n=this.resolveDataElementOptions(e,t),r=this._sharedOptions,i=this.getSharedOptions(n),a=this.includeOptions(t,i)||i!==r;return this.updateSharedOptions(i,t,n),{sharedOptions:i,includeOptions:a}}updateElement(e,t,n,r){Zl(r)?Object.assign(e,n):this._resolveAnimations(t,r).update(e,n)}updateSharedOptions(e,t,n){e&&!Zl(t)&&this._resolveAnimations(void 0,t).update(e,n)}_setStyle(e,t,n,r){e.active=r;let i=this.getStyle(t,r);this._resolveAnimations(t,n,r).update(e,{options:!r&&this.getSharedOptions(i)||i})}removeHoverStyle(e,t,n){this._setStyle(e,n,`active`,!1)}setHoverStyle(e,t,n){this._setStyle(e,n,`active`,!0)}_removeDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!1)}_setDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!0)}_resyncElements(e){let t=this._data,n=this._cachedMeta.data;for(let[e,t,n]of this._syncList)this[e](t,n);this._syncList=[];let r=n.length,i=t.length,a=Math.min(i,r);a&&this.parse(0,a),i>r?this._insertElements(r,i-r,e):i{for(e.length+=t,o=e.length-1;o>=a;o--)e[o]=e[o-t]};for(s(i),o=e;oe-t))}return e._cache.$bar}function nu(e){let t=e.iScale,n=tu(t,e.type),r=t._length,i,a,o,s,c=()=>{o!==32767&&o!==-32768&&(xo(s)&&(r=Math.min(r,Math.abs(o-s)||r)),s=o)};for(i=0,a=n.length;i0?i[e-1]:null,s=eMath.abs(s)&&(c=s,l=o),t[n.axis]=l,t._custom={barStart:c,barEnd:l,start:i,end:a,min:o,max:s}}function ou(e,t,n,r){return q(e)?au(e,t,n,r):t[n.axis]=n.parse(e,r),t}function su(e,t,n,r){let i=e.iScale,a=e.vScale,o=i.getLabels(),s=i===a,c=[],l,u,d,f;for(l=n,u=n+r;l=n?1:-1):Mo(e)}function uu(e){let t,n,r,i,a;return e.horizontal?(t=e.base>e.x,n=`left`,r=`right`):(t=e.basee.controller.options.grouped),i=n.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(t),s=o&&o[n.axis],c=e=>{let t=e._parsed.find(e=>e[n.axis]===s),r=t&&t[e.vScale.axis];if(K(r)||isNaN(r))return!0};for(let n of r)if(!(t!==void 0&&c(n))&&((i===!1||a.indexOf(n.stack)===-1||i===void 0&&n.stack===void 0)&&a.push(n.stack),n.index===e))break;return a.length||a.push(void 0),a}_getStackCount(e){return this._getStacks(void 0,e).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){let e=this.chart.scales,t=this.chart.options.indexAxis;return Object.keys(e).filter(n=>e[n].axis===t).shift()}_getAxis(){let e={},t=this.getFirstScaleIdForIndexAxis();for(let n of this.chart.data.datasets)e[Y(this.chart.options.indexAxis===`x`?n.xAxisID:n.yAxisID,t)]=!0;return Object.keys(e)}_getStackIndex(e,t,n){let r=this._getStacks(e,n),i=t===void 0?-1:r.indexOf(t);return i===-1?r.length-1:i}_getRuler(){let e=this.options,t=this._cachedMeta,n=t.iScale,r=[],i,a;for(i=0,a=t.data.length;i=0;--n)t=Math.max(t,e[n].size(this.resolveDataElementOptions(n))/2);return t>0&&t}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart.data.labels||[],{xScale:r,yScale:i}=t,a=this.getParsed(e),o=r.getLabelForValue(a.x),s=i.getLabelForValue(a.y),c=a._custom;return{label:n[e]||``,value:`(`+o+`, `+s+(c?`, `+c:``)+`)`}}update(e){let t=this._cachedMeta.data;this.updateElements(t,0,t.length,e)}updateElements(e,t,n,r){let i=r===`reset`,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:s,includeOptions:c}=this._getSharedOptions(t,r),l=a.axis,u=o.axis;for(let d=t;dqo(e,s,c,!0)?1:Math.max(t,t*n,r,r*n),m=(e,t,r)=>qo(e,s,c,!0)?-1:Math.min(t,t*n,r,r*n),h=p(0,l,d),g=p(Oo,u,f),_=m(Z,l,d),v=m(Z+Oo,u,f);r=(h-_)/2,i=(g-v)/2,a=-(h+_)/2,o=-(g+v)/2}return{ratioX:r,ratioY:i,offsetX:a,offsetY:o}}var yu=class extends eu{constructor(e,t){super(e,t),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(e,t){let n=this.getDataset().data,r=this._cachedMeta;if(this._parsing===!1)r._parsed=n;else{let i=e=>+n[e];if(J(n[e])){let{key:e=`value`}=this._parsing;i=t=>+yo(n[t],e)}let a,o;for(a=e,o=e+t;a0&&!isNaN(e)?Math.abs(e)/t*Q:0}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart,r=n.data.labels||[],i=Ts(t._parsed[e],n.options.locale);return{label:r[e]||``,value:i}}getMaxBorderWidth(e){let t=0,n=this.chart,r,i,a,o,s;if(!e){for(r=0,i=n.data.datasets.length;re!==`spacing`&&e!==`spacingMode`,_indexable:e=>e!==`spacing`&&e!==`spacingMode`&&!e.startsWith(`borderDash`)&&!e.startsWith(`hoverBorderDash`)}),$(yu,`overrides`,{aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){let t=e.data,{labels:{pointStyle:n,textAlign:r,color:i,useBorderRadius:a,borderRadius:o}}=e.legend.options;return t.labels.length&&t.datasets.length?t.labels.map((t,s)=>{let c=e.getDatasetMeta(0).controller.getStyle(s);return{text:t,fillStyle:c.backgroundColor,fontColor:i,hidden:!e.getDataVisibility(s),lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:c.borderWidth,strokeStyle:c.borderColor,textAlign:r,pointStyle:n,borderRadius:a&&(o||c.borderRadius),index:s}}):[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}}});var bu=class extends eu{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(e){let t=this._cachedMeta,{dataset:n,data:r=[],_dataset:i}=t,a=this.chart._animationsDisabled,{start:o,count:s}=us(t,r,a);this._drawStart=o,this._drawCount=s,ds(t)&&(o=0,s=r.length),n._chart=this.chart,n._datasetIndex=this.index,n._decimated=!!i._decimated,n.points=r;let c=this.resolveDatasetElementOptions(e);this.options.showLine||(c.borderWidth=0),c.segment=this.options.segment,this.updateElement(n,void 0,{animated:!a,options:c},e),this.updateElements(r,o,s,e)}updateElements(e,t,n,r){let i=r===`reset`,{iScale:a,vScale:o,_stacked:s,_dataset:c}=this._cachedMeta,{sharedOptions:l,includeOptions:u}=this._getSharedOptions(t,r),d=a.axis,f=o.axis,{spanGaps:p,segment:m}=this.options,h=Lo(p)?p:1/0,g=this.chart._animationsDisabled||i||r===`none`,_=t+n,v=e.length,y=t>0&&this.getParsed(t-1);for(let n=0;n=_){v.skip=!0;continue}let b=this.getParsed(n),x=K(b[f]),S=v[d]=a.getPixelForValue(b[d],n),C=v[f]=i||x?o.getBasePixel():o.getPixelForValue(s?this.applyStack(o,b,s):b[f],n);v.skip=isNaN(S)||isNaN(C)||x,v.stop=n>0&&Math.abs(b[d]-y[d])>h,m&&(v.parsed=b,v.raw=c.data[n]),u&&(v.options=l||this.resolveDataElementOptions(n,p.active?`active`:r)),g||this.updateElement(p,n,v,r),y=b}}getMaxOverflow(){let e=this._cachedMeta,t=e.dataset,n=t.options&&t.options.borderWidth||0,r=e.data||[];if(!r.length)return n;let i=r[0].size(this.resolveDataElementOptions(0)),a=r[r.length-1].size(this.resolveDataElementOptions(r.length-1));return Math.max(n,i,a)/2}draw(){let e=this._cachedMeta;e.dataset.updateControlPoints(this.chart.chartArea,e.iScale.axis),super.draw()}};$(bu,`id`,`line`),$(bu,`defaults`,{datasetElementType:`line`,dataElementType:`point`,showLine:!0,spanGaps:!1}),$(bu,`overrides`,{scales:{_index_:{type:`category`},_value_:{type:`linear`}}});var xu=class extends eu{constructor(e,t){super(e,t),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart,r=n.data.labels||[],i=Ts(t._parsed[e].r,n.options.locale);return{label:r[e]||``,value:i}}parseObjectData(e,t,n,r){return kc.bind(this)(e,t,n,r)}update(e){let t=this._cachedMeta.data;this._updateRadius(),this.updateElements(t,0,t.length,e)}getMinMax(){let e=this._cachedMeta,t={min:1/0,max:-1/0};return e.data.forEach((e,n)=>{let r=this.getParsed(n).r;!isNaN(r)&&this.chart.getDataVisibility(n)&&(rt.max&&(t.max=r))}),t}_updateRadius(){let e=this.chart,t=e.chartArea,n=e.options,r=Math.min(t.right-t.left,t.bottom-t.top),i=Math.max(r/2,0),a=(i-Math.max(n.cutoutPercentage?i/100*n.cutoutPercentage:1,0))/e.getVisibleDatasetCount();this.outerRadius=i-a*this.index,this.innerRadius=this.outerRadius-a}updateElements(e,t,n,r){let i=r===`reset`,a=this.chart,o=a.options.animation,s=this._cachedMeta.rScale,c=s.xCenter,l=s.yCenter,u=s.getIndexAngle(0)-.5*Z,d=u,f,p=360/this.countVisibleElements();for(f=0;f{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&t++}),t}_computeAngle(e,t,n){return this.chart.getDataVisibility(e)?Bo(this.resolveDataElementOptions(e,t).angle||n):0}};$(xu,`id`,`polarArea`),$(xu,`defaults`,{dataElementType:`arc`,animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:`number`,properties:[`x`,`y`,`startAngle`,`endAngle`,`innerRadius`,`outerRadius`]}},indexAxis:`r`,startAngle:0,spacing:0,spacingMode:`proportional`}),$(xu,`overrides`,{aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){let t=e.data;if(t.labels.length&&t.datasets.length){let{labels:{pointStyle:n,color:r}}=e.legend.options;return t.labels.map((t,i)=>{let a=e.getDatasetMeta(0).controller.getStyle(i);return{text:t,fillStyle:a.backgroundColor,strokeStyle:a.borderColor,fontColor:r,lineWidth:a.borderWidth,pointStyle:n,hidden:!e.getDataVisibility(i),index:i}})}return[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}},scales:{r:{type:`radialLinear`,angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});var Su=class extends yu{};$(Su,`id`,`pie`),$(Su,`defaults`,{cutout:0,rotation:0,circumference:360,radius:`100%`});var Cu=class extends eu{getLabelAndValue(e){let t=this._cachedMeta.vScale,n=this.getParsed(e);return{label:t.getLabels()[e],value:``+t.getLabelForValue(n[t.axis])}}parseObjectData(e,t,n,r){return kc.bind(this)(e,t,n,r)}update(e){let t=this._cachedMeta,n=t.dataset,r=t.data||[],i=t.iScale.getLabels();if(n.points=r,e!==`resize`){let t=this.resolveDatasetElementOptions(e);this.options.showLine||(t.borderWidth=0);let a={_loop:!0,_fullLoop:i.length===r.length,options:t};this.updateElement(n,void 0,a,e)}this.updateElements(r,0,r.length,e)}updateElements(e,t,n,r){let i=this._cachedMeta.rScale,a=r===`reset`;for(let o=t;o0&&this.getParsed(t-1);for(let l=t;l0&&Math.abs(n[f]-v[f])>g,h&&(m.parsed=n,m.raw=c.data[l]),d&&(m.options=u||this.resolveDataElementOptions(l,t.active?`active`:r)),_||this.updateElement(t,l,m,r),v=n}this.updateSharedOptions(u,r,l)}getMaxOverflow(){let e=this._cachedMeta,t=e.data||[];if(!this.options.showLine){let e=0;for(let n=t.length-1;n>=0;--n)e=Math.max(e,t[n].size(this.resolveDataElementOptions(n))/2);return e>0&&e}let n=e.dataset,r=n.options&&n.options.borderWidth||0;if(!t.length)return r;let i=t[0].size(this.resolveDataElementOptions(0)),a=t[t.length-1].size(this.resolveDataElementOptions(t.length-1));return Math.max(r,i,a)/2}};$(wu,`id`,`scatter`),$(wu,`defaults`,{datasetElementType:!1,dataElementType:`point`,showLine:!1,fill:!1}),$(wu,`overrides`,{interaction:{mode:`point`},scales:{x:{type:`linear`},y:{type:`linear`}}});function Tu(){throw Error(`This method is not implemented: Check that a complete date adapter is provided.`)}var Eu={_date:class e{static override(t){Object.assign(e.prototype,t)}constructor(e){$(this,`options`,void 0),this.options=e||{}}init(){}formats(){return Tu()}parse(){return Tu()}format(){return Tu()}add(){return Tu()}diff(){return Tu()}startOf(){return Tu()}endOf(){return Tu()}}};function Du(e,t,n,r){let{controller:i,data:a,_sorted:o}=e,s=i._cachedMeta.iScale,c=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null;if(s&&t===s.axis&&t!==`r`&&o&&a.length){let o=s._reversePixels?$o:Qo;if(!r){let r=o(a,t,n);if(c){let{vScale:t}=i._cachedMeta,{_parsed:n}=e,a=n.slice(0,r.lo+1).reverse().findIndex(e=>!K(e[t.axis]));r.lo-=Math.max(0,a);let o=n.slice(r.hi).findIndex(e=>!K(e[t.axis]));r.hi+=Math.max(0,o)}return r}if(i._sharedOptions){let e=a[0],r=typeof e.getRange==`function`&&e.getRange(t);if(r){let e=o(a,t,n-r),i=o(a,t,n+r);return{lo:e.lo,hi:i.hi}}}}return{lo:0,hi:a.length-1}}function Ou(e,t,n,r,i){let a=e.getSortedVisibleDatasetMetas(),o=n[t];for(let e=0,n=a.length;e{e[o]&&e[o](t[n],i)&&(a.push({element:e,datasetIndex:r,index:c}),s=s||e.inRange(t.x,t.y,i))}),r&&!s?[]:a}var Fu={evaluateInteractionItems:Ou,modes:{index(e,t,n,r){let i=Yc(t,e),a=n.axis||`x`,o=n.includeInvisible||!1,s=n.intersect?Au(e,i,a,r,o):Nu(e,i,a,!1,r,o),c=[];return s.length?(e.getSortedVisibleDatasetMetas().forEach(e=>{let t=s[0].index,n=e.data[t];n&&!n.skip&&c.push({element:n,datasetIndex:e.index,index:t})}),c):[]},dataset(e,t,n,r){let i=Yc(t,e),a=n.axis||`xy`,o=n.includeInvisible||!1,s=n.intersect?Au(e,i,a,r,o):Nu(e,i,a,!1,r,o);if(s.length>0){let t=s[0].datasetIndex,n=e.getDatasetMeta(t).data;s=[];for(let e=0;ee.pos===t)}function Ru(e,t){return e.filter(e=>Iu.indexOf(e.pos)===-1&&e.box.axis===t)}function zu(e,t){return e.sort((e,n)=>{let r=t?n:e,i=t?e:n;return r.weight===i.weight?r.index-i.index:r.weight-i.weight})}function Bu(e){let t=[],n,r,i,a,o,s;for(n=0,r=(e||[]).length;ne.box.fullSize),!0),r=zu(Lu(t,`left`),!0),i=zu(Lu(t,`right`)),a=zu(Lu(t,`top`),!0),o=zu(Lu(t,`bottom`)),s=Ru(t,`x`),c=Ru(t,`y`);return{fullSize:n,leftAndTop:r.concat(a),rightAndBottom:i.concat(c).concat(o).concat(s),chartArea:Lu(t,`chartArea`),vertical:r.concat(i).concat(c),horizontal:a.concat(o).concat(s)}}function Wu(e,t,n,r){return Math.max(e[n],t[n])+Math.max(e[r],t[r])}function Gu(e,t){e.top=Math.max(e.top,t.top),e.left=Math.max(e.left,t.left),e.bottom=Math.max(e.bottom,t.bottom),e.right=Math.max(e.right,t.right)}function Ku(e,t,n,r){let{pos:i,box:a}=n,o=e.maxPadding;if(!J(i)){n.size&&(e[i]-=n.size);let t=r[n.stack]||{size:0,count:1};t.size=Math.max(t.size,n.horizontal?a.height:a.width),n.size=t.size/t.count,e[i]+=n.size}a.getPadding&&Gu(o,a.getPadding());let s=Math.max(0,t.outerWidth-Wu(o,e,`left`,`right`)),c=Math.max(0,t.outerHeight-Wu(o,e,`top`,`bottom`)),l=s!==e.w,u=c!==e.h;return e.w=s,e.h=c,n.horizontal?{same:l,other:u}:{same:u,other:l}}function qu(e){let t=e.maxPadding;function n(n){let r=Math.max(t[n]-e[n],0);return e[n]+=r,r}e.y+=n(`top`),e.x+=n(`left`),n(`right`),n(`bottom`)}function Ju(e,t){let n=t.maxPadding;function r(e){let r={left:0,top:0,right:0,bottom:0};return e.forEach(e=>{r[e]=Math.max(t[e],n[e])}),r}return r(e?[`left`,`right`]:[`top`,`bottom`])}function Yu(e,t,n,r){let i=[],a,o,s,c,l,u;for(a=0,o=e.length,l=0;a{typeof e.beforeLayout==`function`&&e.beforeLayout()});let u=c.reduce((e,t)=>t.box.options&&t.box.options.display===!1?e:e+1,0)||1,d=Object.freeze({outerWidth:t,outerHeight:n,padding:i,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/u,hBoxMaxHeight:o/2}),f=Object.assign({},i);Gu(f,ac(r));let p=Object.assign({maxPadding:f,w:a,h:o,x:i.left,y:i.top},i),m=Hu(c.concat(l),d);Yu(s.fullSize,p,d,m),Yu(c,p,d,m),Yu(l,p,d,m)&&Yu(c,p,d,m),qu(p),Zu(s.leftAndTop,p,d,m),p.x+=p.w,p.y+=p.h,Zu(s.rightAndBottom,p,d,m),e.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},X(s.chartArea,t=>{let n=t.box;Object.assign(n,e.chartArea),n.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}},$u=class{acquireContext(e,t){}releaseContext(e){return!1}addEventListener(e,t,n){}removeEventListener(e,t,n){}getDevicePixelRatio(){return 1}getMaximumSize(e,t,n,r){return t=Math.max(0,t||e.width),n=n||e.height,{width:t,height:Math.max(0,r?Math.floor(t/r):n)}}isAttached(e){return!0}updateConfig(e){}},ed=class extends $u{acquireContext(e){return e&&e.getContext&&e.getContext(`2d`)||null}updateConfig(e){e.options.animation=!1}},td=`$chartjs`,nd={touchstart:`mousedown`,touchmove:`mousemove`,touchend:`mouseup`,pointerenter:`mouseenter`,pointerdown:`mousedown`,pointermove:`mousemove`,pointerup:`mouseup`,pointerleave:`mouseout`,pointerout:`mouseout`},rd=e=>e===null||e===``;function id(e,t){let n=e.style,r=e.getAttribute(`height`),i=e.getAttribute(`width`);if(e[td]={initial:{height:r,width:i,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||`block`,n.boxSizing=n.boxSizing||`border-box`,rd(i)){let t=tl(e,`width`);t!==void 0&&(e.width=t)}if(rd(r)){if(e.style.height===``)e.height=e.width/(t||2);else{let t=tl(e,`height`);t!==void 0&&(e.height=t)}}return e}var ad=el?{passive:!0}:!1;function od(e,t,n){e&&e.addEventListener(t,n,ad)}function sd(e,t,n){e&&e.canvas&&e.canvas.removeEventListener(t,n,ad)}function cd(e,t){let n=nd[e.type]||e.type,{x:r,y:i}=Yc(e,t);return{type:n,chart:t,native:e,x:r===void 0?null:r,y:i===void 0?null:i}}function ld(e,t){for(let n of e)if(n===t||n.contains(t))return!0}function ud(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t=t||ld(n.addedNodes,r),t=t&&!ld(n.removedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}function dd(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t=t||ld(n.removedNodes,r),t=t&&!ld(n.addedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}var fd=new Map,pd=0;function md(){let e=window.devicePixelRatio;e!==pd&&(pd=e,fd.forEach((t,n)=>{n.currentDevicePixelRatio!==e&&t()}))}function hd(e,t){fd.size||window.addEventListener(`resize`,md),fd.set(e,t)}function gd(e){fd.delete(e),fd.size||window.removeEventListener(`resize`,md)}function _d(e,t,n){let r=e.canvas,i=r&&Vc(r);if(!i)return;let a=os((e,t)=>{let r=i.clientWidth;n(e,t),r{let t=e[0],n=t.contentRect.width,r=t.contentRect.height;(n!==0||r!==0)&&a(n,r)});return o.observe(i),hd(e,a),o}function vd(e,t,n){n&&n.disconnect(),t===`resize`&&gd(e)}function yd(e,t,n){let r=e.canvas,i=os(t=>{e.ctx!==null&&n(cd(t,e))},e);return od(r,t,i),i}var bd=class extends $u{acquireContext(e,t){let n=e&&e.getContext&&e.getContext(`2d`);return n&&n.canvas===e?(id(e,t),n):null}releaseContext(e){let t=e.canvas;if(!t[td])return!1;let n=t[td].initial;[`height`,`width`].forEach(e=>{let r=n[e];K(r)?t.removeAttribute(e):t.setAttribute(e,r)});let r=n.style||{};return Object.keys(r).forEach(e=>{t.style[e]=r[e]}),t.width=t.width,delete t[td],!0}addEventListener(e,t,n){this.removeEventListener(e,t);let r=e.$proxies||(e.$proxies={});r[t]=({attach:ud,detach:dd,resize:_d}[t]||yd)(e,t,n)}removeEventListener(e,t){let n=e.$proxies||(e.$proxies={}),r=n[t];r&&(({attach:vd,detach:vd,resize:vd}[t]||sd)(e,t,r),n[t]=void 0)}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(e,t,n,r){return Qc(e,t,n,r)}isAttached(e){let t=e&&Vc(e);return!!(t&&t.isConnected)}};function xd(e){return!Bc()||typeof OffscreenCanvas<`u`&&e instanceof OffscreenCanvas?ed:bd}var Sd=class{constructor(){$(this,`x`,void 0),$(this,`y`,void 0),$(this,`active`,!1),$(this,`options`,void 0),$(this,`$animations`,void 0)}tooltipPosition(e){let{x:t,y:n}=this.getProps([`x`,`y`],e);return{x:t,y:n}}hasValue(){return Lo(this.x)&&Lo(this.y)}getProps(e,t){let n=this.$animations;if(!t||!n)return this;let r={};return e.forEach(e=>{r[e]=n[e]&&n[e].active()?n[e]._to:this[e]}),r}};$(Sd,`defaults`,{}),$(Sd,`defaultRoutes`,void 0);function Cd(e,t){let n=e.options.ticks,r=wd(e),i=Math.min(n.maxTicksLimit||r,r),a=n.major.enabled?Ed(t):[],o=a.length,s=a[0],c=a[o-1],l=[];if(o>i)return Dd(t,l,a,o/i),l;let u=Td(a,t,i);if(o>0){let e,n,r=o>1?Math.round((c-s)/(o-1)):null;for(Od(t,l,u,K(r)?0:s-r,s),e=0,n=o-1;ei)return t}return Math.max(i,1)}function Ed(e){let t=[],n,r;for(n=0,r=e.length;ne===`left`?`right`:e===`right`?`left`:e,jd=(e,t,n)=>t===`top`||t===`left`?e[t]+n:e[t]-n,Md=(e,t)=>Math.min(t||e,e);function Nd(e,t){let n=[],r=e.length/t,i=e.length,a=0;for(;ao+s)))return c}function Fd(e,t){X(e,e=>{let n=e.gc,r=n.length/2,i;if(r>t){for(i=0;in?n:t,n=r&&t>n?t:n,{min:io(t,io(n,t)),max:io(n,io(t,n))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){let e=this.chart.data;return this.options.labels||(this.isHorizontal()?e.xLabels:e.yLabels)||e.labels||[]}getLabelItems(e=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(e))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){so(this.options.beforeUpdate,[this])}update(e,t,n){let{beginAtZero:r,grace:i,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=e,this.maxHeight=t,this._margins=n=Object.assign({left:0,right:0,top:0,bottom:0},n),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+n.left+n.right:this.height+n.top+n.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=cc(this,i,r),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();let s=o=i||n<=1||!this.isHorizontal()){this.labelRotation=r;return}let l=this._getLabelSizes(),u=l.widest.width,d=l.highest.height,f=Jo(this.chart.width-u,0,this.maxWidth);o=e.offset?this.maxWidth/n:f/(n-1),u+6>o&&(o=f/(n-(e.offset?.5:1)),s=this.maxHeight-Id(e.grid)-t.padding-Ld(e.title,this.chart.options.font),c=Math.sqrt(u*u+d*d),a=Vo(Math.min(Math.asin(Jo((l.highest.height+6)/o,-1,1)),Math.asin(Jo(s/c,-1,1))-Math.asin(Jo(d/c,-1,1)))),a=Math.max(r,Math.min(i,a))),this.labelRotation=a}afterCalculateLabelRotation(){so(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){so(this.options.beforeFit,[this])}fit(){let e={width:0,height:0},{chart:t,options:{ticks:n,title:r,grid:i}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){let a=Ld(r,t.options.font);if(o?(e.width=this.maxWidth,e.height=Id(i)+a):(e.height=this.maxHeight,e.width=Id(i)+a),n.display&&this.ticks.length){let{first:t,last:r,widest:i,highest:a}=this._getLabelSizes(),s=n.padding*2,c=Bo(this.labelRotation),l=Math.cos(c),u=Math.sin(c);if(o){let t=n.mirror?0:u*i.width+l*a.height;e.height=Math.min(this.maxHeight,e.height+t+s)}else{let t=n.mirror?0:l*i.width+u*a.height;e.width=Math.min(this.maxWidth,e.width+t+s)}this._calculatePadding(t,r,u,l)}}this._handleMargins(),o?(this.width=this._length=t.width-this._margins.left-this._margins.right,this.height=e.height):(this.width=e.width,this.height=this._length=t.height-this._margins.top-this._margins.bottom)}_calculatePadding(e,t,n,r){let{ticks:{align:i,padding:a},position:o}=this.options,s=this.labelRotation!==0,c=o!==`top`&&this.axis===`x`;if(this.isHorizontal()){let o=this.getPixelForTick(0)-this.left,l=this.right-this.getPixelForTick(this.ticks.length-1),u=0,d=0;s?c?(u=r*e.width,d=n*t.height):(u=n*e.height,d=r*t.width):i===`start`?d=t.width:i===`end`?u=e.width:i!==`inner`&&(u=e.width/2,d=t.width/2),this.paddingLeft=Math.max((u-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((d-l+a)*this.width/(this.width-l),0)}else{let n=t.height/2,r=e.height/2;i===`start`?(n=0,r=e.height):i===`end`&&(n=t.height,r=0),this.paddingTop=n+a,this.paddingBottom=r+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){so(this.options.afterFit,[this])}isHorizontal(){let{axis:e,position:t}=this.options;return t===`top`||t===`bottom`||e===`x`}isFullSize(){return this.options.fullSize}_convertTicksToLabels(e){this.beforeTickToLabelConversion(),this.generateTickLabels(e);let t,n;for(t=0,n=e.length;t({width:a[e]||0,height:o[e]||0});return{first:C(0),last:C(t-1),widest:C(x),highest:C(S),widths:a,heights:o}}getLabelForValue(e){return e}getPixelForValue(e,t){return NaN}getValueForPixel(e){}getPixelForTick(e){let t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e].value)}getPixelForDecimal(e){this._reversePixels&&(e=1-e);let t=this._startPixel+e*this._length;return Yo(this._alignToPixels?Rs(this.chart,t,0):t)}getDecimalForPixel(e){let t=(e-this._startPixel)/this._length;return this._reversePixels?1-t:t}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){let{min:e,max:t}=this;return e<0&&t<0?t:e>0&&t>0?e:0}getContext(e){let t=this.ticks||[];if(e>=0&&eo*r?o/n:s/r:s*r0:!!e}_computeGridLineItems(e){let t=this.axis,n=this.chart,r=this.options,{grid:i,position:a,border:o}=r,s=i.offset,c=this.isHorizontal(),l=this.ticks.length+ +!!s,u=Id(i),d=[],f=o.setContext(this.getContext()),p=f.display?f.width:0,m=p/2,h=function(e){return Rs(n,e,p)},g,_,v,y,b,x,S,C,w,T,E,D;if(a===`top`)g=h(this.bottom),x=this.bottom-u,C=g-m,T=h(e.top)+m,D=e.bottom;else if(a===`bottom`)g=h(this.top),T=e.top,D=h(e.bottom)-m,x=g+m,C=this.top+u;else if(a===`left`)g=h(this.right),b=this.right-u,S=g-m,w=h(e.left)+m,E=e.right;else if(a===`right`)g=h(this.left),w=e.left,E=h(e.right)-m,b=g+m,S=this.left+u;else if(t===`x`){if(a===`center`)g=h((e.top+e.bottom)/2+.5);else if(J(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}T=e.top,D=e.bottom,x=g+m,C=x+u}else if(t===`y`){if(a===`center`)g=h((e.left+e.right)/2);else if(J(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}b=g-m,S=b-u,w=e.left,E=e.right}let O=Y(r.ticks.maxTicksLimit,l),k=Math.max(1,Math.ceil(l/O));for(_=0;_0&&(a-=r/2)}f={left:a,top:i,width:r+t.width,height:n+t.height,color:e.backdropColor}}h.push({label:y,font:w,textOffset:D,options:{rotation:m,color:n,strokeColor:s,strokeWidth:l,textAlign:d,textBaseline:O,translation:[b,x],backdrop:f}})}return h}_getXAxisLabelAlignment(){let{position:e,ticks:t}=this.options;if(-Bo(this.labelRotation))return e===`top`?`left`:`right`;let n=`center`;return t.align===`start`?n=`left`:t.align===`end`?n=`right`:t.align===`inner`&&(n=`inner`),n}_getYAxisLabelAlignment(e){let{position:t,ticks:{crossAlign:n,mirror:r,padding:i}}=this.options,a=this._getLabelSizes(),o=e+i,s=a.widest.width,c,l;return t===`left`?r?(l=this.right+i,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l+=s)):(l=this.right-o,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l=this.left)):t===`right`?r?(l=this.left+i,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l-=s)):(l=this.left+o,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l=this.right)):c=`right`,{textAlign:c,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;let e=this.chart,t=this.options.position;if(t===`left`||t===`right`)return{top:0,left:this.left,bottom:e.height,right:this.right};if(t===`top`||t===`bottom`)return{top:this.top,left:0,bottom:this.bottom,right:e.width}}drawBackground(){let{ctx:e,options:{backgroundColor:t},left:n,top:r,width:i,height:a}=this;t&&(e.save(),e.fillStyle=t,e.fillRect(n,r,i,a),e.restore())}getLineWidthForValue(e){let t=this.options.grid;if(!this._isVisible()||!t.display)return 0;let n=this.ticks.findIndex(t=>t.value===e);return n>=0?t.setContext(this.getContext(n)).lineWidth:0}drawGrid(e){let t=this.options.grid,n=this.ctx,r=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(e)),i,a,o=(e,t,r)=>{r.width&&r.color&&(n.save(),n.lineWidth=r.width,n.strokeStyle=r.color,n.setLineDash(r.borderDash||[]),n.lineDashOffset=r.borderDashOffset,n.beginPath(),n.moveTo(e.x,e.y),n.lineTo(t.x,t.y),n.stroke(),n.restore())};if(t.display)for(i=0,a=r.length;i{this.draw(e)}}]:[{z:r,draw:e=>{this.drawBackground(),this.drawGrid(e),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:n,draw:e=>{this.drawLabels(e)}}]}getMatchingVisibleMetas(e){let t=this.chart.getSortedVisibleDatasetMetas(),n=this.axis+`AxisID`,r=[],i,a;for(i=0,a=t.length;i{let r=n.split(`.`),i=r.pop(),a=[e].concat(r).join(`.`),o=t[n].split(`.`),s=o.pop(),c=o.join(`.`);Ps.route(a,i,c,s)})}function Kd(e){return`id`in e&&`defaults`in e}var qd=new class{constructor(){this.controllers=new Ud(eu,`datasets`,!0),this.elements=new Ud(Sd,`elements`),this.plugins=new Ud(Object,`plugins`),this.scales=new Ud(Hd,`scales`),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...e){this._each(`register`,e)}remove(...e){this._each(`unregister`,e)}addControllers(...e){this._each(`register`,e,this.controllers)}addElements(...e){this._each(`register`,e,this.elements)}addPlugins(...e){this._each(`register`,e,this.plugins)}addScales(...e){this._each(`register`,e,this.scales)}getController(e){return this._get(e,this.controllers,`controller`)}getElement(e){return this._get(e,this.elements,`element`)}getPlugin(e){return this._get(e,this.plugins,`plugin`)}getScale(e){return this._get(e,this.scales,`scale`)}removeControllers(...e){this._each(`unregister`,e,this.controllers)}removeElements(...e){this._each(`unregister`,e,this.elements)}removePlugins(...e){this._each(`unregister`,e,this.plugins)}removeScales(...e){this._each(`unregister`,e,this.scales)}_each(e,t,n){[...t].forEach(t=>{let r=n||this._getRegistryForType(t);n||r.isForType(t)||r===this.plugins&&t.id?this._exec(e,r,t):X(t,t=>{let r=n||this._getRegistryForType(t);this._exec(e,r,t)})})}_exec(e,t,n){let r=bo(e);so(n[`before`+r],[],n),t[e](n),so(n[`after`+r],[],n)}_getRegistryForType(e){for(let t=0;te.filter(e=>!t.some(t=>e.plugin.id===t.plugin.id));this._notify(r(t,n),e,`stop`),this._notify(r(n,t),e,`start`)}};function Yd(e){let t={},n=[],r=Object.keys(qd.plugins.items);for(let e=0;e1&&nf(e[0].toLowerCase());if(t)return t}throw Error(`Cannot determine type of '${e}' axis. Please provide 'axis' or 'position' option.`)}function of(e,t,n){if(n[t+`AxisID`]===e)return{axis:t}}function sf(e,t){if(t.data&&t.data.datasets){let n=t.data.datasets.filter(t=>t.xAxisID===e||t.yAxisID===e);if(n.length)return of(e,`x`,n[0])||of(e,`y`,n[0])}return{}}function cf(e,t){let n=As[e.type]||{scales:{}},r=t.scales||{},i=$d(e.type,t),a=Object.create(null);return Object.keys(r).forEach(t=>{let o=r[t];if(!J(o))return console.error(`Invalid scale configuration for scale: ${t}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);let s=af(t,o,sf(t,e),Ps.scales[o.type]),c=tf(s,i),l=n.scales||{};a[t]=mo(Object.create(null),[{axis:s},o,l[s],l[c]])}),e.data.datasets.forEach(n=>{let i=n.type||e.type,o=n.indexAxis||$d(i,t),s=(As[i]||{}).scales||{};Object.keys(s).forEach(e=>{let t=ef(e,o),i=n[t+`AxisID`]||t;a[i]=a[i]||Object.create(null),mo(a[i],[{axis:t},r[i],s[e]])})}),Object.keys(a).forEach(e=>{let t=a[e];mo(t,[Ps.scales[t.type],Ps.scale])}),a}function lf(e){let t=e.options||(e.options={});t.plugins=Y(t.plugins,{}),t.scales=cf(e,t)}function uf(e){return e=e||{},e.datasets=e.datasets||[],e.labels=e.labels||[],e}function df(e){return e=e||{},e.data=uf(e.data),lf(e),e}var ff=new Map,pf=new Set;function mf(e,t){let n=ff.get(e);return n||(n=t(),ff.set(e,n),pf.add(n)),n}var hf=(e,t,n)=>{let r=yo(t,n);r!==void 0&&e.add(r)},gf=class{constructor(e){this._config=df(e),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(e){this._config.type=e}get data(){return this._config.data}set data(e){this._config.data=uf(e)}get options(){return this._config.options}set options(e){this._config.options=e}get plugins(){return this._config.plugins}update(){let e=this._config;this.clearCache(),lf(e)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(e){return mf(e,()=>[[`datasets.${e}`,``]])}datasetAnimationScopeKeys(e,t){return mf(`${e}.transition.${t}`,()=>[[`datasets.${e}.transitions.${t}`,`transitions.${t}`],[`datasets.${e}`,``]])}datasetElementScopeKeys(e,t){return mf(`${e}-${t}`,()=>[[`datasets.${e}.elements.${t}`,`datasets.${e}`,`elements.${t}`,``]])}pluginScopeKeys(e){let t=e.id,n=this.type;return mf(`${n}-plugin-${t}`,()=>[[`plugins.${t}`,...e.additionalOptionScopes||[]]])}_cachedScopes(e,t){let n=this._scopeCache,r=n.get(e);return(!r||t)&&(r=new Map,n.set(e,r)),r}getOptionScopes(e,t,n){let{options:r,type:i}=this,a=this._cachedScopes(e,n),o=a.get(t);if(o)return o;let s=new Set;t.forEach(t=>{e&&(s.add(e),t.forEach(t=>hf(s,e,t))),t.forEach(e=>hf(s,r,e)),t.forEach(e=>hf(s,As[i]||{},e)),t.forEach(e=>hf(s,Ps,e)),t.forEach(e=>hf(s,js,e))});let c=Array.from(s);return c.length===0&&c.push(Object.create(null)),pf.has(t)&&a.set(t,c),c}chartOptionScopes(){let{options:e,type:t}=this;return[e,As[t]||{},Ps.datasets[t]||{},{type:t},Ps,js]}resolveNamedOptions(e,t,n,r=[``]){let i={$shared:!0},{resolver:a,subPrefixes:o}=_f(this._resolverCache,e,r),s=a;if(yf(a,t)){i.$shared=!1,n=So(n)?n():n;let t=this.createResolver(e,n,o);s=dc(a,n,t)}for(let e of t)i[e]=s[e];return i}createResolver(e,t,n=[``],r){let{resolver:i}=_f(this._resolverCache,e,n);return J(t)?dc(i,t,void 0,r):i}};function _f(e,t,n){let r=e.get(t);r||(r=new Map,e.set(t,r));let i=n.join(),a=r.get(i);return a||(a={resolver:uc(t,n),subPrefixes:n.filter(e=>!e.toLowerCase().includes(`hover`))},r.set(i,a)),a}var vf=e=>J(e)&&Object.getOwnPropertyNames(e).some(t=>So(e[t]));function yf(e,t){let{isScriptable:n,isIndexable:r}=fc(e);for(let i of t){let t=n(i),a=r(i),o=(a||t)&&e[i];if(t&&(So(o)||vf(o))||a&&q(o))return!0}return!1}var bf=`4.6.1`,xf=[`top`,`bottom`,`left`,`right`,`chartArea`];function Sf(e,t){return e===`top`||e===`bottom`||xf.indexOf(e)===-1&&t===`x`}function Cf(e,t){return function(n,r){return n[e]===r[e]?n[t]-r[t]:n[e]-r[e]}}function wf(e){let t=e.chart,n=t.options.animation;t.notifyPlugins(`afterRender`),so(n&&n.onComplete,[e],t)}function Tf(e){let t=e.chart,n=t.options.animation;so(n&&n.onProgress,[e],t)}function Ef(e){return Bc()&&typeof e==`string`?e=document.getElementById(e):e&&e.length&&(e=e[0]),e&&e.canvas&&(e=e.canvas),e}var Df={},Of=e=>{let t=Ef(e);return Object.values(Df).filter(e=>e.canvas===t).pop()};function kf(e,t,n){let r=Object.keys(e);for(let i of r){let r=+i;if(r>=t){let a=e[i];delete e[i],(n>0||r>t)&&(e[r+n]=a)}}}function Af(e,t,n,r){return!n||e.type===`mouseout`?null:r?t:e}var jf=class{static register(...e){qd.add(...e),Mf()}static unregister(...e){qd.remove(...e),Mf()}constructor(e,t){let n=this.config=new gf(t),r=Ef(e),i=Of(r);if(i)throw Error(`Canvas is already in use. Chart with ID '`+i.id+`' must be destroyed before the canvas with ID '`+i.canvas.id+`' can be reused.`);let a=n.createResolver(n.chartOptionScopes(),this.getContext());this.platform=new(n.platform||(xd(r))),this.platform.updateConfig(n);let o=this.platform.acquireContext(r,a.aspectRatio),s=o&&o.canvas,c=s&&s.height,l=s&&s.width;this.id=no(),this.ctx=o,this.canvas=s,this.width=l,this.height=c,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Jd,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=ss(e=>this.update(e),a.resizeDelay||0),this._dataChanges=[],Df[this.id]=this,!o||!s?console.error(`Failed to create chart: can't acquire context from the given item`):(Ol.listen(this,`complete`,wf),Ol.listen(this,`progress`,Tf),this._initialize(),this.attached&&this.update())}get aspectRatio(){let{options:{aspectRatio:e,maintainAspectRatio:t},width:n,height:r,_aspectRatio:i}=this;return K(e)?t&&i?i:r?n/r:null:e}get data(){return this.config.data}set data(e){this.config.data=e}get options(){return this._options}set options(e){this.config.options=e}get registry(){return qd}_initialize(){return this.notifyPlugins(`beforeInit`),this.options.responsive?this.resize():$c(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins(`afterInit`),this}clear(){return zs(this.canvas,this.ctx),this}stop(){return Ol.stop(this),this}resize(e,t){Ol.running(this)?this._resizeBeforeDraw={width:e,height:t}:this._resize(e,t)}_resize(e,t){let n=this.options,r=this.canvas,i=n.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(r,e,t,i),o=n.devicePixelRatio||this.platform.getDevicePixelRatio(),s=this.width?`resize`:`attach`;this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,$c(this,o,!0)&&(this.notifyPlugins(`resize`,{size:a}),so(n.onResize,[this,a],this),this.attached&&this._doResize(s)&&this.render())}ensureScalesHaveIDs(){X(this.options.scales||{},(e,t)=>{e.id=t})}buildOrUpdateScales(){let e=this.options,t=e.scales,n=this.scales,r=Object.keys(n).reduce((e,t)=>(e[t]=!1,e),{}),i=[];t&&(i=i.concat(Object.keys(t).map(e=>{let n=t[e],r=af(e,n),i=r===`r`,a=r===`x`;return{options:n,dposition:i?`chartArea`:a?`bottom`:`left`,dtype:i?`radialLinear`:a?`category`:`linear`}}))),X(i,t=>{let i=t.options,a=i.id,o=af(a,i),s=Y(i.type,t.dtype);(i.position===void 0||Sf(i.position,o)!==Sf(t.dposition))&&(i.position=t.dposition),r[a]=!0;let c=null;a in n&&n[a].type===s?c=n[a]:(c=new(qd.getScale(s))({id:a,type:s,ctx:this.ctx,chart:this}),n[c.id]=c),c.init(i,e)}),X(r,(e,t)=>{e||delete n[t]}),X(n,e=>{Qu.configure(this,e,e.options),Qu.addBox(this,e)})}_updateMetasets(){let e=this._metasets,t=this.data.datasets.length,n=e.length;if(e.sort((e,t)=>e.index-t.index),n>t){for(let e=t;et.length&&delete this._stacks,e.forEach((e,n)=>{t.filter(t=>t===e._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){let e=[],t=this.data.datasets,n,r;for(this._removeUnreferencedMetasets(),n=0,r=t.length;n{this.getDatasetMeta(t).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins(`reset`)}update(e){let t=this.config;t.update();let n=this._options=t.createResolver(t.chartOptionScopes(),this.getContext()),r=this._animationsDisabled=!n.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins(`beforeUpdate`,{mode:e,cancelable:!0})===!1)return;let i=this.buildOrUpdateControllers();this.notifyPlugins(`beforeElementsUpdate`);let a=0;for(let e=0,t=this.data.datasets.length;e{e.reset()}),this._updateDatasets(e),this.notifyPlugins(`afterUpdate`,{mode:e}),this._layers.sort(Cf(`z`,`_idx`));let{_active:o,_lastEvent:s}=this;s?this._eventHandler(s,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){X(this.scales,e=>{Qu.removeBox(this,e)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){let e=this.options;Co(new Set(Object.keys(this._listeners)),new Set(e.events))&&!!this._responsiveListeners===e.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){let{_hiddenIndices:e}=this,t=this._getUniformDataChanges()||[];for(let{method:n,start:r,count:i}of t)kf(e,r,n===`_removeElements`?-i:i)}_getUniformDataChanges(){let e=this._dataChanges;if(!e||!e.length)return;this._dataChanges=[];let t=this.data.datasets.length,n=t=>new Set(e.filter(e=>e[0]===t).map((e,t)=>t+`,`+e.splice(1).join(`,`))),r=n(0);for(let e=1;ee.split(`,`)).map(e=>({method:e[1],start:+e[2],count:+e[3]}))}_updateLayout(e){if(this.notifyPlugins(`beforeLayout`,{cancelable:!0})===!1)return;Qu.update(this,this.width,this.height,e);let t=this.chartArea,n=t.width<=0||t.height<=0;this._layers=[],X(this.boxes,e=>{n&&e.position===`chartArea`||(e.configure&&e.configure(),this._layers.push(...e._layers()))},this),this._layers.forEach((e,t)=>{e._idx=t}),this.notifyPlugins(`afterLayout`)}_updateDatasets(e){if(this.notifyPlugins(`beforeDatasetsUpdate`,{mode:e,cancelable:!0})!==!1){for(let e=0,t=this.data.datasets.length;e=0;--t)this._drawDataset(e[t]);this.notifyPlugins(`afterDatasetsDraw`)}_drawDataset(e){let t=this.ctx,n={meta:e,index:e.index,cancelable:!0},r=wl(this,e);this.notifyPlugins(`beforeDatasetDraw`,n)!==!1&&(r&&Us(t,r),e.controller.draw(),r&&Ws(t),n.cancelable=!1,this.notifyPlugins(`afterDatasetDraw`,n))}isPointInArea(e){return Hs(e,this.chartArea,this._minPadding)}getElementsAtEventForMode(e,t,n,r){let i=Fu.modes[t];return typeof i==`function`?i(this,e,n,r):[]}getDatasetMeta(e){let t=this.data.datasets[e],n=this._metasets,r=n.filter(e=>e&&e._dataset===t).pop();return r||(r={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:t&&t.order||0,index:e,_dataset:t,_parsed:[],_sorted:!1},n.push(r)),r}getContext(){return this.$context||(this.$context=lc(null,{chart:this,type:`chart`}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(e){let t=this.data.datasets[e];if(!t)return!1;let n=this.getDatasetMeta(e);return typeof n.hidden==`boolean`?!n.hidden:!t.hidden}setDatasetVisibility(e,t){let n=this.getDatasetMeta(e);n.hidden=!t}toggleDataVisibility(e){this._hiddenIndices[e]=!this._hiddenIndices[e]}getDataVisibility(e){return!this._hiddenIndices[e]}_updateVisibility(e,t,n){let r=n?`show`:`hide`,i=this.getDatasetMeta(e),a=i.controller._resolveAnimations(void 0,r);xo(t)?(i.data[t].hidden=!n,this.update()):(this.setDatasetVisibility(e,n),a.update(i,{visible:n}),this.update(t=>t.datasetIndex===e?r:void 0))}hide(e,t){this._updateVisibility(e,t,!1)}show(e,t){this._updateVisibility(e,t,!0)}_destroyDatasetMeta(e){let t=this._metasets[e];t&&t.controller&&t.controller._destroy(),delete this._metasets[e]}_stop(){let e,t;for(this.stop(),Ol.remove(this),e=0,t=this.data.datasets.length;e{t.addEventListener(this,n,r),e[n]=r},r=(e,t,n)=>{e.offsetX=t,e.offsetY=n,this._eventHandler(e)};X(this.options.events,e=>n(e,r))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});let e=this._responsiveListeners,t=this.platform,n=(n,r)=>{t.addEventListener(this,n,r),e[n]=r},r=(n,r)=>{e[n]&&(t.removeEventListener(this,n,r),delete e[n])},i=(e,t)=>{this.canvas&&this.resize(e,t)},a,o=()=>{r(`attach`,o),this.attached=!0,this.resize(),n(`resize`,i),n(`detach`,a)};a=()=>{this.attached=!1,r(`resize`,i),this._stop(),this._resize(0,0),n(`attach`,o)},t.isAttached(this.canvas)?o():a()}unbindEvents(){X(this._listeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._listeners={},X(this._responsiveListeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._responsiveListeners=void 0}updateHoverStyle(e,t,n){let r=n?`set`:`remove`,i,a,o,s;for(t===`dataset`&&(i=this.getDatasetMeta(e[0].datasetIndex),i.controller[`_`+r+`DatasetHoverStyle`]()),o=0,s=e.length;o{let n=this.getDatasetMeta(e);if(!n)throw Error(`No dataset found at index `+e);return{datasetIndex:e,element:n.data[t],index:t}});co(n,t)||(this._active=n,this._lastEvent=null,this._updateHoverStyles(n,t))}notifyPlugins(e,t,n){return this._plugins.notify(this,e,t,n)}isPluginEnabled(e){return this._plugins._cache.filter(t=>t.plugin.id===e).length===1}_updateHoverStyles(e,t,n){let r=this.options.hover,i=(e,t)=>e.filter(e=>!t.some(t=>e.datasetIndex===t.datasetIndex&&e.index===t.index)),a=i(t,e),o=n?e:i(e,t);a.length&&this.updateHoverStyle(a,r.mode,!1),o.length&&r.mode&&this.updateHoverStyle(o,r.mode,!0)}_eventHandler(e,t){let n={event:e,replay:t,cancelable:!0,inChartArea:this.isPointInArea(e)},r=t=>(t.options.events||this.options.events).includes(e.native.type);if(this.notifyPlugins(`beforeEvent`,n,r)===!1)return;let i=this._handleEvent(e,t,n.inChartArea);return n.cancelable=!1,this.notifyPlugins(`afterEvent`,n,r),(i||n.changed)&&this.render(),this}_handleEvent(e,t,n){let{_active:r=[],options:i}=this,a=t,o=this._getActiveElements(e,r,n,a),s=wo(e),c=Af(e,this._lastEvent,n,s);n&&(this._lastEvent=null,so(i.onHover,[e,o,this],this),s&&so(i.onClick,[e,o,this],this));let l=!co(o,r);return(l||t)&&(this._active=o,this._updateHoverStyles(o,r,t)),this._lastEvent=c,l}_getActiveElements(e,t,n,r){if(e.type===`mouseout`)return[];if(!n)return t;let i=this.options.hover;return this.getElementsAtEventForMode(e,i.mode,i,r)}};$(jf,`defaults`,Ps),$(jf,`instances`,Df),$(jf,`overrides`,As),$(jf,`registry`,qd),$(jf,`version`,bf),$(jf,`getChart`,Of);function Mf(){return X(jf.instances,e=>e._plugins.invalidate())}function Nf(e,t,n){let{startAngle:r,x:i,y:a,outerRadius:o,innerRadius:s,options:c}=t,{borderWidth:l,borderJoinStyle:u}=c,d=Math.min(l/o,Ko(r-n));if(e.beginPath(),e.arc(i,a,o-l/2,r+d/2,n-d/2),s>0){let t=Math.min(l/s,Ko(r-n));e.arc(i,a,s+l/2,n-t/2,r+t/2,!0)}else{let t=Math.min(l/2,o*Ko(r-n));if(u===`round`)e.arc(i,a,t,n-Z/2,r+Z/2,!0);else if(u===`bevel`){let o=2*t*t,s=-o*Math.cos(n+Z/2)+i,c=-o*Math.sin(n+Z/2)+a,l=o*Math.cos(r+Z/2)+i,u=o*Math.sin(r+Z/2)+a;e.lineTo(s,c),e.lineTo(l,u)}}e.closePath(),e.moveTo(0,0),e.rect(0,0,e.canvas.width,e.canvas.height),e.clip(`evenodd`)}function Pf(e,t,n){let{startAngle:r,pixelMargin:i,x:a,y:o,outerRadius:s,innerRadius:c}=t,l=i/s;e.beginPath(),e.arc(a,o,s,r-l,n+l),c>i?(l=i/c,e.arc(a,o,c,n+l,r-l,!0)):e.arc(a,o,i,n+Oo,r-Oo),e.closePath(),e.clip()}function Ff(e){return nc(e,[`outerStart`,`outerEnd`,`innerStart`,`innerEnd`])}function If(e,t,n,r){let i=Ff(e.options.borderRadius),a=(n-t)/2,o=Math.min(a,r*t/2),s=e=>{let t=(n-Math.min(a,e))*r/2;return Jo(e,0,Math.min(a,t))};return{outerStart:s(i.outerStart),outerEnd:s(i.outerEnd),innerStart:Jo(i.innerStart,0,o),innerEnd:Jo(i.innerEnd,0,o)}}function Lf(e,t,n,r){return{x:n+e*Math.cos(t),y:r+e*Math.sin(t)}}function Rf(e,t,n,r){let{x:i,y:a,startAngle:o,pixelMargin:s,innerRadius:c}=t,l=Math.max(t.outerRadius+r+n-s,0),u=c>0?c+r+n+s:0;e.beginPath(),e.arc(i,a,l,o,o+Q),u>0&&(e.moveTo(i+Math.cos(o)*u,a+Math.sin(o)*u),e.arc(i,a,u,o+Q,o,!0)),e.closePath()}function zf(e,t,n,r,i,a){let{x:o,y:s,startAngle:c,pixelMargin:l,innerRadius:u}=t,{spacingMode:d=`angular`}=t.options,f=i-c;if(a&&t.options.selfJoin&&Math.abs(f)>=Q-1e-4){Rf(e,t,n,r);return}let p=Math.max(t.outerRadius+r+n-l,0),m=u>0?u+r+n+l:0,h=0,g=0,_=p>0?Math.max(.001,f*p-n/Z)/p:.001,v=(f-_)/2;if(r){let e=((u>0?u-r:0)+(p>0?p-r:0))/2,t=(()=>{let t=e===0?f:f*e/(e+r);return(f-t)/2})(),n=e>0?Math.asin(Math.min(1,r/e)):0,i=Math.max(0,_/2-.001),a=Math.sin(i);if(d===`parallel`){if(m===0&&a>0){let e=r/a,t=Math.max(0,p-.001);m=Math.min(e,t)}let e=Math.min(p>0?p*a:1/0,m>0?m*a:1/0),t=Math.min(r,e);h=p>0?Math.asin(Math.min(1,t/p)):Math.min(i,n),g=m>0?Math.asin(Math.min(1,t/m)):h}else d===`proportional`?(h=Math.min(i,t),g=Math.min(i,t)):(h=Math.min(i,n),g=Math.min(i,n))}let y=c+v+h,b=i-v-h,x=c+v+g,S=i-v-g,C=Math.min(b-y,S-x),{outerStart:w,outerEnd:T,innerStart:E,innerEnd:D}=If(t,m,p,C),O=p-w,k=p-T,A=y+w/O,j=b-T/k,M=m+E,N=m+D,P=x+E/M,F=S-D/N;if(e.beginPath(),a){let t=(A+j)/2;if(e.arc(o,s,p,A,t),e.arc(o,s,p,t,j),T>0){let t=Lf(k,j,o,s);e.arc(t.x,t.y,T,j,b+Oo)}let n=Lf(N,S,o,s);if(e.lineTo(n.x,n.y),D>0){let t=Lf(N,F,o,s);e.arc(t.x,t.y,D,S+Oo,F+Math.PI)}let r=(S-D/m+(x+E/m))/2;if(e.arc(o,s,m,S-D/m,r,!0),e.arc(o,s,m,r,x+E/m,!0),E>0){let t=Lf(M,P,o,s);e.arc(t.x,t.y,E,P+Math.PI,x-Oo)}let i=Lf(O,y,o,s);if(e.lineTo(i.x,i.y),w>0){let t=Lf(O,A,o,s);e.arc(t.x,t.y,w,y-Oo,A)}}else{e.moveTo(o,s);let t=Math.cos(A)*p+o,n=Math.sin(A)*p+s;e.lineTo(t,n);let r=Math.cos(j)*p+o,i=Math.sin(j)*p+s;e.lineTo(r,i)}e.closePath()}function Bf(e,t,n,r,i){let{fullCircles:a,startAngle:o,circumference:s}=t,c=t.endAngle;if(a){zf(e,t,n,r,c,i);for(let t=0;t=Q-1e-4;if(a){zf(e,t,n,r,h,i);for(let t=0;t0)&&c.selfJoin&&h-o>=Z&&p===0&&u!==`miter`&&Nf(e,t,h),a||(zf(e,t,n,r,h,i),e.stroke())}var Hf=class extends Sd{constructor(e){super(),$(this,`circumference`,void 0),$(this,`endAngle`,void 0),$(this,`fullCircles`,void 0),$(this,`innerRadius`,void 0),$(this,`outerRadius`,void 0),$(this,`pixelMargin`,void 0),$(this,`startAngle`,void 0),$(this,`circular`,void 0),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,this.circular=!1,e&&Object.assign(this,e)}inRange(e,t,n){let{angle:r,distance:i}=Uo(this.getProps([`x`,`y`],n),{x:e,y:t}),{startAngle:a,endAngle:o,innerRadius:s,outerRadius:c,circumference:l}=this.getProps([`startAngle`,`endAngle`,`innerRadius`,`outerRadius`,`circumference`],n),u=(this.options.spacing+this.options.borderWidth)/2,d=Y(l,o-a),f=qo(r,a,o)&&a!==o,p=d>=Q||f,m=Xo(i,s+u,c+u);return p&&m}getCenterPoint(e){let{x:t,y:n,startAngle:r,endAngle:i,innerRadius:a,outerRadius:o}=this.getProps([`x`,`y`,`startAngle`,`endAngle`,`innerRadius`,`outerRadius`],e),{offset:s,spacing:c}=this.options,l=(r+i)/2,u=(a+o+c+s)/2;return{x:t+Math.cos(l)*u,y:n+Math.sin(l)*u}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){let{options:t,circumference:n}=this,r=(t.offset||0)/4,i=(t.spacing||0)/2,a=t.circular;if(this.pixelMargin=t.borderAlign===`inner`?.33:0,this.fullCircles=n>Q?Math.floor(n/Q):0,n===0||this.innerRadius<0||this.outerRadius<0)return;e.save();let o=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(o)*r,Math.sin(o)*r);let s=r*(1-Math.sin(Math.min(Z,n||0)));e.fillStyle=t.backgroundColor,e.strokeStyle=t.borderColor,Bf(e,this,s,i,a),Vf(e,this,s,i,a),e.restore()}};$(Hf,`id`,`arc`),$(Hf,`defaults`,{borderAlign:`center`,borderColor:`#fff`,borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,spacingMode:`angular`,angle:void 0,circular:!0,selfJoin:!1}),$(Hf,`defaultRoutes`,{backgroundColor:`backgroundColor`}),$(Hf,`descriptors`,{_scriptable:!0,_indexable:e=>e!==`borderDash`});function Uf(e,t,n=t){e.lineCap=Y(n.borderCapStyle,t.borderCapStyle),e.setLineDash(Y(n.borderDash,t.borderDash)),e.lineDashOffset=Y(n.borderDashOffset,t.borderDashOffset),e.lineJoin=Y(n.borderJoinStyle,t.borderJoinStyle),e.lineWidth=Y(n.borderWidth,t.borderWidth),e.strokeStyle=Y(n.borderColor,t.borderColor)}function Wf(e,t,n){e.lineTo(n.x,n.y)}function Gf(e){return e.stepped?Gs:e.tension||e.cubicInterpolationMode===`monotone`?Ks:Wf}function Kf(e,t,n={}){let r=e.length,{start:i=0,end:a=r-1}=n,{start:o,end:s}=t,c=Math.max(i,o),l=Math.min(a,s),u=is&&a>s;return{count:r,start:c,loop:t.loop,ilen:l(o+(l?s-e:e))%a,y=()=>{h!==g&&(e.lineTo(u,g),e.lineTo(u,h),e.lineTo(u,_))};for(c&&(p=i[v(0)],e.moveTo(p.x,p.y)),f=0;f<=s;++f){if(p=i[v(f)],p.skip)continue;let t=p.x,n=p.y,r=t|0;r===m?(ng&&(g=n),u=(d*u+t)/++d):(y(),e.lineTo(t,n),m=r,d=0,h=g=n),_=n}y()}function Yf(e){let t=e.options,n=t.borderDash&&t.borderDash.length;return!e._decimated&&!e._loop&&!t.tension&&t.cubicInterpolationMode!==`monotone`&&!t.stepped&&!n?Jf:qf}function Xf(e){return e.stepped?rl:e.tension||e.cubicInterpolationMode===`monotone`?il:nl}function Zf(e,t,n,r){let i=t._path;i||(i=t._path=new Path2D,t.path(i,n,r)&&i.closePath()),Uf(e,t.options),e.stroke(i)}function Qf(e,t,n,r){let{segments:i,options:a}=t,o=Yf(t);for(let s of i)Uf(e,a,s.style),e.beginPath(),o(e,t,s,{start:n,end:n+r-1})&&e.closePath(),e.stroke()}var $f=typeof Path2D==`function`;function ep(e,t,n,r){$f&&!t.options.segment?Zf(e,t,n,r):Qf(e,t,n,r)}var tp=class extends Sd{constructor(e){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,e&&Object.assign(this,e)}updateControlPoints(e,t){let n=this.options;if((n.tension||n.cubicInterpolationMode===`monotone`)&&!n.stepped&&!this._pointsUpdated){let r=n.spanGaps?this._loop:this._fullLoop;zc(this._points,n,e,r,t),this._pointsUpdated=!0}}set points(e){this._points=e,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=_l(this,this.options.segment))}first(){let e=this.segments,t=this.points;return e.length&&t[e[0].start]}last(){let e=this.segments,t=this.points,n=e.length;return n&&t[e[n-1].end]}interpolate(e,t){let n=this.options,r=e[t],i=this.points,a=ml(this,{property:t,start:r,end:r});if(!a.length)return;let o=[],s=Xf(n),c,l;for(c=0,l=a.length;ce!==`borderDash`&&e!==`fill`});function np(e,t,n,r){let i=e.options,{[n]:a}=e.getProps([n],r);return Math.abs(t-a)e+t)/r.size,y:i/a}},nearest(e,t){if(!e.length)return!1;let n=t.x,r=t.y,i=1/0,a,o,s;for(a=0,o=e.length;a-1?e.split(` -`):e}function Df(e,t){let{element:n,datasetIndex:r,index:i}=t,a=e.getDatasetMeta(r).controller,{label:o,value:s}=a.getLabelAndValue(i);return{chart:e,label:o,parsed:a.getParsed(i),raw:e.data.datasets[r].data[i],formattedValue:s,dataset:a.getDataset(),dataIndex:i,datasetIndex:r,element:n}}function Of(e,t){let n=e.chart.ctx,{body:r,footer:i,title:a}=e,{boxWidth:o,boxHeight:s}=t,c=_s(t.bodyFont),l=_s(t.titleFont),u=_s(t.footerFont),d=a.length,f=i.length,p=r.length,m=gs(t.padding),h=m.height,g=0,_=r.reduce((e,t)=>e+t.before.length+t.lines.length+t.after.length,0);if(_+=e.beforeBody.length+e.afterBody.length,d&&(h+=d*l.lineHeight+(d-1)*t.titleSpacing+t.titleMarginBottom),_){let e=t.displayColors?Math.max(s,c.lineHeight):c.lineHeight;h+=p*e+(_-p)*c.lineHeight+(_-1)*t.bodySpacing}f&&(h+=t.footerMarginTop+f*u.lineHeight+(f-1)*t.footerSpacing);let v=0,y=function(e){g=Math.max(g,n.measureText(e).width+v)};return n.save(),n.font=l.string,J(e.title,y),n.font=c.string,J(e.beforeBody.concat(e.afterBody),y),v=t.displayColors?o+2+t.boxPadding:0,J(r,e=>{J(e.before,y),J(e.lines,y),J(e.after,y)}),v=0,n.font=u.string,J(e.footer,y),n.restore(),g+=m.width,{width:g,height:h}}function kf(e,t){let{y:n,height:r}=t;return ne.height-r/2?`bottom`:`center`}function Af(e,t,n,r){let{x:i,width:a}=r,o=n.caretSize+n.caretPadding;if(e===`left`&&i+a+o>t.width||e===`right`&&i-a-o<0)return!0}function jf(e,t,n,r){let{x:i,width:a}=n,{width:o,chartArea:{left:s,right:c}}=e,l=`center`;return r===`center`?l=i<=(s+c)/2?`left`:`right`:i<=a/2?l=`left`:i>=o-a/2&&(l=`right`),Af(l,e,t,n)&&(l=`center`),l}function Mf(e,t,n){let r=n.yAlign||t.yAlign||kf(e,n);return{xAlign:n.xAlign||t.xAlign||jf(e,t,n,r),yAlign:r}}function Nf(e,t){let{x:n,width:r}=e;return t===`right`?n-=r:t===`center`&&(n-=r/2),n}function Pf(e,t,n){let{y:r,height:i}=e;return t===`top`?r+=n:r-=t===`bottom`?i+n:i/2,r}function Ff(e,t,n,r){let{caretSize:i,caretPadding:a,cornerRadius:o}=e,{xAlign:s,yAlign:c}=n,l=i+a,{topLeft:u,topRight:d,bottomLeft:f,bottomRight:p}=hs(o),m=Nf(t,s),h=Pf(t,c,l);return c===`center`?s===`left`?m+=l:s===`right`&&(m-=l):s===`left`?m-=Math.max(u,f)+i:s===`right`&&(m+=Math.max(d,p)+i),{x:ao(m,0,r.width-t.width),y:ao(h,0,r.height-t.height)}}function If(e,t,n){let r=gs(n.padding);return t===`center`?e.x+e.width/2:t===`right`?e.x+e.width-r.right:e.x+r.left}function Lf(e){return Tf([],Ef(e))}function Rf(e,t,n){return bs(e,{tooltip:t,tooltipItems:n,type:`tooltip`})}function zf(e,t){let n=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return n?e.override(n):e}var Bf={beforeTitle:ha,title(e){if(e.length>0){let t=e[0],n=t.chart.data.labels,r=n?n.length:0;if(this&&this.options&&this.options.mode===`dataset`)return t.dataset.label||``;if(t.label)return t.label;if(r>0&&t.dataIndex{let t={before:[],lines:[],after:[]},i=zf(n,e);Tf(t.before,Ef(Vf(i,`beforeLabel`,this,e))),Tf(t.lines,Vf(i,`label`,this,e)),Tf(t.after,Ef(Vf(i,`afterLabel`,this,e))),r.push(t)}),r}getAfterBody(e,t){return Lf(Vf(t.callbacks,`afterBody`,this,e))}getFooter(e,t){let{callbacks:n}=t,r=Vf(n,`beforeFooter`,this,e),i=Vf(n,`footer`,this,e),a=Vf(n,`afterFooter`,this,e),o=[];return o=Tf(o,Ef(r)),o=Tf(o,Ef(i)),o=Tf(o,Ef(a)),o}_createItems(e){let t=this._active,n=this.chart.data,r=[],i=[],a=[],o=[],s,c;for(s=0,c=t.length;se.filter(t,r,i,n))),e.itemSort&&(o=o.sort((t,r)=>e.itemSort(t,r,n))),J(o,t=>{let n=zf(e.callbacks,t);r.push(Vf(n,`labelColor`,this,t)),i.push(Vf(n,`labelPointStyle`,this,t)),a.push(Vf(n,`labelTextColor`,this,t))}),this.labelColors=r,this.labelPointStyles=i,this.labelTextColors=a,this.dataPoints=o,o}update(e,t){let n=this.options.setContext(this.getContext()),r=this._active,i,a=[];if(!r.length)this.opacity!==0&&(i={opacity:0});else{let e=wf[n.position].call(this,r,this._eventPosition);a=this._createItems(n),this.title=this.getTitle(a,n),this.beforeBody=this.getBeforeBody(a,n),this.body=this.getBody(a,n),this.afterBody=this.getAfterBody(a,n),this.footer=this.getFooter(a,n);let t=this._size=Of(this,n),o=Object.assign({},e,t),s=Mf(this.chart,n,o),c=Ff(n,o,s,this.chart);this.xAlign=s.xAlign,this.yAlign=s.yAlign,i={opacity:1,x:c.x,y:c.y,width:t.width,height:t.height,caretX:e.x,caretY:e.y}}this._tooltipItems=a,this.$context=void 0,i&&this._resolveAnimations().update(this,i),e&&n.external&&n.external.call(this,{chart:this.chart,tooltip:this,replay:t})}drawCaret(e,t,n,r){let i=this.getCaretPosition(e,n,r);t.lineTo(i.x1,i.y1),t.lineTo(i.x2,i.y2),t.lineTo(i.x3,i.y3)}getCaretPosition(e,t,n){let{xAlign:r,yAlign:i}=this,{caretSize:a,cornerRadius:o}=n,{topLeft:s,topRight:c,bottomLeft:l,bottomRight:u}=hs(o),{x:d,y:f}=e,{width:p,height:m}=t,h,g,_,v,y,b;return i===`center`?(y=f+m/2,r===`left`?(h=d,g=h-a,v=y+a,b=y-a):(h=d+p,g=h+a,v=y-a,b=y+a),_=h):(g=r===`left`?d+Math.max(s,l)+a:r===`right`?d+p-Math.max(c,u)-a:this.caretX,i===`top`?(v=f,y=v-a,h=g-a,_=g+a):(v=f+m,y=v+a,h=g+a,_=g-a),b=v),{x1:h,x2:g,x3:_,y1:v,y2:y,y3:b}}drawTitle(e,t,n){let r=this.title,i=r.length,a,o,s;if(i){let c=vc(n.rtl,this.x,this.width);for(e.x=If(this,n.titleAlign,n),t.textAlign=c.textAlign(n.titleAlign),t.textBaseline=`middle`,a=_s(n.titleFont),o=n.titleSpacing,t.fillStyle=n.titleColor,t.font=a.string,s=0;se!==0)?(e.beginPath(),e.fillStyle=i.multiKeyBackground,cs(e,{x:t,y:p,w:c,h:s,radius:o}),e.fill(),e.stroke(),e.fillStyle=a.backgroundColor,e.beginPath(),cs(e,{x:n,y:p+1,w:c-2,h:s-2,radius:o}),e.fill()):(e.fillStyle=i.multiKeyBackground,e.fillRect(t,p,c,s),e.strokeRect(t,p,c,s),e.fillStyle=a.backgroundColor,e.fillRect(n,p+1,c-2,s-2))}e.fillStyle=this.labelTextColors[n]}drawBody(e,t,n){let{body:r}=this,{bodySpacing:i,bodyAlign:a,displayColors:o,boxHeight:s,boxWidth:c,boxPadding:l}=n,u=_s(n.bodyFont),d=u.lineHeight,f=0,p=vc(n.rtl,this.x,this.width),m=function(n){t.fillText(n,p.x(e.x+f),e.y+d/2),e.y+=d+i},h=p.textAlign(a),g,_,v,y,b,x,S;for(t.textAlign=a,t.textBaseline=`middle`,t.font=u.string,e.x=If(this,h,n),t.fillStyle=n.bodyColor,J(this.beforeBody,m),f=o&&h!==`right`?a===`center`?c/2+l:c+2+l:0,y=0,x=r.length;y0&&t.stroke()}_updateAnimationTarget(e){let t=this.chart,n=this.$animations,r=n&&n.x,i=n&&n.y;if(r||i){let n=wf[e.position].call(this,this._active,this._eventPosition);if(!n)return;let a=this._size=Of(this,e),o=Object.assign({},n,this._size),s=Mf(t,e,o),c=Ff(e,o,s,t);(r._to!==c.x||i._to!==c.y)&&(this.xAlign=s.xAlign,this.yAlign=s.yAlign,this.width=a.width,this.height=a.height,this.caretX=n.x,this.caretY=n.y,this._resolveAnimations().update(this,c))}}_willRender(){return!!this.opacity}draw(e){let t=this.options.setContext(this.getContext()),n=this.opacity;if(!n)return;this._updateAnimationTarget(t);let r={width:this.width,height:this.height},i={x:this.x,y:this.y};n=Math.abs(n)<.001?0:n;let a=gs(t.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;t.enabled&&o&&(e.save(),e.globalAlpha=n,this.drawBackground(i,e,r,t),yc(e,t.textDirection),i.y+=a.top,this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),bc(e,t.textDirection),e.restore())}getActiveElements(){return this._active||[]}setActiveElements(e,t){let n=this._active,r=e.map(({datasetIndex:e,index:t})=>{let n=this.chart.getDatasetMeta(e);if(!n)throw Error(`Cannot find a dataset at index `+e);return{datasetIndex:e,element:n.data[t],index:t}}),i=!xa(n,r),a=this._positionChanged(r,t);(i||a)&&(this._active=r,this._eventPosition=t,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(e,t,n=!0){if(t&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;let r=this.options,i=this._active||[],a=this._getActiveElements(e,i,t,n),o=this._positionChanged(a,e),s=t||!xa(a,i)||o;return s&&(this._active=a,(r.enabled||r.external)&&(this._eventPosition={x:e.x,y:e.y},this.update(!0,t))),s}_getActiveElements(e,t,n,r){let i=this.options;if(e.type===`mouseout`)return[];if(!r)return t.filter(e=>this.chart.data.datasets[e.datasetIndex]&&this.chart.getDatasetMeta(e.datasetIndex).controller.getParsed(e.index)!==void 0);let a=this.chart.getElementsAtEventForMode(e,i.mode,i,n);return i.reverse&&a.reverse(),a}_positionChanged(e,t){let{caretX:n,caretY:r,options:i}=this,a=wf[i.position].call(this,e,t);return a!==!1&&(n!==a.x||r!==a.y)}};$(Hf,`positioners`,wf);var Uf={id:`tooltip`,_element:Hf,positioners:wf,afterInit(e,t,n){n&&(e.tooltip=new Hf({chart:e,options:n}))},beforeUpdate(e,t,n){e.tooltip&&e.tooltip.initialize(n)},reset(e,t,n){e.tooltip&&e.tooltip.initialize(n)},afterDraw(e){let t=e.tooltip;if(t&&t._willRender()){let n={tooltip:t};if(e.notifyPlugins(`beforeTooltipDraw`,{...n,cancelable:!0})===!1)return;t.draw(e.ctx),e.notifyPlugins(`afterTooltipDraw`,n)}},afterEvent(e,t){if(e.tooltip){let n=t.replay;e.tooltip.handleEvent(t.event,n,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:`average`,backgroundColor:`rgba(0,0,0,0.8)`,titleColor:`#fff`,titleFont:{weight:`bold`},titleSpacing:2,titleMarginBottom:6,titleAlign:`left`,bodyColor:`#fff`,bodySpacing:2,bodyFont:{},bodyAlign:`left`,footerColor:`#fff`,footerSpacing:2,footerMarginTop:6,footerFont:{weight:`bold`},footerAlign:`left`,padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(e,t)=>t.bodyFont.size,boxWidth:(e,t)=>t.bodyFont.size,multiKeyBackground:`#fff`,displayColors:!0,boxPadding:0,borderColor:`rgba(0,0,0,0)`,borderWidth:0,animation:{duration:400,easing:`easeOutQuart`},animations:{numbers:{type:`number`,properties:[`x`,`y`,`width`,`height`,`caretX`,`caretY`]},opacity:{easing:`linear`,duration:200}},callbacks:Bf},defaultRoutes:{bodyFont:`font`,footerFont:`font`,titleFont:`font`},descriptors:{_scriptable:e=>e!==`filter`&&e!==`itemSort`&&e!==`external`,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:`animation`}},additionalOptionScopes:[`interaction`]},Wf=(e,t,n,r)=>(typeof t==`string`?(n=e.push(t)-1,r.unshift({index:n,label:t})):isNaN(t)&&(n=null),n);function Gf(e,t,n,r){let i=e.indexOf(t);return i===-1?Wf(e,t,n,r):i===e.lastIndexOf(t)?i:n}var Kf=(e,t)=>e===null?null:ao(Math.round(e),0,t);function qf(e){let t=this.getLabels();return e>=0&&et.length-1?null:this.getPixelForValue(t[e].value)}getValueForPixel(e){return Math.round(this._startValue+this.getDecimalForPixel(e)*this._valueRange)}getBasePixel(){return this.bottom}};$(Jf,`id`,`category`),$(Jf,`defaults`,{ticks:{callback:qf}});function Yf(e,t){let n=[],{bounds:r,step:i,min:a,max:o,precision:s,count:c,maxTicks:l,maxDigits:u,includeBounds:d}=e,f=i||1,p=l-1,{min:m,max:h}=t,g=!U(a),_=!U(o),v=!U(c),y=(h-m)/(u+1),b=Ga((h-m)/p/f)*f,x,S,C,w;if(b<1e-14&&!g&&!_)return[{value:m},{value:h}];w=Math.ceil(h/b)-Math.floor(m/b),w>p&&(b=Ga(w*b/p/f)*f),U(s)||(x=10**s,b=Math.ceil(b*x)/x),r===`ticks`?(S=Math.floor(m/b)*b,C=Math.ceil(h/b)*b):(S=m,C=h),g&&_&&i&&Ya((o-a)/i,b/1e3)?(w=Math.round(Math.min((o-a)/b,l)),b=(o-a)/w,S=a,C=o):v?(S=g?a:S,C=_?o:C,w=c-1,b=(C-S)/w):(w=(C-S)/b,w=Wa(w,Math.round(w),b/1e3)?Math.round(w):Math.ceil(w));let T=Math.max($a(b),$a(S));x=10**(U(s)?T:s),S=Math.round(S*x)/x,C=Math.round(C*x)/x;let E=0;for(g&&(d&&S!==a?(n.push({value:a}),So)break;n.push({value:e})}return _&&d&&C!==o?n.length&&Wa(n[n.length-1].value,o,Xf(o,y,e))?n[n.length-1].value=o:n.push({value:o}):(!_||C===o)&&n.push({value:C}),n}function Xf(e,t,{horizontal:n,minRotation:r}){let i=Za(r),a=(n?Math.sin(i):Math.cos(i))||.001,o=.75*t*(``+e).length;return Math.min(t/a,o)}var Zf=class extends $u{constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(e,t){return U(e)||(typeof e==`number`||e instanceof Number)&&!isFinite(+e)?null:+e}handleTickRangeOptions(){let{beginAtZero:e}=this.options,{minDefined:t,maxDefined:n}=this.getUserBounds(),{min:r,max:i}=this,a=e=>r=t?r:e,o=e=>i=n?i:e;if(e){let e=Ua(r),t=Ua(i);e<0&&t<0?o(0):e>0&&t>0&&a(0)}if(r===i){let t=i===0?1:Math.abs(i*.05);o(i+t),e||a(r-t)}this.min=r,this.max=i}getTickLimit(){let{maxTicksLimit:e,stepSize:t}=this.options.ticks,n;return t?(n=Math.ceil(this.max/t)-Math.floor(this.min/t)+1,n>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${t} would result generating up to ${n} ticks. Limiting to 1000.`),n=1e3)):(n=this.computeTickLimit(),e=e||11),e&&(n=Math.min(e,n)),n}computeTickLimit(){return 1/0}buildTicks(){let e=this.options,t=e.ticks,n=this.getTickLimit();n=Math.max(2,n);let r=Yf({maxTicks:n,bounds:e.bounds,min:e.min,max:e.max,precision:t.precision,step:t.stepSize,count:t.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:t.minRotation||0,includeBounds:t.includeBounds!==!1},this._range||this);return e.bounds===`ticks`&&Xa(r,this,`value`),e.reverse?(r.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),r}configure(){let e=this.ticks,t=this.min,n=this.max;if(super.configure(),this.options.offset&&e.length){let r=(n-t)/Math.max(e.length-1,1)/2;t-=r,n+=r}this._startValue=t,this._endValue=n,this._valueRange=n-t}getLabelForValue(e){return Lo(e,this.chart.options.locale,this.options.ticks.format)}},Qf=class extends Zf{determineDataLimits(){let{min:e,max:t}=this.getMinMax(!0);this.min=_a(e)?e:0,this.max=_a(t)?t:1,this.handleTickRangeOptions()}computeTickLimit(){let e=this.isHorizontal(),t=e?this.width:this.height,n=Za(this.options.ticks.minRotation),r=(e?Math.sin(n):Math.cos(n))||.001,i=this._resolveTickFontOptions(0);return Math.ceil(t/Math.min(40,i.lineHeight/r))}getPixelForValue(e){return e===null?NaN:this.getPixelForDecimal((e-this._startValue)/this._valueRange)}getValueForPixel(e){return this._startValue+this.getDecimalForPixel(e)*this._valueRange}};$(Qf,`id`,`linear`),$(Qf,`defaults`,{ticks:{callback:Bo.formatters.numeric}});var $f=e=>Math.floor(Ha(e)),ep=(e,t)=>10**($f(e)+t);function tp(e){return e/10**$f(e)==1}function np(e,t,n){let r=10**n,i=Math.floor(e/r);return Math.ceil(t/r)-i}function rp(e,t){let n=$f(t-e);for(;np(e,t,n)>10;)n++;for(;np(e,t,n)<10;)n--;return Math.min(n,$f(e))}function ip(e,{min:t,max:n}){t=va(e.min,t);let r=[],i=$f(t),a=rp(t,n),o=a<0?10**Math.abs(a):1,s=10**a,c=i>a?10**i:0,l=Math.round((t-c)*o)/o,u=Math.floor((t-c)/s/10)*s*10,d=Math.floor((l-u)/10**a),f=va(e.min,Math.round((c+u+d*10**a)*o)/o);for(;f=10?d=d<15?15:20:d++,d>=20&&(a++,d=2,o=a>=0?1:o),f=Math.round((c+u+d*10**a)*o)/o;let p=va(e.max,f);return r.push({value:p,major:tp(p),significand:d}),r}var ap=class extends $u{constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(e,t){let n=Zf.prototype.parse.apply(this,[e,t]);if(n===0)this._zero=!0;else return _a(n)&&n>0?n:null}determineDataLimits(){let{min:e,max:t}=this.getMinMax(!0);this.min=_a(e)?Math.max(0,e):null,this.max=_a(t)?Math.max(0,t):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!_a(this._userMin)&&(this.min=e===ep(this.min,0)?ep(this.min,-1):ep(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){let{minDefined:e,maxDefined:t}=this.getUserBounds(),n=this.min,r=this.max,i=t=>n=e?n:t,a=e=>r=t?r:e;n===r&&(n<=0?(i(1),a(10)):(i(ep(n,-1)),a(ep(r,1)))),n<=0&&i(ep(r,-1)),r<=0&&a(ep(n,1)),this.min=n,this.max=r}buildTicks(){let e=this.options,t=ip({min:this._userMin,max:this._userMax},this);return e.bounds===`ticks`&&Xa(t,this,`value`),e.reverse?(t.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),t}getLabelForValue(e){return e===void 0?`0`:Lo(e,this.chart.options.locale,this.options.ticks.format)}configure(){let e=this.min;super.configure(),this._startValue=Ha(e),this._valueRange=Ha(this.max)-Ha(e)}getPixelForValue(e){return(e===void 0||e===0)&&(e=this.min),e===null||isNaN(e)?NaN:this.getPixelForDecimal(e===this.min?0:(Ha(e)-this._startValue)/this._valueRange)}getValueForPixel(e){let t=this.getDecimalForPixel(e);return 10**(this._startValue+t*this._valueRange)}};$(ap,`id`,`logarithmic`),$(ap,`defaults`,{ticks:{callback:Bo.formatters.logarithmic,major:{enabled:!0}}});function op(e){let t=e.ticks;if(t.display&&e.display){let e=gs(t.backdropPadding);return K(t.font&&t.font.size,Q.font.size)+e.height}return 0}function sp(e,t,n){return n=W(n)?n:[n],{w:Jo(e,t.string,n),h:n.length*t.lineHeight}}function cp(e,t,n,r,i){return e===r||e===i?{start:t-n/2,end:t+n/2}:ei?{start:t-n,end:t}:{start:t,end:t+n}}function lp(e){let t={l:e.left+e._padding.left,r:e.right-e._padding.right,t:e.top+e._padding.top,b:e.bottom-e._padding.bottom},n=Object.assign({},t),r=[],i=[],a=e._pointLabels.length,o=e.options.pointLabels,s=o.centerPointLabels?Y/a:0;for(let c=0;ct.r&&(s=(r.end-t.r)/a,e.r=Math.max(e.r,t.r+s)),i.startt.b&&(c=(i.end-t.b)/o,e.b=Math.max(e.b,t.b+c))}function dp(e,t,n){let r=e.drawingArea,{extra:i,additionalAngle:a,padding:o,size:s}=n,c=e.getPointPosition(t,r+i+o,a),l=Math.round(Qa(ro(c.angle+Z))),u=gp(c.y,s.h,l),d=mp(l),f=hp(c.x,s.w,d);return{visible:!0,x:c.x,y:u,textAlign:d,left:f,top:u,right:f+s.w,bottom:u+s.h}}function fp(e,t){if(!t)return!0;let{left:n,top:r,right:i,bottom:a}=e;return!($o({x:n,y:r},t)||$o({x:n,y:a},t)||$o({x:i,y:r},t)||$o({x:i,y:a},t))}function pp(e,t,n){let r=[],i=e._pointLabels.length,a=e.options,{centerPointLabels:o,display:s}=a.pointLabels,c={extra:op(a)/2,additionalAngle:o?Y/i:0},l;for(let a=0;a270||n<90)&&(e-=t),e}function _p(e,t,n){let{left:r,top:i,right:a,bottom:o}=n,{backdropColor:s}=t;if(!U(s)){let n=hs(t.borderRadius),c=gs(t.backdropPadding);e.fillStyle=s;let l=r-c.left,u=i-c.top,d=a-r+c.width,f=o-i+c.height;Object.values(n).some(e=>e!==0)?(e.beginPath(),cs(e,{x:l,y:u,w:d,h:f,radius:n}),e.fill()):e.fillRect(l,u,d,f)}}function vp(e,t){let{ctx:n,options:{pointLabels:r}}=e;for(let i=t-1;i>=0;i--){let t=e._pointLabelItems[i];if(!t.visible)continue;let a=r.setContext(e.getPointLabelContext(i));_p(n,a,t);let o=_s(a.font),{x:s,y:c,textAlign:l}=t;ss(n,e._pointLabels[i],s,c+o.lineHeight/2,o,{color:a.color,textAlign:l,textBaseline:`middle`})}}function yp(e,t,n,r){let{ctx:i}=e;if(n)i.arc(e.xCenter,e.yCenter,t,0,X);else{let n=e.getPointPosition(0,t);i.moveTo(n.x,n.y);for(let a=1;a{let n=q(this.options.pointLabels.callback,[e,t],this);return n||n===0?n:``}).filter((e,t)=>this.chart.getDataVisibility(t))}fit(){let e=this.options;e.display&&e.pointLabels.display?lp(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(e,t,n,r){this.xCenter+=Math.floor((e-t)/2),this.yCenter+=Math.floor((n-r)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(e,t,n,r))}getIndexAngle(e){let t=X/(this._pointLabels.length||1),n=this.options.startAngle||0;return ro(e*t+Za(n))}getDistanceFromCenterForValue(e){if(U(e))return NaN;let t=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-e)*t:(e-this.min)*t}getValueForDistanceFromCenter(e){if(U(e))return NaN;let t=e/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-t:this.min+t}getPointLabelContext(e){let t=this._pointLabels||[];if(e>=0&&e{if(t!==0||t===0&&this.min<0){s=this.getDistanceFromCenterForValue(e.value);let n=this.getContext(t),o=r.setContext(n),c=i.setContext(n);bp(this,o,s,a,c)}}),n.display){for(e.save(),o=a-1;o>=0;o--){let r=n.setContext(this.getPointLabelContext(o)),{color:i,lineWidth:a}=r;a&&i&&(e.lineWidth=a,e.strokeStyle=i,e.setLineDash(r.borderDash),e.lineDashOffset=r.borderDashOffset,s=this.getDistanceFromCenterForValue(t.reverse?this.min:this.max),c=this.getPointPosition(o,s),e.beginPath(),e.moveTo(this.xCenter,this.yCenter),e.lineTo(c.x,c.y),e.stroke())}e.restore()}}drawBorder(){}drawLabels(){let e=this.ctx,t=this.options,n=t.ticks;if(!n.display)return;let r=this.getIndexAngle(0),i,a;e.save(),e.translate(this.xCenter,this.yCenter),e.rotate(r),e.textAlign=`center`,e.textBaseline=`middle`,this.ticks.forEach((r,o)=>{if(o===0&&this.min>=0&&!t.reverse)return;let s=n.setContext(this.getContext(o)),c=_s(s.font);if(i=this.getDistanceFromCenterForValue(this.ticks[o].value),s.showLabelBackdrop){e.font=c.string,a=e.measureText(r.label).width,e.fillStyle=s.backdropColor;let t=gs(s.backdropPadding);e.fillRect(-a/2-t.left,-i-c.size/2-t.top,a+t.width,c.size+t.height)}ss(e,r.label,0,-i,c,{color:s.color,strokeColor:s.textStrokeColor,strokeWidth:s.textStrokeWidth})}),e.restore()}drawTitle(){}};$(Sp,`id`,`radialLinear`),$(Sp,`defaults`,{display:!0,animate:!0,position:`chartArea`,angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Bo.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(e){return e},padding:5,centerPointLabels:!1}}),$(Sp,`defaultRoutes`,{"angleLines.color":`borderColor`,"pointLabels.color":`color`,"ticks.color":`color`}),$(Sp,`descriptors`,{angleLines:{_fallback:`grid`}});var Cp={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},wp=Object.keys(Cp);function Tp(e,t){return e-t}function Ep(e,t){if(U(t))return null;let n=e._adapter,{parser:r,round:i,isoWeekday:a}=e._parseOpts,o=t;return typeof r==`function`&&(o=r(o)),_a(o)||(o=typeof r==`string`?n.parse(o,r):n.parse(o)),o===null?null:(i&&(o=i===`week`&&(Ja(a)||a===!0)?n.startOf(o,`isoWeek`,a):n.startOf(o,i)),+o)}function Dp(e,t,n,r){let i=wp.length;for(let a=wp.indexOf(e);a=wp.indexOf(n);a--){let n=wp[a];if(Cp[n].common&&e._adapter.diff(i,r,n)>=t-1)return n}return wp[n?wp.indexOf(n):0]}function kp(e){for(let t=wp.indexOf(e)+1,n=wp.length;t=t?n[r]:n[i];e[a]=!0}}function jp(e,t,n,r){let i=e._adapter,a=+i.startOf(t[0].value,r),o=t[t.length-1].value,s,c;for(s=a;s<=o;s=+i.add(s,1,r))c=n[s],c>=0&&(t[c].major=!0);return t}function Mp(e,t,n){let r=[],i={},a=t.length,o,s;for(o=0;o+e.value))}initOffsets(e=[]){let t=0,n=0,r,i;this.options.offset&&e.length&&(r=this.getDecimalForValue(e[0]),t=e.length===1?1-r:(this.getDecimalForValue(e[1])-r)/2,i=this.getDecimalForValue(e[e.length-1]),n=e.length===1?i:(i-this.getDecimalForValue(e[e.length-2]))/2);let a=e.length<3?.5:.25;t=ao(t,0,a),n=ao(n,0,a),this._offsets={start:t,end:n,factor:1/(t+1+n)}}_generate(){let e=this._adapter,t=this.min,n=this.max,r=this.options,i=r.time,a=i.unit||Dp(i.minUnit,t,n,this._getLabelCapacity(t)),o=K(r.ticks.stepSize,1),s=a===`week`&&i.isoWeekday,c=Ja(s)||s===!0,l={},u=t,d,f;if(c&&(u=+e.startOf(u,`isoWeek`,s)),u=+e.startOf(u,c?`day`:a),e.diff(n,t,a)>1e5*o)throw Error(t+` and `+n+` are too far apart with stepSize of `+o+` `+a);let p=r.ticks.source===`data`&&this.getDataTimestamps();for(d=u,f=0;d+e)}getLabelForValue(e){let t=this._adapter,n=this.options.time;return n.tooltipFormat?t.format(e,n.tooltipFormat):t.format(e,n.displayFormats.datetime)}format(e,t){let n=this.options.time.displayFormats,r=this._unit,i=t||n[r];return this._adapter.format(e,i)}_tickFormatFunction(e,t,n,r){let i=this.options,a=i.ticks.callback;if(a)return q(a,[e,t,n],this);let o=i.time.displayFormats,s=this._unit,c=this._majorUnit,l=s&&o[s],u=c&&o[c],d=n[t],f=c&&u&&d&&d.major;return this._adapter.format(e,r||(f?u:l))}generateTickLabels(e){let t,n,r;for(t=0,n=e.length;t0?o:1}getDataTimestamps(){let e=this._cache.data||[],t,n;if(e.length)return e;let r=this.getMatchingVisibleMetas();if(this._normalized&&r.length)return this._cache.data=r[0].controller.getAllParsedValues(this);for(t=0,n=r.length;t=e[r].pos&&t<=e[i].pos&&({lo:r,hi:i}=lo(e,`pos`,t)),{pos:a,time:s}=e[r],{pos:o,time:c}=e[i]):(t>=e[r].time&&t<=e[i].time&&({lo:r,hi:i}=lo(e,`time`,t)),{time:a,pos:s}=e[r],{time:o,pos:c}=e[i]);let l=o-a;return l?s+(c-s)*(t-a)/l:s}var Fp=class extends Np{constructor(e){super(e),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){let e=this._getTimestampsForTable(),t=this._table=this.buildLookupTable(e);this._minPos=Pp(t,this.min),this._tableRange=Pp(t,this.max)-this._minPos,super.initOffsets(e)}buildLookupTable(e){let{min:t,max:n}=this,r=[],i=[],a,o,s,c,l;for(a=0,o=e.length;a=t&&c<=n&&r.push(c);if(r.length<2)return[{time:t,pos:0},{time:n,pos:1}];for(a=0,o=r.length;ae-t)}_getTimestampsForTable(){let e=this._cache.all||[];if(e.length)return e;let t=this.getDataTimestamps(),n=this.getLabelTimestamps();return e=t.length&&n.length?this.normalize(t.concat(n)):t.length?t:n,e=this._cache.all=e,e}getDecimalForValue(e){return(Pp(this._table,e)-this._minPos)/this._tableRange}getValueForPixel(e){let t=this._offsets,n=this.getDecimalForPixel(e)/t.factor-t.end;return Pp(this._table,n*this._tableRange+this._minPos,!0)}};$(Fp,`id`,`timeseries`),$(Fp,`defaults`,Np.defaults),Vd.register(Dl,Cf,Jf,Qf,Uf);var Ip=new Intl.DateTimeFormat(`ko-KR`,{hour:`2-digit`,hour12:!1}),Lp=`#94a3b8`,Rp=`rgba(148, 163, 184, 0.18)`,zp=`#0d9488`,Bp=`#0f766e`;function Vp(e){return Ip.format(new Date(e*1e3))}function Hp(e){return e.map((t,n)=>n%3==0||n===e.length-1?Vp(t.bucketStart):``)}function Up({buckets:e}){let t=we(null),n=we(null),r=we(e);return r.current=e,I(()=>{let e=t.current;if(!e)return;let i=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,a=window.getComputedStyle(e).fontFamily,o={animation:!i&&{duration:500,easing:`easeOutQuart`},maintainAspectRatio:!1,responsive:!0,interaction:{intersect:!1,mode:`index`},plugins:{legend:{display:!1},tooltip:{displayColors:!1,callbacks:{title:e=>{let t=e[0]?.dataIndex??-1,n=r.current[t];return n?Vp(n.bucketStart):``},label:e=>`차단 ${H(Number(e.raw??0))}`,afterLabel:e=>{let t=r.current[e.dataIndex];return t?`DNS 요청 ${H(t.queries)}`:``}}}},scales:{x:{border:{display:!1},grid:{display:!1},ticks:{autoSkip:!1,color:Lp,font:{family:a,size:11,weight:700},maxRotation:0,minRotation:0}},y:{beginAtZero:!0,border:{display:!1},grid:{color:Rp},ticks:{color:Lp,font:{family:a,size:11,weight:700},maxTicksLimit:4,precision:0}}}};return n.current=new Vd(e,{type:`bar`,data:{labels:Hp(r.current),datasets:[{data:r.current.map(e=>e.blocked),backgroundColor:zp,hoverBackgroundColor:Bp,borderRadius:4,borderSkipped:!1,barPercentage:.82,categoryPercentage:.9,maxBarThickness:24}]},options:o}),()=>{n.current?.destroy(),n.current=null}},[]),I(()=>{let t=n.current;t&&(t.data.labels=Hp(e),t.data.datasets[0].data=e.map(e=>e.blocked),t.update())},[e]),L(`div`,{class:`mt-5 h-44 sm:h-52`,children:L(`canvas`,{"aria-label":`최근 24시간 시간대별 SafeShield 차단 요청`,ref:t,role:`img`,children:`최근 24시간 시간대별 SafeShield 차단 요청 차트`})})}var Wp=3600,Gp=24;function Kp(e,t){return e<=0?`0.0%`:`${(t/e*100).toFixed(1)}%`}function qp(e){let t=e.hourly[e.hourly.length-1];if(t?.bucketStart)return t.bucketStart;let n=e.updatedAt>0?e.updatedAt:Math.floor(Date.now()/1e3);return Math.floor(n/Wp)*Wp}function Jp(e){let t=new Map(e.hourly.map(e=>[e.bucketStart,e])),n=qp(e)-23*Wp;return Array.from({length:Gp},(e,r)=>{let i=n+r*Wp;return t.get(i)??{bucketStart:i,queries:0,blocked:0}})}function Yp({children:e}){return L(`div`,{class:`mt-5 flex min-h-52 items-center justify-center rounded-xl border border-slate-200 bg-slate-50 px-5 text-center`,children:L(`p`,{class:`m-0 max-w-lg text-sm font-semibold leading-6 text-slate-500`,children:e})})}function Xp({data:e,error:t,loading:n,nowTimestamp:r,refreshing:i}){let a;if(n&&!e)a=L(Yp,{children:`SafeShield 보호 활동을 불러오는 중입니다.`});else if(t&&!e)a=L(Yp,{children:`SafeShield 보호 활동을 불러오지 못했습니다. SafeShield 페이지에서 상태를 확인해 주세요.`});else if(!e||!e.available)a=L(Yp,{children:`현재 SafeShield에서 차단 통계를 제공하지 않습니다. 통계 기능을 확인해 주세요.`});else if(!e.enabled)a=L(Yp,{children:`통계 수집이 꺼져 있습니다. SafeShield 페이지에서 통계를 켜면 최근 24시간 활동이 표시됩니다.`});else{let t=Jp(e),n=t.reduce((e,t)=>({queries:e.queries+t.queries,blocked:e.blocked+t.blocked}),{queries:0,blocked:0});a=L(v,{children:[L(`dl`,{class:`mt-5 grid gap-3 sm:grid-cols-3`,children:[L(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3`,children:[L(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:`DNS 요청`}),L(`dd`,{class:`mt-1 mb-0 ml-0 text-lg font-black text-slate-950`,children:H(n.queries)})]}),L(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3`,children:[L(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:`차단`}),L(`dd`,{class:`mt-1 mb-0 ml-0 text-lg font-black text-teal-700`,children:H(n.blocked)})]}),L(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3`,children:[L(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:`차단율`}),L(`dd`,{class:`mt-1 mb-0 ml-0 text-lg font-black text-slate-950`,children:Kp(n.queries,n.blocked)})]})]}),L(Up,{buckets:t})]})}return L(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[L(`div`,{class:`min-w-0`,children:[L(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`SafeShield activity`}),L(`div`,{class:`mt-2 flex min-w-0 items-center justify-between gap-3`,children:[L(`h3`,{class:`m-0 min-w-0 text-xl font-black text-slate-950`,children:`최근 24시간 보호 활동`}),L(`a`,{class:`shrink-0 whitespace-nowrap text-xs font-extrabold text-teal-700 no-underline hover:text-teal-800`,href:`#safeshield`,children:`상세 통계 →`})]}),e?.updatedAt?L(`p`,{class:`mt-2 mb-0 text-[0.68rem] font-semibold text-slate-400`,title:Wt(e.updatedAt),children:i?`갱신 중…`:`집계: ${Gt(e.updatedAt,r)}`}):null]}),a,t&&e?L(`p`,{class:`mt-3 mb-0 text-xs font-bold text-amber-700`,children:`최근 통계 갱신에 실패해 마지막 정상 데이터를 표시하고 있습니다.`}):null]})}function Zp(e){return e===`healthy`?`bg-emerald-50 text-emerald-700 ring-emerald-200`:e===`warning`?`bg-amber-50 text-amber-800 ring-amber-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function Qp({detail:e,eyebrow:t,href:n,icon:r,linkLabel:i=`자세히 보기 →`,meta:a,metaState:o,metaWarning:s=!1,state:c=`neutral`,value:l}){let u=L(v,{children:[L(`div`,{class:`flex items-start justify-between gap-4`,children:[L(`p`,{class:`m-0 text-[0.68rem] font-black uppercase tracking-[0.16em] text-slate-500`,children:t}),L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl ring-1 ring-inset ${Zp(c)}`,children:r})]}),L(`p`,{class:`mt-4 mb-0 break-words text-2xl font-black tracking-tight text-slate-950`,children:l}),L(`p`,{class:`mt-2 mb-0 min-h-10 text-sm font-medium leading-5 text-slate-500`,children:e}),a?L(`p`,{class:`mt-3 mb-0 text-xs font-bold ${o===`healthy`?`text-emerald-700`:o===`warning`||s?`text-amber-700`:`text-slate-400`}`,children:a}):null,n?L(`span`,{class:`mt-4 inline-flex text-xs font-extrabold text-teal-700`,children:i}):null]}),d=`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 transition`;return n?L(`a`,{class:`${d} no-underline hover:border-slate-300 hover:shadow-md`,href:n,children:u}):L(`article`,{class:d,children:u})}var $p=6e4;function em(e,t){return!e||!Number.isFinite(e)||e<=0?null:Math.max(0,t-e)}function tm(e,t,n,r){return!t||t<=0?`${e}: ${r}`:L(`span`,{title:Wt(t),children:[e,`: `,Gt(t,n)]})}function nm(e){if(!e)return null;switch(e.toLowerCase()){case`dhcp`:return`DHCP`;case`static`:return`Static`;case`pppoe`:return`PPPoE`;default:return e.toUpperCase()}}function rm(e){if(!e)return!1;let t=e.split(`.`).map(e=>Number(e));if(t.length!==4||t.some(e=>!Number.isInteger(e)||e<0||e>255))return!1;let[n,r]=t;return n===void 0||r===void 0?!1:n===10||n===172&&r>=16&&r<=31||n===192&&r===168}function im({label:e,value:t}){return L(`div`,{class:`flex min-w-0 items-start justify-between gap-4 border-b border-slate-100 py-3 last:border-b-0`,children:[L(`dt`,{class:`text-sm font-semibold text-slate-500`,children:e}),L(`dd`,{class:`m-0 min-w-0 max-w-[68%] break-words text-right text-sm font-extrabold text-slate-950`,children:t})]})}function am(e){return e===`initializing`?{badge:`bg-teal-100 text-teal-800`,icon:`text-teal-700`,label:`준비 중`,panel:`border-teal-200 bg-teal-50`}:e===`critical`?{badge:`bg-rose-100 text-rose-800`,icon:`text-rose-700`,label:`이상`,panel:`border-rose-200 bg-rose-50/70`}:e===`warning`?{badge:`bg-amber-100 text-amber-800`,icon:`text-amber-700`,label:`주의`,panel:`border-amber-200 bg-amber-50/70`}:e===`unknown`?{badge:`bg-slate-200 text-slate-700`,icon:`text-slate-500`,label:`확인 불가`,panel:`border-slate-200 bg-slate-50`}:{badge:`bg-emerald-100 text-emerald-800`,icon:`text-emerald-700`,label:`정상`,panel:`border-emerald-200 bg-emerald-50/70`}}function om({data:e,error:t,loading:n,nowTimestamp:r}){let i=!!(e&&e.generatedAt>0),a=am(i&&e?e.overall:`unknown`),o=i&&e?e.checks.filter(e=>e.status!==`ok`):[],s=o.slice(0,2),c=Math.max(0,o.length-s.length);return L(`div`,{class:`mt-5 border-t border-slate-200 pt-5`,children:[L(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[L(`div`,{class:`flex items-center gap-2`,children:[L(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:`장치 진단`}),i?L(`span`,{class:`rounded-full px-2.5 py-1 text-[11px] font-extrabold ${a.badge}`,children:a.label}):null]}),L(`a`,{class:`text-xs font-extrabold text-teal-700 no-underline hover:text-teal-900`,href:`#settings`,children:`상세 보기 →`})]}),t&&!i?L(`div`,{class:`mt-3 rounded-xl border border-amber-200 bg-amber-50/70 px-4 py-3`,children:L(`div`,{class:`flex items-start gap-2`,children:[L(B,{class:`mt-0.5 size-4 shrink-0 text-amber-700`}),L(`div`,{class:`min-w-0`,children:[L(`p`,{class:`m-0 text-sm font-extrabold text-slate-900`,children:`진단 상태를 확인하지 못했습니다.`}),L(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`설정에서 장치 진단 상태를 다시 확인해 주세요.`})]})]})}):i&&e?L(`div`,{class:`mt-3 rounded-xl border px-4 py-3 ${a.panel}`,children:[L(`div`,{class:`flex min-w-0 items-start gap-3`,children:[e.overall===`ok`?L(ut,{class:`mt-0.5 size-5 shrink-0 ${a.icon}`}):e.overall===`initializing`?L(tt,{class:`mt-0.5 size-5 shrink-0 ${a.icon}`}):L(B,{class:`mt-0.5 size-5 shrink-0 ${a.icon}`}),L(`div`,{class:`min-w-0 flex-1`,children:[L(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:e.summary.message}),L(`p`,{class:`mt-1 mb-0 text-xs font-semibold leading-5 text-slate-500`,children:[`마지막 진단: `,Gt(e.generatedAt,r),` · 검사 항목:`,` `,e.summary.total,`개`]})]})]}),s.length>0?L(`div`,{class:`mt-3 grid gap-2 sm:grid-cols-2`,children:s.map(e=>L(`div`,{class:`min-w-0 rounded-lg border border-white/80 bg-white/70 px-3 py-2`,children:[L(`p`,{class:`m-0 text-xs font-extrabold text-slate-900`,children:e.label}),L(`p`,{class:`mt-1 mb-0 line-clamp-2 text-xs leading-5 text-slate-500`,children:e.message})]},e.id))}):null,c>0?L(`p`,{class:`mt-2 mb-0 text-xs font-extrabold text-slate-600`,children:[`외 `,c,`건의 확인 항목이 있습니다.`]}):null]}):L(`div`,{class:`mt-3 rounded-xl border border-slate-200 bg-slate-50 px-4 py-3`,children:[L(`p`,{class:`m-0 text-sm font-extrabold text-slate-900`,children:n?`진단 상태를 확인하고 있습니다.`:`아직 생성된 진단 결과가 없습니다.`}),L(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`진단 결과가 생성되면 현재 장치 상태를 이곳에 요약해서 표시합니다.`})]})]})}function sm(e,t,n){if(t&&!e)return{detail:`보호 상태를 확인하고 있습니다.`,state:`neutral`,value:`확인 중`};if(n&&!e)return{detail:`SafeShield 상태를 불러오지 못했습니다.`,state:`warning`,value:`확인 필요`};if(!e||!e.available)return{detail:`SafeShield 서비스를 사용할 수 없습니다.`,state:`warning`,value:`사용 불가`};if(!e.enabled||e.status===`disabled`)return{detail:`DNS 보호가 비활성화되어 있습니다.`,state:`neutral`,value:`꺼짐`};if(e.status===`running`)return{detail:`차단 목록을 갱신하고 있습니다.`,state:`neutral`,value:`갱신 중`};if(!(e.active&&e.runtime.dnsmasqRunning&&e.runtime.dnsRuntimeOk&&e.health.overall!==`error`&&e.issueCounts.errors===0))return{detail:e.runtime.lastErrorCode?`최근 오류: ${e.runtime.lastErrorCode}`:`DNS 보호 상태를 확인해 주세요.`,state:`warning`,value:`확인 필요`};let r=e.entitlement.plan?.trim(),i=e.blocklist.validLineCount>0?`${H(e.blocklist.validLineCount)}개 차단 규칙`:`차단 목록 적용됨`;return{detail:r?`${i} · ${r.toUpperCase()}`:i,state:`healthy`,value:`보호 중`}}function cm({accountRegistered:e,activity:t,activityError:n,activityLoading:r,data:i,devices:a,devicesError:o,devicesLoading:s,error:c,firmware:l,firmwareError:u,firmwareLoading:d,health:f,healthError:p,healthLoading:m,lan:h,lanError:g,lanLoading:_,loading:v,onRetry:y,safeshield:b,safeshieldError:x,safeshieldLoading:S,statistics:C,statisticsError:w,statisticsLoading:T,statisticsRefreshing:E,updates:D,updatesError:O,updatesLoading:k}){let A=Te(()=>i?Yt(i.runtime.memory):null,[i]),[j,M]=F(()=>Math.floor(Date.now()/1e3));if(I(()=>{let e=window.setInterval(()=>{M(Math.floor(Date.now()/1e3))},$p);return()=>window.clearInterval(e)},[]),v&&!i)return L(zn,{});if(c&&!i)return L(Bn,{message:c,onRetry:y});if(!i)return null;let ee=A?Math.round(A.percent):0,te=sm(b,S,x),ne=D?.packages.find(e=>e.name===`luci-app-smartsafehub`)??D?.packages[0]??null,re=!!(D&&D.updateCount>0),ie=D?re?`${D.updateCount}개 업데이트`:D.lastCheckAt?`최신 상태`:`확인 전`:O?`확인 필요`:`확인 중`,ae=ne?re&&ne.availableVersion?`${ne.installedVersion} → ${ne.availableVersion}`:`설치 버전 ${ne.installedVersion}`:O?`업데이트 상태를 불러오지 못했습니다.`:k?`업데이트 상태를 확인하고 있습니다.`:`업데이트 상태를 확인할 수 없습니다.`,oe=a?`${H(a.totals.online)}대`:s?`확인 중`:`확인 필요`,se=a?`Wi-Fi ${H(a.totals.wireless)}대 · 유선/기타 ${H(a.totals.ethernet)}대`:o||`연결 기기 요약을 불러오고 있습니다.`,ce=nm(i.network.protocol),le=i.network.available?i.network.ipv4Address?`WAN ${i.network.ipv4Address}${ce?` · ${ce}`:``}`:ce?`${ce} · WAN 주소를 받지 못했습니다.`:`WAN 주소를 받지 못했습니다.`:`WAN 인터페이스를 찾을 수 없습니다.`,N=!!h?.conflict.detected,ue=!i.network.up||N||g!==null&&!h?`warning`:h?`healthy`:`neutral`,de=N?`네트워크 충돌`:i.network.up?`정상 연결`:`연결 확인`,fe=i.network.up?N?`⚠ LAN 대역과 충돌합니다`:_&&!h?`네트워크 대역 확인 중`:g&&!h?`네트워크 대역을 확인하지 못했습니다.`:h?`✓ 네트워크 충돌 없음`:`네트워크 대역 확인 필요`:`WAN 연결 상태를 확인해 주세요.`,pe=!i.network.up||N||g!==null&&!h?`warning`:h?`healthy`:`neutral`,me=i.network.ipv4Address?rm(i.network.ipv4Address)?`${i.network.ipv4Address} · 사설 네트워크`:i.network.ipv4Address:`할당되지 않음`,he=em(b?.timestamps.lastSuccess,j),P=b?Math.max(b.timestamps.refreshIntervalS*2,86400):null,ge=!!(b?.enabled&&b.status!==`running`&&he!==null&&P!==null&&he>P),_e=Wr(D,j),ve=!!l?.current.metadataAvailable,ye=d&&!l?`확인 중`:u&&!l?`확인 필요`:ve?l?.current.releaseVersion?`SmartSafeHub ${l.current.releaseVersion}`:`SmartSafeHub 펌웨어`:`${i.software.distribution} ${i.software.version}`,be=d&&!l?`확인 중`:u&&!l?`확인 필요`:ve&&l?.current.buildId||i.software.revision,xe=ve?`빌드 ID`:`리비전`;return L(`div`,{class:`min-w-0 space-y-6`,children:[L(`section`,{"aria-labelledby":`dashboard-overview-title`,children:[L(V,{description:`인터넷, SafeShield, 연결 기기와 소프트웨어 상태를 한눈에 확인합니다.`,eyebrow:`Overview`,id:`dashboard-overview-title`,title:`시스템 개요`}),L(`div`,{class:`grid min-w-0 gap-4 sm:grid-cols-2 xl:grid-cols-4`,children:[L(Qp,{detail:le,eyebrow:`Internet`,href:`#network`,icon:L($e,{class:`size-5`}),linkLabel:N?`해결하기 →`:`자세히 보기 →`,meta:fe,metaState:pe,state:ue,value:de}),L(Qp,{detail:te.detail,eyebrow:`SafeShield`,href:`#safeshield`,icon:L(Ue,{class:`size-5`}),meta:tm(ge?`차단 목록 갱신 지연`:`차단 목록 갱신`,b?.timestamps.lastSuccess,j,S?`확인 중`:`기록 없음`),metaWarning:ge,state:te.state===`healthy`&&ge?`warning`:te.state,value:te.value}),L(Qp,{detail:se,eyebrow:`Connected devices`,href:`#devices`,icon:L(Ge,{class:`size-5`}),meta:tm(`목록 확인`,a?.generatedAt,j,s?`확인 중`:`기록 없음`),state:a?`healthy`:o?`warning`:`neutral`,value:oe}),L(Qp,{detail:ae,eyebrow:`Software update`,href:`#system`,icon:L(Je,{class:`size-5`}),meta:D&&!D.settings.checkEnabled?tm(`자동 확인 꺼짐 · 마지막 확인`,D.lastCheckAt,j,`확인 기록 없음`):tm(_e?`업데이트 확인 지연`:`마지막 확인`,D?.lastCheckAt,j,k?`확인 중`:`아직 없음`),metaWarning:_e,state:O||_e||re?`warning`:D?.lastCheckAt?`healthy`:`neutral`,value:ie})]}),e===!1?L(`div`,{class:`ssh-dashboard-account-banner mt-4 flex flex-col gap-4 rounded-2xl border p-4 sm:flex-row sm:items-center sm:justify-between sm:p-5`,role:`status`,children:[L(`div`,{class:`flex min-w-0 items-start gap-3`,children:[L(`span`,{class:`ssh-dashboard-account-banner-icon grid size-10 shrink-0 place-items-center rounded-xl`,"aria-hidden":`true`,children:L(qe,{class:`size-5`})}),L(`div`,{class:`min-w-0`,children:[L(`div`,{class:`flex flex-wrap items-center gap-2`,children:[L(`p`,{class:`ssh-dashboard-account-banner-title m-0 font-bold`,children:`SmartSafeHub 계정을 연결해 주세요`}),L(`span`,{class:`ssh-dashboard-account-banner-badge rounded-full px-2 py-0.5 text-[0.7rem] font-bold`,children:`연결 필요`})]}),L(`p`,{class:`ssh-dashboard-account-banner-description mt-1 mb-0 text-sm leading-relaxed`,children:`계정을 연결하면 웹사이트에서 기기를 관리하고 구독 정보를 확인할 수 있습니다. DNS 보호는 연결하지 않아도 계속 작동합니다.`})]})]}),L(`a`,{href:`#account`,class:`ssh-dashboard-account-banner-action inline-flex min-h-10 shrink-0 items-center justify-center rounded-xl px-4 py-2 text-sm font-bold no-underline transition-colors focus-visible:outline-2 focus-visible:outline-offset-2`,children:`계정 연결하기 →`})]}):null]}),L(`section`,{"aria-labelledby":`dashboard-activity-title`,children:[L(V,{description:`최근 SafeShield 차단 활동과 현재 네트워크 연결 구성을 함께 확인합니다.`,eyebrow:`Activity`,id:`dashboard-activity-title`,title:`네트워크 보호 활동`}),L(`div`,{class:`grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1.55fr)_minmax(18rem,0.65fr)]`,children:[L(Xp,{data:C,error:w,loading:T,nowTimestamp:j,refreshing:E}),L(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[L(`div`,{class:`flex items-start justify-between gap-4`,children:[L(`div`,{children:[L(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Network`}),L(`h3`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:`연결 상태`})]}),L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl ${i.network.up&&!N?`bg-emerald-50 text-emerald-700`:`bg-amber-50 text-amber-800`}`,children:L($e,{class:`size-5`})})]}),L(`dl`,{class:`mt-4 mb-0`,children:[L(im,{label:`인터넷`,value:N?`네트워크 충돌`:i.network.up?`정상 연결`:`연결 확인`}),L(im,{label:`WAN IP`,value:me}),L(im,{label:`프로토콜`,value:ce||`확인되지 않음`}),L(im,{label:`상위 네트워크`,value:h?.wan.subnet||(_?`확인 중`:g?`확인 필요`:`확인되지 않음`)}),L(im,{label:`LAN 네트워크`,value:h?.lan.subnet||(_?`확인 중`:g?`확인 필요`:`확인되지 않음`)}),L(im,{label:`대역 충돌`,value:h?L(`span`,{class:h.conflict.detected?`text-amber-700`:`text-emerald-700`,children:h.conflict.detected?`충돌 감지`:`없음`}):_?`확인 중`:`확인 필요`})]}),L(`a`,{class:`mt-5 inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-slate-200 bg-slate-50 px-4 py-2 text-sm font-extrabold text-slate-700 no-underline transition hover:border-teal-200 hover:bg-teal-50 hover:text-teal-800`,href:`#network`,children:`네트워크 보기`})]})]})]}),L(`section`,{"aria-labelledby":`dashboard-recent-activity-title`,children:[L(V,{action:L(`a`,{class:`inline-flex whitespace-nowrap text-xs font-extrabold text-teal-700 no-underline hover:text-teal-900`,href:`#activity`,children:`전체 보기 →`}),description:`인터넷, 보호, 업데이트와 진단에서 실제 상태가 바뀐 시점을 확인합니다.`,eyebrow:`History`,id:`dashboard-recent-activity-title`,title:`최근 활동`}),L(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:r||n&&!t?L(dn,{error:n,loading:r}):L(un,{compact:!0,events:(t?.events??[]).slice(0,3)})})]}),L(`section`,{"aria-labelledby":`dashboard-system-title`,children:[L(V,{description:`메모리, 시스템 부하와 장치 정보를 빠르게 점검합니다.`,eyebrow:`System`,id:`dashboard-system-title`,title:`시스템 상태`}),L(`div`,{class:`grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1.45fr)_minmax(20rem,0.75fr)]`,children:[L(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[L(`div`,{class:`flex flex-wrap items-start justify-between gap-4`,children:[L(`div`,{children:[L(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Runtime`}),L(`h3`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:`리소스 사용량`})]}),L(`span`,{class:`inline-flex items-center gap-2 rounded-full px-3 py-1.5 text-xs font-black ring-1 ring-inset ${ee>=90?`bg-amber-50 text-amber-800 ring-amber-200`:`bg-emerald-50 text-emerald-700 ring-emerald-200`}`,children:[L(`span`,{class:`size-2 rounded-full ${ee>=90?`bg-amber-500`:`bg-emerald-500`}`}),ee>=90?`메모리 확인`:`정상 실행`]})]}),L(`div`,{class:`mt-5 grid gap-3 sm:grid-cols-3`,children:[L(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[L(`div`,{class:`flex items-center gap-2 text-slate-500`,children:[L(nt,{class:`size-4`}),L(`span`,{class:`text-xs font-extrabold`,children:`메모리`})]}),L(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:[ee,`%`]}),L(`p`,{class:`mt-1 mb-0 text-xs font-semibold text-slate-500`,children:[A?Vt(A.used):`-`,` /`,` `,Vt(i.runtime.memory.total)]}),L(`div`,{"aria-label":`메모리 사용률 ${ee}%`,class:`mt-3 h-1.5 overflow-hidden rounded-full bg-slate-200`,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":ee,children:L(`div`,{class:`h-full rounded-full transition-[width] duration-300 ${ee>=90?`bg-amber-500`:`bg-teal-600`}`,style:{width:`${Math.min(100,ee)}%`}})})]}),L(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[L(`div`,{class:`flex items-center gap-2 text-slate-500`,children:[L(We,{class:`size-4`}),L(`span`,{class:`text-xs font-extrabold`,children:`시스템 부하`})]}),L(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:Ht(i.runtime.load[0])}),L(`p`,{class:`mt-1 mb-0 text-xs font-semibold text-slate-500`,children:[`5분 `,Ht(i.runtime.load[1]),` · 15분`,` `,Ht(i.runtime.load[2])]})]}),L(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[L(`div`,{class:`flex items-center gap-2 text-slate-500`,children:[L(tt,{class:`size-4`}),L(`span`,{class:`text-xs font-extrabold`,children:`실행 시간`})]}),L(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:Bt(i.runtime.uptime)}),L(`p`,{class:`mt-1 mb-0 text-xs font-semibold text-slate-500`,children:[`부팅 `,Ut(i.runtime.localtime,i.runtime.uptime)]})]})]}),L(om,{data:f,error:p,loading:m,nowTimestamp:j})]}),L(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[L(`div`,{class:`flex items-start justify-between gap-4`,children:[L(`div`,{children:[L(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Device`}),L(`h3`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:`장치 정보`})]}),L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:L(We,{class:`size-5`})})]}),L(`dl`,{class:`mt-4 mb-0`,children:[L(im,{label:`모델`,value:i.device.model}),L(im,{label:`호스트 이름`,value:i.device.hostname}),L(im,{label:`펌웨어`,value:L(`span`,{title:ve?l?.current.releaseVersion?`SmartSafeHub 펌웨어 ${l.current.releaseVersion}`:`SmartSafeHub 커스텀 펌웨어`:u||void 0,children:ye})}),L(im,{label:xe,value:be}),L(im,{label:`커널`,value:i.software.kernel}),L(im,{label:`WAN IP`,value:i.network.ipv4Address||`할당되지 않음`})]})]})]})]})]})}var lm=3,um=10;function dm(e,t){return e<=0?`0.0%`:`${(t/e*100).toFixed(1)}%`}function fm(e){return e.id===`other`?`기타 기기`:e.hostname?e.hostname:e.identified?`이름 없는 기기`:`미식별 기기`}function pm(e){return[...e].sort((e,t)=>e.id===`other`?1:t.id===`other`?-1:t.blocked-e.blocked||t.queries-e.queries||fm(e).localeCompare(fm(t),`ko`))}function mm({devices:e,deviceLimit:t,truncated:n}){let r=pm(e),[i,a]=F(!1),[o,s]=F(1),c=Math.max(1,Math.ceil(r.length/um)),l=Math.min(o,c),u=(l-1)*um,d=Math.min(u+um,r.length),f=i?r.slice(u,d):r.slice(0,lm),p=r.length>lm;return I(()=>{s(e=>Math.min(e,c))},[c]),L(`div`,{class:`mt-6 rounded-2xl border border-slate-100 bg-slate-50/70 p-4 sm:p-5`,children:[L(`div`,{class:`flex flex-wrap items-start justify-between gap-3`,children:[L(`div`,{children:[L(`div`,{class:`flex flex-wrap items-center gap-2`,children:[L(`p`,{class:`m-0 text-xs font-bold text-slate-500`,children:`기기별 통계`}),p&&!i?L(`span`,{class:`inline-flex items-center rounded-full bg-teal-50 px-2 py-1 text-[10px] font-extrabold tracking-wide text-teal-700 ring-1 ring-teal-100`,children:`차단 TOP 3`}):null]}),L(`h3`,{class:`mt-1 mb-0 text-base font-extrabold text-slate-950`,children:`어떤 기기에서 차단되었는지 확인`}),L(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-500`,children:`DHCP 정보가 있는 기기는 MAC 주소를 기준으로 식별하며, 기기별 숫자만 현재 부팅 세션 동안 메모리에 집계합니다.`})]}),L(`div`,{class:`flex flex-wrap items-center justify-end gap-2`,children:[L(`span`,{class:`inline-flex items-center gap-2 rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-slate-600 ring-1 ring-slate-200`,children:[L(Ge,{class:`size-4 text-teal-700`}),H(r.length),`개 항목`]}),p?L(`button`,{"aria-controls":`safeshield-device-statistics-list`,"aria-expanded":i,class:`rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-teal-700 ring-1 ring-slate-200 transition hover:bg-slate-50`,onClick:()=>{a(e=>!e),s(1)},type:`button`,children:i?`간단히 보기 ↑`:`전체 ${H(r.length)}개 기기 보기 ↓`}):null]})]}),r.length===0?L(`p`,{class:`mt-4 mb-0 rounded-xl bg-white p-4 text-sm leading-6 text-slate-500 ring-1 ring-slate-100`,children:`아직 기기별 DNS 통계가 없습니다. 클라이언트에서 DNS 요청이 발생하면 다음 통계 갱신 시 표시됩니다.`}):L(`div`,{class:`mt-4 grid gap-3`,id:`safeshield-device-statistics-list`,children:f.map(e=>L(`article`,{class:`grid gap-4 rounded-xl bg-white p-4 ring-1 ring-slate-100 sm:grid-cols-[minmax(0,1fr)_auto] sm:items-center`,children:[L(`div`,{class:`min-w-0`,children:L(`div`,{class:`flex min-w-0 flex-wrap items-center gap-2`,children:[L(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg bg-teal-50 text-teal-700`,children:L(Ge,{class:`size-4`})}),L(`div`,{class:`min-w-0`,children:[L(`h4`,{class:`m-0 truncate text-sm font-extrabold text-slate-950`,children:fm(e)}),L(`p`,{class:`mt-1 mb-0 break-all text-xs text-slate-500`,children:[e.ip||`IP 미확인`,e.mac?` · ${e.mac}`:``]})]}),L(`span`,{class:`rounded-full px-2 py-1 text-[11px] font-extrabold ${e.identified?`bg-emerald-50 text-emerald-700`:`bg-slate-100 text-slate-600`}`,children:e.id===`other`?`합산`:e.identified?`DHCP 식별`:`IP 임시 식별`})]})}),L(`dl`,{class:`m-0 grid grid-cols-3 gap-2 text-right`,children:[L(`div`,{class:`min-w-20`,children:[L(`dt`,{class:`text-[11px] font-bold text-slate-400`,children:`DNS 요청`}),L(`dd`,{class:`mt-1 mb-0 ml-0 text-sm font-extrabold text-slate-900`,children:H(e.queries)})]}),L(`div`,{class:`min-w-20`,children:[L(`dt`,{class:`text-[11px] font-bold text-slate-400`,children:`차단`}),L(`dd`,{class:`mt-1 mb-0 ml-0 text-sm font-extrabold text-teal-700`,children:H(e.blocked)})]}),L(`div`,{class:`min-w-20`,children:[L(`dt`,{class:`text-[11px] font-bold text-slate-400`,children:`차단율`}),L(`dd`,{class:`mt-1 mb-0 ml-0 text-sm font-extrabold text-slate-900`,children:dm(e.queries,e.blocked)})]})]})]},e.id))}),p&&!i?L(`p`,{class:`mt-3 mb-0 text-xs font-semibold leading-5 text-slate-500`,children:[`전체 `,H(r.length),`개 기기 중 차단 수 기준 상위 `,lm,`개를 표시하고 있습니다.`]}):null,i&&r.length>um?L(`nav`,{"aria-label":`기기별 통계 페이지`,class:`mt-4 flex flex-wrap items-center justify-between gap-3`,children:[L(`p`,{class:`m-0 text-xs font-semibold text-slate-500`,children:[H(u+1),`–`,H(d),` /`,` `,H(r.length),`개`]}),L(`div`,{class:`flex items-center gap-2`,children:[L(`button`,{class:`rounded-lg bg-white px-3 py-2 text-xs font-extrabold text-slate-700 ring-1 ring-slate-200 transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50`,disabled:l<=1,onClick:()=>s(e=>Math.max(1,e-1)),type:`button`,children:`이전`}),L(`span`,{"aria-current":`page`,class:`min-w-20 text-center text-xs font-extrabold text-slate-600`,children:[H(l),` / `,H(c)]}),L(`button`,{class:`rounded-lg bg-white px-3 py-2 text-xs font-extrabold text-slate-700 ring-1 ring-slate-200 transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50`,disabled:l>=c,onClick:()=>s(e=>Math.min(c,e+1)),type:`button`,children:`다음`})]})]}):null,n?L(`p`,{class:`mt-4 mb-0 rounded-xl border border-amber-200 bg-amber-50 p-3 text-xs font-semibold leading-5 text-amber-800`,children:[`개별 통계는 최대 `,H(t),`개 기기까지 추적합니다. 한도를 초과한 기기의 요청은 기타 기기로 합산됩니다.`]}):null]})}var hm=3600,gm=24;function _m(e,t){return e<=0?`0.0%`:`${(t/e*100).toFixed(1)}%`}function vm(e){let t=e.hourly[e.hourly.length-1];if(t?.bucketStart)return t.bucketStart;let n=e.updatedAt>0?e.updatedAt:Math.floor(Date.now()/1e3);return Math.floor(n/hm)*hm}function ym(e){let t=new Map(e.hourly.map(e=>[e.bucketStart,e])),n=vm(e)-23*hm;return Array.from({length:gm},(e,r)=>{let i=n+r*hm;return t.get(i)??{bucketStart:i,queries:0,blocked:0}})}function bm({emphasized:e=!1,label:t,value:n}){return L(`div`,{class:`rounded-xl bg-slate-50 p-4 sm:p-5`,children:[L(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:t}),L(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight ${e?`text-teal-700`:`text-slate-950`}`,children:n})]})}function xm({action:e,data:t,error:n,loading:r,onRetry:i,onSetEnabled:a,refreshing:o}){if(r&&t===null)return L(v,{children:[L(V,{eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청과 차단 현황을 확인합니다.`}),L(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:L(`p`,{class:`m-0 text-sm font-bold text-slate-500`,children:`차단 통계를 불러오는 중입니다…`})})]});if(n&&t===null)return L(v,{children:[L(V,{eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청과 차단 현황을 확인합니다.`}),L(`section`,{class:`rounded-2xl border border-amber-200 bg-amber-50 p-5 sm:p-6`,children:[L(`p`,{class:`m-0 text-sm font-extrabold text-amber-950`,children:`차단 통계를 불러오지 못했습니다.`}),L(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-amber-800`,children:n}),L(`button`,{class:`mt-4 inline-flex min-h-9 items-center justify-center rounded-xl border border-amber-300 bg-white px-3 py-2 text-xs font-extrabold text-amber-900 transition hover:bg-amber-100 focus:outline-none focus-visible:ring-4 focus-visible:ring-amber-100`,onClick:i,type:`button`,children:`다시 시도`})]})]});if(!t)return L(v,{children:[L(V,{eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청과 차단 현황을 확인합니다.`}),L(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:L(`p`,{class:`m-0 text-sm leading-6 text-slate-600`,children:`현재 SafeShield에서 통계 데이터를 제공하지 않습니다. SafeShield 0.3.15 버전 이상이 설치되어 있고, 통계 수집이 활성화되어 있는지 확인해 주세요.`})})]});let s=ym(t),c=s[s.length-1],l=s.reduce((e,t)=>({queries:e.queries+t.queries,blocked:e.blocked+t.blocked}),{queries:0,blocked:0}),u=e===`statistics-enable`||e===`statistics-disable`,d=e===`statistics-enable`||e!==`statistics-disable`&&t.enabled,f=u?d?`활성화하는 중…`:`비활성화하는 중…`:t.enabled?t.collectorRunning?`활성화 · 수집 중`:`활성화 · 시작 중`:`비활성화`;return L(v,{children:[L(V,{action:L(`div`,{class:`flex items-center gap-3 rounded-xl border border-slate-100 bg-slate-50 px-3 py-2.5`,children:[L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-500`,children:L(at,{class:`size-5`})}),L(`div`,{class:`text-right`,children:[L(`p`,{class:`m-0 text-[0.68rem] font-bold text-slate-400`,children:`통계 수집`}),L(`p`,{class:`mt-1 mb-0 text-xs font-extrabold ${u||d?`text-emerald-700`:`text-slate-500`}`,role:`status`,children:f})]}),L(`button`,{"aria-checked":d,"aria-label":d?`차단 통계 수집 끄기`:`차단 통계 수집 켜기`,class:`ssh-switch-control relative inline-flex shrink-0 items-center rounded-full border-0 p-0 transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 ${u?`cursor-wait opacity-80`:`disabled:cursor-not-allowed disabled:opacity-50`} ${d?`bg-teal-600`:`bg-slate-300`}`,disabled:e!==null,onClick:()=>a(!t.enabled),role:`switch`,type:`button`,children:L(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 grid place-items-center shadow-sm transition-all ${d?`left-6`:`left-1`}`,children:u?L(z,{"aria-hidden":`true`,class:`size-3 animate-spin text-teal-600`}):null})})]}),eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청 원본은 저장하지 않고 숫자만 로컬 메모리에 집계합니다.`}),L(`section`,{"aria-busy":u,class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 ${u?`cursor-wait`:``}`,children:[t.enabled?null:L(`div`,{class:`mb-4 rounded-xl border border-slate-200 bg-slate-50 px-4 py-3 text-sm leading-6 text-slate-600`,children:`통계 수집이 꺼져 있습니다. 활성화하면 DNS 요청 원본은 저장하지 않고 요청 수와 차단 수만 로컬 메모리에 집계합니다.`}),L(`dl`,{class:`mt-2 grid gap-3 sm:grid-cols-2 xl:grid-cols-4`,children:[L(bm,{label:`최근 24시간 DNS 요청`,value:H(l.queries)}),L(bm,{emphasized:!0,label:`최근 24시간 차단`,value:H(l.blocked)}),L(bm,{label:`최근 24시간 차단율`,value:_m(l.queries,l.blocked)}),L(bm,{label:`현재 시간 차단`,value:H(c?.blocked??0)})]}),L(`div`,{class:`mt-5 rounded-xl bg-slate-50/70 p-4 sm:p-5`,children:[L(`div`,{class:`flex flex-wrap items-end justify-between gap-3`,children:[L(`div`,{children:[L(`p`,{class:`m-0 text-xs font-bold text-slate-500`,children:`최근 24시간`}),L(`h3`,{class:`mt-1 mb-0 text-base font-extrabold text-slate-950`,children:`시간대별 차단 요청`})]}),L(`span`,{class:`text-xs font-bold text-slate-500`,children:o?`갱신 중…`:`마지막 집계 ${Wt(t.updatedAt)}`})]}),L(Up,{buckets:s})]}),L(mm,{deviceLimit:t.deviceLimit,devices:t.devices,truncated:t.devicesTruncated}),L(`div`,{class:`mt-5 flex flex-wrap gap-x-5 gap-y-2 border-t border-slate-100 pt-4 text-xs leading-5 text-slate-500`,children:[L(`span`,{children:[`수집 누적 DNS 요청 `,H(t.totals.queries)]}),L(`span`,{children:[`수집 누적 차단 `,H(t.totals.blocked)]}),L(`span`,{children:[`수집 시작 `,Wt(t.startedAt)]}),L(`span`,{children:[`보존 `,H(t.retentionHours),`시간`]}),t.volatile?L(`span`,{children:`재부팅 시 초기화되는 메모리 통계`}):null]}),n?L(`p`,{class:`mt-3 mb-0 text-xs font-bold text-amber-700`,children:`최근 자동 갱신에 실패했습니다. 현재 표시된 마지막 정상 통계를 유지합니다.`}):null]})]})}var Sm=[{label:`갱신 준비`,description:`차단 목록 갱신을 준비하고 있습니다.`,stages:[`starting`,`boot_delay`,`boot_refresh`,`boot_refresh_skipped`,`scheduled_refresh`,`init`]},{label:`최신 차단 목록 확인`,description:`서버에서 최신 차단 목록 정보를 확인하고 있습니다.`,stages:[`resolve_api`]},{label:`차단 목록 다운로드`,description:`최신 차단 목록을 안전하게 다운로드하고 있습니다.`,stages:[`download_artifact`]},{label:`사용자 규칙 적용`,description:`허용·차단 사용자 규칙을 새 차단 목록에 반영하고 있습니다.`,stages:[`local_overrides`,`merge`]},{label:`보호 규칙 적용`,description:`새 차단 규칙을 설치하고 DNS 보호 서비스를 갱신하고 있습니다.`,stages:[`install`,`restart_dnsmasq`]},{label:`보호 상태 확인`,description:`새 차단 목록과 DNS 보호가 정상적으로 동작하는지 확인하고 있습니다.`,stages:[`runtime_check`,`blocklist_verify`]}],Cm=new Map;Sm.forEach((e,t)=>{e.stages.forEach(e=>Cm.set(e,t))});function wm(e,t){return e===`running`||t!==null&&Cm.has(t)}function Tm(e){let t=e===null?0:Cm.get(e)??0,n=Sm[t];return{description:n.description,label:n.label,number:t+1,total:Sm.length}}function Em(e){return(e??``).trim().toLowerCase()}function Dm(e,t){let n=Em(e);if(n.includes(`upgrade`)||n.includes(`version`))return`현재 SafeShield 버전으로는 갱신을 계속할 수 없습니다. 시스템 업데이트에서 SafeShield를 최신 버전으로 업데이트해 주세요.`;if(n.includes(`entitlement`)||n.includes(`license`)||n.includes(`unauthorized`)||n.includes(`forbidden`))return`차단 목록을 사용할 권한을 확인하지 못했습니다. SmartSafeHub 계정과 요금제 상태를 확인해 주세요.`;if(n.includes(`dnsmasq`)||n.includes(`restart`)||n.includes(`runtime`))return`DNS 보호 서비스를 정상적으로 갱신하지 못했습니다. 잠시 후 다시 갱신해 보고 문제가 계속되면 상태 점검 정보를 확인해 주세요.`;if(n.includes(`verify`)||n.includes(`sanity`))return`새 차단 목록을 적용한 뒤 보호 상태 확인을 완료하지 못했습니다. 다시 갱신해 주세요.`;if(n.includes(`download`)||n.includes(`fetch`)||n.includes(`timeout`)||n.includes(`network`)||n.includes(`wan`))return`차단 목록을 다운로드하지 못했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`;if(n.includes(`resolve`)||n.includes(`manifest`)||n.includes(`artifact`)||n.includes(`api`))return`최신 차단 목록 정보를 확인하지 못했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`;if(n.includes(`override`)||n.includes(`allowlist`)||n.includes(`merge`)||n.includes(`rule`))return`사용자 허용·차단 규칙을 새 차단 목록에 반영하지 못했습니다. 사용자 규칙을 확인한 뒤 다시 갱신해 주세요.`;if(n.includes(`install`)||n.includes(`write`)||n.includes(`space`))return`새 차단 규칙을 장치에 적용하지 못했습니다. 저장 공간과 SafeShield 상태를 확인한 뒤 다시 갱신해 주세요.`;let r=Tm(t);return r.number===2?`최신 차단 목록 정보를 확인하는 중 문제가 발생했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`:r.number===3?`차단 목록을 다운로드하는 중 문제가 발생했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`:r.number===4?`사용자 규칙을 적용하는 중 문제가 발생했습니다. 사용자 규칙을 확인한 뒤 다시 갱신해 주세요.`:r.number===5?`새 보호 규칙을 적용하는 중 문제가 발생했습니다. 잠시 후 다시 갱신해 주세요.`:r.number===6?`새 차단 목록의 보호 상태를 확인하지 못했습니다. 다시 갱신해 주세요.`:`차단 목록 갱신을 완료하지 못했습니다. 잠시 후 다시 갱신해 주세요.`}var Om=`https://www.smartsafehub.com/pricing/`;function km({value:e,trueLabel:t=`정상`,falseLabel:n=`확인 필요`}){return L(`span`,{class:`inline-flex items-center gap-2 text-sm font-extrabold ${e?`text-emerald-700`:`text-slate-500`}`,children:[L(`span`,{class:`size-2 rounded-full ${e?`bg-emerald-500`:`bg-slate-300`}`}),e?t:n]})}function Am(e){return!e.enabled||e.status===`disabled`?`disabled`:e.status===`running`?`refreshing`:e.status===`error`||e.health.overall===`error`||e.issueCounts.errors>0?`error`:e.status===`paused`?`paused`:e.active&&e.runtime.dnsmasqRunning&&e.runtime.dnsRuntimeOk?`protecting`:`attention`}function jm(e){return!e.enabled||e.status===`disabled`?`비활성화`:e.active&&e.runtime.dnsmasqRunning&&e.runtime.dnsRuntimeOk?`보호 중`:e.status===`paused`?`일시 중지`:`확인 필요`}function Mm(e){let t=Am(e);return t===`error`&&jm(e)===`보호 중`&&e.runtime.lastErrorCode?`갱신 실패`:{disabled:`비활성화`,refreshing:`갱신 중`,protecting:`보호 중`,paused:`일시 중지`,error:`오류`,attention:`확인 필요`}[t]}function Nm(e){return e?`자동 최적화`:`확인되지 않음`}function Pm(e){let t=qt(e);return t===null?`확인되지 않음`:L(Dr,{timestamp:t})}function Fm(e){let t=Am(e);return t===`protecting`?e.blocklist.validLineCount>0?`${H(e.blocklist.validLineCount)}개 도메인 차단 규칙으로 DNS를 보호하고 있습니다.`:e.blocklist.installed?`차단 목록이 설치되어 있으며 DNS 보호가 정상적으로 동작하고 있습니다.`:`SafeShield 서비스와 DNS 런타임이 정상적으로 동작하고 있습니다.`:t===`refreshing`?`차단 목록을 최신 상태로 갱신하고 있습니다.`:t===`disabled`?`SafeShield DNS 보호가 비활성화되어 있습니다.`:t===`paused`?`SafeShield 작업이 일시 중지되어 있습니다.`:t===`error`?jm(e)===`보호 중`?`기존 DNS 보호는 유지되고 있지만 최근 차단 목록 갱신을 완료하지 못했습니다.`:`SafeShield 보호 상태에 문제가 발생했습니다. 아래 오류 내용을 확인해 주세요.`:e.active?e.runtime.dnsmasqRunning?e.runtime.dnsRuntimeOk?e.summary.message:`SafeShield DNS 런타임 상태를 확인해야 합니다.`:`dnsmasq가 실행 중이 아니어서 DNS 보호 상태를 확인해야 합니다.`:`SafeShield가 활성화되어 있지만 서비스가 실행 중이 아닙니다.`}function Im(e){return{ok:`정상`,warning:`경고`,error:`오류`,unavailable:`사용 불가`}[e]??e}function Lm({data:e}){let t=Am(e);return L(`span`,{class:`inline-flex items-center rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${t===`error`?`bg-red-50 text-red-700 ring-red-200`:t===`disabled`?`bg-slate-100 text-slate-700 ring-slate-200`:t===`refreshing`?`bg-blue-50 text-blue-700 ring-blue-200`:t===`paused`||t===`attention`?`bg-amber-50 text-amber-800 ring-amber-200`:`bg-emerald-50 text-emerald-700 ring-emerald-200`}`,children:Mm(e)})}function Rm({failed:e,step:t,total:n}){let r=2*Math.PI*17,i=r*.22,a=r-i;return L(`span`,{"aria-label":e?`갱신 실패 · ${t}/${n} 단계`:`갱신 ${t}/${n} 단계`,class:`ssh-safeshield-refresh-donut`,"data-state":e?`error`:`active`,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":n,"aria-valuenow":t,children:[L(`svg`,{"aria-hidden":`true`,class:e?`ssh-safeshield-refresh-loader-svg ssh-safeshield-refresh-loader-svg-error`:`ssh-safeshield-refresh-loader-svg`,viewBox:`0 0 48 48`,children:[L(`circle`,{class:`ssh-safeshield-refresh-loader-track`,cx:`24`,cy:`24`,fill:`none`,r:17,stroke:`currentColor`,strokeWidth:2.5}),e?null:L(`circle`,{class:`ssh-safeshield-refresh-loader-arc`,cx:`24`,cy:`24`,fill:`none`,r:17,stroke:`currentColor`,strokeDasharray:`${i} ${a}`,strokeLinecap:`round`,strokeWidth:3.5})]}),L(`span`,{class:`ssh-safeshield-refresh-donut-label`,children:e?`!`:`${t}/${n}`})]})}function zm({data:e}){let t=wm(e.status,e.stage),n=Am(e)===`error`;if(!t&&!n)return null;let r=Tm(e.stage),i=n?Dm(e.runtime.lastErrorCode,e.stage):null;return L(`div`,{"aria-live":n?`assertive`:`polite`,class:`ssh-safeshield-refresh`,"data-state":n?`error`:`active`,role:n?`alert`:`status`,children:[L(Rm,{failed:n,step:r.number,total:r.total}),L(`div`,{class:`ssh-safeshield-refresh-copy`,children:[L(`p`,{class:`ssh-safeshield-refresh-kicker`,children:n?`갱신 실패 · ${r.number}/${r.total}`:`갱신 ${r.number}/${r.total}`}),L(`p`,{class:`ssh-safeshield-refresh-title`,children:n?`${r.label} 단계에서 문제가 발생했습니다.`:r.label}),L(`p`,{class:`ssh-safeshield-refresh-description`,children:i??r.description}),n&&e.runtime.lastErrorCode?L(`p`,{class:`ssh-safeshield-refresh-error-code`,children:[`오류 코드: `,L(`code`,{children:e.runtime.lastErrorCode})]}):null]})]})}function Bm({label:e,value:t}){return L(`div`,{class:`bg-white px-5 py-4 sm:px-6`,children:[L(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.14em] text-slate-400`,children:e}),L(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-extrabold text-slate-950`,title:typeof t==`string`?t:void 0,children:t})]})}function Vm(e){return e?.trim().toUpperCase()||`FREE`}function Hm(e){return e===`FREE`?`free`:e===`PRO`?`pro`:e===`ULTIMATE`?`ultimate`:`paid`}function Um({compact:e=!1,plan:t}){let n=Hm(t),r=n!==`free`;return L(`span`,{class:`ssh-safeshield-plan-badge`,"data-compact":e?`true`:`false`,"data-tier":n,title:r?`${t} 멤버십`:`무료 플랜`,children:[L(`span`,{"aria-hidden":`true`,class:`ssh-safeshield-plan-badge-mark`,children:r?`✦`:`•`}),L(`span`,{children:t})]})}function Wm({plan:e}){let t=Hm(e)===`free`;return L(`div`,{class:`bg-white px-5 py-4 sm:px-6`,children:[L(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.14em] text-slate-400`,children:`Plan`}),L(`dd`,{class:`mt-2 mb-0 ml-0 flex min-w-0 flex-wrap items-center gap-2`,children:[L(Um,{plan:e}),t?L(`span`,{class:`ssh-safeshield-plan-caption`,children:`기본 플랜`}):null]})]})}function Gm(){return L(`div`,{class:`ssh-safeshield-upgrade-card`,children:[L(`span`,{"aria-hidden":`true`,class:`ssh-safeshield-upgrade-mark`,children:`✦`}),L(`div`,{class:`ssh-safeshield-upgrade-copy`,children:[L(`div`,{class:`ssh-safeshield-upgrade-meta`,children:[L(`span`,{children:`SmartSafeHub Membership`}),L(`span`,{class:`ssh-safeshield-upgrade-soon`,children:`Coming soon`})]}),L(`strong`,{children:`더 강력한 보호 기능을 준비하고 있습니다.`}),L(`span`,{children:`프리미엄 보호와 확장된 관리 기능을 미리 확인해 보세요.`})]}),L(`a`,{class:`ssh-safeshield-upgrade-action`,href:Om,rel:`noopener noreferrer`,target:`_blank`,children:[`요금제 보기`,L(`span`,{"aria-hidden":`true`,children:`→`})]})]})}function Km({children:e,eyebrow:t,icon:n,title:r}){return L(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:p-4 2xl:p-5`,children:[L(`div`,{class:`flex min-w-0 items-start justify-between gap-4 xl:gap-2`,children:[L(`div`,{children:[L(`p`,{class:`m-0 text-[0.68rem] font-black uppercase tracking-[0.16em] text-slate-400`,children:t}),L(`h3`,{class:`mt-2 mb-0 text-lg font-black tracking-tight text-slate-950 xl:text-base 2xl:text-lg`,children:r})]}),L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-500 xl:size-9 2xl:size-10`,children:n})]}),L(`dl`,{class:`mt-5 mb-0 grid gap-3`,children:e})]})}function qm({label:e,value:t}){return L(`div`,{class:`flex min-w-0 items-center justify-between gap-2 border-b border-slate-100 pb-3 last:border-b-0 last:pb-0`,children:[L(`dt`,{class:`text-sm font-semibold text-slate-500`,children:e}),L(`dd`,{class:`m-0 min-w-0 break-words text-right text-sm font-extrabold text-slate-950`,children:t})]})}function Jm({error:e,message:t,onDismiss:n}){if(!e&&!t)return null;let r=e!==null;return L(`div`,{"aria-live":r?`assertive`:`polite`,class:`mt-4 flex flex-col items-start gap-3 rounded-2xl border px-4 py-3 text-sm sm:flex-row sm:justify-between ${r?`border-red-200 bg-red-50 text-red-900`:`border-emerald-200 bg-emerald-50 text-emerald-900`}`,role:r?`alert`:`status`,children:[L(`div`,{class:`flex min-w-0 items-start gap-3`,children:[L(r?B:ut,{class:`mt-0.5 size-5 shrink-0`}),L(`p`,{class:`m-0 font-semibold leading-6`,children:e??t})]}),L(`button`,{"aria-label":`알림 닫기`,class:`shrink-0 rounded-lg border-0 bg-transparent px-2 py-1 font-black text-current opacity-60 transition hover:opacity-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-current`,onClick:n,type:`button`,children:`×`})]})}function Ym({action:e,actionError:t,actionMessage:n,data:r,error:i,loading:a,statistics:o,statisticsError:s,statisticsLoading:c,statisticsRefreshing:l,onDismissFeedback:u,onRefreshBlocklist:d,onRetry:f,onRetryStatistics:p,onSetEnabled:m,onSetStatisticsEnabled:h}){let[g,_]=F(null);if(I(()=>{r?.available&&r.blocklist.validLineCount>0&&!wm(r.status,r.stage)&&_(r.blocklist.validLineCount)},[r?.available,r?.blocklist.validLineCount,r?.stage,r?.status]),a)return L(zn,{});if(i)return L(Bn,{message:i,onRetry:f});if(!r)return L(zn,{});if(!r.available)return L(`section`,{class:`rounded-2xl border border-amber-200 bg-amber-50 p-5 sm:p-6`,children:[L(`span`,{class:`grid size-11 place-items-center rounded-xl bg-amber-100 text-amber-800`,children:L(B,{class:`size-6`})}),L(`h2`,{class:`mt-5 mb-0 text-xl font-extrabold text-amber-950`,children:`SafeShield 상태 API를 찾을 수 없습니다`}),L(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-amber-900`,children:`safeshield 패키지와 rpcd ucode 플러그인이 설치되어 있는지 확인해 주세요.`})]});let y=r.enabled,b=Vm(r.entitlement.plan),x=r.status===`running`,S=e!==null,C=(wm(r.status,r.stage)||Am(r)===`error`)&&r.blocklist.validLineCount===0&&g!==null?g:r.blocklist.validLineCount,w=y?e===`disable`?`끄는 중…`:`보호 끄기`:e===`enable`?`켜는 중…`:`보호 켜기`;function T(){(!y||window.confirm(`보호를 끄면, 현재 차단 목록이 제거되어 위험에 노출될 수 있습니다. 그래도 계속하시겠습니까?`))&&m(!y)}return L(v,{children:[L(V,{eyebrow:`Protection`,title:`SafeShield 보호 상태`,description:`DNS 보호 상태와 적용 중인 차단 목록을 확인합니다.`}),L(`section`,{class:`mb-8 grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1.08fr)_minmax(0,0.92fr)] xl:items-stretch`,children:[L(`article`,{"aria-label":`보호 상태 요약`,class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:h-full`,children:[L(`div`,{class:`flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between xl:flex-col 2xl:flex-row`,children:[L(`div`,{class:`flex min-w-0 items-start gap-3`,children:[L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:L(Ue,{class:`size-5`})}),L(`div`,{class:`min-w-0`,children:[L(`div`,{class:`flex flex-wrap items-center gap-2`,children:[L(`h3`,{class:`m-0 text-base font-black text-slate-950`,children:`현재 보호 상태`}),L(Lm,{data:r})]}),L(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:Fm(r)})]})]}),L(`div`,{class:`flex w-full flex-col gap-2 sm:w-auto sm:flex-row sm:flex-wrap xl:justify-end`,children:[L(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border px-4 py-2.5 text-sm font-extrabold transition focus:outline-none focus-visible:ring-4 disabled:cursor-not-allowed disabled:opacity-50 ${r.enabled?`border-red-200 bg-white text-red-700 hover:border-red-300 hover:bg-red-50 focus-visible:ring-red-100`:`border-teal-700 bg-teal-700 text-white hover:border-teal-800 hover:bg-teal-800 focus-visible:ring-teal-100`}`,disabled:S||x,onClick:T,type:`button`,children:[L(rt,{class:`size-4 ${e===`enable`||e===`disable`?`animate-pulse`:``}`}),w]}),L(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border border-slate-200 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-700 transition hover:border-teal-300 hover:bg-teal-50 hover:text-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!r.enabled||S||x,onClick:d,type:`button`,children:[L(it,{class:`size-4 ${e===`refresh`||x?`animate-bounce`:``}`}),e===`refresh`?`시작 중…`:x?`갱신 중…`:r.status===`error`?`다시 갱신`:`지금 갱신`]})]})]}),L(zm,{data:r}),L(`dl`,{class:`mt-5 mb-0 grid min-w-0 grid-cols-2 overflow-hidden rounded-xl border border-slate-200 bg-slate-200`,children:[L(Bm,{label:`SafeShield`,value:r.version??`확인되지 않음`}),L(Bm,{label:`Blocklist`,value:`${H(C)}개 도메인`}),L(Bm,{label:`Last refresh`,value:L(Dr,{timestamp:r.timestamps.lastSuccess})}),L(Wm,{plan:b})]}),b===`FREE`?L(Gm,{}):null]}),L(`section`,{"aria-label":`보호 데이터 요약`,class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:h-full`,children:[L(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[L(`div`,{class:`flex min-w-0 items-center gap-3`,children:[L(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-500`,children:L(at,{class:`size-5`})}),L(`div`,{children:[L(`p`,{class:`m-0 text-[0.65rem] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Protection data`}),L(`h3`,{class:`mt-1 mb-0 text-sm font-black text-slate-950`,children:`보호 데이터`})]})]}),L(`span`,{"aria-label":`보호 데이터 상태: ${r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?`최신`:`확인 필요`}`,class:`inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-xs font-extrabold ${r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?`bg-emerald-50 text-emerald-700`:`bg-amber-50 text-amber-700`}`,children:[r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?L(ut,{class:`size-3.5 shrink-0`}):L(B,{class:`size-3.5 shrink-0`}),r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?`최신`:`확인 필요`]})]}),L(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-500`,children:`SafeShield가 기기 성능에 맞춰 사용하는 보호 목록의 구성과 최신 상태를 확인합니다.`}),L(`dl`,{class:`mt-3 mb-0 grid grid-cols-1 gap-2 sm:grid-cols-2`,children:[L(`div`,{class:`min-w-0 rounded-lg border border-slate-200 bg-white px-3 py-2.5`,children:[L(`dt`,{class:`text-xs font-bold text-slate-500`,children:`기기 최적화`}),L(`dd`,{class:`mt-1 mb-0 text-sm font-extrabold text-slate-950`,children:Nm(r.artifact.tier)})]}),L(`div`,{class:`min-w-0 rounded-lg border border-slate-200 bg-white px-3 py-2.5`,children:[L(`dt`,{class:`text-xs font-bold text-slate-500`,children:`마지막 업데이트`}),L(`dd`,{class:`mt-1 mb-0 text-sm font-extrabold leading-5 text-slate-950`,children:Pm(r.artifact.version)})]})]}),L(`section`,{"aria-label":`보호 데이터 세부 정보`,class:`mt-3 border-t border-slate-200 pt-3`,children:[L(`h4`,{class:`m-0 text-xs font-extrabold text-slate-600`,children:`세부 정보`}),L(`dl`,{class:`mt-3 mb-0 grid gap-2`,children:[L(qm,{label:`데이터 프로필`,value:r.artifact.tier||`확인되지 않음`}),L(qm,{label:`데이터 버전`,value:r.artifact.version||`확인되지 않음`})]})]})]})]}),L(Jm,{error:t,message:n,onDismiss:u}),L(xm,{action:e,data:o,error:s,loading:c,onRetry:p,onSetEnabled:h,refreshing:l}),L(`section`,{class:`mt-7`,children:[L(V,{description:`DNS 보호 런타임, 차단 목록, 갱신 일정과 상태 점검 결과를 한곳에서 확인합니다.`,eyebrow:`Protection details`,title:`보호 구성`}),L(`div`,{class:`grid min-w-0 grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4`,children:[L(Km,{eyebrow:`Runtime`,icon:L(ut,{class:`size-5`}),title:`DNS 보호 런타임`,children:[L(qm,{label:`SafeShield 서비스`,value:L(km,{falseLabel:`중지됨`,trueLabel:`동작 중`,value:r.active})}),L(qm,{label:`DNS 서비스`,value:L(km,{falseLabel:`중지됨`,value:r.runtime.dnsmasqRunning})}),L(qm,{label:`SafeShield DNS 연동`,value:L(km,{value:r.runtime.dnsRuntimeOk})}),L(qm,{label:`차단 목록 갱신`,value:L(km,{falseLabel:`중지됨`,value:r.runtime.refreshdRunning})})]}),L(Km,{eyebrow:`Blocklist`,icon:L(at,{class:`size-5`}),title:`차단 목록`,children:[L(qm,{label:`적용 규칙`,value:`${H(r.blocklist.validLineCount)}개 도메인`}),L(qm,{label:`파일 크기`,value:Vt(r.blocklist.fileSizeKb*1024)}),L(qm,{label:`설치 상태`,value:L(km,{falseLabel:`미설치`,trueLabel:`설치됨`,value:r.blocklist.installed})}),L(qm,{label:`검증 상태`,value:L(km,{falseLabel:`확인 필요`,value:r.blocklist.verificationOk})})]}),L(Km,{eyebrow:`Refresh schedule`,icon:L(lt,{class:`size-5`}),title:`차단 목록 갱신`,children:[L(qm,{label:`마지막 성공`,value:L(Dr,{timestamp:r.timestamps.lastSuccess})}),L(qm,{label:`다음 갱신`,value:Wt(r.timestamps.nextRefreshAt)}),L(qm,{label:`갱신 주기`,value:Jt(r.timestamps.refreshIntervalS)}),L(qm,{label:`최근 결과`,value:r.runtime.lastResult||(x?`갱신 중`:`확인되지 않음`)})]}),L(Km,{eyebrow:`Health`,icon:L(Ue,{class:`size-5`}),title:`상태 점검`,children:[L(qm,{label:`전체 상태`,value:Im(r.health.overall)}),L(qm,{label:`경고`,value:L(`span`,{class:`text-amber-700`,children:H(r.issueCounts.warnings)})}),L(qm,{label:`오류`,value:L(`span`,{class:`text-red-700`,children:H(r.issueCounts.errors)})}),L(qm,{label:`최근 오류 코드`,value:r.runtime.lastErrorCode||`없음`})]})]})]})]})}var Xm=Math.floor(Date.now()/1e3),Zm=3600,Qm={generatedAt:Xm,devices:[{id:`demo-phone`,hostname:`거실 스마트폰`,mac:`02:00:00:00:00:01`,ipv4Address:`192.0.2.101`,connection:`wifi`,online:!0,leaseActive:!0,leaseExpiresAt:Xm+6*Zm,interface:`wlan0`,ssid:`SmartSafeHub`,radio:`radio0`,band:`5g`,bandLabel:`5 GHz`,signalDbm:-43,inactiveMs:250,connectedSeconds:8300},{id:`demo-laptop`,hostname:`작업용 노트북`,mac:`02:00:00:00:00:02`,ipv4Address:`192.0.2.102`,connection:`wifi`,online:!0,leaseActive:!0,leaseExpiresAt:Xm+8*Zm,interface:`wlan0`,ssid:`SmartSafeHub`,radio:`radio0`,band:`5g`,bandLabel:`5 GHz`,signalDbm:-57,inactiveMs:720,connectedSeconds:29200},{id:`demo-tv`,hostname:`거실 TV`,mac:`02:00:00:00:00:03`,ipv4Address:`192.0.2.103`,connection:`ethernet`,online:!0,leaseActive:!0,leaseExpiresAt:Xm+12*Zm,interface:`lan1`,ssid:null,radio:null,band:null,bandLabel:null,signalDbm:null,inactiveMs:null,connectedSeconds:14e4},{id:`demo-tablet`,hostname:`태블릿`,mac:`02:00:00:00:00:04`,ipv4Address:`192.0.2.104`,connection:`wifi`,online:!1,leaseActive:!1,leaseExpiresAt:null,interface:null,ssid:`SmartSafeHub`,radio:`radio1`,band:`2g`,bandLabel:`2.4 GHz`,signalDbm:null,inactiveMs:null,connectedSeconds:null}],totals:{known:4,online:3,wireless:2,ethernet:1,offline:1}},$m={schema:1,scope:`current_boot`,volatile:!0,maxEvents:100,cloud:{enabled:!1,phase:`disabled`,eligible:!1,plan:`free`,retentionDays:0,pendingEvents:0,lastAttemptAt:0,lastSuccessAt:0,lastUploadedCount:0,lastErrorCode:null,nextSyncAt:0},events:[{schema:1,eventId:`demo-event-1`,eventType:`safeshield.blocklist.updated`,severity:`success`,occurredAt:Xm-7200,deviceUuid:null,source:`safeshield`,metadata:{}},{schema:1,eventId:`demo-event-2`,eventType:`system.boot`,severity:`info`,occurredAt:Xm-86400,deviceUuid:null,source:`system`,metadata:{}}]},eh={device:{hostname:`SmartRouter`,model:`ipTIME AX3000SM`,boardName:`iptime,ax3000sm`},software:{distribution:`OpenWrt`,version:`25.12`,revision:`demo`,kernel:`6.12`},runtime:{uptime:86400,localtime:Xm,load:[.08,.12,.05],memory:{total:268435456,free:83886080,shared:4194304,buffered:41943040,available:171966464,cached:41943040}},network:{available:!0,up:!0,protocol:`dhcp`,ipv4Address:`198.51.100.20`},activityHistory:$m},th={lan:{address:`192.168.1.1`,prefixLength:24,netmask:`255.255.255.0`,subnet:`192.168.1.0/24`},dhcp:{enabled:!0,start:`192.168.1.100`,end:`192.168.1.249`,leaseTime:`12h`},wan:{connected:!0,protocol:`dhcp`,address:`198.51.100.20`,prefixLength:24,subnet:`198.51.100.0/24`},conflict:{detected:!1,wanSubnet:null},recommendation:null},nh={available:!0,version:`0.3.25`,enabled:!0,active:!0,status:`idle`,stage:null,summary:{label:`보호 중`,message:`DNS 보호가 정상적으로 동작하고 있습니다.`,severity:`info`},runtime:{refreshdRunning:!0,dnsmasqRunning:!0,dnsRuntimeOk:!0,lastResult:`success`,lastErrorCode:null},entitlement:{plan:`free`,status:`active`},artifact:{resolved:!0,tier:`light`,version:`20261010T010000Z`,uniqueDomains:48e3,rules:48e3},localOverrides:{enabled:!0,allowlistPath:`/etc/safeshield/allowlist`,blocklistPath:`/etc/safeshield/blocklist`},blocklist:{installed:!0,validLineCount:48e3,fileSizeKb:4700,verificationOk:!0},health:{overall:`ok`},issueCounts:{warnings:0,errors:0},timestamps:{lastAttempt:Xm-2*Zm,lastSuccess:Xm-2*Zm,lastFailure:0,lastLocalApply:Xm-2*Zm,lastLocalApplyFailure:0,nextRefreshAt:Xm+21*Zm,refreshIntervalS:82800}},rh=Math.floor(Xm/Zm)*Zm,ih=[{queries:351,blocked:18},{queries:297,blocked:15},{queries:243,blocked:11},{queries:216,blocked:9},{queries:203,blocked:8},{queries:230,blocked:10},{queries:324,blocked:17},{queries:567,blocked:35},{queries:783,blocked:54},{queries:864,blocked:61},{queries:756,blocked:50},{queries:702,blocked:43},{queries:635,blocked:36},{queries:580,blocked:30},{queries:608,blocked:33},{queries:689,blocked:40},{queries:837,blocked:54},{queries:1026,blocked:73},{queries:1256,blocked:99},{queries:1458,blocked:125},{queries:1512,blocked:135},{queries:1323,blocked:111},{queries:1026,blocked:75},{queries:648,blocked:39}],ah=Array.from({length:24},(e,t)=>{let n=rh-(23-t)*Zm,r=ih[new Date(n*1e3).getHours()];return{bucketStart:n,queries:r.queries,blocked:r.blocked}}),oh={enabled:!0,collectorRunning:!0,available:!0,schemaVersion:1,volatile:!0,startedAt:Xm-604800,updatedAt:Xm-30,retentionHours:168,totals:{queries:ah.reduce((e,t)=>e+t.queries,0),blocked:ah.reduce((e,t)=>e+t.blocked,0)},hourly:ah,deviceLimit:128,devicesTruncated:!1,devices:[{id:`demo-phone`,mac:`02:00:00:00:00:01`,ip:`192.0.2.101`,hostname:`거실 스마트폰`,identified:!0,queries:3400,blocked:470},{id:`demo-laptop`,mac:`02:00:00:00:00:02`,ip:`192.0.2.102`,hostname:`작업용 노트북`,identified:!0,queries:2900,blocked:345},{id:`demo-tv`,mac:`02:00:00:00:00:03`,ip:`192.0.2.103`,hostname:`거실 TV`,identified:!0,queries:1200,blocked:185}]},sh={schema:1,generatedAt:Xm,overall:`ok`,summary:{message:`모든 주요 항목이 정상입니다.`,total:3,ok:3,warning:0,critical:0,unknown:0},metrics:{memoryAvailablePercent:64,load1m:.08,overlayAvailablePercent:80},checks:[],reporter:{enabled:!1,eligible:!1,plan:`free`,entitlementStatus:`active`,lastReportAt:0,nextReportAt:0,lastResult:``,lastErrorCode:null}},ch={phase:`idle`,updateCount:0,packages:[],lastCheckAt:Xm-Zm,lastInstallAt:null,lastError:null,releaseNotes:[],releaseNotesComplete:!0,settings:{channel:`stable`,checkEnabled:!0,checkIntervalSeconds:21600,autoInstall:!0,autoInstallTime:`03:00`,repositoryHost:`example.invalid`,updatePackage:`luci-app-smartsafehub`}},lh={phase:`idle`,source:null,lastCheckAt:Xm-Zm,lastPrepareAt:null,lastError:null,prepared:null,current:{deviceCode:`iptime-ax3000sm`,boardName:`iptime,ax3000sm`,buildId:`demo`,releaseVersion:`1.0.2`,openwrtVersion:`25.12`,metadataAvailable:!0},updateAvailable:!1,release:null,settings:{channel:`stable`,apiBaseUrl:`https://www.smartsafehub.com`,checkIntervalSeconds:21600,autoInstall:!1}},uh={configuration:{protocol:`dhcp`,supported:!0,pppoe:{username:``,passwordConfigured:!1},static:{address:null,prefixLength:null,netmask:null,gateway:null,dns:[]}},status:{connected:!0,pending:!1,protocol:`dhcp`,device:`wan`,address:`198.51.100.20`,prefixLength:24,gateway:`198.51.100.1`,dns:[`1.1.1.1`,`8.8.8.8`],uptimeSeconds:86400}},dh={networks:[{section:`demo_5g`,device:`radio0`,band:`5g`,bandLabel:`5 GHz`,ssid:`SmartSafeHub`,enabled:!0,runtimeUp:!0,security:`sae-mixed`,securityRaw:`sae-mixed`,passwordConfigured:!0,channel:`36`,networks:[`lan`],clientCount:2},{section:`demo_2g`,device:`radio1`,band:`2g`,bandLabel:`2.4 GHz`,ssid:`SmartSafeHub-2G`,enabled:!0,runtimeUp:!0,security:`sae-mixed`,securityRaw:`sae-mixed`,passwordConfigured:!0,channel:`6`,networks:[`lan`],clientCount:0}],totalClients:2,guest:{supported:!0,configured:!0,enabled:!0,ssid:`SmartSafeHub-Guest`,passwordConfigured:!0,subnet:`192.0.2.0/24`,radio:`radio1`}},fh={allow:[`trusted.example`,`updates.example`],block:[`ads.example`,`tracker.example`],counts:{allow:2,block:2,total:4},safeshieldEnabled:!0,applyLocalOverrides:!0},ph=async e=>({ssid:dh.networks.find(t=>t.section===e)?.ssid??`SmartSafeHub`,security:`sae-mixed`,password:`demo-only-2026`}),mh=async()=>({ssid:`SmartSafeHub-Guest`,security:`sae-mixed`,password:`guest-demo-only-2026`}),hh=new Set(Le);function gh(){let e=ai(),t=li(),n=hh.has(e)?e:`home`,[r,i]=F(``);I(()=>{hh.has(e)||(window.history.replaceState(null,``,`${window.location.pathname}${window.location.search}#home`),i(`해당 기능은 현재 데모에서 제공하지 않습니다.`))},[e]);let a=()=>i(`데모에서는 실제 공유기 설정을 변경할 수 없습니다.`),o=()=>i(``),s=()=>i(`예시 데이터가 표시되고 있습니다. 실제 공유기에는 연결되지 않습니다.`),c=async()=>(a(),!1),l={action:null,actionError:null,data:lh,error:null,loading:!1,message:null,reconnecting:!1,uploadProgress:null,check:a,discard:c,dismissFeedback:o,install:c,prepare:a,refresh:s,upload:c},u;switch(n){case`activity`:u=L(hn,{actionError:null,actionMessage:null,data:$m,error:null,loading:!1,onDismissActionFeedback:o,onRetry:s,onSetCloudSync:a,savingCloudSync:!1});break;case`network`:u=L(`div`,{class:`min-w-0`,children:[L(ui,{active:t.network,label:`네트워크 설정 메뉴`,tabs:[{id:`internet`,label:`인터넷 연결`,href:`#network`},{id:`lan`,label:`LAN 및 DHCP`,href:`#network/lan`}]}),L(`div`,{"aria-label":`인터넷 연결 설정`,"aria-labelledby":`internet-tab`,hidden:t.network!==`internet`,id:`internet-panel`,role:`tabpanel`,children:L(er,{action:null,data:uh,error:null,feedback:null,loading:!1,onDismissFeedback:o,onReconnect:a,onRetry:s,onSave:c})}),L(`div`,{"aria-label":`내부 네트워크 설정`,"aria-labelledby":`lan-tab`,hidden:t.network!==`lan`,id:`lan-panel`,role:`tabpanel`,children:L(dr,{action:null,data:th,error:null,feedback:null,loading:!1,onApplyRecommendation:c,onDismissFeedback:o,onRetry:s,onSave:c})})]});break;case`wifi`:u=L(Er,{data:dh,error:null,feedback:null,loading:!1,updatingSection:null,onDismissFeedback:o,onRetry:s,onUpdate:c,onUpdateGuest:c,onLoadQr:ph,onLoadGuestQr:mh});break;case`rules`:u=L(jr,{action:null,data:fh,error:null,feedback:null,loading:!1,onAddRule:c,onDeleteRule:c,onDismissFeedback:o,onRetry:s});break;case`system`:u=L(ni,{action:null,actionError:null,data:ch,error:null,firmware:l,loading:!1,message:null,onCheck:a,onDismissFeedback:o,onInstall:a,onRetry:s,onSaveSettings:c});break;case`devices`:u=L(Si,{data:Qm,error:null,loading:!1,onRetry:s});break;case`safeshield`:u=L(Ym,{action:null,actionError:null,actionMessage:null,data:nh,error:null,loading:!1,statistics:oh,statisticsError:null,statisticsLoading:!1,statisticsRefreshing:!1,onDismissFeedback:o,onRefreshBlocklist:a,onRetry:s,onRetryStatistics:s,onSetEnabled:a,onSetStatisticsEnabled:a});break;default:u=L(cm,{accountRegistered:!1,activity:$m,activityError:null,activityLoading:!1,data:eh,devices:Qm,devicesError:null,devicesLoading:!1,error:null,firmware:lh,firmwareError:null,firmwareLoading:!1,health:sh,healthError:null,healthLoading:!1,lan:th,lanError:null,lanLoading:!1,loading:!1,onRetry:s,safeshield:nh,safeshieldError:null,safeshieldLoading:!1,statistics:oh,statisticsError:null,statisticsLoading:!1,statisticsRefreshing:!1,updates:ch,updatesError:null,updatesLoading:!1})}return L(Lt,{accountRegistered:!1,demo:!0,loading:!1,onRefresh:s,refreshing:!1,route:n,updateCount:0,children:[L(`div`,{role:`status`,class:`mb-5 flex flex-wrap items-center justify-between gap-3 rounded-xl border border-teal-200 bg-teal-50 px-4 py-3 text-sm font-semibold text-teal-800`,children:[L(`span`,{children:`체험 모드 · 표시되는 기기와 보호 통계는 모두 예시입니다.`}),L(`a`,{class:`font-extrabold underline`,href:`/devices/`,children:`지원 기기 살펴보기 →`})]}),r?L(`div`,{role:`alert`,class:`mb-5 flex items-center justify-between gap-3 rounded-xl border border-amber-300 bg-amber-50 p-4 text-sm font-semibold text-amber-900`,children:[r,L(`button`,{"aria-label":`안내 닫기`,class:`font-black`,onClick:o,type:`button`,children:`✕`})]}):null,u]})}var _h=document.getElementById(`smartsafehub-demo-root`);if(_h){let e=_h.attachShadow({mode:`open`}),t=document.createElement(`link`);t.rel=`stylesheet`,t.href=_h.dataset.demoCss||`/static/router-demo/demo.css`,e.appendChild(t);let n=document.createElement(`div`);n.className=`smartsafehub-shadow-root`,e.appendChild(n),oe(L(gh,{}),n)} \ No newline at end of file +`):e}function _p(e,t){let{element:n,datasetIndex:r,index:i}=t,a=e.getDatasetMeta(r).controller,{label:o,value:s}=a.getLabelAndValue(i);return{chart:e,label:o,parsed:a.getParsed(i),raw:e.data.datasets[r].data[i],formattedValue:s,dataset:a.getDataset(),dataIndex:i,datasetIndex:r,element:n}}function vp(e,t){let n=e.chart.ctx,{body:r,footer:i,title:a}=e,{boxWidth:o,boxHeight:s}=t,c=oc(t.bodyFont),l=oc(t.titleFont),u=oc(t.footerFont),d=a.length,f=i.length,p=r.length,m=ac(t.padding),h=m.height,g=0,_=r.reduce((e,t)=>e+t.before.length+t.lines.length+t.after.length,0);if(_+=e.beforeBody.length+e.afterBody.length,d&&(h+=d*l.lineHeight+(d-1)*t.titleSpacing+t.titleMarginBottom),_){let e=t.displayColors?Math.max(s,c.lineHeight):c.lineHeight;h+=p*e+(_-p)*c.lineHeight+(_-1)*t.bodySpacing}f&&(h+=t.footerMarginTop+f*u.lineHeight+(f-1)*t.footerSpacing);let v=0,y=function(e){g=Math.max(g,n.measureText(e).width+v)};return n.save(),n.font=l.string,X(e.title,y),n.font=c.string,X(e.beforeBody.concat(e.afterBody),y),v=t.displayColors?o+2+t.boxPadding:0,X(r,e=>{X(e.before,y),X(e.lines,y),X(e.after,y)}),v=0,n.font=u.string,X(e.footer,y),n.restore(),g+=m.width,{width:g,height:h}}function yp(e,t){let{y:n,height:r}=t;return ne.height-r/2?`bottom`:`center`}function bp(e,t,n,r){let{x:i,width:a}=r,o=n.caretSize+n.caretPadding;if(e===`left`&&i+a+o>t.width||e===`right`&&i-a-o<0)return!0}function xp(e,t,n,r){let{x:i,width:a}=n,{width:o,chartArea:{left:s,right:c}}=e,l=`center`;return r===`center`?l=i<=(s+c)/2?`left`:`right`:i<=a/2?l=`left`:i>=o-a/2&&(l=`right`),bp(l,e,t,n)&&(l=`center`),l}function Sp(e,t,n){let r=n.yAlign||t.yAlign||yp(e,n);return{xAlign:n.xAlign||t.xAlign||xp(e,t,n,r),yAlign:r}}function Cp(e,t){let{x:n,width:r}=e;return t===`right`?n-=r:t===`center`&&(n-=r/2),n}function wp(e,t,n){let{y:r,height:i}=e;return t===`top`?r+=n:r-=t===`bottom`?i+n:i/2,r}function Tp(e,t,n,r){let{caretSize:i,caretPadding:a,cornerRadius:o}=e,{xAlign:s,yAlign:c}=n,l=i+a,{topLeft:u,topRight:d,bottomLeft:f,bottomRight:p}=ic(o),m=Cp(t,s),h=wp(t,c,l);return c===`center`?s===`left`?m+=l:s===`right`&&(m-=l):s===`left`?m-=Math.max(u,f)+i:s===`right`&&(m+=Math.max(d,p)+i),{x:Jo(m,0,r.width-t.width),y:Jo(h,0,r.height-t.height)}}function Ep(e,t,n){let r=ac(n.padding);return t===`center`?e.x+e.width/2:t===`right`?e.x+e.width-r.right:e.x+r.left}function Dp(e){return hp([],gp(e))}function Op(e,t,n){return lc(e,{tooltip:t,tooltipItems:n,type:`tooltip`})}function kp(e,t){let n=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return n?e.override(n):e}var Ap={beforeTitle:to,title(e){if(e.length>0){let t=e[0],n=t.chart.data.labels,r=n?n.length:0;if(this&&this.options&&this.options.mode===`dataset`)return t.dataset.label||``;if(t.label)return t.label;if(r>0&&t.dataIndex{let t={before:[],lines:[],after:[]},i=kp(n,e);hp(t.before,gp(jp(i,`beforeLabel`,this,e))),hp(t.lines,jp(i,`label`,this,e)),hp(t.after,gp(jp(i,`afterLabel`,this,e))),r.push(t)}),r}getAfterBody(e,t){return Dp(jp(t.callbacks,`afterBody`,this,e))}getFooter(e,t){let{callbacks:n}=t,r=jp(n,`beforeFooter`,this,e),i=jp(n,`footer`,this,e),a=jp(n,`afterFooter`,this,e),o=[];return o=hp(o,gp(r)),o=hp(o,gp(i)),o=hp(o,gp(a)),o}_createItems(e){let t=this._active,n=this.chart.data,r=[],i=[],a=[],o=[],s,c;for(s=0,c=t.length;se.filter(t,r,i,n))),e.itemSort&&(o=o.sort((t,r)=>e.itemSort(t,r,n))),X(o,t=>{let n=kp(e.callbacks,t);r.push(jp(n,`labelColor`,this,t)),i.push(jp(n,`labelPointStyle`,this,t)),a.push(jp(n,`labelTextColor`,this,t))}),this.labelColors=r,this.labelPointStyles=i,this.labelTextColors=a,this.dataPoints=o,o}update(e,t){let n=this.options.setContext(this.getContext()),r=this._active,i,a=[];if(!r.length)this.opacity!==0&&(i={opacity:0});else{let e=mp[n.position].call(this,r,this._eventPosition);a=this._createItems(n),this.title=this.getTitle(a,n),this.beforeBody=this.getBeforeBody(a,n),this.body=this.getBody(a,n),this.afterBody=this.getAfterBody(a,n),this.footer=this.getFooter(a,n);let t=this._size=vp(this,n),o=Object.assign({},e,t),s=Sp(this.chart,n,o),c=Tp(n,o,s,this.chart);this.xAlign=s.xAlign,this.yAlign=s.yAlign,i={opacity:1,x:c.x,y:c.y,width:t.width,height:t.height,caretX:e.x,caretY:e.y}}this._tooltipItems=a,this.$context=void 0,i&&this._resolveAnimations().update(this,i),e&&n.external&&n.external.call(this,{chart:this.chart,tooltip:this,replay:t})}drawCaret(e,t,n,r){let i=this.getCaretPosition(e,n,r);t.lineTo(i.x1,i.y1),t.lineTo(i.x2,i.y2),t.lineTo(i.x3,i.y3)}getCaretPosition(e,t,n){let{xAlign:r,yAlign:i}=this,{caretSize:a,cornerRadius:o}=n,{topLeft:s,topRight:c,bottomLeft:l,bottomRight:u}=ic(o),{x:d,y:f}=e,{width:p,height:m}=t,h,g,_,v,y,b;return i===`center`?(y=f+m/2,r===`left`?(h=d,g=h-a,v=y+a,b=y-a):(h=d+p,g=h+a,v=y-a,b=y+a),_=h):(g=r===`left`?d+Math.max(s,l)+a:r===`right`?d+p-Math.max(c,u)-a:this.caretX,i===`top`?(v=f,y=v-a,h=g-a,_=g+a):(v=f+m,y=v+a,h=g+a,_=g-a),b=v),{x1:h,x2:g,x3:_,y1:v,y2:y,y3:b}}drawTitle(e,t,n){let r=this.title,i=r.length,a,o,s;if(i){let c=sl(n.rtl,this.x,this.width);for(e.x=Ep(this,n.titleAlign,n),t.textAlign=c.textAlign(n.titleAlign),t.textBaseline=`middle`,a=oc(n.titleFont),o=n.titleSpacing,t.fillStyle=n.titleColor,t.font=a.string,s=0;se!==0)?(e.beginPath(),e.fillStyle=i.multiKeyBackground,Zs(e,{x:t,y:p,w:c,h:s,radius:o}),e.fill(),e.stroke(),e.fillStyle=a.backgroundColor,e.beginPath(),Zs(e,{x:n,y:p+1,w:c-2,h:s-2,radius:o}),e.fill()):(e.fillStyle=i.multiKeyBackground,e.fillRect(t,p,c,s),e.strokeRect(t,p,c,s),e.fillStyle=a.backgroundColor,e.fillRect(n,p+1,c-2,s-2))}e.fillStyle=this.labelTextColors[n]}drawBody(e,t,n){let{body:r}=this,{bodySpacing:i,bodyAlign:a,displayColors:o,boxHeight:s,boxWidth:c,boxPadding:l}=n,u=oc(n.bodyFont),d=u.lineHeight,f=0,p=sl(n.rtl,this.x,this.width),m=function(n){t.fillText(n,p.x(e.x+f),e.y+d/2),e.y+=d+i},h=p.textAlign(a),g,_,v,y,b,x,S;for(t.textAlign=a,t.textBaseline=`middle`,t.font=u.string,e.x=Ep(this,h,n),t.fillStyle=n.bodyColor,X(this.beforeBody,m),f=o&&h!==`right`?a===`center`?c/2+l:c+2+l:0,y=0,x=r.length;y0&&t.stroke()}_updateAnimationTarget(e){let t=this.chart,n=this.$animations,r=n&&n.x,i=n&&n.y;if(r||i){let n=mp[e.position].call(this,this._active,this._eventPosition);if(!n)return;let a=this._size=vp(this,e),o=Object.assign({},n,this._size),s=Sp(t,e,o),c=Tp(e,o,s,t);(r._to!==c.x||i._to!==c.y)&&(this.xAlign=s.xAlign,this.yAlign=s.yAlign,this.width=a.width,this.height=a.height,this.caretX=n.x,this.caretY=n.y,this._resolveAnimations().update(this,c))}}_willRender(){return!!this.opacity}draw(e){let t=this.options.setContext(this.getContext()),n=this.opacity;if(!n)return;this._updateAnimationTarget(t);let r={width:this.width,height:this.height},i={x:this.x,y:this.y};n=Math.abs(n)<.001?0:n;let a=ac(t.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;t.enabled&&o&&(e.save(),e.globalAlpha=n,this.drawBackground(i,e,r,t),cl(e,t.textDirection),i.y+=a.top,this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),ll(e,t.textDirection),e.restore())}getActiveElements(){return this._active||[]}setActiveElements(e,t){let n=this._active,r=e.map(({datasetIndex:e,index:t})=>{let n=this.chart.getDatasetMeta(e);if(!n)throw Error(`Cannot find a dataset at index `+e);return{datasetIndex:e,element:n.data[t],index:t}}),i=!co(n,r),a=this._positionChanged(r,t);(i||a)&&(this._active=r,this._eventPosition=t,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(e,t,n=!0){if(t&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;let r=this.options,i=this._active||[],a=this._getActiveElements(e,i,t,n),o=this._positionChanged(a,e),s=t||!co(a,i)||o;return s&&(this._active=a,(r.enabled||r.external)&&(this._eventPosition={x:e.x,y:e.y},this.update(!0,t))),s}_getActiveElements(e,t,n,r){let i=this.options;if(e.type===`mouseout`)return[];if(!r)return t.filter(e=>this.chart.data.datasets[e.datasetIndex]&&this.chart.getDatasetMeta(e.datasetIndex).controller.getParsed(e.index)!==void 0);let a=this.chart.getElementsAtEventForMode(e,i.mode,i,n);return i.reverse&&a.reverse(),a}_positionChanged(e,t){let{caretX:n,caretY:r,options:i}=this,a=mp[i.position].call(this,e,t);return a!==!1&&(n!==a.x||r!==a.y)}};$(Mp,`positioners`,mp);var Np={id:`tooltip`,_element:Mp,positioners:mp,afterInit(e,t,n){n&&(e.tooltip=new Mp({chart:e,options:n}))},beforeUpdate(e,t,n){e.tooltip&&e.tooltip.initialize(n)},reset(e,t,n){e.tooltip&&e.tooltip.initialize(n)},afterDraw(e){let t=e.tooltip;if(t&&t._willRender()){let n={tooltip:t};if(e.notifyPlugins(`beforeTooltipDraw`,{...n,cancelable:!0})===!1)return;t.draw(e.ctx),e.notifyPlugins(`afterTooltipDraw`,n)}},afterEvent(e,t){if(e.tooltip){let n=t.replay;e.tooltip.handleEvent(t.event,n,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:`average`,backgroundColor:`rgba(0,0,0,0.8)`,titleColor:`#fff`,titleFont:{weight:`bold`},titleSpacing:2,titleMarginBottom:6,titleAlign:`left`,bodyColor:`#fff`,bodySpacing:2,bodyFont:{},bodyAlign:`left`,footerColor:`#fff`,footerSpacing:2,footerMarginTop:6,footerFont:{weight:`bold`},footerAlign:`left`,padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(e,t)=>t.bodyFont.size,boxWidth:(e,t)=>t.bodyFont.size,multiKeyBackground:`#fff`,displayColors:!0,boxPadding:0,borderColor:`rgba(0,0,0,0)`,borderWidth:0,animation:{duration:400,easing:`easeOutQuart`},animations:{numbers:{type:`number`,properties:[`x`,`y`,`width`,`height`,`caretX`,`caretY`]},opacity:{easing:`linear`,duration:200}},callbacks:Ap},defaultRoutes:{bodyFont:`font`,footerFont:`font`,titleFont:`font`},descriptors:{_scriptable:e=>e!==`filter`&&e!==`itemSort`&&e!==`external`,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:`animation`}},additionalOptionScopes:[`interaction`]},Pp=(e,t,n,r)=>(typeof t==`string`?(n=e.push(t)-1,r.unshift({index:n,label:t})):isNaN(t)&&(n=null),n);function Fp(e,t,n,r){let i=e.indexOf(t);return i===-1?Pp(e,t,n,r):i===e.lastIndexOf(t)?i:n}var Ip=(e,t)=>e===null?null:Jo(Math.round(e),0,t);function Lp(e){let t=this.getLabels();return e>=0&&et.length-1?null:this.getPixelForValue(t[e].value)}getValueForPixel(e){return Math.round(this._startValue+this.getDecimalForPixel(e)*this._valueRange)}getBasePixel(){return this.bottom}};$(Rp,`id`,`category`),$(Rp,`defaults`,{ticks:{callback:Lp}});function zp(e,t){let n=[],{bounds:r,step:i,min:a,max:o,precision:s,count:c,maxTicks:l,maxDigits:u,includeBounds:d}=e,f=i||1,p=l-1,{min:m,max:h}=t,g=!K(a),_=!K(o),v=!K(c),y=(h-m)/(u+1),b=Po((h-m)/p/f)*f,x,S,C,w;if(b<1e-14&&!g&&!_)return[{value:m},{value:h}];w=Math.ceil(h/b)-Math.floor(m/b),w>p&&(b=Po(w*b/p/f)*f),K(s)||(x=10**s,b=Math.ceil(b*x)/x),r===`ticks`?(S=Math.floor(m/b)*b,C=Math.ceil(h/b)*b):(S=m,C=h),g&&_&&i&&Ro((o-a)/i,b/1e3)?(w=Math.round(Math.min((o-a)/b,l)),b=(o-a)/w,S=a,C=o):v?(S=g?a:S,C=_?o:C,w=c-1,b=(C-S)/w):(w=(C-S)/b,w=No(w,Math.round(w),b/1e3)?Math.round(w):Math.ceil(w));let T=Math.max(Ho(b),Ho(S));x=10**(K(s)?T:s),S=Math.round(S*x)/x,C=Math.round(C*x)/x;let E=0;for(g&&(d&&S!==a?(n.push({value:a}),So)break;n.push({value:e})}return _&&d&&C!==o?n.length&&No(n[n.length-1].value,o,Bp(o,y,e))?n[n.length-1].value=o:n.push({value:o}):_&&C!==o||n.push({value:C}),n}function Bp(e,t,{horizontal:n,minRotation:r}){let i=Bo(r),a=(n?Math.sin(i):Math.cos(i))||.001,o=.75*t*(``+e).length;return Math.min(t/a,o)}var Vp=class extends Hd{constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(e,t){return K(e)||(typeof e==`number`||e instanceof Number)&&!isFinite(+e)?null:+e}handleTickRangeOptions(){let{beginAtZero:e}=this.options,{minDefined:t,maxDefined:n}=this.getUserBounds(),{min:r,max:i}=this,a=e=>r=t?r:e,o=e=>i=n?i:e;if(e){let e=Mo(r),t=Mo(i);e<0&&t<0?o(0):e>0&&t>0&&a(0)}if(r===i){let t=i===0?1:Math.abs(i*.05);o(i+t),e||a(r-t)}this.min=r,this.max=i}getTickLimit(){let{maxTicksLimit:e,stepSize:t}=this.options.ticks,n;return t?(n=Math.ceil(this.max/t)-Math.floor(this.min/t)+1,n>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${t} would result generating up to ${n} ticks. Limiting to 1000.`),n=1e3)):(n=this.computeTickLimit(),e=e||11),e&&(n=Math.min(e,n)),n}computeTickLimit(){return 1/0}buildTicks(){let e=this.options,t=e.ticks,n=this.getTickLimit();n=Math.max(2,n);let r=zp({maxTicks:n,bounds:e.bounds,min:e.min,max:e.max,precision:t.precision,step:t.stepSize,count:t.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:t.minRotation||0,includeBounds:t.includeBounds!==!1},this._range||this);return e.bounds===`ticks`&&zo(r,this,`value`),e.reverse?(r.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),r}configure(){let e=this.ticks,t=this.min,n=this.max;if(super.configure(),this.options.offset&&e.length){let r=(n-t)/Math.max(e.length-1,1)/2;t-=r,n+=r}this._startValue=t,this._endValue=n,this._valueRange=n-t}getLabelForValue(e){return Ts(e,this.chart.options.locale,this.options.ticks.format)}},Hp=class extends Vp{determineDataLimits(){let{min:e,max:t}=this.getMinMax(!0);this.min=ro(e)?e:0,this.max=ro(t)?t:1,this.handleTickRangeOptions()}computeTickLimit(){let e=this.isHorizontal(),t=e?this.width:this.height,n=Bo(this.options.ticks.minRotation),r=(e?Math.sin(n):Math.cos(n))||.001,i=this._resolveTickFontOptions(0);return Math.ceil(t/Math.min(40,i.lineHeight/r))}getPixelForValue(e){return e===null?NaN:this.getPixelForDecimal((e-this._startValue)/this._valueRange)}getValueForPixel(e){return this._startValue+this.getDecimalForPixel(e)*this._valueRange}};$(Hp,`id`,`linear`),$(Hp,`defaults`,{ticks:{callback:Os.formatters.numeric}});var Up=e=>Math.floor(jo(e)),Wp=(e,t)=>10**(Up(e)+t);function Gp(e){return e/10**Up(e)==1}function Kp(e,t,n){let r=10**n,i=Math.floor(e/r);return Math.ceil(t/r)-i}function qp(e,t){let n=Up(t-e);for(;Kp(e,t,n)>10;)n++;for(;Kp(e,t,n)<10;)n--;return Math.min(n,Up(e))}function Jp(e,{min:t,max:n}){t=io(e.min,t);let r=[],i=Up(t),a=qp(t,n),o=a<0?10**Math.abs(a):1,s=10**a,c=i>a?10**i:0,l=Math.round((t-c)*o)/o,u=Math.floor((t-c)/s/10)*s*10,d=Math.floor((l-u)/10**a),f=io(e.min,Math.round((c+u+d*10**a)*o)/o);for(;f=10?d=d<15?15:20:d++,d>=20&&(a++,d=2,o=a>=0?1:o),f=Math.round((c+u+d*10**a)*o)/o;let p=io(e.max,f);return r.push({value:p,major:Gp(p),significand:d}),r}var Yp=class extends Hd{constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(e,t){let n=Vp.prototype.parse.apply(this,[e,t]);if(n===0)this._zero=!0;else return ro(n)&&n>0?n:null}determineDataLimits(){let{min:e,max:t}=this.getMinMax(!0);this.min=ro(e)?Math.max(0,e):null,this.max=ro(t)?Math.max(0,t):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!ro(this._userMin)&&(this.min=e===Wp(this.min,0)?Wp(this.min,-1):Wp(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){let{minDefined:e,maxDefined:t}=this.getUserBounds(),n=this.min,r=this.max,i=t=>n=e?n:t,a=e=>r=t?r:e;n===r&&(n<=0?(i(1),a(10)):(i(Wp(n,-1)),a(Wp(r,1)))),n<=0&&i(Wp(r,-1)),r<=0&&a(Wp(n,1)),this.min=n,this.max=r}buildTicks(){let e=this.options,t=Jp({min:this._userMin,max:this._userMax},this);return e.bounds===`ticks`&&zo(t,this,`value`),e.reverse?(t.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),t}getLabelForValue(e){return e===void 0?`0`:Ts(e,this.chart.options.locale,this.options.ticks.format)}configure(){let e=this.min;super.configure(),this._startValue=jo(e),this._valueRange=jo(this.max)-jo(e)}getPixelForValue(e){return(e===void 0||e===0)&&(e=this.min),e===null||isNaN(e)?NaN:this.getPixelForDecimal(e===this.min?0:(jo(e)-this._startValue)/this._valueRange)}getValueForPixel(e){let t=this.getDecimalForPixel(e);return 10**(this._startValue+t*this._valueRange)}};$(Yp,`id`,`logarithmic`),$(Yp,`defaults`,{ticks:{callback:Os.formatters.logarithmic,major:{enabled:!0}}});function Xp(e){let t=e.ticks;if(t.display&&e.display){let e=ac(t.backdropPadding);return Y(t.font&&t.font.size,Ps.font.size)+e.height}return 0}function Zp(e,t,n){return n=q(n)?n:[n],{w:Ls(e,t.string,n),h:n.length*t.lineHeight}}function Qp(e,t,n,r,i){return e===r||e===i?{start:t-n/2,end:t+n/2}:ei?{start:t-n,end:t}:{start:t,end:t+n}}function $p(e){let t={l:e.left+e._padding.left,r:e.right-e._padding.right,t:e.top+e._padding.top,b:e.bottom-e._padding.bottom},n=Object.assign({},t),r=[],i=[],a=e._pointLabels.length,o=e.options.pointLabels,s=o.centerPointLabels?Z/a:0;for(let c=0;ct.r&&(s=(r.end-t.r)/a,e.r=Math.max(e.r,t.r+s)),i.startt.b&&(c=(i.end-t.b)/o,e.b=Math.max(e.b,t.b+c))}function tm(e,t,n){let r=e.drawingArea,{extra:i,additionalAngle:a,padding:o,size:s}=n,c=e.getPointPosition(t,r+i+o,a),l=Math.round(Vo(Ko(c.angle+Oo))),u=om(c.y,s.h,l),d=im(l),f=am(c.x,s.w,d);return{visible:!0,x:c.x,y:u,textAlign:d,left:f,top:u,right:f+s.w,bottom:u+s.h}}function nm(e,t){if(!t)return!0;let{left:n,top:r,right:i,bottom:a}=e;return!(Hs({x:n,y:r},t)||Hs({x:n,y:a},t)||Hs({x:i,y:r},t)||Hs({x:i,y:a},t))}function rm(e,t,n){let r=[],i=e._pointLabels.length,a=e.options,{centerPointLabels:o,display:s}=a.pointLabels,c={extra:Xp(a)/2,additionalAngle:o?Z/i:0},l;for(let a=0;a270||n<90)&&(e-=t),e}function sm(e,t,n){let{left:r,top:i,right:a,bottom:o}=n,{backdropColor:s}=t;if(!K(s)){let n=ic(t.borderRadius),c=ac(t.backdropPadding);e.fillStyle=s;let l=r-c.left,u=i-c.top,d=a-r+c.width,f=o-i+c.height;Object.values(n).some(e=>e!==0)?(e.beginPath(),Zs(e,{x:l,y:u,w:d,h:f,radius:n}),e.fill()):e.fillRect(l,u,d,f)}}function cm(e,t){let{ctx:n,options:{pointLabels:r}}=e;for(let i=t-1;i>=0;i--){let t=e._pointLabelItems[i];if(!t.visible)continue;let a=r.setContext(e.getPointLabelContext(i));sm(n,a,t);let o=oc(a.font),{x:s,y:c,textAlign:l}=t;Xs(n,e._pointLabels[i],s,c+o.lineHeight/2,o,{color:a.color,textAlign:l,textBaseline:`middle`})}}function lm(e,t,n,r){let{ctx:i}=e;if(n)i.arc(e.xCenter,e.yCenter,t,0,Q);else{let n=e.getPointPosition(0,t);i.moveTo(n.x,n.y);for(let a=1;a{let n=so(this.options.pointLabels.callback,[e,t],this);return n||n===0?n:``}).filter((e,t)=>this.chart.getDataVisibility(t))}fit(){let e=this.options;e.display&&e.pointLabels.display?$p(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(e,t,n,r){this.xCenter+=Math.floor((e-t)/2),this.yCenter+=Math.floor((n-r)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(e,t,n,r))}getIndexAngle(e){let t=Q/(this._pointLabels.length||1),n=this.options.startAngle||0;return Ko(e*t+Bo(n))}getDistanceFromCenterForValue(e){if(K(e))return NaN;let t=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-e)*t:(e-this.min)*t}getValueForDistanceFromCenter(e){if(K(e))return NaN;let t=e/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-t:this.min+t}getPointLabelContext(e){let t=this._pointLabels||[];if(e>=0&&e{if(t!==0||t===0&&this.min<0){s=this.getDistanceFromCenterForValue(e.value);let n=this.getContext(t),o=r.setContext(n),c=i.setContext(n);um(this,o,s,a,c)}}),n.display){for(e.save(),o=a-1;o>=0;o--){let r=n.setContext(this.getPointLabelContext(o)),{color:i,lineWidth:a}=r;a&&i&&(e.lineWidth=a,e.strokeStyle=i,e.setLineDash(r.borderDash),e.lineDashOffset=r.borderDashOffset,s=this.getDistanceFromCenterForValue(t.reverse?this.min:this.max),c=this.getPointPosition(o,s),e.beginPath(),e.moveTo(this.xCenter,this.yCenter),e.lineTo(c.x,c.y),e.stroke())}e.restore()}}drawBorder(){}drawLabels(){let e=this.ctx,t=this.options,n=t.ticks;if(!n.display)return;let r=this.getIndexAngle(0),i,a;e.save(),e.translate(this.xCenter,this.yCenter),e.rotate(r),e.textAlign=`center`,e.textBaseline=`middle`,this.ticks.forEach((r,o)=>{if(o===0&&this.min>=0&&!t.reverse)return;let s=n.setContext(this.getContext(o)),c=oc(s.font);if(i=this.getDistanceFromCenterForValue(this.ticks[o].value),s.showLabelBackdrop){e.font=c.string,a=e.measureText(r.label).width,e.fillStyle=s.backdropColor;let t=ac(s.backdropPadding);e.fillRect(-a/2-t.left,-i-c.size/2-t.top,a+t.width,c.size+t.height)}Xs(e,r.label,0,-i,c,{color:s.color,strokeColor:s.textStrokeColor,strokeWidth:s.textStrokeWidth})}),e.restore()}drawTitle(){}};$(fm,`id`,`radialLinear`),$(fm,`defaults`,{display:!0,animate:!0,position:`chartArea`,angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Os.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(e){return e},padding:5,centerPointLabels:!1}}),$(fm,`defaultRoutes`,{"angleLines.color":`borderColor`,"pointLabels.color":`color`,"ticks.color":`color`}),$(fm,`descriptors`,{angleLines:{_fallback:`grid`}});var pm={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},mm=Object.keys(pm);function hm(e,t){return e-t}function gm(e,t){if(K(t))return null;let n=e._adapter,{parser:r,round:i,isoWeekday:a}=e._parseOpts,o=t;return typeof r==`function`&&(o=r(o)),ro(o)||(o=typeof r==`string`?n.parse(o,r):n.parse(o)),o===null?null:(i&&(o=i===`week`&&(Lo(a)||a===!0)?n.startOf(o,`isoWeek`,a):n.startOf(o,i)),+o)}function _m(e,t,n,r){let i=mm.length;for(let a=mm.indexOf(e);a=mm.indexOf(n);a--){let n=mm[a];if(pm[n].common&&e._adapter.diff(i,r,n)>=t-1)return n}return mm[n?mm.indexOf(n):0]}function ym(e){for(let t=mm.indexOf(e)+1,n=mm.length;t=t?n[r]:n[i];e[a]=!0}}function xm(e,t,n,r){let i=e._adapter,a=+i.startOf(t[0].value,r),o=t[t.length-1].value,s,c;for(s=a;s<=o;s=+i.add(s,1,r))c=n[s],c>=0&&(t[c].major=!0);return t}function Sm(e,t,n){let r=[],i={},a=t.length,o,s;for(o=0;o+e.value))}initOffsets(e=[]){let t=0,n=0,r,i;this.options.offset&&e.length&&(r=this.getDecimalForValue(e[0]),t=e.length===1?1-r:(this.getDecimalForValue(e[1])-r)/2,i=this.getDecimalForValue(e[e.length-1]),n=e.length===1?i:(i-this.getDecimalForValue(e[e.length-2]))/2);let a=e.length<3?.5:.25;t=Jo(t,0,a),n=Jo(n,0,a),this._offsets={start:t,end:n,factor:1/(t+1+n)}}_generate(){let e=this._adapter,t=this.min,n=this.max,r=this.options,i=r.time,a=i.unit||_m(i.minUnit,t,n,this._getLabelCapacity(t)),o=Y(r.ticks.stepSize,1),s=a===`week`&&i.isoWeekday,c=Lo(s)||s===!0,l={},u=t,d,f;if(c&&(u=+e.startOf(u,`isoWeek`,s)),u=+e.startOf(u,c?`day`:a),e.diff(n,t,a)>1e5*o)throw Error(t+` and `+n+` are too far apart with stepSize of `+o+` `+a);let p=r.ticks.source===`data`&&this.getDataTimestamps();for(d=u,f=0;d+e)}getLabelForValue(e){let t=this._adapter,n=this.options.time;return n.tooltipFormat?t.format(e,n.tooltipFormat):t.format(e,n.displayFormats.datetime)}format(e,t){let n=this.options.time.displayFormats,r=this._unit,i=t||n[r];return this._adapter.format(e,i)}_tickFormatFunction(e,t,n,r){let i=this.options,a=i.ticks.callback;if(a)return so(a,[e,t,n],this);let o=i.time.displayFormats,s=this._unit,c=this._majorUnit,l=s&&o[s],u=c&&o[c],d=n[t],f=c&&u&&d&&d.major;return this._adapter.format(e,r||(f?u:l))}generateTickLabels(e){let t,n,r;for(t=0,n=e.length;t0?o:1}getDataTimestamps(){let e=this._cache.data||[],t,n;if(e.length)return e;let r=this.getMatchingVisibleMetas();if(this._normalized&&r.length)return this._cache.data=r[0].controller.getAllParsedValues(this);for(t=0,n=r.length;t=e[r].pos&&t<=e[i].pos&&({lo:r,hi:i}=Qo(e,`pos`,t)),{pos:a,time:s}=e[r],{pos:o,time:c}=e[i]):(t>=e[r].time&&t<=e[i].time&&({lo:r,hi:i}=Qo(e,`time`,t)),{time:a,pos:s}=e[r],{time:o,pos:c}=e[i]);let l=o-a;return l?s+(c-s)*(t-a)/l:s}var Tm=class extends Cm{constructor(e){super(e),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){let e=this._getTimestampsForTable(),t=this._table=this.buildLookupTable(e);this._minPos=wm(t,this.min),this._tableRange=wm(t,this.max)-this._minPos,super.initOffsets(e)}buildLookupTable(e){let{min:t,max:n}=this,r=[],i=[],a,o,s,c,l;for(a=0,o=e.length;a=t&&c<=n&&r.push(c);if(r.length<2)return[{time:t,pos:0},{time:n,pos:1}];for(a=0,o=r.length;ae-t)}_getTimestampsForTable(){let e=this._cache.all||[];if(e.length)return e;let t=this.getDataTimestamps(),n=this.getLabelTimestamps();return e=t.length&&n.length?this.normalize(t.concat(n)):t.length?t:n,e=this._cache.all=e,e}getDecimalForValue(e){return(wm(this._table,e)-this._minPos)/this._tableRange}getValueForPixel(e){let t=this._offsets,n=this.getDecimalForPixel(e)/t.factor-t.end;return wm(this._table,n*this._tableRange+this._minPos,!0)}};$(Tm,`id`,`timeseries`),$(Tm,`defaults`,Cm.defaults),jf.register(gu,pp,Rp,Hp,Np);var Em=new Intl.DateTimeFormat(`ko-KR`,{hour:`2-digit`,hour12:!1}),Dm=`#94a3b8`,Om=`rgba(148, 163, 184, 0.18)`,km=`#0d9488`,Am=`#0f766e`;function jm(e){return Em.format(new Date(e*1e3))}function Mm(e){return e.map((t,n)=>n%3==0||n===e.length-1?jm(t.bucketStart):``)}function Nm({buckets:e}){let t=we(null),n=we(null),r=we(e);return r.current=e,z(()=>{let e=t.current;if(!e)return;let i=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,a=window.getComputedStyle(e).fontFamily,o={animation:!i&&{duration:500,easing:`easeOutQuart`},maintainAspectRatio:!1,responsive:!0,interaction:{intersect:!1,mode:`index`},plugins:{legend:{display:!1},tooltip:{displayColors:!1,callbacks:{title:e=>{let t=e[0]?.dataIndex??-1,n=r.current[t];return n?jm(n.bucketStart):``},label:e=>`차단 ${G(Number(e.raw??0))}`,afterLabel:e=>{let t=r.current[e.dataIndex];return t?`DNS 요청 ${G(t.queries)}`:``}}}},scales:{x:{border:{display:!1},grid:{display:!1},ticks:{autoSkip:!1,color:Dm,font:{family:a,size:11,weight:700},maxRotation:0,minRotation:0}},y:{beginAtZero:!0,border:{display:!1},grid:{color:Om},ticks:{color:Dm,font:{family:a,size:11,weight:700},maxTicksLimit:4,precision:0}}}};return n.current=new jf(e,{type:`bar`,data:{labels:Mm(r.current),datasets:[{data:r.current.map(e=>e.blocked),backgroundColor:km,hoverBackgroundColor:Am,borderRadius:4,borderSkipped:!1,barPercentage:.82,categoryPercentage:.9,maxBarThickness:24}]},options:o}),()=>{n.current?.destroy(),n.current=null}},[]),z(()=>{let t=n.current;t&&(t.data.labels=Mm(e),t.data.datasets[0].data=e.map(e=>e.blocked),t.update())},[e]),B(`div`,{class:`mt-5 h-44 sm:h-52`,children:B(`canvas`,{"aria-label":`최근 24시간 시간대별 SafeShield 차단 요청`,ref:t,role:`img`,children:`최근 24시간 시간대별 SafeShield 차단 요청 차트`})})}var Pm=3600,Fm=24;function Im(e,t){return e<=0?`0.0%`:`${(t/e*100).toFixed(1)}%`}function Lm(e){let t=e.hourly[e.hourly.length-1];if(t?.bucketStart)return t.bucketStart;let n=e.updatedAt>0?e.updatedAt:Math.floor(Date.now()/1e3);return Math.floor(n/Pm)*Pm}function Rm(e){let t=new Map(e.hourly.map(e=>[e.bucketStart,e])),n=Lm(e)-23*Pm;return Array.from({length:Fm},(e,r)=>{let i=n+r*Pm;return t.get(i)??{bucketStart:i,queries:0,blocked:0}})}function zm({children:e}){return B(`div`,{class:`mt-5 flex min-h-52 items-center justify-center rounded-xl border border-slate-200 bg-slate-50 px-5 text-center`,children:B(`p`,{class:`m-0 max-w-lg text-sm font-semibold leading-6 text-slate-500`,children:e})})}function Bm({data:e,error:t,loading:n,nowTimestamp:r,refreshing:i}){let a;if(n&&!e)a=B(zm,{children:`SafeShield 보호 활동을 불러오는 중입니다.`});else if(t&&!e)a=B(zm,{children:`SafeShield 보호 활동을 불러오지 못했습니다. SafeShield 페이지에서 상태를 확인해 주세요.`});else if(!e||!e.available)a=B(zm,{children:`현재 SafeShield에서 차단 통계를 제공하지 않습니다. 통계 기능을 확인해 주세요.`});else if(!e.enabled)a=B(zm,{children:`통계 수집이 꺼져 있습니다. SafeShield 페이지에서 통계를 켜면 최근 24시간 활동이 표시됩니다.`});else{let t=Rm(e),n=t.reduce((e,t)=>({queries:e.queries+t.queries,blocked:e.blocked+t.blocked}),{queries:0,blocked:0});a=B(b,{children:[B(`dl`,{class:`mt-5 grid gap-3 sm:grid-cols-3`,children:[B(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3`,children:[B(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:`DNS 요청`}),B(`dd`,{class:`mt-1 mb-0 ml-0 text-lg font-black text-slate-950`,children:G(n.queries)})]}),B(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3`,children:[B(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:`차단`}),B(`dd`,{class:`mt-1 mb-0 ml-0 text-lg font-black text-teal-700`,children:G(n.blocked)})]}),B(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3`,children:[B(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:`차단율`}),B(`dd`,{class:`mt-1 mb-0 ml-0 text-lg font-black text-slate-950`,children:Im(n.queries,n.blocked)})]})]}),B(Nm,{buckets:t})]})}return B(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[B(`div`,{class:`min-w-0`,children:[B(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`SafeShield activity`}),B(`div`,{class:`mt-2 flex min-w-0 items-center justify-between gap-3`,children:[B(`h3`,{class:`m-0 min-w-0 text-xl font-black text-slate-950`,children:`최근 24시간 보호 활동`}),B(`a`,{class:`shrink-0 whitespace-nowrap text-xs font-extrabold text-teal-700 no-underline hover:text-teal-800`,href:`#safeshield`,children:`상세 통계 →`})]}),e?.updatedAt?B(`p`,{class:`mt-2 mb-0 text-[0.68rem] font-semibold text-slate-400`,title:Qt(e.updatedAt),children:i?`갱신 중…`:`집계: ${$t(e.updatedAt,r)}`}):null]}),a,t&&e?B(`p`,{class:`mt-3 mb-0 text-xs font-bold text-amber-700`,children:`최근 통계 갱신에 실패해 마지막 정상 데이터를 표시하고 있습니다.`}):null]})}var Vm=2*Math.PI*39;function Hm(e){return e===`healthy`?`bg-emerald-50 text-emerald-700 ring-emerald-200`:e===`warning`?`bg-amber-50 text-amber-800 ring-amber-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function Um({detail:e,eyebrow:t,href:n,icon:r,linkLabel:i=`자세히 보기 →`,meta:a,metaState:o,metaWarning:s=!1,state:c=`neutral`,value:l}){let u=B(b,{children:[B(`div`,{class:`flex items-start justify-between gap-4`,children:[B(`p`,{class:`m-0 text-[0.68rem] font-black uppercase tracking-[0.16em] text-slate-500`,children:t}),B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl ring-1 ring-inset ${Hm(c)}`,children:r})]}),B(`p`,{class:`mt-4 mb-0 break-words text-2xl font-black tracking-tight text-slate-950`,children:l}),B(`p`,{class:`mt-2 mb-0 min-h-10 text-sm font-medium leading-5 text-slate-500`,children:e}),a?B(`p`,{class:`mt-3 mb-0 text-xs font-bold ${o===`healthy`?`text-emerald-700`:o===`warning`||s?`text-amber-700`:`text-slate-400`}`,children:a}):null,n?B(`span`,{class:`mt-4 inline-flex text-xs font-extrabold text-teal-700`,children:i}):null]}),d=`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 transition`;return n?B(`a`,{class:`${d} no-underline hover:border-slate-300 hover:shadow-md`,href:n,children:u}):B(`article`,{class:d,children:u})}var Wm=6e4;function Gm(e,t){return!e||!Number.isFinite(e)||e<=0?null:Math.max(0,t-e)}function Km(e,t,n,r){return!t||t<=0?`${e}: ${r}`:B(`span`,{title:Qt(t),children:[e,`: `,$t(t,n)]})}function qm(e){if(!e)return null;switch(e.toLowerCase()){case`dhcp`:return`DHCP`;case`static`:return`Static`;case`pppoe`:return`PPPoE`;default:return e.toUpperCase()}}function Jm(e){if(!e)return!1;let t=e.split(`.`).map(e=>Number(e));if(t.length!==4||t.some(e=>!Number.isInteger(e)||e<0||e>255))return!1;let[n,r]=t;return n===void 0||r===void 0?!1:n===10||n===172&&r>=16&&r<=31||n===192&&r===168}function Ym({label:e,value:t}){return B(`div`,{class:`flex min-w-0 items-start justify-between gap-4 border-b border-slate-100 py-3 last:border-b-0`,children:[B(`dt`,{class:`text-sm font-semibold text-slate-500`,children:e}),B(`dd`,{class:`m-0 min-w-0 max-w-[68%] break-words text-right text-sm font-extrabold text-slate-950`,children:t})]})}function Xm(e){return e===`initializing`?{badge:`bg-teal-100 text-teal-800`,icon:`text-teal-700`,label:`준비 중`,panel:`border-teal-200 bg-teal-50`}:e===`critical`?{badge:`bg-rose-100 text-rose-800`,icon:`text-rose-700`,label:`이상`,panel:`border-rose-200 bg-rose-50/70`}:e===`warning`?{badge:`bg-amber-100 text-amber-800`,icon:`text-amber-700`,label:`주의`,panel:`border-amber-200 bg-amber-50/70`}:e===`unknown`?{badge:`bg-slate-200 text-slate-700`,icon:`text-slate-500`,label:`확인 불가`,panel:`border-slate-200 bg-slate-50`}:{badge:`bg-emerald-100 text-emerald-800`,icon:`text-emerald-700`,label:`정상`,panel:`border-emerald-200 bg-emerald-50/70`}}function Zm({data:e,error:t,loading:n,nowTimestamp:r}){let i=!!(e&&e.generatedAt>0),a=Xm(i&&e?e.overall:`unknown`),o=i&&e?e.checks.filter(e=>e.status!==`ok`):[],s=o.slice(0,2),c=Math.max(0,o.length-s.length);return B(`div`,{class:`mt-5 border-t border-slate-200 pt-5`,children:[B(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[B(`div`,{class:`flex items-center gap-2`,children:[B(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:`장치 진단`}),i?B(`span`,{class:`rounded-full px-2.5 py-1 text-[11px] font-extrabold ${a.badge}`,children:a.label}):null]}),B(`a`,{class:`text-xs font-extrabold text-teal-700 no-underline hover:text-teal-900`,href:`#settings`,children:`상세 보기 →`})]}),t&&!i?B(`div`,{class:`mt-3 rounded-xl border border-amber-200 bg-amber-50/70 px-4 py-3`,children:B(`div`,{class:`flex items-start gap-2`,children:[B(U,{class:`mt-0.5 size-4 shrink-0 text-amber-700`}),B(`div`,{class:`min-w-0`,children:[B(`p`,{class:`m-0 text-sm font-extrabold text-slate-900`,children:`진단 상태를 확인하지 못했습니다.`}),B(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`설정에서 장치 진단 상태를 다시 확인해 주세요.`})]})]})}):i&&e?B(`div`,{class:`mt-3 rounded-xl border px-4 py-3 ${a.panel}`,children:[B(`div`,{class:`flex min-w-0 items-start gap-3`,children:[e.overall===`ok`?B(_t,{class:`mt-0.5 size-5 shrink-0 ${a.icon}`}):e.overall===`initializing`?B(st,{class:`mt-0.5 size-5 shrink-0 ${a.icon}`}):B(U,{class:`mt-0.5 size-5 shrink-0 ${a.icon}`}),B(`div`,{class:`min-w-0 flex-1`,children:[B(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:e.summary.message}),B(`p`,{class:`mt-1 mb-0 text-xs font-semibold leading-5 text-slate-500`,children:[`마지막 진단: `,$t(e.generatedAt,r),` · 검사 항목:`,` `,e.summary.total,`개`]})]})]}),s.length>0?B(`div`,{class:`mt-3 grid gap-2 sm:grid-cols-2`,children:s.map(e=>B(`div`,{class:`min-w-0 rounded-lg border border-white/80 bg-white/70 px-3 py-2`,children:[B(`p`,{class:`m-0 text-xs font-extrabold text-slate-900`,children:e.label}),B(`p`,{class:`mt-1 mb-0 line-clamp-2 text-xs leading-5 text-slate-500`,children:e.message})]},e.id))}):null,c>0?B(`p`,{class:`mt-2 mb-0 text-xs font-extrabold text-slate-600`,children:[`외 `,c,`건의 확인 항목이 있습니다.`]}):null]}):B(`div`,{class:`mt-3 rounded-xl border border-slate-200 bg-slate-50 px-4 py-3`,children:[B(`p`,{class:`m-0 text-sm font-extrabold text-slate-900`,children:n?`진단 상태를 확인하고 있습니다.`:`아직 생성된 진단 결과가 없습니다.`}),B(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`진단 결과가 생성되면 현재 장치 상태를 이곳에 요약해서 표시합니다.`})]})]})}function Qm(e,t,n){if(t&&!e)return{detail:`보호 상태를 확인하고 있습니다.`,state:`neutral`,value:`확인 중`};if(n&&!e)return{detail:`SafeShield 상태를 불러오지 못했습니다.`,state:`warning`,value:`확인 필요`};if(!e||!e.available)return{detail:`SafeShield 서비스를 사용할 수 없습니다.`,state:`warning`,value:`사용 불가`};if(!e.enabled||e.status===`disabled`)return{detail:`DNS 보호가 비활성화되어 있습니다.`,state:`neutral`,value:`꺼짐`};if(e.status===`running`)return{detail:`차단 목록을 갱신하고 있습니다.`,state:`neutral`,value:`갱신 중`};if(!(e.active&&e.runtime.dnsmasqRunning&&e.runtime.dnsRuntimeOk&&e.health.overall!==`error`&&e.issueCounts.errors===0))return{detail:e.runtime.lastErrorCode?`최근 오류: ${e.runtime.lastErrorCode}`:`DNS 보호 상태를 확인해 주세요.`,state:`warning`,value:`확인 필요`};let r=e.entitlement.plan?.trim(),i=e.blocklist.validLineCount>0?`${G(e.blocklist.validLineCount)}개 차단 규칙`:`차단 목록 적용됨`;return{detail:r?`${i} · ${r.toUpperCase()}`:i,state:`healthy`,value:`보호 중`}}function $m({accountRegistered:e,activity:t,activityError:n,activityLoading:r,data:i,devices:a,devicesError:o,devicesLoading:s,error:c,firmware:l,firmwareError:u,firmwareLoading:d,health:f,healthError:p,healthLoading:m,lan:h,lanError:g,lanLoading:_,loading:v,onRetry:y,safeshield:b,safeshieldError:x,safeshieldLoading:S,statistics:C,statisticsError:w,statisticsLoading:T,statisticsRefreshing:E,updates:D,updatesError:O,updatesLoading:k}){let A=Te(()=>i?rn(i.runtime.memory):null,[i]),[j,M]=R(()=>Math.floor(Date.now()/1e3));if(z(()=>{let e=window.setInterval(()=>{M(Math.floor(Date.now()/1e3))},Wm);return()=>window.clearInterval(e)},[]),v&&!i)return B(Bn,{});if(c&&!i)return B(Vn,{message:c,onRetry:y});if(!i)return null;let N=A?Math.round(A.percent):0,P=Tn(i.runtime.storage),F=P?(P.availableRatio*Vm).toFixed(2):`0`,ee=Qm(b,S,x),te=D?.packages.find(e=>e.name===`luci-app-smartsafehub`)??D?.packages[0]??null,ne=!!(D&&D.updateCount>0),re=D?ne?`${D.updateCount}개 업데이트`:D.lastCheckAt?`최신 상태`:`확인 전`:O?`확인 필요`:`확인 중`,ie=te?ne&&te.availableVersion?`${te.installedVersion} → ${te.availableVersion}`:`설치 버전 ${te.installedVersion}`:O?`업데이트 상태를 불러오지 못했습니다.`:k?`업데이트 상태를 확인하고 있습니다.`:`업데이트 상태를 확인할 수 없습니다.`,ae=a?`${G(a.totals.online)}대`:s?`확인 중`:`확인 필요`,oe=a?`Wi-Fi ${G(a.totals.wireless)}대 · 유선/기타 ${G(a.totals.ethernet)}대`:o||`연결 기기 요약을 불러오고 있습니다.`,se=qm(i.network.protocol),ce=i.network.available?i.network.ipv4Address?`WAN ${i.network.ipv4Address}${se?` · ${se}`:``}`:se?`${se} · WAN 주소를 받지 못했습니다.`:`WAN 주소를 받지 못했습니다.`:`WAN 인터페이스를 찾을 수 없습니다.`,le=!!h?.conflict.detected,I=!i.network.up||le||g!==null&&!h?`warning`:h?`healthy`:`neutral`,ue=le?`네트워크 충돌`:i.network.up?`정상 연결`:`연결 확인`,de=i.network.up?le?`⚠ LAN 대역과 충돌합니다`:_&&!h?`네트워크 대역 확인 중`:g&&!h?`네트워크 대역을 확인하지 못했습니다.`:h?`✓ 네트워크 충돌 없음`:`네트워크 대역 확인 필요`:`WAN 연결 상태를 확인해 주세요.`,fe=!i.network.up||le||g!==null&&!h?`warning`:h?`healthy`:`neutral`,pe=i.network.ipv4Address?Jm(i.network.ipv4Address)?`${i.network.ipv4Address} · 사설 네트워크`:i.network.ipv4Address:`할당되지 않음`,me=Gm(b?.timestamps.lastSuccess,j),he=b?Math.max(b.timestamps.refreshIntervalS*2,86400):null,L=!!(b?.enabled&&b.status!==`running`&&me!==null&&he!==null&&me>he),ge=Ai(D,j),_e=!!l?.current.metadataAvailable,ve=d&&!l?`확인 중`:u&&!l?`확인 필요`:_e?l?.current.releaseVersion?`SmartSafeHub ${l.current.releaseVersion}`:`SmartSafeHub 펌웨어`:`${i.software.distribution} ${i.software.version}`,ye=d&&!l?`확인 중`:u&&!l?`확인 필요`:_e&&l?.current.buildId||i.software.revision,be=_e?`빌드 ID`:`리비전`;return B(`div`,{class:`min-w-0 space-y-6`,children:[B(`section`,{"aria-labelledby":`dashboard-overview-title`,children:[B(W,{description:`인터넷, SafeShield, 연결 기기와 소프트웨어 상태를 한눈에 확인합니다.`,eyebrow:`Overview`,id:`dashboard-overview-title`,title:`시스템 개요`}),B(`div`,{class:`grid min-w-0 gap-4 sm:grid-cols-2 xl:grid-cols-4`,children:[B(Um,{detail:ce,eyebrow:`Internet`,href:`#network`,icon:B(at,{class:`size-5`}),linkLabel:le?`해결하기 →`:`자세히 보기 →`,meta:de,metaState:fe,state:I,value:ue}),B(Um,{detail:ee.detail,eyebrow:`SafeShield`,href:`#safeshield`,icon:B(We,{class:`size-5`}),meta:Km(L?`차단 목록 갱신 지연`:`차단 목록 갱신`,b?.timestamps.lastSuccess,j,S?`확인 중`:`기록 없음`),metaWarning:L,state:ee.state===`healthy`&&L?`warning`:ee.state,value:ee.value}),B(Um,{detail:oe,eyebrow:`Connected devices`,href:`#devices`,icon:B(Ke,{class:`size-5`}),meta:Km(`목록 확인`,a?.generatedAt,j,s?`확인 중`:`기록 없음`),state:a?`healthy`:o?`warning`:`neutral`,value:ae}),B(Um,{detail:ie,eyebrow:`Software update`,href:`#system`,icon:B(et,{class:`size-5`}),meta:D&&!D.settings.checkEnabled?Km(`자동 확인 꺼짐 · 마지막 확인`,D.lastCheckAt,j,`확인 기록 없음`):Km(ge?`업데이트 확인 지연`:`마지막 확인`,D?.lastCheckAt,j,k?`확인 중`:`아직 없음`),metaWarning:ge,state:O||ge||ne?`warning`:D?.lastCheckAt?`healthy`:`neutral`,value:re})]}),e===!1?B(`div`,{class:`ssh-dashboard-account-banner mt-4 flex flex-col gap-4 rounded-2xl border p-4 sm:flex-row sm:items-center sm:justify-between sm:p-5`,role:`status`,children:[B(`div`,{class:`flex min-w-0 items-start gap-3`,children:[B(`span`,{class:`ssh-dashboard-account-banner-icon grid size-10 shrink-0 place-items-center rounded-xl`,"aria-hidden":`true`,children:B(Je,{class:`size-5`})}),B(`div`,{class:`min-w-0`,children:[B(`div`,{class:`flex flex-wrap items-center gap-2`,children:[B(`p`,{class:`ssh-dashboard-account-banner-title m-0 font-bold`,children:`SmartSafeHub 계정을 연결해 주세요`}),B(`span`,{class:`ssh-dashboard-account-banner-badge rounded-full px-2 py-0.5 text-[0.7rem] font-bold`,children:`연결 필요`})]}),B(`p`,{class:`ssh-dashboard-account-banner-description mt-1 mb-0 text-sm leading-relaxed`,children:`계정을 연결하면 웹사이트에서 기기를 관리하고 구독 정보를 확인할 수 있습니다. DNS 보호는 연결하지 않아도 계속 작동합니다.`})]})]}),B(`a`,{href:`#account`,class:`ssh-dashboard-account-banner-action inline-flex min-h-10 shrink-0 items-center justify-center rounded-xl px-4 py-2 text-sm font-bold no-underline transition-colors focus-visible:outline-2 focus-visible:outline-offset-2`,children:`계정 연결하기 →`})]}):null]}),B(`section`,{"aria-labelledby":`dashboard-activity-title`,children:[B(W,{description:`최근 SafeShield 차단 활동과 현재 네트워크 연결 구성을 함께 확인합니다.`,eyebrow:`Activity`,id:`dashboard-activity-title`,title:`네트워크 보호 활동`}),B(`div`,{class:`grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1.55fr)_minmax(18rem,0.65fr)]`,children:[B(Bm,{data:C,error:w,loading:T,nowTimestamp:j,refreshing:E}),B(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[B(`div`,{class:`flex items-start justify-between gap-4`,children:[B(`div`,{children:[B(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Network`}),B(`h3`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:`연결 상태`})]}),B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl ${i.network.up&&!le?`bg-emerald-50 text-emerald-700`:`bg-amber-50 text-amber-800`}`,children:B(at,{class:`size-5`})})]}),B(`dl`,{class:`mt-4 mb-0`,children:[B(Ym,{label:`인터넷`,value:le?`네트워크 충돌`:i.network.up?`정상 연결`:`연결 확인`}),B(Ym,{label:`WAN IP`,value:pe}),B(Ym,{label:`프로토콜`,value:se||`확인되지 않음`}),B(Ym,{label:`상위 네트워크`,value:h?.wan.subnet||(_?`확인 중`:g?`확인 필요`:`확인되지 않음`)}),B(Ym,{label:`LAN 네트워크`,value:h?.lan.subnet||(_?`확인 중`:g?`확인 필요`:`확인되지 않음`)}),B(Ym,{label:`대역 충돌`,value:h?B(`span`,{class:h.conflict.detected?`text-amber-700`:`text-emerald-700`,children:h.conflict.detected?`충돌 감지`:`없음`}):_?`확인 중`:`확인 필요`})]}),B(`a`,{class:`mt-5 inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-slate-200 bg-slate-50 px-4 py-2 text-sm font-extrabold text-slate-700 no-underline transition hover:border-teal-200 hover:bg-teal-50 hover:text-teal-800`,href:`#network`,children:`네트워크 보기`})]})]})]}),B(`section`,{"aria-labelledby":`dashboard-recent-activity-title`,children:[B(W,{action:B(`a`,{class:`inline-flex whitespace-nowrap text-xs font-extrabold text-teal-700 no-underline hover:text-teal-900`,href:`#activity`,children:`전체 보기 →`}),description:`인터넷, 보호, 업데이트와 진단에서 실제 상태가 바뀐 시점을 확인합니다.`,eyebrow:`History`,id:`dashboard-recent-activity-title`,title:`최근 활동`}),B(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:r||n&&!t?B(yn,{error:n,loading:r}):B(vn,{compact:!0,events:(t?.events??[]).slice(0,3)})})]}),B(`section`,{"aria-labelledby":`dashboard-system-title`,children:[B(W,{description:`메모리, 디스크, 시스템 부하와 장치 정보를 빠르게 점검합니다.`,eyebrow:`System`,id:`dashboard-system-title`,title:`시스템 상태`}),B(`div`,{class:`grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1.45fr)_minmax(20rem,0.75fr)]`,children:[B(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[B(`div`,{class:`flex flex-wrap items-start justify-between gap-4`,children:[B(`div`,{children:[B(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Runtime`}),B(`h3`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:`리소스 사용량`})]}),B(`span`,{class:`inline-flex items-center gap-2 rounded-full px-3 py-1.5 text-xs font-black ring-1 ring-inset ${N>=90?`bg-amber-50 text-amber-800 ring-amber-200`:`bg-emerald-50 text-emerald-700 ring-emerald-200`}`,children:[B(`span`,{class:`size-2 rounded-full ${N>=90?`bg-amber-500`:`bg-emerald-500`}`}),N>=90?`메모리 확인`:`정상 실행`]})]}),B(`div`,{class:`mt-5 grid min-w-0 grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-4`,children:[B(`div`,{class:`flex min-w-0 flex-col rounded-xl border border-slate-200 bg-slate-50 p-3 sm:p-4`,children:[B(`div`,{class:`flex items-center gap-2 text-slate-500`,children:[B(ct,{class:`size-4`}),B(`span`,{class:`text-xs font-extrabold`,children:`메모리`})]}),B(`div`,{class:`flex min-h-0 flex-1 flex-col justify-center py-1`,children:[B(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:[N,`%`]}),B(`p`,{class:`mt-1 mb-0 text-xs font-semibold text-slate-500`,children:[A?Yt(A.used):`-`,` /`,` `,Yt(i.runtime.memory.total)]}),B(`div`,{"aria-label":`메모리 사용률 ${N}%`,class:`mt-3 h-1.5 overflow-hidden rounded-full bg-slate-200`,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":N,children:B(`div`,{class:`h-full rounded-full transition-[width] duration-300 ${N>=90?`bg-amber-500`:`bg-teal-600`}`,style:{width:`${Math.min(100,N)}%`}})})]})]}),B(`div`,{class:`ssh-dashboard-storage-card flex min-w-0 flex-col rounded-xl border border-slate-200 bg-slate-50 p-3 sm:p-4`,"data-level":P?.level??`unavailable`,children:[B(`div`,{class:`flex items-center gap-2 text-slate-500`,children:[B(dt,{class:`size-4`}),B(`span`,{class:`text-xs font-extrabold`,children:`디스크`})]}),B(`div`,{class:`mt-1 flex justify-center`,role:`img`,"aria-label":P?`디스크 여유 공간 ${P.availablePercent}%, ${P.availableText} 남음, 사용 ${P.usedText} / 전체 ${P.totalText}`:`디스크 저장 공간 확인 불가`,children:B(`div`,{class:`ssh-apps-storage-ring relative grid size-[76px] shrink-0 place-items-center`,"data-level":P?.level??`unavailable`,children:[B(`svg`,{"aria-hidden":`true`,class:`size-[76px]`,viewBox:`0 0 96 96`,children:[B(`circle`,{class:`ssh-apps-storage-track`,cx:`48`,cy:`48`,r:`39`}),P&&P.availableRatio>0?B(`circle`,{class:`ssh-apps-storage-free`,cx:`48`,cy:`48`,r:`39`,"stroke-dasharray":`${F} ${Vm.toFixed(2)}`}):null]}),B(`div`,{class:`absolute inset-0 flex items-center justify-center text-center`,children:B(`strong`,{class:`text-base leading-none font-black text-slate-950`,children:P?`${P.availablePercent}%`:`—`})})]})}),B(`p`,{class:`ssh-apps-storage-available mt-1 mb-0 text-center text-xs font-extrabold text-teal-700`,children:P?`${P.availableText} 남음`:`저장 공간 확인 불가`}),P?B(`p`,{class:`mt-1 mb-0 text-center text-[11px] leading-4 font-semibold text-slate-500`,title:`앱 설치 가능 공간을 기준으로 계산하며 파일시스템 예약 공간이 사용량에 포함될 수 있습니다.`,children:[`사용 `,P.usedText,` / 전체 `,P.totalText]}):null]}),B(`div`,{class:`flex min-w-0 flex-col rounded-xl border border-slate-200 bg-slate-50 p-3 sm:p-4`,children:[B(`div`,{class:`flex items-center gap-2 text-slate-500`,children:[B(Ge,{class:`size-4`}),B(`span`,{class:`text-xs font-extrabold`,children:`시스템 부하`})]}),B(`div`,{class:`flex min-h-0 flex-1 flex-col justify-center py-1`,children:[B(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:Xt(i.runtime.load[0])}),B(`p`,{class:`mt-1 mb-0 text-xs font-semibold text-slate-500`,children:[`5분 `,Xt(i.runtime.load[1]),` · 15분`,` `,Xt(i.runtime.load[2])]})]})]}),B(`div`,{class:`flex min-w-0 flex-col rounded-xl border border-slate-200 bg-slate-50 p-3 sm:p-4`,children:[B(`div`,{class:`flex items-center gap-2 text-slate-500`,children:[B(st,{class:`size-4`}),B(`span`,{class:`text-xs font-extrabold`,children:`실행 시간`})]}),B(`div`,{class:`flex min-h-0 flex-1 flex-col justify-center py-1`,children:[B(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:Jt(i.runtime.uptime)}),B(`p`,{class:`mt-1 mb-0 text-xs font-semibold text-slate-500`,children:[`부팅 `,Zt(i.runtime.localtime,i.runtime.uptime)]})]})]})]}),B(Zm,{data:f,error:p,loading:m,nowTimestamp:j})]}),B(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[B(`div`,{class:`flex items-start justify-between gap-4`,children:[B(`div`,{children:[B(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Device`}),B(`h3`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:`장치 정보`})]}),B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:B(Ge,{class:`size-5`})})]}),B(`dl`,{class:`mt-4 mb-0`,children:[B(Ym,{label:`모델`,value:i.device.model}),B(Ym,{label:`호스트 이름`,value:i.device.hostname}),B(Ym,{label:`펌웨어`,value:B(`span`,{title:_e?l?.current.releaseVersion?`SmartSafeHub 펌웨어 ${l.current.releaseVersion}`:`SmartSafeHub 커스텀 펌웨어`:u||void 0,children:ve})}),B(Ym,{label:be,value:ye}),B(Ym,{label:`커널`,value:i.software.kernel}),B(Ym,{label:`WAN IP`,value:i.network.ipv4Address||`할당되지 않음`})]})]})]})]})]})}var eh=3,th=10;function nh(e,t){return e<=0?`0.0%`:`${(t/e*100).toFixed(1)}%`}function rh(e){return e.id===`other`?`기타 기기`:e.hostname?e.hostname:e.identified?`이름 없는 기기`:`미식별 기기`}function ih(e){return[...e].sort((e,t)=>e.id===`other`?1:t.id===`other`?-1:t.blocked-e.blocked||t.queries-e.queries||rh(e).localeCompare(rh(t),`ko`))}function ah({devices:e,deviceLimit:t,truncated:n}){let r=ih(e),[i,a]=R(!1),[o,s]=R(1),c=Math.max(1,Math.ceil(r.length/th)),l=Math.min(o,c),u=(l-1)*th,d=Math.min(u+th,r.length),f=i?r.slice(u,d):r.slice(0,eh),p=r.length>eh;return z(()=>{s(e=>Math.min(e,c))},[c]),B(`div`,{class:`mt-6 rounded-2xl border border-slate-100 bg-slate-50/70 p-4 sm:p-5`,children:[B(`div`,{class:`flex flex-wrap items-start justify-between gap-3`,children:[B(`div`,{children:[B(`div`,{class:`flex flex-wrap items-center gap-2`,children:[B(`p`,{class:`m-0 text-xs font-bold text-slate-500`,children:`기기별 통계`}),p&&!i?B(`span`,{class:`inline-flex items-center rounded-full bg-teal-50 px-2 py-1 text-[10px] font-extrabold tracking-wide text-teal-700 ring-1 ring-teal-100`,children:`차단 TOP 3`}):null]}),B(`h3`,{class:`mt-1 mb-0 text-base font-extrabold text-slate-950`,children:`어떤 기기에서 차단되었는지 확인`}),B(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-500`,children:`DHCP 정보가 있는 기기는 MAC 주소를 기준으로 식별하며, 기기별 숫자만 현재 부팅 세션 동안 메모리에 집계합니다.`})]}),B(`div`,{class:`flex flex-wrap items-center justify-end gap-2`,children:[B(`span`,{class:`inline-flex items-center gap-2 rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-slate-600 ring-1 ring-slate-200`,children:[B(Ke,{class:`size-4 text-teal-700`}),G(r.length),`개 항목`]}),p?B(`button`,{"aria-controls":`safeshield-device-statistics-list`,"aria-expanded":i,class:`rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-teal-700 ring-1 ring-slate-200 transition hover:bg-slate-50`,onClick:()=>{a(e=>!e),s(1)},type:`button`,children:i?`간단히 보기 ↑`:`전체 ${G(r.length)}개 기기 보기 ↓`}):null]})]}),r.length===0?B(`p`,{class:`mt-4 mb-0 rounded-xl bg-white p-4 text-sm leading-6 text-slate-500 ring-1 ring-slate-100`,children:`아직 기기별 DNS 통계가 없습니다. 클라이언트에서 DNS 요청이 발생하면 다음 통계 갱신 시 표시됩니다.`}):B(`div`,{class:`mt-4 grid gap-3`,id:`safeshield-device-statistics-list`,children:f.map(e=>B(`article`,{class:`grid gap-4 rounded-xl bg-white p-4 ring-1 ring-slate-100 sm:grid-cols-[minmax(0,1fr)_auto] sm:items-center`,children:[B(`div`,{class:`min-w-0`,children:B(`div`,{class:`flex min-w-0 flex-wrap items-center gap-2`,children:[B(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg bg-teal-50 text-teal-700`,children:B(Ke,{class:`size-4`})}),B(`div`,{class:`min-w-0`,children:[B(`h4`,{class:`m-0 truncate text-sm font-extrabold text-slate-950`,children:rh(e)}),B(`p`,{class:`mt-1 mb-0 break-all text-xs text-slate-500`,children:[e.ip||`IP 미확인`,e.mac?` · ${e.mac}`:``]})]}),B(`span`,{class:`rounded-full px-2 py-1 text-[11px] font-extrabold ${e.identified?`bg-emerald-50 text-emerald-700`:`bg-slate-100 text-slate-600`}`,children:e.id===`other`?`합산`:e.identified?`DHCP 식별`:`IP 임시 식별`})]})}),B(`dl`,{class:`m-0 grid grid-cols-3 gap-2 text-right`,children:[B(`div`,{class:`min-w-20`,children:[B(`dt`,{class:`text-[11px] font-bold text-slate-400`,children:`DNS 요청`}),B(`dd`,{class:`mt-1 mb-0 ml-0 text-sm font-extrabold text-slate-900`,children:G(e.queries)})]}),B(`div`,{class:`min-w-20`,children:[B(`dt`,{class:`text-[11px] font-bold text-slate-400`,children:`차단`}),B(`dd`,{class:`mt-1 mb-0 ml-0 text-sm font-extrabold text-teal-700`,children:G(e.blocked)})]}),B(`div`,{class:`min-w-20`,children:[B(`dt`,{class:`text-[11px] font-bold text-slate-400`,children:`차단율`}),B(`dd`,{class:`mt-1 mb-0 ml-0 text-sm font-extrabold text-slate-900`,children:nh(e.queries,e.blocked)})]})]})]},e.id))}),p&&!i?B(`p`,{class:`mt-3 mb-0 text-xs font-semibold leading-5 text-slate-500`,children:[`전체 `,G(r.length),`개 기기 중 차단 수 기준 상위 `,eh,`개를 표시하고 있습니다.`]}):null,i&&r.length>th?B(`nav`,{"aria-label":`기기별 통계 페이지`,class:`mt-4 flex flex-wrap items-center justify-between gap-3`,children:[B(`p`,{class:`m-0 text-xs font-semibold text-slate-500`,children:[G(u+1),`–`,G(d),` /`,` `,G(r.length),`개`]}),B(`div`,{class:`flex items-center gap-2`,children:[B(`button`,{class:`rounded-lg bg-white px-3 py-2 text-xs font-extrabold text-slate-700 ring-1 ring-slate-200 transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50`,disabled:l<=1,onClick:()=>s(e=>Math.max(1,e-1)),type:`button`,children:`이전`}),B(`span`,{"aria-current":`page`,class:`min-w-20 text-center text-xs font-extrabold text-slate-600`,children:[G(l),` / `,G(c)]}),B(`button`,{class:`rounded-lg bg-white px-3 py-2 text-xs font-extrabold text-slate-700 ring-1 ring-slate-200 transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50`,disabled:l>=c,onClick:()=>s(e=>Math.min(c,e+1)),type:`button`,children:`다음`})]})]}):null,n?B(`p`,{class:`mt-4 mb-0 rounded-xl border border-amber-200 bg-amber-50 p-3 text-xs font-semibold leading-5 text-amber-800`,children:[`개별 통계는 최대 `,G(t),`개 기기까지 추적합니다. 한도를 초과한 기기의 요청은 기타 기기로 합산됩니다.`]}):null]})}var oh=3600,sh=24;function ch(e,t){return e<=0?`0.0%`:`${(t/e*100).toFixed(1)}%`}function lh(e){let t=e.hourly[e.hourly.length-1];if(t?.bucketStart)return t.bucketStart;let n=e.updatedAt>0?e.updatedAt:Math.floor(Date.now()/1e3);return Math.floor(n/oh)*oh}function uh(e){let t=new Map(e.hourly.map(e=>[e.bucketStart,e])),n=lh(e)-23*oh;return Array.from({length:sh},(e,r)=>{let i=n+r*oh;return t.get(i)??{bucketStart:i,queries:0,blocked:0}})}function dh({emphasized:e=!1,label:t,value:n}){return B(`div`,{class:`rounded-xl bg-slate-50 p-4 sm:p-5`,children:[B(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:t}),B(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight ${e?`text-teal-700`:`text-slate-950`}`,children:n})]})}function fh({action:e,data:t,error:n,loading:r,onRetry:i,onSetEnabled:a,refreshing:o}){if(r&&t===null)return B(b,{children:[B(W,{eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청과 차단 현황을 확인합니다.`}),B(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:B(`p`,{class:`m-0 text-sm font-bold text-slate-500`,children:`차단 통계를 불러오는 중입니다…`})})]});if(n&&t===null)return B(b,{children:[B(W,{eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청과 차단 현황을 확인합니다.`}),B(`section`,{class:`rounded-2xl border border-amber-200 bg-amber-50 p-5 sm:p-6`,children:[B(`p`,{class:`m-0 text-sm font-extrabold text-amber-950`,children:`차단 통계를 불러오지 못했습니다.`}),B(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-amber-800`,children:n}),B(`button`,{class:`mt-4 inline-flex min-h-9 items-center justify-center rounded-xl border border-amber-300 bg-white px-3 py-2 text-xs font-extrabold text-amber-900 transition hover:bg-amber-100 focus:outline-none focus-visible:ring-4 focus-visible:ring-amber-100`,onClick:i,type:`button`,children:`다시 시도`})]})]});if(!t)return B(b,{children:[B(W,{eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청과 차단 현황을 확인합니다.`}),B(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:B(`p`,{class:`m-0 text-sm leading-6 text-slate-600`,children:`현재 SafeShield에서 통계 데이터를 제공하지 않습니다. SafeShield 0.3.15 버전 이상이 설치되어 있고, 통계 수집이 활성화되어 있는지 확인해 주세요.`})})]});let s=uh(t),c=s[s.length-1],l=s.reduce((e,t)=>({queries:e.queries+t.queries,blocked:e.blocked+t.blocked}),{queries:0,blocked:0}),u=e===`statistics-enable`||e===`statistics-disable`,d=e===`statistics-enable`||e!==`statistics-disable`&&t.enabled,f=u?d?`활성화하는 중…`:`비활성화하는 중…`:t.enabled?t.collectorRunning?`활성화 · 수집 중`:`활성화 · 시작 중`:`비활성화`;return B(b,{children:[B(W,{action:B(`div`,{class:`flex items-center gap-3 rounded-xl border border-slate-100 bg-slate-50 px-3 py-2.5`,children:[B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-500`,children:B(dt,{class:`size-5`})}),B(`div`,{class:`text-right`,children:[B(`p`,{class:`m-0 text-[0.68rem] font-bold text-slate-400`,children:`통계 수집`}),B(`p`,{class:`mt-1 mb-0 text-xs font-extrabold ${u||d?`text-emerald-700`:`text-slate-500`}`,role:`status`,children:f})]}),B(`button`,{"aria-checked":d,"aria-label":d?`차단 통계 수집 끄기`:`차단 통계 수집 켜기`,class:`ssh-switch-control relative inline-flex shrink-0 items-center rounded-full border-0 p-0 transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 ${u?`cursor-wait opacity-80`:`disabled:cursor-not-allowed disabled:opacity-50`} ${d?`bg-teal-600`:`bg-slate-300`}`,disabled:e!==null,onClick:()=>a(!t.enabled),role:`switch`,type:`button`,children:B(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 grid place-items-center shadow-sm transition-all ${d?`left-6`:`left-1`}`,children:u?B(H,{"aria-hidden":`true`,class:`size-3 animate-spin text-teal-600`}):null})})]}),eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청 원본은 저장하지 않고 숫자만 로컬 메모리에 집계합니다.`}),B(`section`,{"aria-busy":u,class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 ${u?`cursor-wait`:``}`,children:[t.enabled?null:B(`div`,{class:`mb-4 rounded-xl border border-slate-200 bg-slate-50 px-4 py-3 text-sm leading-6 text-slate-600`,children:`통계 수집이 꺼져 있습니다. 활성화하면 DNS 요청 원본은 저장하지 않고 요청 수와 차단 수만 로컬 메모리에 집계합니다.`}),B(`dl`,{class:`mt-2 grid gap-3 sm:grid-cols-2 xl:grid-cols-4`,children:[B(dh,{label:`최근 24시간 DNS 요청`,value:G(l.queries)}),B(dh,{emphasized:!0,label:`최근 24시간 차단`,value:G(l.blocked)}),B(dh,{label:`최근 24시간 차단율`,value:ch(l.queries,l.blocked)}),B(dh,{label:`현재 시간 차단`,value:G(c?.blocked??0)})]}),B(`div`,{class:`mt-5 rounded-xl bg-slate-50/70 p-4 sm:p-5`,children:[B(`div`,{class:`flex flex-wrap items-end justify-between gap-3`,children:[B(`div`,{children:[B(`p`,{class:`m-0 text-xs font-bold text-slate-500`,children:`최근 24시간`}),B(`h3`,{class:`mt-1 mb-0 text-base font-extrabold text-slate-950`,children:`시간대별 차단 요청`})]}),B(`span`,{class:`text-xs font-bold text-slate-500`,children:o?`갱신 중…`:`마지막 집계 ${Qt(t.updatedAt)}`})]}),B(Nm,{buckets:s})]}),B(ah,{deviceLimit:t.deviceLimit,devices:t.devices,truncated:t.devicesTruncated}),B(`div`,{class:`mt-5 flex flex-wrap gap-x-5 gap-y-2 border-t border-slate-100 pt-4 text-xs leading-5 text-slate-500`,children:[B(`span`,{children:[`수집 누적 DNS 요청 `,G(t.totals.queries)]}),B(`span`,{children:[`수집 누적 차단 `,G(t.totals.blocked)]}),B(`span`,{children:[`수집 시작 `,Qt(t.startedAt)]}),B(`span`,{children:[`보존 `,G(t.retentionHours),`시간`]}),t.volatile?B(`span`,{children:`재부팅 시 초기화되는 메모리 통계`}):null]}),n?B(`p`,{class:`mt-3 mb-0 text-xs font-bold text-amber-700`,children:`최근 자동 갱신에 실패했습니다. 현재 표시된 마지막 정상 통계를 유지합니다.`}):null]})]})}var ph=[{label:`갱신 준비`,description:`차단 목록 갱신을 준비하고 있습니다.`,stages:[`starting`,`boot_delay`,`boot_refresh`,`boot_refresh_skipped`,`scheduled_refresh`,`init`]},{label:`최신 차단 목록 확인`,description:`서버에서 최신 차단 목록 정보를 확인하고 있습니다.`,stages:[`resolve_api`]},{label:`차단 목록 다운로드`,description:`최신 차단 목록을 안전하게 다운로드하고 있습니다.`,stages:[`download_artifact`]},{label:`사용자 규칙 적용`,description:`허용·차단 사용자 규칙을 새 차단 목록에 반영하고 있습니다.`,stages:[`local_overrides`,`merge`]},{label:`보호 규칙 적용`,description:`새 차단 규칙을 설치하고 DNS 보호 서비스를 갱신하고 있습니다.`,stages:[`install`,`restart_dnsmasq`]},{label:`보호 상태 확인`,description:`새 차단 목록과 DNS 보호가 정상적으로 동작하는지 확인하고 있습니다.`,stages:[`runtime_check`,`blocklist_verify`]}],mh=new Map;ph.forEach((e,t)=>{e.stages.forEach(e=>mh.set(e,t))});function hh(e,t){return e===`running`||t!==null&&mh.has(t)}function gh(e){let t=e===null?0:mh.get(e)??0,n=ph[t];return{description:n.description,label:n.label,number:t+1,total:ph.length}}function _h(e){return(e??``).trim().toLowerCase()}function vh(e,t){let n=_h(e);if(n.includes(`upgrade`)||n.includes(`version`))return`현재 SafeShield 버전으로는 갱신을 계속할 수 없습니다. 시스템 업데이트에서 SafeShield를 최신 버전으로 업데이트해 주세요.`;if(n.includes(`entitlement`)||n.includes(`license`)||n.includes(`unauthorized`)||n.includes(`forbidden`))return`차단 목록을 사용할 권한을 확인하지 못했습니다. SmartSafeHub 계정과 요금제 상태를 확인해 주세요.`;if(n.includes(`dnsmasq`)||n.includes(`restart`)||n.includes(`runtime`))return`DNS 보호 서비스를 정상적으로 갱신하지 못했습니다. 잠시 후 다시 갱신해 보고 문제가 계속되면 상태 점검 정보를 확인해 주세요.`;if(n.includes(`verify`)||n.includes(`sanity`))return`새 차단 목록을 적용한 뒤 보호 상태 확인을 완료하지 못했습니다. 다시 갱신해 주세요.`;if(n.includes(`download`)||n.includes(`fetch`)||n.includes(`timeout`)||n.includes(`network`)||n.includes(`wan`))return`차단 목록을 다운로드하지 못했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`;if(n.includes(`resolve`)||n.includes(`manifest`)||n.includes(`artifact`)||n.includes(`api`))return`최신 차단 목록 정보를 확인하지 못했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`;if(n.includes(`override`)||n.includes(`allowlist`)||n.includes(`merge`)||n.includes(`rule`))return`사용자 허용·차단 규칙을 새 차단 목록에 반영하지 못했습니다. 사용자 규칙을 확인한 뒤 다시 갱신해 주세요.`;if(n.includes(`install`)||n.includes(`write`)||n.includes(`space`))return`새 차단 규칙을 장치에 적용하지 못했습니다. 저장 공간과 SafeShield 상태를 확인한 뒤 다시 갱신해 주세요.`;let r=gh(t);return r.number===2?`최신 차단 목록 정보를 확인하는 중 문제가 발생했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`:r.number===3?`차단 목록을 다운로드하는 중 문제가 발생했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`:r.number===4?`사용자 규칙을 적용하는 중 문제가 발생했습니다. 사용자 규칙을 확인한 뒤 다시 갱신해 주세요.`:r.number===5?`새 보호 규칙을 적용하는 중 문제가 발생했습니다. 잠시 후 다시 갱신해 주세요.`:r.number===6?`새 차단 목록의 보호 상태를 확인하지 못했습니다. 다시 갱신해 주세요.`:`차단 목록 갱신을 완료하지 못했습니다. 잠시 후 다시 갱신해 주세요.`}var yh=`https://www.smartsafehub.com/pricing/`;function bh({value:e,trueLabel:t=`정상`,falseLabel:n=`확인 필요`}){return B(`span`,{class:`inline-flex items-center gap-2 text-sm font-extrabold ${e?`text-emerald-700`:`text-slate-500`}`,children:[B(`span`,{class:`size-2 rounded-full ${e?`bg-emerald-500`:`bg-slate-300`}`}),e?t:n]})}function xh(e){return!e.enabled||e.status===`disabled`?`disabled`:e.status===`running`?`refreshing`:e.status===`error`||e.health.overall===`error`||e.issueCounts.errors>0?`error`:e.status===`paused`?`paused`:e.active&&e.runtime.dnsmasqRunning&&e.runtime.dnsRuntimeOk?`protecting`:`attention`}function Sh(e){return!e.enabled||e.status===`disabled`?`비활성화`:e.active&&e.runtime.dnsmasqRunning&&e.runtime.dnsRuntimeOk?`보호 중`:e.status===`paused`?`일시 중지`:`확인 필요`}function Ch(e){let t=xh(e);return t===`error`&&Sh(e)===`보호 중`&&e.runtime.lastErrorCode?`갱신 실패`:{disabled:`비활성화`,refreshing:`갱신 중`,protecting:`보호 중`,paused:`일시 중지`,error:`오류`,attention:`확인 필요`}[t]}function wh(e){return e?`자동 최적화`:`확인되지 않음`}function Th(e){let t=tn(e);return t===null?`확인되지 않음`:B(oi,{timestamp:t})}function Eh(e){let t=xh(e);return t===`protecting`?e.blocklist.validLineCount>0?`${G(e.blocklist.validLineCount)}개 도메인 차단 규칙으로 DNS를 보호하고 있습니다.`:e.blocklist.installed?`차단 목록이 설치되어 있으며 DNS 보호가 정상적으로 동작하고 있습니다.`:`SafeShield 서비스와 DNS 런타임이 정상적으로 동작하고 있습니다.`:t===`refreshing`?`차단 목록을 최신 상태로 갱신하고 있습니다.`:t===`disabled`?`SafeShield DNS 보호가 비활성화되어 있습니다.`:t===`paused`?`SafeShield 작업이 일시 중지되어 있습니다.`:t===`error`?Sh(e)===`보호 중`?`기존 DNS 보호는 유지되고 있지만 최근 차단 목록 갱신을 완료하지 못했습니다.`:`SafeShield 보호 상태에 문제가 발생했습니다. 아래 오류 내용을 확인해 주세요.`:e.active?e.runtime.dnsmasqRunning?e.runtime.dnsRuntimeOk?e.summary.message:`SafeShield DNS 런타임 상태를 확인해야 합니다.`:`dnsmasq가 실행 중이 아니어서 DNS 보호 상태를 확인해야 합니다.`:`SafeShield가 활성화되어 있지만 서비스가 실행 중이 아닙니다.`}function Dh(e){return{ok:`정상`,warning:`경고`,error:`오류`,unavailable:`사용 불가`}[e]??e}function Oh({data:e}){let t=xh(e);return B(`span`,{class:`inline-flex items-center rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${t===`error`?`bg-red-50 text-red-700 ring-red-200`:t===`disabled`?`bg-slate-100 text-slate-700 ring-slate-200`:t===`refreshing`?`bg-blue-50 text-blue-700 ring-blue-200`:t===`paused`||t===`attention`?`bg-amber-50 text-amber-800 ring-amber-200`:`bg-emerald-50 text-emerald-700 ring-emerald-200`}`,children:Ch(e)})}function kh({failed:e,step:t,total:n}){let r=2*Math.PI*17,i=r*.22,a=r-i;return B(`span`,{"aria-label":e?`갱신 실패 · ${t}/${n} 단계`:`갱신 ${t}/${n} 단계`,class:`ssh-safeshield-refresh-donut`,"data-state":e?`error`:`active`,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":n,"aria-valuenow":t,children:[B(`svg`,{"aria-hidden":`true`,class:e?`ssh-safeshield-refresh-loader-svg ssh-safeshield-refresh-loader-svg-error`:`ssh-safeshield-refresh-loader-svg`,viewBox:`0 0 48 48`,children:[B(`circle`,{class:`ssh-safeshield-refresh-loader-track`,cx:`24`,cy:`24`,fill:`none`,r:17,stroke:`currentColor`,strokeWidth:2.5}),e?null:B(`circle`,{class:`ssh-safeshield-refresh-loader-arc`,cx:`24`,cy:`24`,fill:`none`,r:17,stroke:`currentColor`,strokeDasharray:`${i} ${a}`,strokeLinecap:`round`,strokeWidth:3.5})]}),B(`span`,{class:`ssh-safeshield-refresh-donut-label`,children:e?`!`:`${t}/${n}`})]})}function Ah({data:e}){let t=hh(e.status,e.stage),n=xh(e)===`error`;if(!t&&!n)return null;let r=gh(e.stage),i=n?vh(e.runtime.lastErrorCode,e.stage):null;return B(`div`,{"aria-live":n?`assertive`:`polite`,class:`ssh-safeshield-refresh`,"data-state":n?`error`:`active`,role:n?`alert`:`status`,children:[B(kh,{failed:n,step:r.number,total:r.total}),B(`div`,{class:`ssh-safeshield-refresh-copy`,children:[B(`p`,{class:`ssh-safeshield-refresh-kicker`,children:n?`갱신 실패 · ${r.number}/${r.total}`:`갱신 ${r.number}/${r.total}`}),B(`p`,{class:`ssh-safeshield-refresh-title`,children:n?`${r.label} 단계에서 문제가 발생했습니다.`:r.label}),B(`p`,{class:`ssh-safeshield-refresh-description`,children:i??r.description}),n&&e.runtime.lastErrorCode?B(`p`,{class:`ssh-safeshield-refresh-error-code`,children:[`오류 코드: `,B(`code`,{children:e.runtime.lastErrorCode})]}):null]})]})}function jh({label:e,value:t}){return B(`div`,{class:`bg-white px-5 py-4 sm:px-6`,children:[B(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.14em] text-slate-400`,children:e}),B(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-extrabold text-slate-950`,title:typeof t==`string`?t:void 0,children:t})]})}function Mh(e){return e?.trim().toUpperCase()||`FREE`}function Nh(e){return e===`FREE`?`free`:e===`PRO`?`pro`:e===`ULTIMATE`?`ultimate`:`paid`}function Ph({compact:e=!1,plan:t}){let n=Nh(t),r=n!==`free`;return B(`span`,{class:`ssh-safeshield-plan-badge`,"data-compact":e?`true`:`false`,"data-tier":n,title:r?`${t} 멤버십`:`무료 플랜`,children:[B(`span`,{"aria-hidden":`true`,class:`ssh-safeshield-plan-badge-mark`,children:r?`✦`:`•`}),B(`span`,{children:t})]})}function Fh({plan:e}){let t=Nh(e)===`free`;return B(`div`,{class:`bg-white px-5 py-4 sm:px-6`,children:[B(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.14em] text-slate-400`,children:`Plan`}),B(`dd`,{class:`mt-2 mb-0 ml-0 flex min-w-0 flex-wrap items-center gap-2`,children:[B(Ph,{plan:e}),t?B(`span`,{class:`ssh-safeshield-plan-caption`,children:`기본 플랜`}):null]})]})}function Ih(){return B(`div`,{class:`ssh-safeshield-upgrade-card`,children:[B(`span`,{"aria-hidden":`true`,class:`ssh-safeshield-upgrade-mark`,children:`✦`}),B(`div`,{class:`ssh-safeshield-upgrade-copy`,children:[B(`div`,{class:`ssh-safeshield-upgrade-meta`,children:[B(`span`,{children:`SmartSafeHub Membership`}),B(`span`,{class:`ssh-safeshield-upgrade-soon`,children:`Coming soon`})]}),B(`strong`,{children:`더 강력한 보호 기능을 준비하고 있습니다.`}),B(`span`,{children:`프리미엄 보호와 확장된 관리 기능을 미리 확인해 보세요.`})]}),B(`a`,{class:`ssh-safeshield-upgrade-action`,href:yh,rel:`noopener noreferrer`,target:`_blank`,children:[`요금제 보기`,B(`span`,{"aria-hidden":`true`,children:`→`})]})]})}function Lh({children:e,eyebrow:t,icon:n,title:r}){return B(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:p-4 2xl:p-5`,children:[B(`div`,{class:`flex min-w-0 items-start justify-between gap-4 xl:gap-2`,children:[B(`div`,{children:[B(`p`,{class:`m-0 text-[0.68rem] font-black uppercase tracking-[0.16em] text-slate-400`,children:t}),B(`h3`,{class:`mt-2 mb-0 text-lg font-black tracking-tight text-slate-950 xl:text-base 2xl:text-lg`,children:r})]}),B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-500 xl:size-9 2xl:size-10`,children:n})]}),B(`dl`,{class:`mt-5 mb-0 grid gap-3`,children:e})]})}function Rh({label:e,value:t}){return B(`div`,{class:`flex min-w-0 items-center justify-between gap-2 border-b border-slate-100 pb-3 last:border-b-0 last:pb-0`,children:[B(`dt`,{class:`text-sm font-semibold text-slate-500`,children:e}),B(`dd`,{class:`m-0 min-w-0 break-words text-right text-sm font-extrabold text-slate-950`,children:t})]})}function zh({error:e,message:t,onDismiss:n}){if(!e&&!t)return null;let r=e!==null;return B(`div`,{"aria-live":r?`assertive`:`polite`,class:`mt-4 flex flex-col items-start gap-3 rounded-2xl border px-4 py-3 text-sm sm:flex-row sm:justify-between ${r?`border-red-200 bg-red-50 text-red-900`:`border-emerald-200 bg-emerald-50 text-emerald-900`}`,role:r?`alert`:`status`,children:[B(`div`,{class:`flex min-w-0 items-start gap-3`,children:[B(r?U:_t,{class:`mt-0.5 size-5 shrink-0`}),B(`p`,{class:`m-0 font-semibold leading-6`,children:e??t})]}),B(`button`,{"aria-label":`알림 닫기`,class:`shrink-0 rounded-lg border-0 bg-transparent px-2 py-1 font-black text-current opacity-60 transition hover:opacity-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-current`,onClick:n,type:`button`,children:`×`})]})}function Bh({action:e,actionError:t,actionMessage:n,data:r,error:i,loading:a,statistics:o,statisticsError:s,statisticsLoading:c,statisticsRefreshing:l,onDismissFeedback:u,onRefreshBlocklist:d,onRetry:f,onRetryStatistics:p,onSetEnabled:m,onSetStatisticsEnabled:h}){let[g,_]=R(null);if(z(()=>{r?.available&&r.blocklist.validLineCount>0&&!hh(r.status,r.stage)&&_(r.blocklist.validLineCount)},[r?.available,r?.blocklist.validLineCount,r?.stage,r?.status]),a)return B(Bn,{});if(i)return B(Vn,{message:i,onRetry:f});if(!r)return B(Bn,{});if(!r.available)return B(`section`,{class:`rounded-2xl border border-amber-200 bg-amber-50 p-5 sm:p-6`,children:[B(`span`,{class:`grid size-11 place-items-center rounded-xl bg-amber-100 text-amber-800`,children:B(U,{class:`size-6`})}),B(`h2`,{class:`mt-5 mb-0 text-xl font-extrabold text-amber-950`,children:`SafeShield 상태 API를 찾을 수 없습니다`}),B(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-amber-900`,children:`safeshield 패키지와 rpcd ucode 플러그인이 설치되어 있는지 확인해 주세요.`})]});let v=r.enabled,y=Mh(r.entitlement.plan),x=r.status===`running`,S=e!==null,C=(hh(r.status,r.stage)||xh(r)===`error`)&&r.blocklist.validLineCount===0&&g!==null?g:r.blocklist.validLineCount,w=v?e===`disable`?`끄는 중…`:`보호 끄기`:e===`enable`?`켜는 중…`:`보호 켜기`;function T(){(!v||window.confirm(`보호를 끄면, 현재 차단 목록이 제거되어 위험에 노출될 수 있습니다. 그래도 계속하시겠습니까?`))&&m(!v)}return B(b,{children:[B(W,{eyebrow:`Protection`,title:`SafeShield 보호 상태`,description:`DNS 보호 상태와 적용 중인 차단 목록을 확인합니다.`}),B(`section`,{class:`mb-8 grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1.08fr)_minmax(0,0.92fr)] xl:items-stretch`,children:[B(`article`,{"aria-label":`보호 상태 요약`,class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:h-full`,children:[B(`div`,{class:`flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between xl:flex-col 2xl:flex-row`,children:[B(`div`,{class:`flex min-w-0 items-start gap-3`,children:[B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:B(We,{class:`size-5`})}),B(`div`,{class:`min-w-0`,children:[B(`div`,{class:`flex flex-wrap items-center gap-2`,children:[B(`h3`,{class:`m-0 text-base font-black text-slate-950`,children:`현재 보호 상태`}),B(Oh,{data:r})]}),B(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:Eh(r)})]})]}),B(`div`,{class:`flex w-full flex-col gap-2 sm:w-auto sm:flex-row sm:flex-wrap xl:justify-end`,children:[B(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border px-4 py-2.5 text-sm font-extrabold transition focus:outline-none focus-visible:ring-4 disabled:cursor-not-allowed disabled:opacity-50 ${r.enabled?`border-red-200 bg-white text-red-700 hover:border-red-300 hover:bg-red-50 focus-visible:ring-red-100`:`border-teal-700 bg-teal-700 text-white hover:border-teal-800 hover:bg-teal-800 focus-visible:ring-teal-100`}`,disabled:S||x,onClick:T,type:`button`,children:[B(lt,{class:`size-4 ${e===`enable`||e===`disable`?`animate-pulse`:``}`}),w]}),B(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border border-slate-200 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-700 transition hover:border-teal-300 hover:bg-teal-50 hover:text-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!r.enabled||S||x,onClick:d,type:`button`,children:[B(ut,{class:`size-4 ${e===`refresh`||x?`animate-bounce`:``}`}),e===`refresh`?`시작 중…`:x?`갱신 중…`:r.status===`error`?`다시 갱신`:`지금 갱신`]})]})]}),B(Ah,{data:r}),B(`dl`,{class:`mt-5 mb-0 grid min-w-0 grid-cols-2 overflow-hidden rounded-xl border border-slate-200 bg-slate-200`,children:[B(jh,{label:`SafeShield`,value:r.version??`확인되지 않음`}),B(jh,{label:`Blocklist`,value:`${G(C)}개 도메인`}),B(jh,{label:`Last refresh`,value:B(oi,{timestamp:r.timestamps.lastSuccess})}),B(Fh,{plan:y})]}),y===`FREE`?B(Ih,{}):null]}),B(`section`,{"aria-label":`보호 데이터 요약`,class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:h-full`,children:[B(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[B(`div`,{class:`flex min-w-0 items-center gap-3`,children:[B(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-500`,children:B(dt,{class:`size-5`})}),B(`div`,{children:[B(`p`,{class:`m-0 text-[0.65rem] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Protection data`}),B(`h3`,{class:`mt-1 mb-0 text-sm font-black text-slate-950`,children:`보호 데이터`})]})]}),B(`span`,{"aria-label":`보호 데이터 상태: ${r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?`최신`:`확인 필요`}`,class:`inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-xs font-extrabold ${r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?`bg-emerald-50 text-emerald-700`:`bg-amber-50 text-amber-700`}`,children:[r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?B(_t,{class:`size-3.5 shrink-0`}):B(U,{class:`size-3.5 shrink-0`}),r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?`최신`:`확인 필요`]})]}),B(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-500`,children:`SafeShield가 기기 성능에 맞춰 사용하는 보호 목록의 구성과 최신 상태를 확인합니다.`}),B(`dl`,{class:`mt-3 mb-0 grid grid-cols-1 gap-2 sm:grid-cols-2`,children:[B(`div`,{class:`min-w-0 rounded-lg border border-slate-200 bg-white px-3 py-2.5`,children:[B(`dt`,{class:`text-xs font-bold text-slate-500`,children:`기기 최적화`}),B(`dd`,{class:`mt-1 mb-0 text-sm font-extrabold text-slate-950`,children:wh(r.artifact.tier)})]}),B(`div`,{class:`min-w-0 rounded-lg border border-slate-200 bg-white px-3 py-2.5`,children:[B(`dt`,{class:`text-xs font-bold text-slate-500`,children:`마지막 업데이트`}),B(`dd`,{class:`mt-1 mb-0 text-sm font-extrabold leading-5 text-slate-950`,children:Th(r.artifact.version)})]})]}),B(`section`,{"aria-label":`보호 데이터 세부 정보`,class:`mt-3 border-t border-slate-200 pt-3`,children:[B(`h4`,{class:`m-0 text-xs font-extrabold text-slate-600`,children:`세부 정보`}),B(`dl`,{class:`mt-3 mb-0 grid gap-2`,children:[B(Rh,{label:`데이터 프로필`,value:r.artifact.tier||`확인되지 않음`}),B(Rh,{label:`데이터 버전`,value:r.artifact.version||`확인되지 않음`})]})]})]})]}),B(zh,{error:t,message:n,onDismiss:u}),B(fh,{action:e,data:o,error:s,loading:c,onRetry:p,onSetEnabled:h,refreshing:l}),B(`section`,{class:`mt-7`,children:[B(W,{description:`DNS 보호 런타임, 차단 목록, 갱신 일정과 상태 점검 결과를 한곳에서 확인합니다.`,eyebrow:`Protection details`,title:`보호 구성`}),B(`div`,{class:`grid min-w-0 grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4`,children:[B(Lh,{eyebrow:`Runtime`,icon:B(_t,{class:`size-5`}),title:`DNS 보호 런타임`,children:[B(Rh,{label:`SafeShield 서비스`,value:B(bh,{falseLabel:`중지됨`,trueLabel:`동작 중`,value:r.active})}),B(Rh,{label:`DNS 서비스`,value:B(bh,{falseLabel:`중지됨`,value:r.runtime.dnsmasqRunning})}),B(Rh,{label:`SafeShield DNS 연동`,value:B(bh,{value:r.runtime.dnsRuntimeOk})}),B(Rh,{label:`차단 목록 갱신`,value:B(bh,{falseLabel:`중지됨`,value:r.runtime.refreshdRunning})})]}),B(Lh,{eyebrow:`Blocklist`,icon:B(dt,{class:`size-5`}),title:`차단 목록`,children:[B(Rh,{label:`적용 규칙`,value:`${G(r.blocklist.validLineCount)}개 도메인`}),B(Rh,{label:`파일 크기`,value:Yt(r.blocklist.fileSizeKb*1024)}),B(Rh,{label:`설치 상태`,value:B(bh,{falseLabel:`미설치`,trueLabel:`설치됨`,value:r.blocklist.installed})}),B(Rh,{label:`검증 상태`,value:B(bh,{falseLabel:`확인 필요`,value:r.blocklist.verificationOk})})]}),B(Lh,{eyebrow:`Refresh schedule`,icon:B(gt,{class:`size-5`}),title:`차단 목록 갱신`,children:[B(Rh,{label:`마지막 성공`,value:B(oi,{timestamp:r.timestamps.lastSuccess})}),B(Rh,{label:`다음 갱신`,value:Qt(r.timestamps.nextRefreshAt)}),B(Rh,{label:`갱신 주기`,value:nn(r.timestamps.refreshIntervalS)}),B(Rh,{label:`최근 결과`,value:r.runtime.lastResult||(x?`갱신 중`:`확인되지 않음`)})]}),B(Lh,{eyebrow:`Health`,icon:B(We,{class:`size-5`}),title:`상태 점검`,children:[B(Rh,{label:`전체 상태`,value:Dh(r.health.overall)}),B(Rh,{label:`경고`,value:B(`span`,{class:`text-amber-700`,children:G(r.issueCounts.warnings)})}),B(Rh,{label:`오류`,value:B(`span`,{class:`text-red-700`,children:G(r.issueCounts.errors)})}),B(Rh,{label:`최근 오류 코드`,value:r.runtime.lastErrorCode||`없음`})]})]})]})]})}var Vh=Math.floor(Date.now()/1e3),Hh=3600,Uh={schema:1,component:`device`,phase:`registered`,lastResult:`success`,lastErrorCode:null,accountRegistered:!0,plan:`free`,pairingCode:null,pairingExpiresAt:null,nextSyncAt:0,lastSuccessAt:Vh-300},Wh={schema:1,deviceCode:`iptime-ax3000sm`,firmwareBuildId:`demo-build`,channel:`stable`,apps:[{id:`retro-arcade`,name:`레트로 아케이드`,summary:`브라우저에서 레트로 게임을 즐기는 엔터테인먼트 앱입니다.`,description:`사용자가 직접 준비한 게임 파일로 즐기는 레트로 아케이드입니다.`,category:`entertainment`,version:`1.1.0-r5`,webUi:{type:`static`,path:`/retro-arcade/`}},{id:`network-usage-monitor`,name:`네트워크 사용량 모니터`,summary:`기기별 네트워크 사용량과 통계를 확인하는 앱입니다.`,description:`네트워크 트래픽을 모니터링합니다.`,category:`network`,version:`2025.06.02~29236be6-r1`,webUi:null},{id:`wake-on-lan`,name:`Wake-on-LAN`,summary:`공유기에서 PC와 홈서버의 전원을 켤 수 있는 도구입니다.`,description:`Wake-on-LAN 지원 컴퓨터를 네트워크에서 깨우는 앱입니다.`,category:`utilities`,version:`26.288.56989~75a306d`,webUi:null}]},Gh={job:{phase:`idle`,action:``,appId:``,code:`NONE`},installed:{"retro-arcade":{installed:!0,partial:!1,managed:!0,updateAvailable:!0,installedVersion:`1.0.0-r1`,webUiReady:!0},"network-usage-monitor":{installed:!0,partial:!1,managed:!0,updateAvailable:!1,installedVersion:`2025.06.02~29236be6-r1`,webUiReady:!1},"wake-on-lan":{installed:!1,partial:!1,managed:!1,updateAvailable:!1,installedVersion:null,webUiReady:!1}}},Kh={storage:{mount:`/overlay`,totalBytes:268435456,availableBytes:193986560},installedSizes:{"retro-arcade":1394688,"network-usage-monitor":117760}},qh={generatedAt:Vh,devices:[{id:`demo-phone`,hostname:`거실 스마트폰`,mac:`02:00:00:00:00:01`,ipv4Address:`192.0.2.101`,connection:`wifi`,online:!0,leaseActive:!0,leaseExpiresAt:Vh+6*Hh,interface:`wlan0`,ssid:`SmartSafeHub`,radio:`radio0`,band:`5g`,bandLabel:`5 GHz`,signalDbm:-43,inactiveMs:250,connectedSeconds:8300},{id:`demo-laptop`,hostname:`작업용 노트북`,mac:`02:00:00:00:00:02`,ipv4Address:`192.0.2.102`,connection:`wifi`,online:!0,leaseActive:!0,leaseExpiresAt:Vh+8*Hh,interface:`wlan0`,ssid:`SmartSafeHub`,radio:`radio0`,band:`5g`,bandLabel:`5 GHz`,signalDbm:-57,inactiveMs:720,connectedSeconds:29200},{id:`demo-tv`,hostname:`거실 TV`,mac:`02:00:00:00:00:03`,ipv4Address:`192.0.2.103`,connection:`ethernet`,online:!0,leaseActive:!0,leaseExpiresAt:Vh+12*Hh,interface:`lan1`,ssid:null,radio:null,band:null,bandLabel:null,signalDbm:null,inactiveMs:null,connectedSeconds:14e4},{id:`demo-tablet`,hostname:`태블릿`,mac:`02:00:00:00:00:04`,ipv4Address:`192.0.2.104`,connection:`wifi`,online:!1,leaseActive:!1,leaseExpiresAt:null,interface:null,ssid:`SmartSafeHub`,radio:`radio1`,band:`2g`,bandLabel:`2.4 GHz`,signalDbm:null,inactiveMs:null,connectedSeconds:null}],totals:{known:4,online:3,wireless:2,ethernet:1,offline:1}},Jh={schema:1,scope:`current_boot`,volatile:!0,maxEvents:100,cloud:{enabled:!1,phase:`disabled`,eligible:!1,plan:`free`,retentionDays:0,pendingEvents:0,lastAttemptAt:0,lastSuccessAt:0,lastUploadedCount:0,lastErrorCode:null,nextSyncAt:0},events:[{schema:1,eventId:`demo-event-1`,eventType:`safeshield.blocklist.updated`,severity:`success`,occurredAt:Vh-7200,deviceUuid:null,source:`safeshield`,metadata:{}},{schema:1,eventId:`demo-event-2`,eventType:`system.boot`,severity:`info`,occurredAt:Vh-86400,deviceUuid:null,source:`system`,metadata:{}}]},Yh={device:{hostname:`SmartRouter`,model:`ipTIME AX3000SM`,boardName:`iptime,ax3000sm`},software:{distribution:`OpenWrt`,version:`25.12`,revision:`demo`,kernel:`6.12`},runtime:{uptime:86400,localtime:Vh,load:[.08,.12,.05],memory:{total:268435456,free:83886080,shared:4194304,buffered:41943040,available:171966464,cached:41943040},storage:Kh.storage},network:{available:!0,up:!0,protocol:`dhcp`,ipv4Address:`198.51.100.20`},activityHistory:Jh},Xh={lan:{address:`192.168.1.1`,prefixLength:24,netmask:`255.255.255.0`,subnet:`192.168.1.0/24`},dhcp:{enabled:!0,start:`192.168.1.100`,end:`192.168.1.249`,leaseTime:`12h`},wan:{connected:!0,protocol:`dhcp`,address:`198.51.100.20`,prefixLength:24,subnet:`198.51.100.0/24`},conflict:{detected:!1,wanSubnet:null},recommendation:null},Zh={available:!0,version:`0.3.25`,enabled:!0,active:!0,status:`idle`,stage:null,summary:{label:`보호 중`,message:`DNS 보호가 정상적으로 동작하고 있습니다.`,severity:`info`},runtime:{refreshdRunning:!0,dnsmasqRunning:!0,dnsRuntimeOk:!0,lastResult:`success`,lastErrorCode:null},entitlement:{plan:`free`,status:`active`},artifact:{resolved:!0,tier:`light`,version:`20261010T010000Z`,uniqueDomains:48e3,rules:48e3},localOverrides:{enabled:!0,allowlistPath:`/etc/safeshield/allowlist`,blocklistPath:`/etc/safeshield/blocklist`},blocklist:{installed:!0,validLineCount:48e3,fileSizeKb:4700,verificationOk:!0},health:{overall:`ok`},issueCounts:{warnings:0,errors:0},timestamps:{lastAttempt:Vh-2*Hh,lastSuccess:Vh-2*Hh,lastFailure:0,lastLocalApply:Vh-2*Hh,lastLocalApplyFailure:0,nextRefreshAt:Vh+21*Hh,refreshIntervalS:82800}},Qh=Math.floor(Vh/Hh)*Hh,$h=[{queries:351,blocked:18},{queries:297,blocked:15},{queries:243,blocked:11},{queries:216,blocked:9},{queries:203,blocked:8},{queries:230,blocked:10},{queries:324,blocked:17},{queries:567,blocked:35},{queries:783,blocked:54},{queries:864,blocked:61},{queries:756,blocked:50},{queries:702,blocked:43},{queries:635,blocked:36},{queries:580,blocked:30},{queries:608,blocked:33},{queries:689,blocked:40},{queries:837,blocked:54},{queries:1026,blocked:73},{queries:1256,blocked:99},{queries:1458,blocked:125},{queries:1512,blocked:135},{queries:1323,blocked:111},{queries:1026,blocked:75},{queries:648,blocked:39}],eg=Array.from({length:24},(e,t)=>{let n=Qh-(23-t)*Hh,r=$h[new Date(n*1e3).getHours()];return{bucketStart:n,queries:r.queries,blocked:r.blocked}}),tg={enabled:!0,collectorRunning:!0,available:!0,schemaVersion:1,volatile:!0,startedAt:Vh-604800,updatedAt:Vh-30,retentionHours:168,totals:{queries:eg.reduce((e,t)=>e+t.queries,0),blocked:eg.reduce((e,t)=>e+t.blocked,0)},hourly:eg,deviceLimit:128,devicesTruncated:!1,devices:[{id:`demo-phone`,mac:`02:00:00:00:00:01`,ip:`192.0.2.101`,hostname:`거실 스마트폰`,identified:!0,queries:3400,blocked:470},{id:`demo-laptop`,mac:`02:00:00:00:00:02`,ip:`192.0.2.102`,hostname:`작업용 노트북`,identified:!0,queries:2900,blocked:345},{id:`demo-tv`,mac:`02:00:00:00:00:03`,ip:`192.0.2.103`,hostname:`거실 TV`,identified:!0,queries:1200,blocked:185}]},ng={schema:1,generatedAt:Vh,overall:`ok`,summary:{message:`모든 주요 항목이 정상입니다.`,total:3,ok:3,warning:0,critical:0,unknown:0},metrics:{memoryAvailablePercent:64,load1m:.08,overlayAvailablePercent:80},checks:[],reporter:{enabled:!1,eligible:!1,plan:`free`,entitlementStatus:`active`,lastReportAt:0,nextReportAt:0,lastResult:``,lastErrorCode:null}},rg={phase:`idle`,updateCount:0,packages:[],lastCheckAt:Vh-Hh,lastInstallAt:null,lastError:null,releaseNotes:[],releaseNotesComplete:!0,settings:{channel:`stable`,checkEnabled:!0,checkIntervalSeconds:21600,autoInstall:!0,autoInstallTime:`03:00`,repositoryHost:`example.invalid`,updatePackage:`luci-app-smartsafehub`}},ig={phase:`idle`,source:null,lastCheckAt:Vh-Hh,lastPrepareAt:null,lastError:null,prepared:null,current:{deviceCode:`iptime-ax3000sm`,boardName:`iptime,ax3000sm`,buildId:`demo`,releaseVersion:`1.0.2`,openwrtVersion:`25.12`,metadataAvailable:!0},updateAvailable:!1,release:null,settings:{channel:`stable`,apiBaseUrl:`https://www.smartsafehub.com`,checkIntervalSeconds:21600,autoInstall:!1}},ag={configuration:{protocol:`dhcp`,supported:!0,pppoe:{username:``,passwordConfigured:!1},static:{address:null,prefixLength:null,netmask:null,gateway:null,dns:[]}},status:{connected:!0,pending:!1,protocol:`dhcp`,device:`wan`,address:`198.51.100.20`,prefixLength:24,gateway:`198.51.100.1`,dns:[`1.1.1.1`,`8.8.8.8`],uptimeSeconds:86400}},og={networks:[{section:`demo_5g`,device:`radio0`,band:`5g`,bandLabel:`5 GHz`,ssid:`SmartSafeHub`,enabled:!0,runtimeUp:!0,security:`sae-mixed`,securityRaw:`sae-mixed`,passwordConfigured:!0,channel:`36`,networks:[`lan`],clientCount:2},{section:`demo_2g`,device:`radio1`,band:`2g`,bandLabel:`2.4 GHz`,ssid:`SmartSafeHub-2G`,enabled:!0,runtimeUp:!0,security:`sae-mixed`,securityRaw:`sae-mixed`,passwordConfigured:!0,channel:`6`,networks:[`lan`],clientCount:0}],totalClients:2,guest:{supported:!0,configured:!0,enabled:!0,ssid:`SmartSafeHub-Guest`,passwordConfigured:!0,subnet:`192.0.2.0/24`,radio:`radio1`}},sg={allow:[`trusted.example`,`updates.example`],block:[`ads.example`,`tracker.example`],counts:{allow:2,block:2,total:4},safeshieldEnabled:!0,applyLocalOverrides:!0},cg=async e=>({ssid:og.networks.find(t=>t.section===e)?.ssid??`SmartSafeHub`,security:`sae-mixed`,password:`demo-only-2026`}),lg=async()=>({ssid:`SmartSafeHub-Guest`,security:`sae-mixed`,password:`guest-demo-only-2026`}),ug=new Set(Le);function dg(){let e=Gi(),t=Yi(),n=ug.has(e)?e:`home`,[r,i]=R(``);z(()=>{ug.has(e)||(window.history.replaceState(null,``,`${window.location.pathname}${window.location.search}#home`),i(`해당 기능은 현재 데모에서 제공하지 않습니다.`))},[e]);let a=()=>i(`체험 모드에서는 실제 계정 연결, 앱 설치·제거·실행 및 공유기 설정 변경을 수행하지 않습니다.`),o=()=>i(``),s=()=>i(`예시 데이터가 표시되고 있습니다. 실제 공유기에는 연결되지 않습니다.`),c=async()=>(a(),!1),l={action:null,actionError:null,data:ig,error:null,loading:!1,message:null,reconnecting:!1,uploadProgress:null,check:a,discard:c,dismissFeedback:o,install:c,prepare:a,refresh:s,upload:c},u;switch(n){case`account`:u=B(Jn,{data:Uh,error:null,loading:!1,pairingBusy:!1,refreshing:!1,syncError:null,demo:!0,onDemoAction:a,onRequestPairing:async()=>(a(),null),onRetry:s});break;case`apps`:u=B(zn,{data:Wh,error:null,loading:!1,refreshing:!1,installStatus:Gh,metrics:Kh,statusError:null,demo:!0,onDemoAction:a,onRefreshStatus:s,onRetry:s,onInstall:async()=>{a()},onRemove:async()=>{a()},onUpdate:async()=>{a()}});break;case`activity`:u=B(Cn,{actionError:null,actionMessage:null,data:Jh,error:null,loading:!1,onDismissActionFeedback:o,onRetry:s,onSetCloudSync:a,savingCloudSync:!1});break;case`network`:u=B(`div`,{class:`min-w-0`,children:[B(Xi,{active:t.network,label:`네트워크 설정 메뉴`,tabs:[{id:`internet`,label:`인터넷 연결`,href:`#network`},{id:`lan`,label:`LAN 및 DHCP`,href:`#network/lan`}]}),B(`div`,{"aria-label":`인터넷 연결 설정`,"aria-labelledby":`internet-tab`,hidden:t.network!==`internet`,id:`internet-panel`,role:`tabpanel`,children:B(Nr,{action:null,data:ag,error:null,feedback:null,loading:!1,onDismissFeedback:o,onReconnect:a,onRetry:s,onSave:c})}),B(`div`,{"aria-label":`내부 네트워크 설정`,"aria-labelledby":`lan-tab`,hidden:t.network!==`lan`,id:`lan-panel`,role:`tabpanel`,children:B(Wr,{action:null,data:Xh,error:null,feedback:null,loading:!1,onApplyRecommendation:c,onDismissFeedback:o,onRetry:s,onSave:c})})]});break;case`wifi`:u=B(ai,{data:og,error:null,feedback:null,loading:!1,updatingSection:null,onDismissFeedback:o,onRetry:s,onUpdate:c,onUpdateGuest:c,onLoadQr:cg,onLoadGuestQr:lg});break;case`rules`:u=B(_i,{action:null,data:sg,error:null,feedback:null,loading:!1,onAddRule:c,onDeleteRule:c,onDismissFeedback:o,onRetry:s});break;case`system`:u=B(Hi,{action:null,actionError:null,data:rg,error:null,firmware:l,loading:!1,message:null,onCheck:a,onDismissFeedback:o,onInstall:a,onRetry:s,onSaveSettings:c});break;case`devices`:u=B(ca,{data:qh,error:null,loading:!1,onRetry:s});break;case`safeshield`:u=B(Bh,{action:null,actionError:null,actionMessage:null,data:Zh,error:null,loading:!1,statistics:tg,statisticsError:null,statisticsLoading:!1,statisticsRefreshing:!1,onDismissFeedback:o,onRefreshBlocklist:a,onRetry:s,onRetryStatistics:s,onSetEnabled:a,onSetStatisticsEnabled:a});break;default:u=B($m,{accountRegistered:Uh.accountRegistered,activity:Jh,activityError:null,activityLoading:!1,data:Yh,devices:qh,devicesError:null,devicesLoading:!1,error:null,firmware:ig,firmwareError:null,firmwareLoading:!1,health:ng,healthError:null,healthLoading:!1,lan:Xh,lanError:null,lanLoading:!1,loading:!1,onRetry:s,safeshield:Zh,safeshieldError:null,safeshieldLoading:!1,statistics:tg,statisticsError:null,statisticsLoading:!1,statisticsRefreshing:!1,updates:rg,updatesError:null,updatesLoading:!1})}return B(Gt,{accountRegistered:Uh.accountRegistered,demo:!0,loading:!1,onRefresh:s,refreshing:!1,route:n,updateCount:0,children:[B(`div`,{role:`status`,class:`mb-5 flex flex-wrap items-center justify-between gap-3 rounded-xl border border-teal-200 bg-teal-50 px-4 py-3 text-sm font-semibold text-teal-800`,children:[B(`span`,{children:`체험 모드 · 표시되는 기기와 보호 통계는 모두 예시입니다.`}),B(`a`,{class:`font-extrabold underline`,href:`/devices/`,children:`지원 기기 살펴보기 →`})]}),r?B(`div`,{role:`alert`,class:`mb-5 flex items-center justify-between gap-3 rounded-xl border border-amber-300 bg-amber-50 p-4 text-sm font-semibold text-amber-900`,children:[r,B(`button`,{"aria-label":`안내 닫기`,class:`font-black`,onClick:o,type:`button`,children:`✕`})]}):null,u]})}var fg=document.getElementById(`smartsafehub-demo-root`);if(fg){let e=fg.attachShadow({mode:`open`}),t=document.createElement(`link`);t.rel=`stylesheet`,t.href=fg.dataset.demoCss||`/static/router-demo/demo.css`,e.appendChild(t);let n=document.createElement(`div`);n.className=`smartsafehub-shadow-root`,e.appendChild(n),oe(B(dg,{}),n)} \ No newline at end of file diff --git a/luci-app-smartsafehub/frontend/package-lock.json b/luci-app-smartsafehub/frontend/package-lock.json index 6a4ee073c..19c7c3c2b 100644 --- a/luci-app-smartsafehub/frontend/package-lock.json +++ b/luci-app-smartsafehub/frontend/package-lock.json @@ -1,23 +1,23 @@ { "name": "luci-app-smartsafehub-frontend", - "version": "0.2.30", + "version": "0.2.31", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "luci-app-smartsafehub-frontend", - "version": "0.2.30", + "version": "0.2.31", "dependencies": { - "chart.js": "4.5.1", - "preact": "11.0.1" + "chart.js": "4.6.1", + "preact": "11.1.0" }, "devDependencies": { "@preact/preset-vite": "2.10.6", "@tailwindcss/vite": "4.3.3", - "@types/node": "26.6.4", + "@types/node": "26.6.5", "tailwindcss": "4.3.3", "typescript": "7.0.2", - "vite": "8.3.4" + "vite": "8.3.5" }, "engines": { "node": ">=24.0" @@ -448,9 +448,9 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.153.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.153.0.tgz", - "integrity": "sha512-jSNrRIyvPVLL5E1z/tS5zLAprosGz/FuI1PWwEOz59j3E4TTTzSpqKb/RDGqJhhW0QHYISGXxq582wGx6T11Tw==", + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.155.0.tgz", + "integrity": "sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==", "dev": true, "license": "MIT", "funding": { @@ -550,9 +550,9 @@ } }, "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.13.tgz", - "integrity": "sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.15.tgz", + "integrity": "sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==", "cpu": [ "arm" ], @@ -567,9 +567,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.13.tgz", - "integrity": "sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.15.tgz", + "integrity": "sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==", "cpu": [ "arm64" ], @@ -584,9 +584,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.13.tgz", - "integrity": "sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.15.tgz", + "integrity": "sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==", "cpu": [ "arm64" ], @@ -601,9 +601,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.13.tgz", - "integrity": "sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.15.tgz", + "integrity": "sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==", "cpu": [ "x64" ], @@ -618,9 +618,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.13.tgz", - "integrity": "sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.15.tgz", + "integrity": "sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==", "cpu": [ "x64" ], @@ -635,9 +635,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.13.tgz", - "integrity": "sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.15.tgz", + "integrity": "sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==", "cpu": [ "arm" ], @@ -652,9 +652,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.13.tgz", - "integrity": "sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.15.tgz", + "integrity": "sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==", "cpu": [ "arm64" ], @@ -669,9 +669,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.13.tgz", - "integrity": "sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.15.tgz", + "integrity": "sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==", "cpu": [ "arm64" ], @@ -686,9 +686,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.13.tgz", - "integrity": "sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.15.tgz", + "integrity": "sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==", "cpu": [ "ppc64" ], @@ -703,9 +703,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.13.tgz", - "integrity": "sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.15.tgz", + "integrity": "sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==", "cpu": [ "s390x" ], @@ -720,9 +720,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.13.tgz", - "integrity": "sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.15.tgz", + "integrity": "sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==", "cpu": [ "x64" ], @@ -737,9 +737,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.13.tgz", - "integrity": "sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.15.tgz", + "integrity": "sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==", "cpu": [ "x64" ], @@ -754,9 +754,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.13.tgz", - "integrity": "sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.15.tgz", + "integrity": "sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==", "cpu": [ "arm64" ], @@ -771,9 +771,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.13.tgz", - "integrity": "sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.15.tgz", + "integrity": "sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==", "cpu": [ "arm64" ], @@ -788,9 +788,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.13.tgz", - "integrity": "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.15.tgz", + "integrity": "sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==", "cpu": [ "x64" ], @@ -1125,9 +1125,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.6.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.4.tgz", - "integrity": "sha512-ldVPDCzj7fsaGZrLB0NuHuTvJcsNasysBAqMolr/cgxrLd1xbqxIr3XJiPnHHJUCxj5sNF1vnRj9aWnrVh5Jcg==", + "version": "26.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.5.tgz", + "integrity": "sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg==", "dev": true, "license": "MIT", "dependencies": { @@ -1560,9 +1560,9 @@ "license": "CC-BY-4.0" }, "node_modules/chart.js": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", - "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.6.1.tgz", + "integrity": "sha512-hJyniucsFmq//EvXYvJ6c6mahPoI3kaxdjVH8awTaJ/fDNWeSqqqArixMJWkWNN6fcYvPU3HneSANFNYtRi61g==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" @@ -2218,9 +2218,9 @@ } }, "node_modules/postcss": { - "version": "8.5.29", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.29.tgz", - "integrity": "sha512-49cGhUbXj8Qenv0iTMxA1cFBzxXoctpC9Ujd77t1WcbJIr6nF/eI7g/8MgxrYldFRuAXvja7xQRwavoW7kgrxQ==", + "version": "8.5.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.32.tgz", + "integrity": "sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g==", "dev": true, "funding": [ { @@ -2238,7 +2238,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.19", + "nanoid": "^3.3.20", "picocolors": "^1.1.1", "source-map-js": "^1.2.2" }, @@ -2247,15 +2247,16 @@ } }, "node_modules/preact": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-11.0.1.tgz", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-11.1.0.tgz", + "integrity": "sha512-hz1VsjWx5pSYPDVEzb9w+XyOmQpP1qW/ZEaMiYm+C8ykJr8KP+TKGZIbCW0QmZ/Yr/jg3XkZoziEWn9iWHZ9Mw==", "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" }, "peerDependencies": { - "preact-render-to-string": ">=5" + "preact-render-to-string": ">=6.7.0" }, "peerDependenciesMeta": { "preact-render-to-string": { @@ -2264,13 +2265,13 @@ } }, "node_modules/rolldown": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.13.tgz", - "integrity": "sha512-/5apOkwWxtACcQtZ5WlrAsKS4JwXVThQPJZ3RqIruRY9UG9M8e0VlXN068xum/JRKA4aIUoJ13ghe/kGCvidiQ==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.15.tgz", + "integrity": "sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.153.0", + "@oxc-project/types": "=0.155.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -2280,21 +2281,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.13", - "@rolldown/binding-android-arm64": "1.2.13", - "@rolldown/binding-darwin-arm64": "1.2.13", - "@rolldown/binding-darwin-x64": "1.2.13", - "@rolldown/binding-freebsd-x64": "1.2.13", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.13", - "@rolldown/binding-linux-arm64-gnu": "1.2.13", - "@rolldown/binding-linux-arm64-musl": "1.2.13", - "@rolldown/binding-linux-ppc64-gnu": "1.2.13", - "@rolldown/binding-linux-s390x-gnu": "1.2.13", - "@rolldown/binding-linux-x64-gnu": "1.2.13", - "@rolldown/binding-linux-x64-musl": "1.2.13", - "@rolldown/binding-openharmony-arm64": "1.2.13", - "@rolldown/binding-win32-arm64-msvc": "1.2.13", - "@rolldown/binding-win32-x64-msvc": "1.2.13" + "@rolldown/binding-android-arm-eabi": "1.2.15", + "@rolldown/binding-android-arm64": "1.2.15", + "@rolldown/binding-darwin-arm64": "1.2.15", + "@rolldown/binding-darwin-x64": "1.2.15", + "@rolldown/binding-freebsd-x64": "1.2.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.15", + "@rolldown/binding-linux-arm64-gnu": "1.2.15", + "@rolldown/binding-linux-arm64-musl": "1.2.15", + "@rolldown/binding-linux-ppc64-gnu": "1.2.15", + "@rolldown/binding-linux-s390x-gnu": "1.2.15", + "@rolldown/binding-linux-x64-gnu": "1.2.15", + "@rolldown/binding-linux-x64-musl": "1.2.15", + "@rolldown/binding-openharmony-arm64": "1.2.15", + "@rolldown/binding-win32-arm64-msvc": "1.2.15", + "@rolldown/binding-win32-x64-msvc": "1.2.15" } }, "node_modules/semver": { @@ -2467,16 +2468,16 @@ } }, "node_modules/vite": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.4.tgz", - "integrity": "sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.5.tgz", + "integrity": "sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", - "postcss": "^8.5.29", - "rolldown": "~1.2.12", + "postcss": "^8.5.30", + "rolldown": "~1.2.14", "tinyglobby": "^0.2.17" }, "bin": { @@ -2493,7 +2494,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.7.1", + "@vitejs/devtools": "^0.7.1 || ^0.8.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", diff --git a/luci-app-smartsafehub/frontend/package.json b/luci-app-smartsafehub/frontend/package.json index 7be743399..7664ced3c 100644 --- a/luci-app-smartsafehub/frontend/package.json +++ b/luci-app-smartsafehub/frontend/package.json @@ -1,7 +1,7 @@ { "name": "luci-app-smartsafehub-frontend", "private": true, - "version": "0.2.30", + "version": "0.2.31", "type": "module", "engines": { "node": ">=24.0" @@ -14,15 +14,15 @@ "preview": "vite preview --host 0.0.0.0" }, "dependencies": { - "chart.js": "4.5.1", - "preact": "11.0.1" + "chart.js": "4.6.1", + "preact": "11.1.0" }, "devDependencies": { "@preact/preset-vite": "2.10.6", "@tailwindcss/vite": "4.3.3", - "@types/node": "26.6.4", + "@types/node": "26.6.5", "tailwindcss": "4.3.3", "typescript": "7.0.2", - "vite": "8.3.4" + "vite": "8.3.5" } } diff --git a/luci-app-smartsafehub/frontend/src/api/rpc.ts b/luci-app-smartsafehub/frontend/src/api/rpc.ts index b9b44ce4b..5c57e3a06 100644 --- a/luci-app-smartsafehub/frontend/src/api/rpc.ts +++ b/luci-app-smartsafehub/frontend/src/api/rpc.ts @@ -4,6 +4,8 @@ import { } from '../auth/sessionEvents'; import type { SmartSafeHubBootstrap } from '../types/bootstrap'; import type { ApiResponse } from '../types/status'; +import { ensureRpcDiagnostics, recordRpcTiming } from './rpcDiagnostics'; +import { acquireRpcSlot, type RpcPriority } from './rpcScheduler'; const UBUS_STATUS_TEXT: Readonly> = { 1: '잘못된 명령입니다.', @@ -27,6 +29,8 @@ let requestId = 1; export interface RpcCallOptions { timeoutMs?: number; + signal?: AbortSignal; + priority?: RpcPriority; } export class RpcError extends Error { @@ -258,15 +262,25 @@ export async function callRpc( options: RpcCallOptions = {}, ): Promise { const bootstrap = getBootstrap(); + ensureRpcDiagnostics(); const startedAt = performance.now(); + let responseMs: number | null = null; + let decodeMs: number | null = null; + let resultCode = 'ok'; const id = requestId++; + // Cancellation while queued never occupies a network slot. Start the + // response timeout only after a slot is acquired, not while waiting. + let release: (() => void) | null = null; + let timeout: number | null = null; const controller = new AbortController(); - const timeout = window.setTimeout( - () => controller.abort(), - normalizedTimeout(options.timeoutMs), - ); + let cancelled = false; + const cancel = () => { cancelled = true; controller.abort(); }; + options.signal?.addEventListener('abort', cancel, { once: true }); try { + release = await acquireRpcSlot(options.priority ?? 'normal', options.signal); + if (cancelled || options.signal?.aborted) throw new RpcError('RPC_CANCELLED', '요청이 취소되었습니다.'); + timeout = window.setTimeout(() => controller.abort(), normalizedTimeout(options.timeoutMs)); const response = await fetch(bootstrap.rpcUrl, { method: 'POST', credentials: 'same-origin', @@ -281,6 +295,7 @@ export async function callRpc( }), signal: controller.signal, }); + responseMs = performance.now() - startedAt; if (!response.ok) { throw new RpcError( @@ -293,33 +308,52 @@ export async function callRpc( try { payload = await response.json(); + decodeMs = performance.now() - startedAt - (responseMs ?? 0); } catch { throw invalidResponse(); } return parseJsonRpcResponse(payload, id); } catch (error) { + if (cancelled || options.signal?.aborted) { + resultCode = 'RPC_CANCELLED'; + throw new RpcError('RPC_CANCELLED', '요청이 취소되었습니다.'); + } if (controller.signal.aborted) { + resultCode = 'RPC_TIMEOUT'; throw new RpcError( 'RPC_TIMEOUT', '장치 응답 시간이 초과되었습니다. 잠시 후 다시 시도해 주세요.', ); } + if (error instanceof DOMException && error.name === 'AbortError') { + resultCode = 'RPC_CANCELLED'; + throw new RpcError('RPC_CANCELLED', '요청이 취소되었습니다.'); + } if (error instanceof RpcError) { - throw await sessionExpiryError(error, bootstrap); + const resolved = await sessionExpiryError(error, bootstrap); + resultCode = resolved.code; + throw resolved; } + resultCode = 'NETWORK_ERROR'; throw new RpcError( 'NETWORK_ERROR', '공유기와 통신할 수 없습니다. 네트워크 연결을 확인해 주세요.', ); } finally { - window.clearTimeout(timeout); + if (timeout !== null) window.clearTimeout(timeout); + options.signal?.removeEventListener('abort', cancel); + release?.(); const elapsedMs = Math.round(performance.now() - startedAt); - // Development diagnostics only: never record parameters, tokens, or responses. - if (import.meta.env.DEV && elapsedMs >= 1000) { - console.warn(`[RPC slow] ${object}.${method}: ${elapsedMs}ms`); + const slow = recordRpcTiming({ + object, method, elapsedMs, responseMs, decodeMs, result: resultCode, + }); + // One concise warning only for a slow call or a timeout; full bounded + // timings are available in DevTools even on a production router. + if (slow || resultCode === 'RPC_TIMEOUT') { + console.warn(`[SmartSafeHub RPC] ${object}.${method}: ${elapsedMs}ms (${resultCode})`); } } } diff --git a/luci-app-smartsafehub/frontend/src/api/rpcDiagnostics.ts b/luci-app-smartsafehub/frontend/src/api/rpcDiagnostics.ts new file mode 100644 index 000000000..57700dc18 --- /dev/null +++ b/luci-app-smartsafehub/frontend/src/api/rpcDiagnostics.ts @@ -0,0 +1,112 @@ +// Browser-local, bounded RPC diagnostics. Never store URL, session, request +// arguments, headers, response data, or error messages. +export const RPC_SLOW_THRESHOLD_MS = 1_500; +const MAX_RECENT = 60; +const MAX_METHODS = 64; + +export interface RpcTiming { + object: string; + method: string; + elapsedMs: number; + responseMs: number | null; + decodeMs: number | null; + result: string; +} + +interface RpcEvent extends RpcTiming { + at: string; +} + +interface RpcSummary { + method: string; + calls: number; + slow: number; + errors: number; + lastMs: number; + maxMs: number; + averageMs: number; +} + +interface MutableSummary extends RpcSummary { totalMs: number } + +export interface RpcDiagnosticsSnapshot { + slowThresholdMs: number; + summary: RpcSummary[]; + recent: RpcEvent[]; +} + +export interface RpcDiagnosticsApi { + snapshot: () => RpcDiagnosticsSnapshot; + reset: () => void; +} + +declare global { + interface Window { + __SMARTHUB_RPC_DIAGNOSTICS__?: RpcDiagnosticsApi; + } +} + +const summaries = new Map(); +const recent: RpcEvent[] = []; + +function rounded(milliseconds: number | null): number | null { + return milliseconds === null ? null : Math.max(0, Math.round(milliseconds)); +} + +export function recordRpcTiming(timing: RpcTiming): boolean { + const method = `${timing.object}.${timing.method}`; + const elapsedMs = rounded(timing.elapsedMs) ?? 0; + const slow = elapsedMs >= RPC_SLOW_THRESHOLD_MS; + const failed = timing.result !== 'ok'; + let summary = summaries.get(method); + if (!summary && summaries.size < MAX_METHODS) { + summary = { method, calls: 0, slow: 0, errors: 0, lastMs: 0, maxMs: 0, averageMs: 0, totalMs: 0 }; + summaries.set(method, summary); + } + if (summary) { + summary.calls++; + summary.slow += Number(slow); + summary.errors += Number(failed); + summary.totalMs += elapsedMs; + summary.lastMs = elapsedMs; + summary.maxMs = Math.max(summary.maxMs, elapsedMs); + summary.averageMs = Math.round(summary.totalMs / summary.calls); + } + + if (slow || failed) { + recent.push({ + at: new Date().toISOString(), + object: timing.object, + method: timing.method, + elapsedMs, + responseMs: rounded(timing.responseMs), + decodeMs: rounded(timing.decodeMs), + result: timing.result, + }); + if (recent.length > MAX_RECENT) recent.shift(); + } + return slow; +} + +export function snapshotRpcDiagnostics(): RpcDiagnosticsSnapshot { + return { + slowThresholdMs: RPC_SLOW_THRESHOLD_MS, + summary: [...summaries.values()].map(({ totalMs: _totalMs, ...summary }) => ({ ...summary })), + recent: recent.map((entry) => ({ ...entry })), + }; +} + +export function resetRpcDiagnostics(): void { + summaries.clear(); + recent.length = 0; +} + +const diagnosticsApi: RpcDiagnosticsApi = { + snapshot: snapshotRpcDiagnostics, + reset: resetRpcDiagnostics, +}; + +export function ensureRpcDiagnostics(): void { + // Enable in production as well, without persistent storage or remote transfer. + window.__SMARTHUB_RPC_DIAGNOSTICS__ ??= diagnosticsApi; +} diff --git a/luci-app-smartsafehub/frontend/src/api/rpcScheduler.ts b/luci-app-smartsafehub/frontend/src/api/rpcScheduler.ts new file mode 100644 index 000000000..041ff0e95 --- /dev/null +++ b/luci-app-smartsafehub/frontend/src/api/rpcScheduler.ts @@ -0,0 +1,52 @@ +/** Shared bounded queue. Reserve one connection for user-triggered requests. */ +export type RpcPriority = 'high' | 'normal' | 'low'; +interface Waiter { + priority: RpcPriority; + start: (release: () => void) => void; + abort: () => void; +} +const MAX_RUNNING = 4; +const MAX_BACKGROUND = 3; +let running = 0; +let background = 0; +const queue: Waiter[] = []; + +function drain() { + while (running < MAX_RUNNING) { + const index = queue.findIndex((waiter) => waiter.priority !== 'low' || background < MAX_BACKGROUND); + if (index === -1) return; + const waiter = queue.splice(index, 1)[0]; + if (!waiter) continue; + running += 1; + if (waiter.priority === 'low') background += 1; + waiter.start(() => { + running -= 1; + if (waiter.priority === 'low') background -= 1; + drain(); + }); + } +} + +export function acquireRpcSlot(priority: RpcPriority, signal?: AbortSignal): Promise<() => void> { + if (signal?.aborted) return Promise.reject(new DOMException('Cancelled', 'AbortError')); + return new Promise((resolve, reject) => { + const waiter: Waiter = { + priority, + start: (release) => { signal?.removeEventListener('abort', waiter.abort); resolve(release); }, + abort: () => { + const index = queue.indexOf(waiter); + if (index !== -1) queue.splice(index, 1); + signal?.removeEventListener('abort', waiter.abort); + reject(new DOMException('Cancelled', 'AbortError')); + }, + }; + signal?.addEventListener('abort', waiter.abort, { once: true }); + // Preserve FIFO within priority while permitting interactive RPC ahead of polls. + const last = queue.findIndex((item) => + (priority === 'high' && item.priority !== 'high') || + (priority === 'normal' && item.priority === 'low')); + if (last === -1) queue.push(waiter); + else queue.splice(last, 0, waiter); + drain(); + }); +} diff --git a/luci-app-smartsafehub/frontend/src/api/safeshield.ts b/luci-app-smartsafehub/frontend/src/api/safeshield.ts index 8d8c512b7..71eead0b5 100644 --- a/luci-app-smartsafehub/frontend/src/api/safeshield.ts +++ b/luci-app-smartsafehub/frontend/src/api/safeshield.ts @@ -125,8 +125,9 @@ function apiError(response: Record): RpcError { async function callSafeShield( method: string, params: Record = {}, + signal?: AbortSignal, ): Promise { - const response = await callRpc(API_OBJECT, method, params); + const response = await callRpc(API_OBJECT, method, params, { ...(signal ? { signal } : {}), priority: signal ? 'low' : 'normal' }); const object = objectValue(response); if (object.ok === false) { @@ -455,8 +456,8 @@ export async function fetchSafeShieldStatus(): Promise { } } -async function fetchSafeShieldRuleConfig(): Promise { - const response = await callSafeShield('config'); +async function fetchSafeShieldRuleConfig(signal?: AbortSignal): Promise { + const response = await callSafeShield('config', {}, signal); return normalizeRuleConfig(response); } @@ -491,10 +492,10 @@ export async function requestSafeShieldRefresh(): Promise { +export async function fetchSafeShieldRules(signal?: AbortSignal): Promise { const [rulesResponse, config] = await Promise.all([ - callSafeShield('rules_list'), - fetchSafeShieldRuleConfig(), + callSafeShield('rules_list', {}, signal), + fetchSafeShieldRuleConfig(signal), ]); const allow = stringArray(rulesResponse.allow); const block = stringArray(rulesResponse.block); diff --git a/luci-app-smartsafehub/frontend/src/api/smartsafehub.ts b/luci-app-smartsafehub/frontend/src/api/smartsafehub.ts index dad5c86bf..dfb80d206 100644 --- a/luci-app-smartsafehub/frontend/src/api/smartsafehub.ts +++ b/luci-app-smartsafehub/frontend/src/api/smartsafehub.ts @@ -1,4 +1,5 @@ import type { ActivityHistory } from '../types/activity'; +import type { AppsCatalog, AppsInstallStatus, AppsMetrics, AppsOperationAccepted } from '../types/apps'; import type { ConfigurationBackupDiscardResult, ConfigurationBackupRestoreResult, @@ -87,30 +88,39 @@ export interface DeviceRegistrationStatus { pairingExpiresAt: string | null; nextSyncAt: number; lastSuccessAt: number; + operation?: BackgroundOperation; + pairingOperation?: BackgroundOperation; } -export function fetchRecommendedRulesStatus(): Promise { - return callApi(API_OBJECT, 'device_recommended_rules_status', {}, { timeoutMs: 5000 }); +export interface BackgroundOperation { + phase: 'idle' | 'starting' | 'running' | 'success' | 'failed'; + code: string; + argument: string; + updatedAt: number; +} + +export function fetchRecommendedRulesStatus(signal?: AbortSignal): Promise { + return callApi(API_OBJECT, 'device_recommended_rules_status', {}, { ...(signal ? { signal } : {}), priority: 'low', timeoutMs: 5000 }); } export function refreshRecommendedRulesStatus(): Promise { - return callApi(API_OBJECT, 'device_recommended_rules_refresh', {}, { timeoutMs: 30000 }); + return callApi(API_OBJECT, 'device_recommended_rules_refresh', {}, { priority: 'high', timeoutMs: 6000 }); } export function revokeRecommendedRule(ruleId: number): Promise { - return callApi(API_OBJECT, 'device_recommended_rules_revoke', { rule_id: ruleId }, { timeoutMs: 30000 }); + return callApi(API_OBJECT, 'device_recommended_rules_revoke', { rule_id: ruleId }, { priority: 'high', timeoutMs: 6000 }); } -export function fetchDeviceRegistrationStatus(): Promise { - return callApi(API_OBJECT, 'device_registration_status', {}, { timeoutMs: 5000 }); +export function fetchDeviceRegistrationStatus(signal?: AbortSignal): Promise { + return callApi(API_OBJECT, 'device_registration_status', {}, { ...(signal ? { signal } : {}), priority: 'low', timeoutMs: 5000 }); } export function refreshDeviceRegistrationStatus(): Promise { - return callApi(API_OBJECT, 'device_registration_refresh', {}, { timeoutMs: 30000 }); + return callApi(API_OBJECT, 'device_registration_refresh', {}, { priority: 'high', timeoutMs: 6000 }); } export function requestDevicePairingCode(): Promise { - return callApi(API_OBJECT, 'device_pairing_refresh', {}, { timeoutMs: 15000 }); + return callApi(API_OBJECT, 'device_pairing_refresh', {}, { priority: 'high', timeoutMs: 6000 }); } export function fetchHealthStatus(): Promise { @@ -125,6 +135,42 @@ export function updateHealthReporter(enabled: boolean): Promise { return callApi(API_OBJECT, 'health_reporter_update', { enabled }); } +export function fetchAppsCatalog(signal?: AbortSignal): Promise { + return callApi(API_OBJECT, 'apps_catalog', {}, { ...(signal ? { signal } : {}), priority: 'low', timeoutMs: 6000 }); +} + +export function refreshAppsCatalog(): Promise { + return callApi(API_OBJECT, 'apps_catalog', { refresh: true }, { priority: 'high', timeoutMs: 6000 }); +} + +export function fetchAppsStatus(signal?: AbortSignal): Promise { + return callApi(API_OBJECT, 'apps_status', {}, { ...(signal ? { signal } : {}), priority: 'low', timeoutMs: 6000 }); +} + +export function refreshAppsStatus(): Promise { + return callApi(API_OBJECT, 'apps_status', { refresh: true }, { priority: 'high', timeoutMs: 6000 }); +} + +export function fetchAppsMetrics(signal?: AbortSignal): Promise { + return callApi(API_OBJECT, 'apps_metrics', {}, { ...(signal ? { signal } : {}), priority: 'low', timeoutMs: 6000 }); +} + +export function refreshAppsMetrics(): Promise { + return callApi(API_OBJECT, 'apps_metrics', { refresh: true }, { priority: 'high', timeoutMs: 6000 }); +} + +export function installVerifiedApp(appId: string): Promise { + return callApi(API_OBJECT, 'apps_install', { app_id: appId }, { timeoutMs: 8000 }); +} + +export function updateVerifiedApp(appId: string): Promise { + return callApi(API_OBJECT, 'apps_update', { app_id: appId }, { timeoutMs: 8000 }); +} + +export function removeVerifiedApp(appId: string): Promise { + return callApi(API_OBJECT, 'apps_remove', { app_id: appId }, { timeoutMs: 8000 }); +} + export function fetchSoftwareUpdates(): Promise { return callApi(API_OBJECT, 'updates_status'); } diff --git a/luci-app-smartsafehub/frontend/src/app/App.tsx b/luci-app-smartsafehub/frontend/src/app/App.tsx index 2c3528e90..78ac85347 100644 --- a/luci-app-smartsafehub/frontend/src/app/App.tsx +++ b/luci-app-smartsafehub/frontend/src/app/App.tsx @@ -1,12 +1,14 @@ import type { ComponentChildren } from 'preact'; -import { useEffect } from 'preact/hooks'; +import { useEffect, useRef } from 'preact/hooks'; -import { fetchGuestWifiQr, fetchRecommendedRulesStatus, refreshRecommendedRulesStatus, +import { fetchAppsCatalog, fetchAppsStatus, fetchAppsMetrics, refreshAppsCatalog, refreshAppsStatus, refreshAppsMetrics, installVerifiedApp, updateVerifiedApp, removeVerifiedApp, fetchGuestWifiQr, fetchRecommendedRulesStatus, refreshRecommendedRulesStatus, revokeRecommendedRule, fetchWifiQr, initializeSystemTimezone } from '../api/smartsafehub'; import { AppShell } from '../components/AppShell'; import { PageTabs } from '../components/PageTabs'; import { useActivityHistory } from '../hooks/useActivityHistory'; +import { useAsyncResource } from '../hooks/useAsyncResource'; +import type { AppsCatalog, AppsInstallStatus, AppsMetrics } from '../types/apps'; import { useConfigurationBackup } from '../hooks/useConfigurationBackup'; import { useConnectedDevices } from '../hooks/useConnectedDevices'; import { useFirmwareUpdates } from '../hooks/useFirmwareUpdates'; @@ -29,6 +31,7 @@ import { useDeviceRegistration } from '../hooks/useDeviceRegistration'; import { useDashboardAccountStatus } from '../hooks/useDashboardAccountStatus'; import { useWifi } from '../hooks/useWifi'; import { ActivityPage } from '../pages/ActivityPage'; +import { AppsPage } from '../pages/AppsPage'; import { ConnectedDevicesPage } from '../pages/ConnectedDevicesPage'; import { HomePage } from '../pages/HomePage'; import { IptvPage } from '../pages/IptvPage'; @@ -51,6 +54,28 @@ export function App({ onAdministratorPasswordChanged }: AppProps) { const tabs = usePageTabs(); const configurationBackup = useConfigurationBackup(); const activity = useActivityHistory(route === 'activity'); + const apps = useAsyncResource({ + active: route === 'apps', + fallbackError: '검증된 앱 목록을 불러오지 못했습니다.', + loader: fetchAppsCatalog, + pollInterval: (data) => data?.refreshing ? 2_000 : !data?.ready ? (data?.refreshFailed ? 15_000 : 2_000) : 60_000, + staleTimeMs: 2_000, + }); + const appsStatus = useAsyncResource({ + active: route === 'apps', + fallbackError: '앱 설치 상태를 불러오지 못했습니다.', + loader: fetchAppsStatus, + pollInterval: (data) => !data?.ready || data?.refreshing ? 2_000 : data?.job.phase === 'running' || data?.job.phase === 'starting' || data?.restore?.phase === 'running' || data?.restore?.phase === 'starting' ? 3000 : 12000, + staleTimeMs: 3000, + }); + // Optional metrics never participate in the status/error guard for buttons. + const appsMetrics = useAsyncResource({ + active: route === 'apps', + fallbackError: '저장 공간 정보를 확인하지 못했습니다.', + loader: fetchAppsMetrics, + pollInterval: (data) => data?.refreshing || !data?.ready ? 3_000 : 60000, + staleTimeMs: 5000, + }); const status = useStatus(route === 'home' || route === 'settings'); const updates = useSoftwareUpdates(true); const firmware = useFirmwareUpdates(true); @@ -95,6 +120,23 @@ export function App({ onAdministratorPasswordChanged }: AppProps) { }); }, []); + // A completed install/remove invalidates both APK snapshots even if their + // background TTL has not elapsed. Never force them on every render/poll. + const appsJobId = appsStatus.data?.job.operationId; + const appsJobPhase = appsStatus.data?.job.phase; + const appsRestorePhase = appsStatus.data?.restore?.phase; + const previousAppsRefreshKey = useRef(''); + useEffect(() => { + if (route !== 'apps' || (appsJobPhase !== 'success' && appsRestorePhase !== 'success')) return; + const key = `${appsJobId ?? ''}:${appsJobPhase}:${appsRestorePhase ?? ''}`; + if (key === previousAppsRefreshKey.current) return; + previousAppsRefreshKey.current = key; + void Promise.allSettled([refreshAppsStatus(), refreshAppsMetrics()]).then(() => { + void appsStatus.refresh(); + void appsMetrics.refresh(); + }); + }, [route, appsJobId, appsJobPhase, appsRestorePhase]); + const safeshieldActions = useSafeShieldActions( safeshield.refresh, safeshieldStatistics.refresh, @@ -117,13 +159,44 @@ export function App({ onAdministratorPasswordChanged }: AppProps) { ? rules : route === 'account' ? deviceRegistration - : route === 'system' - ? updates - : status; + : route === 'apps' + ? apps + : route === 'system' + ? updates + : status; let content: ComponentChildren; switch (route) { + case 'apps': + content = ( + void refreshAppsCatalog().then(() => apps.refresh()).then(() => + Promise.all([appsStatus.refresh(), appsMetrics.refresh()])).catch(() => apps.refresh())} + installStatus={appsStatus.data?.ready === false ? null : appsStatus.data} + metrics={appsMetrics.data} + statusError={appsStatus.error ?? (appsStatus.data?.ready === false ? '설치 상태를 확인하고 있습니다.' : null)} + onRefreshStatus={() => void appsStatus.refresh()} + onInstall={async (id) => { + await installVerifiedApp(id); + await appsStatus.refresh(); + }} + onUpdate={async (id) => { + await updateVerifiedApp(id); + await appsStatus.refresh(); + }} + onRemove={async (id) => { + await removeVerifiedApp(id); + await appsStatus.refresh(); + }} + /> + ); + break; + case 'network': content = (

diff --git a/luci-app-smartsafehub/frontend/src/app/routes.ts b/luci-app-smartsafehub/frontend/src/app/routes.ts index 7496d3a48..524df6280 100644 --- a/luci-app-smartsafehub/frontend/src/app/routes.ts +++ b/luci-app-smartsafehub/frontend/src/app/routes.ts @@ -8,6 +8,7 @@ export type AppRoute = | 'safeshield' | 'rules' | 'account' + | 'apps' | 'system' | 'settings'; @@ -83,6 +84,13 @@ export const ROUTES: readonly RouteDefinition[] = [ title: 'SmartSafeHub 계정', description: '이 기기의 SmartSafeHub 계정 연결 상태와 구독 플랜을 확인합니다.', }, + { + route: 'apps', + hash: '#apps', + label: 'Apps', + title: 'SmartSafeHub Apps', + description: 'SmartSafeHub에서 검증한 앱과 확장 기능을 살펴봅니다.', + }, { route: 'system', hash: '#system', @@ -105,5 +113,5 @@ export const ROUTE_BY_NAME = Object.fromEntries( // Public demo exposes only these read-only, fixture-backed screens. export const DEMO_ROUTES: readonly AppRoute[] = [ - 'home', 'activity', 'network', 'wifi', 'devices', 'safeshield', 'rules', 'system', + 'home', 'activity', 'network', 'wifi', 'devices', 'safeshield', 'rules', 'account', 'apps', 'system', ]; diff --git a/luci-app-smartsafehub/frontend/src/components/AppsCategoryIcon.tsx b/luci-app-smartsafehub/frontend/src/components/AppsCategoryIcon.tsx new file mode 100644 index 000000000..63d66e771 --- /dev/null +++ b/luci-app-smartsafehub/frontend/src/components/AppsCategoryIcon.tsx @@ -0,0 +1,32 @@ +import { AppsIcon, CircleEllipsisIcon, GamepadIcon, HomeIcon, NetworkNodesIcon, ShieldIcon, WrenchIcon } from './Icons'; + +export type AppsCategory = 'all' | 'network' | 'security' | 'smart_home' | 'entertainment' | 'utilities' | 'other'; + +/** Normalize catalog categories once for both the filter and icon fallback. */ +export function appsCategoryOf(category: string): AppsCategory { + switch (category) { + case 'network': return 'network'; + case 'security': return 'security'; + case 'entertainment': return 'entertainment'; + case 'utilities': return 'utilities'; + case 'other': return 'other'; + case 'smart_home': + case 'iot': return 'smart_home'; + default: return 'other'; + } +} + +/** Local SVG icons: never fetch or execute artwork from a catalog entry. + * When verified per-app icons are supported, use these as the fallback. */ +export function AppsCategoryIcon({ category, class: className }: { category: AppsCategory; class?: string }) { + switch (category) { + case 'all': return ; + case 'network': return ; + case 'security': return ; + case 'smart_home': return ; + case 'entertainment': return ; + case 'utilities': return ; + case 'other': return ; + default: return ; + } +} diff --git a/luci-app-smartsafehub/frontend/src/components/AppsStorageCard.tsx b/luci-app-smartsafehub/frontend/src/components/AppsStorageCard.tsx new file mode 100644 index 000000000..c2d0bb120 --- /dev/null +++ b/luci-app-smartsafehub/frontend/src/components/AppsStorageCard.tsx @@ -0,0 +1,39 @@ +import type { AppsStorage } from '../types/apps'; +import { summarizeAppsStorage } from '../utils/appsStorage'; + +const RING_CIRCUMFERENCE = 2 * Math.PI * 39; + +export function AppsStorageCard({ storage }: { storage: AppsStorage | null | undefined }) { + const summary = summarizeAppsStorage(storage); + const availableArc = summary ? (summary.availableRatio * RING_CIRCUMFERENCE).toFixed(2) : '0'; + return ( + + ); +} diff --git a/luci-app-smartsafehub/frontend/src/components/Icons.tsx b/luci-app-smartsafehub/frontend/src/components/Icons.tsx index 39d100d7d..5e4084df6 100644 --- a/luci-app-smartsafehub/frontend/src/components/Icons.tsx +++ b/luci-app-smartsafehub/frontend/src/components/Icons.tsx @@ -69,6 +69,59 @@ export function UserIcon(props: IconProps) { ); } +/** App modules icon; distinct from firmware update and system settings. */ +export function AppsIcon(props: IconProps) { + return ( + + + + + + + ); +} + +/** Connected nodes for network-monitoring Apps. */ +export function NetworkNodesIcon(props: IconProps) { + return ( + + + + + + + ); +} + +/** Controller outline for games and entertainment Apps. */ +export function GamepadIcon(props: IconProps) { + return ( + + + + + ); +} + +/** Tools and utilities: a wrench is distinct from the power control. */ +export function WrenchIcon(props: IconProps) { + return ( + + + + ); +} + +/** Other/unknown Apps: a simple ellipsis, distinct from network nodes. */ +export function CircleEllipsisIcon(props: IconProps) { + return ( + + + + + ); +} + export function UpdateIcon(props: IconProps) { return ( diff --git a/luci-app-smartsafehub/frontend/src/components/ProductNavigation.tsx b/luci-app-smartsafehub/frontend/src/components/ProductNavigation.tsx index db38670d3..0f549917a 100644 --- a/luci-app-smartsafehub/frontend/src/components/ProductNavigation.tsx +++ b/luci-app-smartsafehub/frontend/src/components/ProductNavigation.tsx @@ -4,6 +4,7 @@ import { DEMO_ROUTES, ROUTE_BY_NAME } from '../app/routes'; import type { AppRoute } from '../app/routes'; import { luciAdminUrl } from '../utils/luci'; import { + AppsIcon, CloseIcon, ClockIcon, DevicesIcon, @@ -47,6 +48,7 @@ const NAVIGATION_GROUPS: readonly { { label: 'Overview', routes: ['home', 'activity'] }, { label: 'Network', routes: ['network', 'wifi', 'iptv', 'devices'] }, { label: 'Security', routes: ['safeshield', 'rules'] }, + { label: 'Explore', routes: ['apps'] }, { label: 'System', routes: ['account', 'system', 'settings'] }, ]; @@ -70,6 +72,8 @@ function NavigationIcon({ route }: { route: AppRoute }) { return ; case 'account': return ; + case 'apps': + return ; case 'system': return ; case 'settings': @@ -85,14 +89,25 @@ function themeActionLabel(theme: 'dark' | 'light'): string { return theme === 'dark' ? '라이트 모드' : '다크 모드'; } -function navigationClass(active: boolean, collapsed = false): string { - return `relative flex min-h-11 min-w-0 items-center rounded-xl py-2.5 text-sm font-extrabold no-underline transition ${ - collapsed ? 'justify-center px-2' : 'gap-3 px-3' - } ${ - active - ? 'bg-teal-50 text-teal-800 ring-1 ring-inset ring-teal-200' - : 'text-slate-600 hover:bg-slate-50 hover:text-slate-950' - }`; +function navigationClass(active: boolean, collapsed = false, routeName?: AppRoute): string { + const baseSpacing = collapsed ? 'justify-center px-2' : 'gap-3 px-3'; + if (active) { + return `relative flex min-h-11 min-w-0 items-center rounded-xl py-2.5 text-sm font-extrabold no-underline transition ${baseSpacing} bg-teal-50 text-teal-800 ring-1 ring-inset ring-teal-200`; + } + + if (routeName === 'apps') { + return `ssh-apps-nav-link relative flex min-h-11 min-w-0 items-center rounded-xl py-2.5 text-sm font-extrabold no-underline transition ${baseSpacing}`; + } + + return `relative flex min-h-11 min-w-0 items-center rounded-xl py-2.5 text-sm font-extrabold text-slate-600 no-underline transition ${baseSpacing} hover:bg-slate-50 hover:text-slate-950`; +} + +function navigationDescription(routeName: AppRoute): string | null { + if (routeName === 'apps') { + return '앱으로 확장하기'; + } + + return null; } function NavigationItems({ @@ -133,7 +148,7 @@ function NavigationItems({ aria-label={routeName === 'account' && accountRegistered === false ? `${item.label} (계정 연결 필요)` : collapsed ? item.label : undefined} - class={navigationClass(active, collapsed)} + class={navigationClass(active, collapsed, routeName)} href={item.hash} key={routeName} title={routeName === 'account' && accountRegistered === false @@ -149,7 +164,14 @@ function NavigationItems({ {collapsed ? null : ( - {item.label} + + {item.label} + {navigationDescription(routeName) ? ( + + {navigationDescription(routeName)} + + ) : null} + {routeName === 'iptv' ? ( Beta diff --git a/luci-app-smartsafehub/frontend/src/demo/data.ts b/luci-app-smartsafehub/frontend/src/demo/data.ts index 8c8d54150..8896bd029 100644 --- a/luci-app-smartsafehub/frontend/src/demo/data.ts +++ b/luci-app-smartsafehub/frontend/src/demo/data.ts @@ -10,10 +10,100 @@ import type { LanSettings } from '../types/lan'; import type { SafeShieldStatistics, SafeShieldStatus } from '../types/safeshield'; import type { SmartSafeHubStatus } from '../types/status'; import type { SoftwareUpdateStatus } from '../types/updates'; +import type { DeviceRegistrationStatus } from '../api/smartsafehub'; +import type { AppsCatalog, AppsInstallStatus, AppsMetrics } from '../types/apps'; const now = Math.floor(Date.now() / 1000); const hour = 3600; +// Demo-only account status: no user, device credential, pairing token or live Hub session. +export const demoAccount: DeviceRegistrationStatus = { + schema: 1, + component: 'device', + phase: 'registered', + lastResult: 'success', + lastErrorCode: null, + accountRegistered: true, + plan: 'free', + pairingCode: null, + pairingExpiresAt: null, + nextSyncAt: 0, + lastSuccessAt: now - 300, +}; + +// Demo-only catalog. No APK URLs or authenticated API responses are used. +export const demoApps: AppsCatalog = { + schema: 1, + deviceCode: 'iptime-ax3000sm', + firmwareBuildId: 'demo-build', + channel: 'stable', + apps: [ + { + id: 'retro-arcade', + name: '레트로 아케이드', + summary: '브라우저에서 레트로 게임을 즐기는 엔터테인먼트 앱입니다.', + description: '사용자가 직접 준비한 게임 파일로 즐기는 레트로 아케이드입니다.', + category: 'entertainment', + version: '1.1.0-r5', + webUi: { type: 'static', path: '/retro-arcade/' }, + }, + { + id: 'network-usage-monitor', + name: '네트워크 사용량 모니터', + summary: '기기별 네트워크 사용량과 통계를 확인하는 앱입니다.', + description: '네트워크 트래픽을 모니터링합니다.', + category: 'network', + version: '2025.06.02~29236be6-r1', + webUi: null, + }, + { + id: 'wake-on-lan', + name: 'Wake-on-LAN', + summary: '공유기에서 PC와 홈서버의 전원을 켤 수 있는 도구입니다.', + description: 'Wake-on-LAN 지원 컴퓨터를 네트워크에서 깨우는 앱입니다.', + category: 'utilities', + version: '26.288.56989~75a306d', + webUi: null, // Public demo must never link to an actual LuCI control page. + }, + ], +}; + +export const demoAppsStatus: AppsInstallStatus = { + job: { phase: 'idle', action: '', appId: '', code: 'NONE' }, + installed: { + 'retro-arcade': { + installed: true, + partial: false, + managed: true, + updateAvailable: true, + installedVersion: '1.0.0-r1', + webUiReady: true, + }, + 'network-usage-monitor': { + installed: true, + partial: false, + managed: true, + updateAvailable: false, + installedVersion: '2025.06.02~29236be6-r1', + webUiReady: false, + }, + 'wake-on-lan': { + installed: false, + partial: false, + managed: false, + updateAvailable: false, + installedVersion: null, + webUiReady: false, + }, + }, +}; + +export const demoAppsMetrics: AppsMetrics = { + storage: { mount: '/overlay', totalBytes: 256 * 1024 * 1024, availableBytes: 185 * 1024 * 1024 }, + // Installed APK metadata; neither app cache nor runtime data is included. + installedSizes: { 'retro-arcade': 1394688, 'network-usage-monitor': 117760 }, +}; + export const demoDevices: ConnectedDevicesSummary = { generatedAt: now, devices: [ @@ -37,7 +127,7 @@ export const demoActivity: ActivityHistory = { export const demoStatus: SmartSafeHubStatus = { device: { hostname: 'SmartRouter', model: 'ipTIME AX3000SM', boardName: 'iptime,ax3000sm' }, software: { distribution: 'OpenWrt', version: '25.12', revision: 'demo', kernel: '6.12' }, - runtime: { uptime: 86400, localtime: now, load: [0.08, 0.12, 0.05], memory: { total: 268435456, free: 83886080, shared: 4194304, buffered: 41943040, available: 171966464, cached: 41943040 } }, + runtime: { uptime: 86400, localtime: now, load: [0.08, 0.12, 0.05], memory: { total: 268435456, free: 83886080, shared: 4194304, buffered: 41943040, available: 171966464, cached: 41943040 }, storage: demoAppsMetrics.storage }, network: { available: true, up: true, protocol: 'dhcp', ipv4Address: '198.51.100.20' }, activityHistory: demoActivity, }; diff --git a/luci-app-smartsafehub/frontend/src/demo/main.tsx b/luci-app-smartsafehub/frontend/src/demo/main.tsx index ab024d8bf..47fd0578e 100644 --- a/luci-app-smartsafehub/frontend/src/demo/main.tsx +++ b/luci-app-smartsafehub/frontend/src/demo/main.tsx @@ -4,6 +4,8 @@ import { useEffect, useState } from 'preact/hooks'; import { AppShell } from '../components/AppShell'; import { DEMO_ROUTES } from '../app/routes'; import { ActivityPage } from '../pages/ActivityPage'; +import { AppsPage } from '../pages/AppsPage'; +import { SmartSafeHubAccountPage } from '../pages/SmartSafeHubAccountPage'; import { WanPage } from '../pages/WanPage'; import { LanPage } from '../pages/LanPage'; import { WifiPage } from '../pages/WifiPage'; @@ -19,6 +21,7 @@ import { demoActivity, demoDevices, demoFirmware, demoHealth, demoLan, demoSafeShield, demoStatistics, demoStatus, demoUpdates, demoWan, demoWifi, demoRules, demoWifiQr, demoGuestWifiQr, + demoAccount, demoApps, demoAppsStatus, demoAppsMetrics, } from './data'; import '../styles/app.css'; @@ -36,7 +39,7 @@ function DemoApp() { setNotice('해당 기능은 현재 데모에서 제공하지 않습니다.'); } }, [currentRoute]); - const readonlyNotice = () => setNotice('데모에서는 실제 공유기 설정을 변경할 수 없습니다.'); + const readonlyNotice = () => setNotice('체험 모드에서는 실제 계정 연결, 앱 설치·제거·실행 및 공유기 설정 변경을 수행하지 않습니다.'); const dismiss = () => setNotice(''); const reset = () => setNotice('예시 데이터가 표시되고 있습니다. 실제 공유기에는 연결되지 않습니다.'); @@ -54,6 +57,20 @@ function DemoApp() { let content; switch (route) { + case 'account': + content = { readonlyNotice(); return null; }} + onRetry={reset} />; + break; + case 'apps': + content = { readonlyNotice(); }} + onRemove={async () => { readonlyNotice(); }} + onUpdate={async () => { readonlyNotice(); }} />; + break; case 'activity': content = + -
-
+
+
메모리
-

{memoryPercent}%

-

- {memory ? formatBytes(memory.used) : '-'} /{' '} - {formatBytes(data.runtime.memory.total)} -

-
+
+

{memoryPercent}%

+

+ {memory ? formatBytes(memory.used) : '-'} /{' '} + {formatBytes(data.runtime.memory.total)} +

= 90 ? 'bg-amber-500' : 'bg-teal-600' - }`} - style={{ width: `${Math.min(100, memoryPercent)}%` }} - /> + aria-label={`메모리 사용률 ${memoryPercent}%`} + class="mt-3 h-1.5 overflow-hidden rounded-full bg-slate-200" + role="progressbar" + aria-valuemin={0} + aria-valuemax={100} + aria-valuenow={memoryPercent} + > +
= 90 ? 'bg-amber-500' : 'bg-teal-600' + }`} + style={{ width: `${Math.min(100, memoryPercent)}%` }} + /> +
-
+
+
+ + 디스크 +
+ +

+ {disk ? `${disk.availableText} 남음` : '저장 공간 확인 불가'} +

+ {disk ? ( +

+ 사용 {disk.usedText} / 전체 {disk.totalText} +

+ ) : null} +
+
시스템 부하
-

- {formatLoadAverage(data.runtime.load[0])} -

-

- 5분 {formatLoadAverage(data.runtime.load[1])} · 15분{' '} - {formatLoadAverage(data.runtime.load[2])} -

+
+

+ {formatLoadAverage(data.runtime.load[0])} +

+

+ 5분 {formatLoadAverage(data.runtime.load[1])} · 15분{' '} + {formatLoadAverage(data.runtime.load[2])} +

+
-
+
실행 시간
-

- {formatUptime(data.runtime.uptime)} -

-

- 부팅 {formatBootTime(data.runtime.localtime, data.runtime.uptime)} -

+
+

+ {formatUptime(data.runtime.uptime)} +

+

+ 부팅 {formatBootTime(data.runtime.localtime, data.runtime.uptime)} +

+
diff --git a/luci-app-smartsafehub/frontend/src/pages/SafeShieldRulesPage.tsx b/luci-app-smartsafehub/frontend/src/pages/SafeShieldRulesPage.tsx index e08a538ae..035f132e3 100644 --- a/luci-app-smartsafehub/frontend/src/pages/SafeShieldRulesPage.tsx +++ b/luci-app-smartsafehub/frontend/src/pages/SafeShieldRulesPage.tsx @@ -1,5 +1,6 @@ import { SectionHeading } from '../components/SectionHeading'; import type { TargetedEvent, TargetedSubmitEvent } from 'preact'; +import { memo } from 'preact/compat'; import { useCallback, useEffect, useMemo, useRef, useState } from 'preact/hooks'; import { RelativeTimestamp } from '../components/RelativeTimestamp'; @@ -16,6 +17,12 @@ import { import { ErrorPanel, LoadingPanel } from '../components/StatePanels'; import type { SafeShieldRulesAction } from '../hooks/useSafeShieldRules'; import type { RecommendedRuleAssignment, RecommendedRulesStatus, SafeShieldRuleAction, SafeShieldRules } from '../types/rules'; +import { filterRecommendedAssignments, filterRuleGroups, sameRecommendationContent } from '../utils/ruleLists'; + +// Stable fallbacks keep memoized rule cards from rebuilding while the first +// recommendation status request is still pending. +const EMPTY_RECOMMENDED_DOMAINS: string[] = []; +const EMPTY_RECOMMENDED_RULES: RecommendedRuleAssignment[] = []; interface SafeShieldRulesPageProps { action: SafeShieldRulesAction | null; @@ -53,7 +60,7 @@ interface RuleListCardProps { domain: string, ) => Promise; rules: string[]; - recommendedDomains: string[]; + recommendedDomainSet: ReadonlySet; recommendedKnown: boolean; recommendedRules: RecommendedRuleAssignment[]; onRequestRevoke?: (rule: RecommendedRuleAssignment) => void; @@ -81,13 +88,13 @@ function isValidDomain(value: string): boolean { ); } -function RuleListCard({ +const RuleListCard = memo(function RuleListCard({ action, kind, onAddRule, onDeleteRule, rules, - recommendedDomains, + recommendedDomainSet, recommendedKnown, recommendedRules, onRequestRevoke, @@ -102,22 +109,18 @@ function RuleListCard({ const [recommendedExpanded, setRecommendedExpanded] = useState(null); const isAllow = kind === 'allow'; const busy = action !== null; - const filteredRules = useMemo(() => { - const query = search.trim().toLowerCase(); - return query ? rules.filter((domain) => domain.includes(query)) : rules; - }, [rules, search]); - const searching = search.trim().length > 0; - // Reconciler-owned domains remain separate from user-managed manual entries. - const managedRules = isAllow && recommendedKnown - ? filteredRules.filter((domain) => recommendedDomains.includes(domain)) - : []; - const manualRules = isAllow && recommendedKnown - ? filteredRules.filter((domain) => !recommendedDomains.includes(domain)) - : filteredRules; - const visibleRecommendedRules = isAllow ? recommendedRules.filter((rule) => - !searching || rule.title.toLowerCase().includes(search.trim().toLowerCase()) || - rule.domains.some((domain) => domain.includes(search.trim().toLowerCase())) - ) : []; + const query = useMemo(() => search.trim().toLowerCase(), [search]); + const searching = query.length > 0; + // Filter and partition once per actual list/search/ownership change. Set + // membership avoids a quadratic scan across the recommended domains. + const { filteredRules, manualRules, managedRules } = useMemo( + () => filterRuleGroups(rules, query, isAllow && recommendedKnown, recommendedDomainSet), + [rules, query, isAllow, recommendedKnown, recommendedDomainSet], + ); + const visibleRecommendedRules = useMemo( + () => isAllow ? filterRecommendedAssignments(recommendedRules, query) : [], + [isAllow, recommendedRules, query], + ); const showRecommended = searching || (recommendedExpanded ?? (recommendedRules.length || managedRules.length) <= 3); const showManual = searching || manualExpanded; @@ -156,7 +159,7 @@ function RuleListCard({ function renderRule(domain: string) { // A manual entry that happens to match a cloud recommendation must // remain deletable. Only entries actually owned by the reconciler lock. - const cloudManaged = isAllow && recommendedKnown && recommendedDomains.includes(domain); + const cloudManaged = isAllow && recommendedKnown && recommendedDomainSet.has(domain); const ruleOrigin = !isAllow || recommendedKnown ? (cloudManaged ? '추천 규칙' : '직접 추가') : null; @@ -319,7 +322,7 @@ function RuleListCard({
); -} +}); export function SafeShieldRulesPage({ action, @@ -344,30 +347,54 @@ export function SafeShieldRulesPage({ const [revokeConfirmationDelayed, setRevokeConfirmationDelayed] = useState(false); const pendingRevokeId = useRef(null); const previousStatusSignature = useRef(null); + const lastConfirmedSignature = useRef(null); const onRetryRef = useRef(onRetry); onRetryRef.current = onRetry; const [syncMessage, setSyncMessage] = useState(null); const [syncError, setSyncError] = useState(null); - const recommendedDomains = recommendedStatus?.domains ?? []; - const recommendedRules = recommendedStatus?.rules ?? []; + const recommendedDomains = recommendedStatus?.domains ?? EMPTY_RECOMMENDED_DOMAINS; + const recommendedRules = recommendedStatus?.rules ?? EMPTY_RECOMMENDED_RULES; + const recommendedDomainSet = useMemo(() => new Set(recommendedDomains), [recommendedDomains]); // A revoke can reach Hub even if rpcd times out while SafeShield is applying // the new rules. Only a confirmed local read can settle its final outcome. // The local SafeShield list also needs a refresh when a background poll // observes a new recommendation revision, without reloading the whole page. - const acceptRecommendedStatus = useCallback((status: RecommendedRulesStatus): void => { - setRecommendedStatus(status); + const acceptRecommendedStatus = useCallback((status: RecommendedRulesStatus): boolean => { + setRecommendedStatus((previous) => { + if (!previous) return status; + // Poll responses are newly deserialized objects. Reuse unchanged list + // references so both memoized cards skip work on progress-only updates. + const { domains, rules } = sameRecommendationContent(previous, status); + return { ...status, domains, rules }; + }); setRecommendedKnown(true); - const signature = JSON.stringify([ - status.revision, status.domains, status.rules.map((rule) => rule.id), - status.syncStatus, - ]); - if (previousStatusSignature.current !== null && previousStatusSignature.current !== signature) { - onRetryRef.current(); + // Progress/status/metadata changes must not re-read the whole SafeShield + // rules list. After a completed reconcile, reload only once per actual + // recommendation revision/ownership change. The first pending -> confirmed + // transition also refreshes a list fetched while SafeShield was applying. + const signature = JSON.stringify([status.revision, status.domains]); + let reloaded = false; + if (status.syncStatus === 'confirmed' && lastConfirmedSignature.current !== signature) { + if (previousStatusSignature.current !== null) { + onRetryRef.current(); + reloaded = true; + } + lastConfirmedSignature.current = signature; } previousStatusSignature.current = signature; - if (status.syncStatus === 'confirmed' && pendingRevokeId.current === null) { + // A worker failure is not a successful revoke. Keep the previous rule + // visible and let the user retry instead of waiting indefinitely. + if (pendingRevokeId.current !== null && status.revokeOperation?.phase === 'failed' && + status.revokeOperation.argument === String(pendingRevokeId.current)) { + pendingRevokeId.current = null; + setRevokeConfirming(false); + setRevokeConfirmationDelayed(false); + setSyncError('추천 규칙 적용 해제를 완료하지 못했습니다. 연결 상태를 확인하고 다시 시도해 주세요.'); + } + if (status.syncStatus === 'confirmed' && pendingRevokeId.current === null && + status.revokeOperation?.phase !== 'failed') { setSyncError(null); } if ( @@ -381,6 +408,7 @@ export function SafeShieldRulesPage({ setSyncError(null); setSyncMessage('추천 규칙 적용 해제를 확인했습니다.'); } + return reloaded; }, []); useEffect(() => { @@ -415,7 +443,7 @@ export function SafeShieldRulesPage({ window.removeEventListener('focus', onFocus); document.removeEventListener('visibilitychange', onVisible); }; - }, [data?.allow.join('\n'), onLoadRecommendedRulesStatus, syncing, revokeBusy, acceptRecommendedStatus]); + }, [onLoadRecommendedRulesStatus, syncing, revokeBusy, acceptRecommendedStatus]); // An RPC timeout cannot prove whether Hub accepted the removal. After a // minute, explain the delay but continue watching for eventual confirmation. @@ -432,11 +460,13 @@ export function SafeShieldRulesPage({ setSyncMessage(null); try { const status = await onSyncRecommendedRules(); - acceptRecommendedStatus(status); + const reloaded = acceptRecommendedStatus(status); setSyncMessage(status.syncStatus === 'confirmed' ? '서버에서 규칙을 가져와 SafeShield 허용 목록을 확인했습니다.' : '추천 규칙 상태를 확인 중입니다. 진행 결과는 자동으로 갱신됩니다.'); - onRetry(); // Reload the actual SafeShield allow list after reconciliation. + // The user explicitly requested synchronization, so allow one manual + // refresh after confirmation but never queue a duplicate full RPC. + if (status.syncStatus === 'confirmed' && !reloaded) onRetry(); } catch { setSyncError('추천 규칙을 동기화하지 못했습니다. 서버 연결 및 기기 등록 상태를 확인해 주세요.'); } finally { @@ -460,7 +490,8 @@ export function SafeShieldRulesPage({ if (pendingRevokeId.current !== null) { setSyncMessage('적용 해제 요청을 처리했습니다. 공유기의 허용 목록을 확인하고 있습니다.'); } - onRetryRef.current(); + // A pending revoke is not yet a changed SafeShield rule list. The + // confirmed status poll refreshes once the local apply is complete. } catch { // Hub may have removed the assignment before the local SafeShield apply // timed out. Keep checking instead of permanently displaying a failure. @@ -677,7 +708,7 @@ export function SafeShieldRulesPage({ onAddRule={onAddRule} onDeleteRule={onDeleteRule} rules={data.allow} - recommendedDomains={recommendedDomains} + recommendedDomainSet={recommendedDomainSet} recommendedKnown={recommendedKnown} recommendedRules={recommendedRules} {...(onRevokeRecommendedRule ? { onRequestRevoke: setRevokeTarget } : {})} @@ -689,7 +720,7 @@ export function SafeShieldRulesPage({ onAddRule={onAddRule} onDeleteRule={onDeleteRule} rules={data.block} - recommendedDomains={recommendedDomains} + recommendedDomainSet={recommendedDomainSet} recommendedKnown={recommendedKnown} recommendedRules={recommendedRules} revokeBusy={revokeBusy} diff --git a/luci-app-smartsafehub/frontend/src/pages/SmartSafeHubAccountPage.tsx b/luci-app-smartsafehub/frontend/src/pages/SmartSafeHubAccountPage.tsx index 8fb41dad9..02d1099c0 100644 --- a/luci-app-smartsafehub/frontend/src/pages/SmartSafeHubAccountPage.tsx +++ b/luci-app-smartsafehub/frontend/src/pages/SmartSafeHubAccountPage.tsx @@ -80,6 +80,9 @@ interface SmartSafeHubAccountPageProps { syncError: string | null; onRequestPairing: () => Promise; onRetry: () => void; + /** Public router demo never navigates to a real device account console. */ + demo?: boolean; + onDemoAction?: () => void; } export function SmartSafeHubAccountPage({ @@ -91,6 +94,8 @@ export function SmartSafeHubAccountPage({ syncError, onRequestPairing, onRetry, + demo = false, + onDemoAction, }: SmartSafeHubAccountPageProps) { const [pairingError, setPairingError] = useState(null); const [pairingCopied, setPairingCopied] = useState(false); @@ -109,6 +114,8 @@ export function SmartSafeHubAccountPage({ const currentPlan = planLabel(status?.plan ?? null); const expired = status ? pairingExpired(status) : false; const pairingCode = !connected && !expired ? status?.pairingCode : null; + const issuingCode = pairingBusy || status?.pairingOperation?.phase === 'starting' || + status?.pairingOperation?.phase === 'running'; async function requestPairing(): Promise { setPairingError(null); @@ -154,14 +161,20 @@ export function SmartSafeHubAccountPage({

이 기기가 계정과 정상적으로 연결되어 있습니다. 연결 코드는 더 이상 필요하지 않습니다.

- - 웹사이트에서 기기 관리 - + {demo ? ( + + ) : ( + 웹사이트에서 기기 관리 + )}

웹사이트에서 기기 등록을 해제하면 공유기도 다음 계정 상태 동기화에서 자동으로 연결 해제를 반영합니다.

@@ -205,13 +218,16 @@ export function SmartSafeHubAccountPage({ + {status?.pairingOperation?.phase === 'failed' ? ( +

연결 코드 발급에 실패했습니다. 다시 시도해 주세요.

+ ) : null} {pairingError ?

{pairingError}

: null}
)} diff --git a/luci-app-smartsafehub/frontend/src/styles/app.css b/luci-app-smartsafehub/frontend/src/styles/app.css index b8ebf045f..3e134c661 100644 --- a/luci-app-smartsafehub/frontend/src/styles/app.css +++ b/luci-app-smartsafehub/frontend/src/styles/app.css @@ -259,6 +259,45 @@ } +/* Apps is an optional expansion area, not the current page by default. + * Avoid translucent *light* teal utilities on dark backgrounds: the 40% white + * mix makes an unselected Apps link look like a grey selected overlay. */ +.ssh-apps-nav-link:not([aria-current='page']) { + border: 1px solid #99f6e4; + background-color: #f0fdfa; + color: #115e59; +} + +.ssh-apps-nav-link:not([aria-current='page']):hover { + border-color: #5eead4; + background-color: #ccfbf1; +} + +.ssh-apps-nav-description { + color: #0f766e; +} + +.ssh-app[data-theme='dark'] .ssh-apps-nav-link:not([aria-current='page']) { + border-color: #134e4a; + background-color: rgb(20 184 166 / 0.09); + color: #e2e8f0; +} + +.ssh-app[data-theme='dark'] .ssh-apps-nav-link:not([aria-current='page']):hover { + border-color: #0f766e; + background-color: rgb(20 184 166 / 0.16); + color: #5eead4; +} + +.ssh-app[data-theme='dark'] .ssh-apps-nav-description { + color: #5eead4; +} + +.ssh-apps-nav-link:focus-visible { + outline: 2px solid #0d9488; + outline-offset: 2px; +} + .ssh-sidebar-toggle { border: 1px solid #e2e8f0; background: #ffffff; @@ -606,6 +645,7 @@ .ssh-app[data-theme='dark'] [class~='text-teal-700'], .ssh-app[data-theme='dark'] [class~='text-teal-800'], +.ssh-app[data-theme='dark'] [class~='text-teal-900'], .ssh-app[data-theme='dark'] [class~='text-teal-950'] { color: #5eead4; } @@ -757,6 +797,11 @@ background-color: #1e293b; } +/* Apps removal stays understated at rest; dark mode uses a muted red hover. */ +.ssh-app[data-theme='dark'] .hover\:bg-red-50:hover { + background-color: rgb(239 68 68 / 0.16); +} + .ssh-app[data-theme='dark'] .hover\:bg-rose-50:hover { background-color: rgb(244 63 94 / 0.18); } @@ -2275,3 +2320,71 @@ background-color: #fbbf24; --ssh-account-dot-ring: #0f172a; } + +/* Apps storage: a small SVG donut, without Chart.js or expensive redraws. */ +.ssh-apps-storage-track, +.ssh-apps-storage-free { + fill: none; + stroke-width: 9; +} + +.ssh-apps-storage-track { stroke: #e2e8f0; } +.ssh-apps-storage-free { + stroke: #0d9488; + transform: rotate(-90deg); + transform-origin: 50% 50%; +} +.ssh-apps-storage-ring[data-level='warning'] .ssh-apps-storage-free { stroke: #d97706; } +.ssh-apps-storage-ring[data-level='critical'] .ssh-apps-storage-free { stroke: #e11d48; } +.ssh-app[data-theme='dark'] .ssh-apps-storage-track { stroke: #334155; } +.ssh-app[data-theme='dark'] .ssh-apps-storage-free { stroke: #2dd4bf; } +.ssh-app[data-theme='dark'] .ssh-apps-storage-ring[data-level='warning'] .ssh-apps-storage-free { stroke: #fbbf24; } +.ssh-app[data-theme='dark'] .ssh-apps-storage-ring[data-level='critical'] .ssh-apps-storage-free { stroke: #fb7185; } + +/* Identical low-space warnings in Apps and Dashboard, including the capacity label. */ +.ssh-apps-storage-card[data-level='warning'] .ssh-apps-storage-available, +.ssh-dashboard-storage-card[data-level='warning'] .ssh-apps-storage-available { color: #b45309; } +.ssh-apps-storage-card[data-level='critical'] .ssh-apps-storage-available, +.ssh-dashboard-storage-card[data-level='critical'] .ssh-apps-storage-available { color: #be123c; } +.ssh-app[data-theme='dark'] .ssh-apps-storage-card[data-level='warning'] .ssh-apps-storage-available, +.ssh-app[data-theme='dark'] .ssh-dashboard-storage-card[data-level='warning'] .ssh-apps-storage-available { color: #fbbf24; } +.ssh-app[data-theme='dark'] .ssh-apps-storage-card[data-level='critical'] .ssh-apps-storage-available, +.ssh-app[data-theme='dark'] .ssh-dashboard-storage-card[data-level='critical'] .ssh-apps-storage-available { color: #fb7185; } + +/* Apps cards: installed is a quiet state, updates are an amber action. */ +.ssh-apps-installed-badge { + border-color: #cbd5e1; + background: #f1f5f9; + color: #475569; +} +.ssh-apps-update-badge { + border-color: #fcd34d; + background: #fffbeb; + color: #92400e; +} +.ssh-apps-update-button { + border-color: #d97706; + background: #d97706; + color: #fff; +} +.ssh-apps-update-button:hover:not(:disabled) { background: #b45309; border-color: #b45309; } +.ssh-apps-update-button:focus-visible { outline: 2px solid #d97706; outline-offset: 2px; } +.ssh-app[data-theme='dark'] .ssh-apps-installed-badge { + border-color: #475569; + background: #1e293b; + color: #cbd5e1; +} +.ssh-app[data-theme='dark'] .ssh-apps-update-badge { + border-color: #92400e; + background: #451a03; + color: #fcd34d; +} +.ssh-app[data-theme='dark'] .ssh-apps-update-button { + border-color: #b45309; + background: #b45309; + color: #fff; +} +.ssh-app[data-theme='dark'] .ssh-apps-update-button:hover:not(:disabled) { + background: #d97706; + border-color: #d97706; +} diff --git a/luci-app-smartsafehub/frontend/src/types/apps.ts b/luci-app-smartsafehub/frontend/src/types/apps.ts new file mode 100644 index 000000000..6e3408864 --- /dev/null +++ b/luci-app-smartsafehub/frontend/src/types/apps.ts @@ -0,0 +1,74 @@ +/** Read-only SmartSafeHub Apps catalog schema 1 from the local router. */ +export interface VerifiedApp { + id: string; + name: string; + summary: string; + description: string; + category: string; + version: string; + /** Approved same-origin LuCI page or first-party static app; never a remote URL. */ + webUi?: { type: 'luci' | 'static'; path: string } | null; +} + +export interface AppsCatalog { + schema: 1; + deviceCode: string; + firmwareBuildId: string; + channel: string; + apps: VerifiedApp[]; + /** False until the first immutable, firmware-matched snapshot is available. */ + ready?: boolean; + refreshing?: boolean; + refreshFailed?: boolean; +} + +/** Writable filesystem used for installing APKs (not RAM or squashfs). */ +export interface AppsStorage { + mount: '/overlay' | '/'; + totalBytes: number; + availableBytes: number; +} + +/** Optional metrics, independent from installation and removal state. */ +export interface AppsMetrics { + storage: AppsStorage | null; + installedSizes: Record; + ready?: boolean; + refreshing?: boolean; +} + +/** Local APK adapter state, independent from the future IoT / AI runtimes. */ +export interface AppsInstallStatus { + job: { + phase: 'idle' | 'starting' | 'running' | 'success' | 'failed'; + action: 'install' | 'update' | 'remove' | ''; + appId: string; + code: string; + operationId?: string; + }; + restore?: { + phase: 'idle' | 'starting' | 'running' | 'success' | 'failed'; + appId: string; + code: string; + }; + ready?: boolean; + refreshing?: boolean; + refreshFailed?: boolean; + installed: Record; +} + +export interface AppsOperationAccepted { + accepted: boolean; + appId: string; + action: 'install' | 'update' | 'remove'; +} diff --git a/luci-app-smartsafehub/frontend/src/types/rules.ts b/luci-app-smartsafehub/frontend/src/types/rules.ts index 142bde6da..aa94fb40e 100644 --- a/luci-app-smartsafehub/frontend/src/types/rules.ts +++ b/luci-app-smartsafehub/frontend/src/types/rules.ts @@ -57,4 +57,6 @@ export interface RecommendedRulesStatus { lastDeviceSyncAt: number; nextDeviceSyncAt: number; accountRegistered: boolean; + operation?: { phase: string; code: string; updatedAt: number }; + revokeOperation?: { phase: string; code: string; argument: string; updatedAt: number }; } diff --git a/luci-app-smartsafehub/frontend/src/types/status.ts b/luci-app-smartsafehub/frontend/src/types/status.ts index 70a626b55..a4d64fb14 100644 --- a/luci-app-smartsafehub/frontend/src/types/status.ts +++ b/luci-app-smartsafehub/frontend/src/types/status.ts @@ -1,4 +1,5 @@ import type { ActivityHistory } from './activity'; +import type { AppsStorage } from './apps'; export interface DeviceStatus { hostname: string; model: string; @@ -26,6 +27,8 @@ export interface RuntimeStatus { localtime: number; load: [number, number, number]; memory: RuntimeMemory; + /** Writable root, using the same units and definition as Apps. Missing on older firmware. */ + storage?: AppsStorage | null; } export interface NetworkStatus { diff --git a/luci-app-smartsafehub/frontend/src/utils/appsJobNotice.ts b/luci-app-smartsafehub/frontend/src/utils/appsJobNotice.ts new file mode 100644 index 000000000..253fa8762 --- /dev/null +++ b/luci-app-smartsafehub/frontend/src/utils/appsJobNotice.ts @@ -0,0 +1,32 @@ +import type { AppsInstallStatus } from '../types/apps'; + +const STORAGE_KEY = 'smartsafehub:apps:dismissed-operation:v1'; + +type AppsJob = AppsInstallStatus['job']; + +/** A job ID is preserved through running/success/failure on the router. */ +export function appsJobNoticeKey(job: AppsJob | null | undefined): string { + if (!job || job.phase === 'idle') return ''; + // Backwards compatibility while router frontend and RPC versions differ. + return job.operationId + ? `operation:${job.operationId}` + : `legacy:${job.phase}:${job.action}:${job.appId}:${job.code}`; +} + +/** Browser storage is optional (private browsing or hardened browsers). */ +export function readDismissedAppsJob(): string | null { + try { + return typeof window === 'undefined' ? null : window.localStorage.getItem(STORAGE_KEY); + } catch { + return null; + } +} + +export function saveDismissedAppsJob(key: string): void { + if (!key) return; + try { + if (typeof window !== 'undefined') window.localStorage.setItem(STORAGE_KEY, key); + } catch { + // In-memory dismissal remains usable if storage is blocked. + } +} diff --git a/luci-app-smartsafehub/frontend/src/utils/appsStorage.ts b/luci-app-smartsafehub/frontend/src/utils/appsStorage.ts new file mode 100644 index 000000000..b07c9661b --- /dev/null +++ b/luci-app-smartsafehub/frontend/src/utils/appsStorage.ts @@ -0,0 +1,37 @@ +import type { AppsStorage } from '../types/apps'; + +export interface StorageSummary { + availablePercent: number; + availableRatio: number; + availableText: string; + usedText: string; + totalText: string; + level: 'normal' | 'warning' | 'critical'; +} + +/** Base-2 units match the BusyBox df -h figures used on OpenWrt. */ +export function formatStorageBytes(bytes: number): string { + if (!Number.isFinite(bytes) || bytes < 0) return '—'; + if (bytes < 1024) return `${Math.round(bytes)} B`; + if (bytes < 1024 ** 2) return `${(bytes / 1024).toFixed(1)} KB`; + if (bytes < 1024 ** 3) return `${(bytes / (1024 ** 2)).toFixed(1)} MB`; + return `${(bytes / (1024 ** 3)).toFixed(1)} GB`; +} + +/** Reserved blocks count as unavailable, not as space for APK installation. */ +export function summarizeAppsStorage(storage: AppsStorage | null | undefined): StorageSummary | null { + if (!storage || !Number.isSafeInteger(storage.totalBytes) || + !Number.isSafeInteger(storage.availableBytes) || storage.totalBytes <= 0 || + storage.availableBytes < 0 || storage.availableBytes > storage.totalBytes || + (storage.mount !== '/overlay' && storage.mount !== '/')) return null; + const availableRatio = storage.availableBytes / storage.totalBytes; + return { + availablePercent: Math.round(availableRatio * 100), + availableRatio, + availableText: formatStorageBytes(storage.availableBytes), + // Includes filesystem-reserved space, not only files written by apps. + usedText: formatStorageBytes(storage.totalBytes - storage.availableBytes), + totalText: formatStorageBytes(storage.totalBytes), + level: availableRatio <= 0.1 ? 'critical' : availableRatio <= 0.2 ? 'warning' : 'normal', + }; +} diff --git a/luci-app-smartsafehub/frontend/src/utils/appsWebUi.ts b/luci-app-smartsafehub/frontend/src/utils/appsWebUi.ts new file mode 100644 index 000000000..f78432306 --- /dev/null +++ b/luci-app-smartsafehub/frontend/src/utils/appsWebUi.ts @@ -0,0 +1,7 @@ +/** Only approved same-origin LuCI pages or the first-party Retro Arcade entry point. */ +export function approvedAppPath(webUi: { type: string; path: string } | null | undefined): string | null { + if (!webUi || typeof webUi.path !== 'string' || webUi.path.length > 160) return null; + if (webUi.type === 'static') return webUi.path === '/retro-arcade/' ? webUi.path : null; + if (webUi.type !== 'luci') return null; + return /^\/cgi-bin\/luci\/admin\/[a-z0-9_-]+(?:\/[a-z0-9_-]+)*$/.test(webUi.path) ? webUi.path : null; +} diff --git a/luci-app-smartsafehub/frontend/src/utils/errors.ts b/luci-app-smartsafehub/frontend/src/utils/errors.ts index 44d25bd17..3e3c75bb1 100644 --- a/luci-app-smartsafehub/frontend/src/utils/errors.ts +++ b/luci-app-smartsafehub/frontend/src/utils/errors.ts @@ -1,7 +1,5 @@ -import { RpcError } from '../api/rpc'; - export function errorMessage(error: unknown, fallback: string): string { - return error instanceof RpcError || error instanceof Error + return error instanceof Error ? error.message : fallback; } diff --git a/luci-app-smartsafehub/frontend/src/utils/ruleLists.ts b/luci-app-smartsafehub/frontend/src/utils/ruleLists.ts new file mode 100644 index 000000000..71da3196f --- /dev/null +++ b/luci-app-smartsafehub/frontend/src/utils/ruleLists.ts @@ -0,0 +1,56 @@ +import type { RecommendedRuleAssignment, RecommendedRulesStatus } from '../types/rules'; + +export function filterRuleGroups( + rules: readonly string[], + query: string, + splitOwnership: boolean, + recommendedDomainSet: ReadonlySet, +): { filteredRules: readonly string[]; manualRules: readonly string[]; managedRules: readonly string[] } { + const filteredRules = query ? rules.filter((domain) => domain.includes(query)) : rules; + if (!splitOwnership) return { filteredRules, manualRules: filteredRules, managedRules: [] }; + + const manualRules: string[] = []; + const managedRules: string[] = []; + for (const domain of filteredRules) { + (recommendedDomainSet.has(domain) ? managedRules : manualRules).push(domain); + } + return { filteredRules, manualRules, managedRules }; +} + +export function filterRecommendedAssignments( + rules: readonly RecommendedRuleAssignment[], + query: string, +): readonly RecommendedRuleAssignment[] { + if (!query) return rules; + return rules.filter((rule) => + rule.title.toLowerCase().includes(query) || + rule.domains.some((domain) => domain.includes(query)), + ); +} + +function sameStrings(left: readonly string[], right: readonly string[]): boolean { + return left === right || (left.length === right.length && left.every((value, index) => value === right[index])); +} + +function sameAssignments( + left: readonly RecommendedRuleAssignment[], + right: readonly RecommendedRuleAssignment[], +): boolean { + return left === right || (left.length === right.length && left.every((rule, index) => { + const other = right[index]; + return other !== undefined && rule.id === other.id && rule.title === other.title && + sameStrings(rule.domains, other.domains); + })); +} + +// Preserve only the arrays that feed the expensive rule cards. Other status +// fields (including stage and timestamps) must always be allowed to update. +export function sameRecommendationContent( + previous: RecommendedRulesStatus, + next: RecommendedRulesStatus, +): Pick { + return { + domains: sameStrings(previous.domains, next.domains) ? previous.domains : next.domains, + rules: sameAssignments(previous.rules, next.rules) ? previous.rules : next.rules, + }; +} diff --git a/luci-app-smartsafehub/root/etc/hotplug.d/iface/98-smartsafehub-apps-restore b/luci-app-smartsafehub/root/etc/hotplug.d/iface/98-smartsafehub-apps-restore new file mode 100755 index 000000000..261c92351 --- /dev/null +++ b/luci-app-smartsafehub/root/etc/hotplug.d/iface/98-smartsafehub-apps-restore @@ -0,0 +1,16 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-or-later +# Resume a bounded restore after a late WAN reconnection, not on LAN churn. +[ "${ACTION:-}" = ifup ] || exit 0 +case "${INTERFACE:-}" in wan|wan6) ;; *) exit 0;; esac +[ -d /etc/smartsafehub/apps-installed ] || exit 0 +# A live restore already retries transient connectivity failures. +[ ! -d /tmp/smartsafehub/apps-restore.lock ] || exit 0 +[ -r /tmp/smartsafehub/apps-restore.state ] || exit 0 +# Never auto-repeat compatibility, integrity, or signing failures. +grep -Eq '^code[[:space:]]+(E21|E25|E31|E35|BUSY)$' \ + /tmp/smartsafehub/apps-restore.state || exit 0 +# Network retries run a finite worker, never launch another service. +RUNNER=/usr/libexec/smartsafehub-apps-restore +[ -x "$RUNNER" ] || exit 0 +"$RUNNER" run /dev/null 2>&1 & diff --git a/luci-app-smartsafehub/root/lib/upgrade/keep.d/smartsafehub-apps b/luci-app-smartsafehub/root/lib/upgrade/keep.d/smartsafehub-apps new file mode 100644 index 000000000..61b6914ca --- /dev/null +++ b/luci-app-smartsafehub/root/lib/upgrade/keep.d/smartsafehub-apps @@ -0,0 +1,2 @@ +/etc/smartsafehub/apps-installed/ +/etc/smartsafehub/apps-metrics-pending/ diff --git a/luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps new file mode 100755 index 000000000..ebcccace2 --- /dev/null +++ b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps @@ -0,0 +1,49 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-or-later +# Read-only, firmware-pinned SmartSafeHub Apps catalog fetch. +set -eu + +RUNTIME_DIR="${SMARTSAFEHUB_APPS_RUNTIME_DIR:-/tmp/smartsafehub}" +ROM_METADATA="${SMARTSAFEHUB_APPS_ROM_METADATA:-/rom/usr/share/smartsafehub/firmware.json}" +FIRMWARE_METADATA="${SMARTSAFEHUB_APPS_METADATA:-/usr/share/smartsafehub/firmware.json}" +JSONFILTER="${SMARTSAFEHUB_APPS_JSONFILTER_BIN:-jsonfilter}" +UCLIENT="${SMARTSAFEHUB_APPS_UCLIENT_BIN:-uclient-fetch}" +CATALOG_URL='https://www.smartsafehub.com/api/v1/app-store/catalog' + +json_field() { "$JSONFILTER" -i "$1" -e "$2" 2>/dev/null | head -n 1; } + +# The ROM image is authoritative when available. Do not accept a device code, +# build ID or catalog URL from RPC/browser input (or from an untrusted feed). +metadata="$ROM_METADATA" +[ -s "$metadata" ] || metadata="$FIRMWARE_METADATA" +[ -s "$metadata" ] || exit 2 + +device_code="$(json_field "$metadata" '@.device_code')" +build_id="$(json_field "$metadata" '@.build_id')" +channel="$(json_field "$metadata" '@.channel')" +case "$device_code" in + iptime-ax3000sm|iptime-ax3000se|iptime-a3004t|gl-mt300n-v2|xiaomi-ax3000t) ;; + *) exit 2 ;; +esac +case "$build_id" in + ''|[!a-zA-Z0-9]*|*[!a-zA-Z0-9._-]*) exit 2 ;; +esac +[ "${#build_id}" -le 64 ] || exit 2 +case "$channel" in stable|beta) ;; *) channel=stable ;; esac + +mkdir -p "$RUNTIME_DIR" || exit 1 +umask 077 +tmp="$(mktemp "$RUNTIME_DIR/apps-catalog.XXXXXXXX")" || exit 1 +trap 'rm -f "$tmp"' EXIT HUP INT TERM +url="$CATALOG_URL?schema=1&device_code=$device_code&firmware_build_id=$build_id&channel=$channel" +"$UCLIENT" -q -T 8 -O "$tmp" "$url" >/dev/null 2>&1 || exit 1 +bytes="$(wc -c < "$tmp" | tr -d ' ')" +[ "$bytes" -gt 1 ] && [ "$bytes" -le 131072 ] || exit 1 +[ "$(json_field "$tmp" '@.schema')" = 1 ] || exit 1 +[ "$(json_field "$tmp" '@.device_code')" = "$device_code" ] || exit 1 +[ "$(json_field "$tmp" '@.firmware_build_id')" = "$build_id" ] || exit 1 +[ "$(json_field "$tmp" '@.channel')" = "$channel" ] || exit 1 +# Atomically replace the previous (display-only) snapshot. If the network is +# unavailable, rpcd rejects this invocation; no stale approval is returned. +mv -f "$tmp" "$RUNTIME_DIR/apps-catalog.json" +exit 0 diff --git a/luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps-manager b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps-manager new file mode 100755 index 000000000..3e6f7b0d5 --- /dev/null +++ b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps-manager @@ -0,0 +1,776 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-or-later +# Privileged, opt-in APK adapter for SmartSafeHub Apps fixed-release protocol. +# No caller-supplied package, URL, shell command or repository is accepted. +set -eu + +SELF="${SMARTSAFEHUB_APPS_MANAGER_BIN:-/usr/libexec/smartsafehub-apps-manager}" +CATALOG_HELPER="${SMARTSAFEHUB_APPS_HELPER_BIN:-/usr/libexec/smartsafehub-apps}" +RUNTIME="${SMARTSAFEHUB_APPS_RUNTIME_DIR:-/tmp/smartsafehub}" +OWNED="${SMARTSAFEHUB_APPS_OWNED_DIR:-/etc/smartsafehub/apps-installed}" +# Fixed first-party host. Only the Hub-approved channel/architecture determine +# the repository path; callers cannot submit a repository URL. +REPO_BASE="${SMARTSAFEHUB_APPS_REPO_BASE:-https://repo.smartsafehub.com}" +UCLIENT="${SMARTSAFEHUB_APPS_UCLIENT_BIN:-uclient-fetch}" +OVERLAY="${SMARTSAFEHUB_APPS_OVERLAY_PATH:-/overlay}" +# OpenWrt uses /proc/meminfo; tests on non-Linux hosts supply a fixture. +MEMINFO="${SMARTSAFEHUB_APPS_MEMINFO_PATH:-/proc/meminfo}" +JSONFILTER="${SMARTSAFEHUB_APPS_JSONFILTER_BIN:-jsonfilter}" +APK="${SMARTSAFEHUB_APPS_APK_BIN:-apk}" +ARCH_FILE="${SMARTSAFEHUB_APPS_ARCH_FILE:-/etc/apk/arch}" +SHA256="${SMARTSAFEHUB_APPS_SHA256_BIN:-sha256sum}" +DAEMON="${SMARTSAFEHUB_APPS_DAEMON_BIN:-start-stop-daemon}" +METRICS="${SMARTSAFEHUB_APPS_METRICS_BIN:-/usr/libexec/smartsafehub-apps-metrics}" +LUCI_INDEX_CACHE="${SMARTSAFEHUB_APPS_LUCI_INDEX_CACHE:-/tmp/luci-indexcache}" +LOCK="$RUNTIME/apps-operation.lock" +STATE="$RUNTIME/apps-operation.state" +CATALOG="$RUNTIME/apps-catalog.json" + +field() { "$JSONFILTER" -i "$1" -e "$2" 2>/dev/null | head -n 1; } +# A wildcard expression returns multiple app IDs. Scalar fields above must +# remain single-valued, but catalog iteration must not truncate the results. +catalog_ids() { "$JSONFILTER" -i "$CATALOG" -e '@.apps[*].id' 2>/dev/null; } +valid_id() { case "$1" in ''|*[!a-z0-9-]*|-*|*-) return 1;; esac; [ "${#1}" -le 80 ]; } +valid_package() { + case "$1" in ''|*[!a-zA-Z0-9_.+-]*|[-.+]*|*[-.+]) return 1;; esac + [ "${#1}" -le 100 ] +} +valid_version() { + case "$1" in ''|*[!a-zA-Z0-9._+~-]*|[-.+~]*|*[-.+~]) return 1;; esac + [ "${#1}" -le 100 ] +} +valid_sha() { + case "$1" in *[!a-f0-9]*|'') return 1;; esac + [ "${#1}" -eq 64 ] +} +protected_package() { + case "$1" in + base-files|busybox|apk|procd|netifd|dnsmasq*|firewall*|odhcp*|dropbear|ubus*|rpcd*|uhttpd*|safeshield*|luci-app-smartsafehub|kernel|kmod-*) return 0;; + esac + return 1 +} +write_state() { + phase="$1"; action="$2"; app="$3"; code="$4"; operation_id="$5"; source="${6:-user}" + tmp="$(mktemp "$RUNTIME/apps-state.XXXXXXXX")" || return 1 + printf 'phase\t%s\naction\t%s\napp_id\t%s\ncode\t%s\noperation_id\t%s\nsource\t%s\n' "$phase" "$action" "$app" "$code" "$operation_id" "$source" > "$tmp" + mv -f "$tmp" "$STATE" +} +# Persist *ownership*, not merely an installed flag, so removal never deletes +# unrelated packages installed through LuCI, ssh or another app. +owned_manifest() { printf '%s/%s' "$OWNED" "$1"; } + +# Dump only simple validated package pins. Indexed JSON filter expressions are +# created exclusively from a numeric index resolved from the approved catalog. +app_index() { + id="$1"; n=0 + for candidate in $(catalog_ids); do + if [ "$candidate" = "$id" ]; then printf '%s\n' "$n"; return 0; fi + n=$((n + 1)) + [ "$n" -le 100 ] || break + done + return 1 +} +extract_pins() { + index="$1"; out="$2" + : > "$out"; n=0 + while :; do + name="$(field "$CATALOG" "@.apps[$index].packages[$n].name")" + [ -n "$name" ] || break + version="$(field "$CATALOG" "@.apps[$index].packages[$n].version")" + hash="$(field "$CATALOG" "@.apps[$index].packages[$n].sha256")" + valid_package "$name" && valid_version "$version" && valid_sha "$hash" || return 1 + protected_package "$name" && return 1 + grep -Fq "$(printf '%s\t' "$name")" "$out" && return 1 + printf '%s\t%s\t%s\n' "$name" "$version" "$hash" >> "$out" + n=$((n + 1)) + [ "$n" -le 32 ] || return 1 + done + [ "$n" -gt 0 ] +} +# A dry-run may install only explicitly reviewed packages. Never allow any +# upgrades, downgrades, removals or automatic dependency additions. Missing +# prerequisites cause a safe failure. +review_install_plan() { + plan="$1"; allow="$2" + awk -v allowed="$allow" ' + BEGIN { split(allowed, names, " "); for (i in names) if (names[i] != "") ok[names[i]]=1 } + { + line=$0 + sub(/^\([0-9]+\/[0-9]+\) /, "", line) + if (line ~ /^(Installing|Upgrading|Downgrading|Purging|Removing) /) { + split(line, fields, " ") + if (fields[1] != "Installing" || !(fields[2] in ok) || ++seen[fields[2]] != 1) bad=1 + } + } + END { + for (name in ok) if (seen[name] != 1) bad=1 + exit bad ? 1 : 0 + } + ' "$plan" +} + +# Only explicitly approved, already-owned APKs may be upgraded. Never let +# apk upgrade the firmware, pull new dependencies, remove packages or downgrade. +review_update_plan() { + plan="$1"; allow="$2" + awk -v allowed="$allow" ' + BEGIN { split(allowed, names, " "); for (i in names) if (names[i] != "") ok[names[i]]=1 } + { + line=$0 + sub(/^\([0-9]+\/[0-9]+\) /, "", line) + if (line ~ /^(Installing|Upgrading|Downgrading|Purging|Removing|Replacing) /) { + split(line, fields, " ") + if (fields[1] != "Upgrading" || !(fields[2] in ok) || ++seen[fields[2]] != 1) bad=1 + } + } + END { + for (name in ok) if (seen[name] != 1) bad=1 + exit bad ? 1 : 0 + } + ' "$plan" +} + +# Likewise, removal may touch only package names in the Apps-owned manifest. +# Shared dependencies, manually installed packages and system packages must +# remain untouched even if apk considers them orphaned. +review_remove_plan() { + plan="$1"; allow="$2" + awk -v allowed="$allow" ' + BEGIN { split(allowed, names, " "); for (i in names) if (names[i] != "") ok[names[i]]=1 } + { + line=$0 + sub(/^\([0-9]+\/[0-9]+\) /, "", line) + if (line ~ /^(Purging|Removing|Upgrading|Downgrading) /) { + split(line, fields, " ") + if ((fields[1] != "Purging" && fields[1] != "Removing") || !(fields[2] in ok)) bad=1 + } + } + END { exit bad ? 1 : 0 } + ' "$plan" +} + +# Preserve recovery of partial operations: an owned manifest may contain a +# not-yet-installed package, but must never adopt a package that was present +# before this transaction. A later retry can finish it safely. +append_owned_pin() { + name="$1"; version="$2"; hash="$3" + manifest="$(owned_manifest "$app")" + mkdir -p "$OWNED" || return 1 + if [ -e "$manifest" ] && grep -Fqx "$(printf '%s\t%s\t%s' "$name" "$version" "$hash")" "$manifest"; then + return 0 + fi + tmp_manifest="$stage/owned-next" + if [ -e "$manifest" ]; then cp "$manifest" "$tmp_manifest" || return 1; else : > "$tmp_manifest"; fi + printf '%s\t%s\t%s\n' "$name" "$version" "$hash" >> "$tmp_manifest" + cp "$tmp_manifest" "$manifest.new" && mv -f "$manifest.new" "$manifest" +} + +installed() { "$APK" info -e "$1" >/dev/null 2>&1; } +# apk info -e verifies only the name. Version checks must use the installed +# database or an old, manually changed APK could be mistaken for our release. +installed_version() { + "$APK" list -I "$1" 2>/dev/null | awk -v prefix="$1-" ' + index($1, prefix) == 1 { print substr($1, length(prefix) + 1); exit } + ' +} +# Use APK's installed-size metadata, not archive/download size or a slow +# recursive scan of /overlay. apk versions may put the number on the same +# line as the "installed size" heading or on the next line. Do not guess +# missing metadata, and do not accept a size from a different package. +parse_installed_apk_size() { + awk -v name="$1" -v expected="$2" ' + function number_of_bytes(value, parts, count, factor, bytes) { + gsub(/^[[:space:]]+|[[:space:]]+$/, "", value) + # Accept the standard "123 KiB" and compact "123KiB" forms. + sub(/(B|KiB|MiB|GiB)$/, " &", value) + count=split(value, parts, /[[:space:]]+/) + if (count != 2 || parts[1] !~ /^[0-9]+([.][0-9]+)?$/) return -1 + if (parts[2] == "B") factor=1 + else if (parts[2] == "KiB") factor=1024 + else if (parts[2] == "MiB") factor=1048576 + else if (parts[2] == "GiB") factor=1073741824 + else return -1 + bytes=parts[1]*factor + if (bytes < 0 || bytes > 1099511627776) return -1 + return bytes + } + # apk v3 may print the exact same installed-size record more than once + # (for instance, when package names are returned from multiple indexes). + # Accept only consistent repetitions; never sum duplicate records. + function record_size(value, version, parsed_bytes) { + parsed_bytes=number_of_bytes(value) + # An APK upgrade can leave multiple versions in index-derived info. + # Prefer the exact locally installed release over older/newer entries. + if (expected != "" && version == expected) { + matched=1 + if (parsed_bytes < 0 || (selected && parsed_bytes != selected_bytes)) { + selected_invalid=1 + return + } + selected_bytes=parsed_bytes + selected=1 + return + } + if (parsed_bytes < 0 || (parsed && parsed_bytes != bytes)) { + invalid=1 + return + } + bytes=parsed_bytes + parsed=1 + } + { + line=$0 + sub(/\r$/, "", line) + heading=" installed size:" + marker=index(line, heading) + if (marker > 0 && (substr(line, 1, length(name) + 1) == name "-" || + substr(line, 1, length(name) + length(heading)) == name heading)) { + if (waiting) { + if (expected != "" && pending_version == expected) selected_invalid=1 + else invalid=1 + } + seen++ + prefix=substr(line, 1, marker-1) + version=prefix == name ? "" : substr(prefix, length(name)+2) + value=substr(line, marker+length(heading)) + gsub(/^[[:space:]]+|[[:space:]]+$/, "", value) + waiting=0 + if (value == "") { + waiting=1 + pending_version=version + } else record_size(value, version) + next + } + if (waiting) { + gsub(/^[[:space:]]+|[[:space:]]+$/, "", line) + if (line == "") next + record_size(line, pending_version) + waiting=0 + } + } + END { + if (waiting) { + if (expected != "" && pending_version == expected) selected_invalid=1 + else invalid=1 + } + if (matched) { + if (!selected_invalid && selected) + printf "%.0f\n", selected_bytes + else exit 1 + } else if (!invalid && seen > 0 && parsed == 1) { + # Keep supporting APK variants without exact version records. + printf "%.0f\n", bytes + } else exit 1 + } + ' +} +installed_size_bytes() { + [ "$#" -eq 1 ] || return 1 + name="$1" + # Match the package release actually installed, not a stale APK index hit. + current_version="$(installed_version "$name" || :)" + valid_version "$current_version" || current_version='' + # Try APK's size-only view first; fall back to its full information view. + # Do not attempt a potentially expensive recursive disk scan. + bytes="$("$APK" info -s "$name" 2>/dev/null | parse_installed_apk_size "$name" "$current_version")" || { + bytes="$("$APK" info "$name" 2>/dev/null | parse_installed_apk_size "$name" "$current_version")" || return 1 + } + case "$bytes" in ''|*[!0-9]*) return 1;; esac + printf '%s\n' "$bytes" +} +# Refuse a downgrade, a same-version rebuild with a different digest, any +# package-set change, or an APK that no longer matches our ownership record. +# The approved replacement must be strictly newer according to apk itself. +select_upgrades() { + old_manifest="$1"; approved_pins="$2"; changed_pins="$3" + [ -s "$old_manifest" ] || return 1 + : > "$changed_pins" + old_count=0 + while IFS="$(printf '\t')" read -r name old_version old_hash; do + valid_package "$name" && valid_version "$old_version" && valid_sha "$old_hash" || return 1 + protected_package "$name" && return 1 + new_version="$(awk -F '\t' -v name="$name" '$1 == name { print $2; exit }' "$approved_pins")" + new_hash="$(awk -F '\t' -v name="$name" '$1 == name { print $3; exit }' "$approved_pins")" + [ -n "$new_version" ] && valid_sha "$new_hash" || return 1 + [ "$(installed_version "$name")" = "$old_version" ] || return 1 + if [ "$old_version" = "$new_version" ]; then + [ "$old_hash" = "$new_hash" ] || return 1 + else + [ "$("$APK" version -t "$old_version" "$new_version" 2>/dev/null)" = '<' ] || return 1 + printf '%s\t%s\t%s\n' "$name" "$new_version" "$new_hash" >> "$changed_pins" + fi + old_count=$((old_count + 1)) + [ "$old_count" -le 32 ] || return 1 + done < "$old_manifest" + [ "$old_count" -gt 0 ] || return 1 + [ "$old_count" -eq "$(wc -l < "$approved_pins" | tr -d ' ')" ] || return 1 + [ -s "$changed_pins" ] +} +# Prefer OpenWrt's configured apk architecture. Some package-manager builds +# do not support --print-arch consistently. Never guess based on the CPU type, +# device name, or the channel: the Hub approval must match an exact native arch. +local_package_arch() { + native='' + if [ -r "$ARCH_FILE" ]; then + native="$(awk '$1 ~ /^(aarch64_cortex-a53|mipsel_24kc|x86_64)$/ {print $1; exit}' "$ARCH_FILE" 2>/dev/null)" + fi + if [ -z "$native" ]; then + native="$("$APK" --print-arch 2>/dev/null || :)" + fi + case "$native" in aarch64_cortex-a53|mipsel_24kc|x86_64) printf '%s\n' "$native";; esac +} + +# Web UI is never considered ready based only on the daemon package. +# Network usage is explicitly known to require a separate LuCI package. +# Other apps opt in via an approved web_ui.package that is also in their +# approved package list, preventing an unrelated local app from being opened. +web_ui_package() { + id="$1"; idx="$2" + if [ "$id" = network-usage-monitor ]; then + printf '%s\n' luci-app-nlbwmon + return 0 + fi + if [ "$id" = wake-on-lan ]; then + # The approved app has exactly one LuCI entry point. Do not mistake the + # backend etherwake package (or a different LuCI page) for that UI. + [ "$(field "$CATALOG" "@.apps[$idx].web_ui.type")" = luci ] || return 1 + [ "$(field "$CATALOG" "@.apps[$idx].web_ui.path")" = /cgi-bin/luci/admin/services/wol ] || return 1 + [ "$(field "$CATALOG" "@.apps[$idx].web_ui.package")" = luci-app-wol ] || return 1 + fi + if [ "$id" = retro-arcade ]; then + [ "$(field "$CATALOG" "@.apps[$idx].web_ui.type")" = static ] || return 1 + [ "$(field "$CATALOG" "@.apps[$idx].web_ui.path")" = /retro-arcade/ ] || return 1 + [ "$(field "$CATALOG" "@.apps[$idx].web_ui.package")" = smartsafehub-app-retro-arcade ] || return 1 + else + [ "$(field "$CATALOG" "@.apps[$idx].web_ui.type")" = luci ] || return 1 + fi + name="$(field "$CATALOG" "@.apps[$idx].web_ui.package")" + valid_package "$name" || return 1 + p=0 + while [ "$p" -le 32 ]; do + candidate="$(field "$CATALOG" "@.apps[$idx].packages[$p].name")" + [ -n "$candidate" ] || break + if [ "$candidate" = "$name" ]; then printf '%s\n' "$name"; return 0; fi + p=$((p + 1)) + done + return 1 +} + +status() { + tmp="$(mktemp "$RUNTIME/apps-status.XXXXXXXX")" || return 1 + { + # A disconnected device can still report its local installation state. + if [ ! -r "$CATALOG" ]; then : > "$tmp"; mv -f "$tmp" "$RUNTIME/apps-status.tsv"; return 0; fi + # Snapshot approved IDs once. Both catalog membership and local ownership + # checks below refer to the same on-disk approved generation. + approved_ids="$(catalog_ids)" + n=0 + for id in $approved_ids; do + valid_id "$id" || continue + idx="$n"; n=$((n + 1)) + [ "$n" -le 100 ] || break + total=0; present=0; p=0; primary_package='' + while :; do + name="$(field "$CATALOG" "@.apps[$idx].packages[$p].name")" + [ -n "$name" ] || break + valid_package "$name" || break + [ -n "$primary_package" ] || primary_package="$name" + total=$((total + 1)); installed "$name" && present=$((present + 1)) + p=$((p + 1)); [ "$p" -le 32 ] || break + done + # WOL's public release version belongs to its LuCI APK, not the + # etherwake backend. Avoid showing a false installed/offered mismatch. + if [ "$id" = wake-on-lan ] && [ "$total" -eq 2 ]; then + primary_package=luci-app-wol + fi + managed=0 + [ -f "$(owned_manifest "$id")" ] && managed=1 + ui_ready=0 + ui_package="$(web_ui_package "$id" "$idx" || :)" + if [ -n "$ui_package" ] && installed "$ui_package"; then + if [ "$id" != retro-arcade ] || [ -r "${SMARTSAFEHUB_APPS_WEB_ROOT:-/www}/retro-arcade/index.html" ]; then + ui_ready=1 + fi + fi + # Update availability requires a complete Apps-owned install and a newer + # Hub-approved exact package set; it never uses an untrusted URL or version. + update_ready=0 + if [ "$managed" -eq 1 ] && [ "$total" -gt 0 ] && [ "$total" -eq "$present" ]; then + status_pins="$(mktemp "$RUNTIME/apps-status-pins.XXXXXXXX")" || return 1 + status_changes="$(mktemp "$RUNTIME/apps-status-changes.XXXXXXXX")" || { rm -f "$status_pins"; return 1; } + if extract_pins "$idx" "$status_pins" && select_upgrades "$(owned_manifest "$id")" "$status_pins" "$status_changes"; then + update_ready=1 + fi + rm -f "$status_pins" "$status_changes" + fi + # The catalog version is the latest approved release, not the APK + # currently installed. Read the actual version of the first approved + # package as a representative version; never infer it from the catalog. + # Use a fixed APK command and validate the field before putting it in TSV. + installed_release='' + if [ -n "$primary_package" ] && installed "$primary_package"; then + installed_release="$(installed_version "$primary_package" || :)" + valid_version "$installed_release" || installed_release='' + fi + if [ "$total" -gt 0 ] && [ "$total" -eq "$present" ]; then full=1; else full=0; fi + if [ "$present" -gt 0 ]; then partial=1; else partial=0; fi + printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' "$id" "$full" "$partial" "$managed" "$ui_ready" "$update_ready" "$installed_release" + done + # Removed approvals must be proven by a valid Apps-owned manifest, not + # inferred from racing UI/catalog RPC responses. Manual apk add does not + # write an Apps manifest and therefore must never appear as retired. + retired_count=0 + for manifest in "$OWNED"/*; do + [ -f "$manifest" ] || continue + id="${manifest##*/}" + valid_id "$id" || continue + printf '%s\n' "$approved_ids" | grep -Fxq "$id" && continue + retired_count=$((retired_count + 1)) + [ "$retired_count" -le 100 ] || break + count=0; present=0; valid=1 + while IFS="$(printf '\t')" read -r name version hash; do + valid_package "$name" && valid_version "$version" && valid_sha "$hash" || { valid=0; break; } + protected_package "$name" && { valid=0; break; } + count=$((count + 1)) + [ "$count" -le 32 ] || { valid=0; break; } + installed "$name" && present=$((present + 1)) + done < "$manifest" + [ "$valid" -eq 1 ] && [ "$count" -gt 0 ] && [ "$present" -gt 0 ] || continue + # Eighth column explicitly marks the verified retired ownership record. + printf '%s\t0\t1\t1\t0\t0\t\t1\n' "$id" + done + } > "$tmp" + mv -f "$tmp" "$RUNTIME/apps-status.tsv" +} + +# Optional read-only sizes. Consult the *last known installed* status and +# approved catalog. For incomplete metadata, omit the total rather than show +# a misleading partial sum. +sizes() { + tmp="$(mktemp "$RUNTIME/apps-size.XXXXXXXX")" || return 1 + { + if [ -r "$CATALOG" ] && [ -r "$RUNTIME/apps-status.tsv" ]; then + for id in $(awk -F '\t' '$2 == "1" {print $1}' "$RUNTIME/apps-status.tsv"); do + valid_id "$id" || continue + idx="$(app_index "$id")" || continue + set -- + p=0 + while :; do + name="$(field "$CATALOG" "@.apps[$idx].packages[$p].name")" + [ -n "$name" ] || break + valid_package "$name" || break + set -- "$@" "$name" + p=$((p + 1)); [ "$p" -le 32 ] || break + done + [ "$#" -gt 0 ] || continue + complete=1; total_bytes=0 + for name in "$@"; do + bytes="$(installed_size_bytes "$name" || :)" + case "$bytes" in + ''|*[!0-9]*) + complete=0;; + *) + # Never overflow signed shell arithmetic or report an impossible total. + if [ "${#bytes}" -gt 13 ] || [ "$bytes" -gt 1099511627776 ] || + [ "$total_bytes" -gt $((1099511627776 - bytes)) ]; then + complete=0 + else + total_bytes=$((total_bytes + bytes)) + fi;; + esac + done + [ "$complete" -eq 1 ] || continue + printf '%s\t%s\n' "$id" "$total_bytes" + done + fi + } > "$tmp" + mv -f "$tmp" "$RUNTIME/apps-size.tsv" +} +# Release names from the Hub have zero command authority. We cross-check the +# fresh exact-build approval, locally trusted immutable index, architecture and +# resource requirements before invoking the fixed APK binary. +preflight_install() { + "$CATALOG_HELPER" || return 21 + index="$(app_index "$app")" || return 22 + [ "$(field "$CATALOG" "@.apps[$index].runtime")" = router ] || return 23 + [ "$(field "$CATALOG" "@.apps[$index].installer")" = apk ] || return 23 + arch="$(field "$CATALOG" "@.apps[$index].package_arch")" + native_arch="$(local_package_arch)" + if [ -z "$arch" ] || [ "$arch" != "$native_arch" ]; then + # E24 is an approval mismatch, not a generic download failure. Keep a + # non-sensitive diagnostic for devices with different apk CLI behaviors. + command -v logger >/dev/null 2>&1 && logger -t smartsafehub-apps "E24: approved=${arch:-missing} local=${native_arch:-unknown}" || : + return 24 + fi + approved_hash="$(field "$CATALOG" "@.apps[$index].repository_index_sha256")" + valid_sha "$approved_hash" || return 25 + # Build an allowlisted repository URL from immutable local firmware identity + # and the approved catalog response. The Hub pins the exact index digest. + channel="$(field "$CATALOG" '@.channel')" + case "$channel" in stable|beta) ;; *) return 25;; esac + case "$arch" in aarch64_cortex-a53|mipsel_24kc|x86_64) ;; *) return 24;; esac + publication="$(field "$CATALOG" "@.apps[$index].repository_release_id")" + printf '%s\n' "$publication" | grep -Eq '^[0-9]{8}T[0-9]{6}([0-9]{1,6})?$' || return 25 + repo_url="$REPO_BASE/$channel/packages/$arch/smartsafehub/$publication" + index_url="$repo_url/packages.adb" + # Always fetch the current published index. If a channel is republished after + # review, fail closed until Hub has reviewed the new index hash. + "$UCLIENT" -q -T 15 -O "$stage/packages.adb" "$index_url" > "$stage/index-fetch.log" 2>&1 || return 25 + [ -s "$stage/packages.adb" ] || return 25 + index_bytes="$(wc -c < "$stage/packages.adb" | tr -d ' ')" + [ "$index_bytes" -le 8388608 ] || return 25 + actual_hash="$("$SHA256" "$stage/packages.adb" | cut -d ' ' -f 1)" + [ "$approved_hash" = "$actual_hash" ] || return 25 + memory="$(field "$CATALOG" "@.apps[$index].requirements.min_memory_mb")" + storage="$(field "$CATALOG" "@.apps[$index].requirements.min_storage_mb")" + case "$memory" in ''|*[!0-9]*) return 26;; esac + case "$storage" in ''|*[!0-9]*) return 26;; esac + [ "$memory" -le 131072 ] && [ "$storage" -le 131072 ] || return 26 + available_memory="$(awk '/^MemTotal:/ {print int($2/1024); exit}' "$MEMINFO" 2>/dev/null)" + available_storage="$(df -Pk "$OVERLAY" 2>/dev/null | awk 'END {print int($4/1024)}')" + [ -n "$available_memory" ] && [ "$available_memory" -ge "$memory" ] || return 26 + [ -n "$available_storage" ] && [ "$available_storage" -ge "$storage" ] || return 26 + extract_pins "$index" "$pins" || return 27 + if [ "$app" = network-usage-monitor ]; then + [ "$(wc -l < "$pins" | tr -d ' ')" -eq 3 ] || return 27 + for required in nlbwmon luci-app-nlbwmon luci-lib-chartjs; do + grep -q "^${required}$(printf '\t')" "$pins" || return 27 + done + elif [ "$app" = wake-on-lan ]; then + # WOL always requires both the signal sender and its LuCI user interface. + # Never install extra packages just because a catalog lists them. + [ "$(wc -l < "$pins" | tr -d ' ')" -eq 2 ] || return 27 + for required in etherwake luci-app-wol; do + grep -q "^${required}$(printf '\t')" "$pins" || return 27 + done + elif [ "$app" = retro-arcade ]; then + # The approved first-party game app owns exactly one APK. Keep the + # package name fixed without freezing its future upgrade versions. + [ "$(wc -l < "$pins" | tr -d ' ')" -eq 1 ] || return 27 + grep -q "^smartsafehub-app-retro-arcade$(printf '\t')" "$pins" || return 27 + fi + return 0 +} + +# Download and hash-check all approved archives prior to any APK mutation. +# Both initial installation and a selected-app update use this same check. +fetch_approved_archives() { + mkdir -p "$stage/packages" || return 30 + while IFS="$(printf '\t')" read -r name version hash; do + archive="$stage/packages/$name-$version.apk" + "$UCLIENT" -q -T 30 -O "$archive" "$repo_url/$name-$version.apk" > "$stage/fetch.log" 2>&1 || return 31 + [ -s "$archive" ] && [ ! -L "$archive" ] || return 32 + archive_bytes="$(wc -c < "$archive" | tr -d ' ')" + [ "$archive_bytes" -le 33554432 ] || return 32 + [ "$("$SHA256" "$archive" | cut -d ' ' -f 1)" = "$hash" ] || return 33 + done < "$pins" +} +prepare_signed_index() { + cp "$stage/packages.adb" "$stage/packages/packages.adb" || return 34 + [ "$("$SHA256" "$stage/packages/packages.adb" | cut -d ' ' -f 1)" = "$approved_hash" ] || return 34 + local_index="file://$stage/packages/packages.adb" + "$APK" --repositories-file /dev/null -X "$local_index" update > "$stage/repo-update.log" 2>&1 || return 34 +} + +# All packages come from one SmartSafeHub-signed immutable release. +install_app() { + preflight_install || return $? + manifest="$(owned_manifest "$app")" + # Existing app ownership must match the reviewed pins. + if [ -e "$manifest" ]; then + [ -s "$manifest" ] || return 28 + while IFS="$(printf '\t')" read -r name version hash; do + valid_package "$name" && valid_version "$version" && valid_sha "$hash" || return 28 + pin="$(printf '%s\t%s\t%s' "$name" "$version" "$hash")" + grep -Fqx "$pin" "$pins" || return 28 + done < "$manifest" + fi + need_install=0 + # Never adopt a package previously installed outside SmartSafeHub Apps. + while IFS="$(printf '\t')" read -r name version hash; do + pin="$(printf '%s\t%s\t%s' "$name" "$version" "$hash")" + if [ -e "$manifest" ] && grep -Fqx "$pin" "$manifest"; then + installed "$name" || need_install=1 + elif installed "$name"; then + return 29 + else + need_install=1 + fi + done < "$pins" + [ "$need_install" -eq 1 ] || return 28 + fetch_approved_archives || return $? + # Only missing packages enter the single signed repository transaction. + set --; base_names='' + while IFS="$(printf '\t')" read -r name version hash; do + if ! installed "$name"; then set -- "$@" "$name=$version"; base_names="${base_names:+$base_names }$name"; fi + done < "$pins" + if [ "$#" -gt 0 ]; then + # Only the verified immutable index can supply packages. + prepare_signed_index || return $? + "$APK" --repositories-file /dev/null -X "$local_index" add --simulate "$@" > "$stage/plan.log" 2>&1 || return 34 + review_install_plan "$stage/plan.log" "$base_names" || return 34 + # Write ownership immediately before modifying packages. If APK partially + # succeeds, the UI offers repair/removal without adopting unrelated packages. + while IFS="$(printf '\t')" read -r name version hash; do + if ! installed "$name"; then append_owned_pin "$name" "$version" "$hash" || return 36; fi + done < "$pins" + "$APK" --repositories-file /dev/null -X "$local_index" add "$@" > "$stage/install.log" 2>&1 || return 35 + fi + # A failed or incomplete add never counts as a successful application. + while IFS="$(printf '\t')" read -r name version hash; do + installed "$name" || return 35 + done < "$pins" + return 0 +} + +# Upgrade only packages already owned by this app, and only when the newly +# approved version is strictly newer. Re-fetch approval at click time, use a +# signed immutable repository, and reject any unrelated solver action. +update_app() { + preflight_install || return $? + manifest="$(owned_manifest "$app")" + [ -s "$manifest" ] || return 51 + changes="$stage/changes" + select_upgrades "$manifest" "$pins" "$changes" || return 52 + # No package installation has been changed at this point. Keep the previous + # manifest intact until every targeted APK has been upgraded and verified. + fetch_approved_archives || return $? + prepare_signed_index || return $? + set --; update_names='' + while IFS="$(printf '\t')" read -r name version hash; do + set -- "$@" "$name=$version" + update_names="${update_names:+$update_names }$name" + done < "$changes" + [ "$#" -gt 0 ] || return 52 + "$APK" --repositories-file /dev/null -X "$local_index" add --upgrade --simulate "$@" > "$stage/plan.log" 2>&1 || return 53 + review_update_plan "$stage/plan.log" "$update_names" || return 53 + "$APK" --repositories-file /dev/null -X "$local_index" add --upgrade "$@" > "$stage/install.log" 2>&1 || return 54 + while IFS="$(printf '\t')" read -r name version hash; do + [ "$(installed_version "$name")" = "$version" ] || return 54 + done < "$pins" + # Preserve ownership atomically; future removal and firmware restore now use + # the new pins. Never record an update as a first-time download receipt. + cp "$pins" "$manifest.new" || return 55 + mv -f "$manifest.new" "$manifest" || return 55 + return 0 +} + +remove_app() { + manifest="$(owned_manifest "$app")" + [ -f "$manifest" ] || return 41 + set --; count=0 + while IFS="$(printf '\t')" read -r name version hash; do + valid_package "$name" && valid_version "$version" && valid_sha "$hash" || return 42 + protected_package "$name" && return 42 + # Reject packages owned by any other Apps installation. + for other in "$OWNED"/*; do + [ -f "$other" ] || continue + [ "$other" = "$manifest" ] && continue + grep -Fq "${name}$(printf '\t')" "$other" && return 43 + done + # A failed transaction may have recorded ownership before apk completed. + # Only pass actually installed packages to apk del; still clear the + # manifest once all remaining owned packages are safely removed. + installed "$name" && set -- "$@" "$name" + count=$((count + 1)); [ "$count" -le 32 ] || return 42 + done < "$manifest" + [ "$count" -gt 0 ] || return 42 + any_installed=0 + for name in "$@"; do installed "$name" && any_installed=1; done + if [ "$any_installed" -eq 1 ]; then + "$APK" del --simulate "$@" > "$stage/plan.log" 2>&1 || return 44 + # Removing an optional app must never implicitly remove system/network, + # SafeShield or firmware kernel-module packages. + if grep -Ei '(Purging|Removing|Upgrading|Downgrading) (base-files|busybox|apk|procd|netifd|dnsmasq[^ ]*|firewall[^ ]*|odhcp[^ ]*|dropbear|ubus[^ ]*|rpcd[^ ]*|uhttpd[^ ]*|safeshield[^ ]*|luci-app-smartsafehub|kernel|kmod-[^ ]*) ' "$stage/plan.log" >/dev/null; then + return 44 + fi + review_remove_plan "$stage/plan.log" "$*" || return 44 + "$APK" del "$@" > "$stage/remove.log" 2>&1 || return 45 + fi + rm -f "$manifest" + return 0 +} + +worker() { + action="$1"; app="$2" + # Keep the ID from the queued job across running/success/failed states. + # The browser uses it to distinguish a new failure from a dismissed one. + operation_id="$(awk -F '\t' '$1 == "operation_id" { print $2; exit }' "$STATE" 2>/dev/null || :)" + source="$(awk -F '\t' '$1 == "source" { print $2; exit }' "$STATE" 2>/dev/null || :)" + case "$source" in user|restore) ;; *) source=user ;; esac + trap 'rm -rf "$stage"; rmdir "$LOCK" 2>/dev/null || true' EXIT HUP INT TERM + stage="$(mktemp -d "$RUNTIME/apps-work.XXXXXXXX")" || exit 1 + pins="$stage/pins" + # Never expose error text from a previous install as the current result. + rm -f "$RUNTIME/apps-last-error.log" + write_state running "$action" "$app" NONE "$operation_id" "$source" + rc=0 + case "$action" in + install) install_app || rc=$?;; + update) update_app || rc=$?;; + remove) remove_app || rc=$?;; + esac + if [ "$rc" -eq 0 ]; then + # The LuCI menu tree may be cached before an optional UI is installed. + # Invalidate the cache only after a successful package transaction. + if [ "$app" = wake-on-lan ]; then + rm -f "$LUCI_INDEX_CACHE" + fi + write_state success "$action" "$app" NONE "$operation_id" "$source" + # Count successful user installs and updates separately. Restores, + # removals and failed/no-op operations never become receipts. Telemetry + # must not affect the success of an APK transaction. + if [ "$source" = user ] && { [ "$action" = install ] || [ "$action" = update ]; }; then + version="$(field "$CATALOG" "@.apps[$index].version")" + "$METRICS" enqueue "$app" "$version" "$operation_id" "$action" >/dev/null 2>&1 || : + fi + else + # Keep only the latest package-manager diagnostic after the workspace is + # removed. Never record an auth token, catalog JSON, or package contents. + for log in "$stage/repo-update.log" "$stage/plan.log" "$stage/install.log" "$stage/remove.log"; do + if [ -s "$log" ]; then + tail -c 4096 "$log" > "$RUNTIME/apps-last-error.log" 2>/dev/null || : + fi + done + write_state failed "$action" "$app" "E$rc" "$operation_id" "$source" + fi +} + +start() { + action="$1"; app="$2"; source="${3:-user}" + case "$source" in user|restore) ;; *) exit 2;; esac + [ "$action" = install ] || [ "$source" = user ] || exit 2 + case "$action" in install|update|remove) ;; *) exit 2;; esac + valid_id "$app" || exit 2 + mkdir -p "$RUNTIME" || exit 1 + mkdir "$LOCK" 2>/dev/null || exit 3 + # The ID is unique to each invocation, even if the same error repeats. + # OpenWrt's default BusyBox image does not include the od applet. + # dd and sha256sum are available; hash 8 random bytes into a 16-hex nonce. + # Fail closed if the entropy read fails rather than reusing a fixed ID. + random_file="$(mktemp "$RUNTIME/apps-random.XXXXXXXX")" || { rmdir "$LOCK" 2>/dev/null || :; exit 1; } + if ! dd if=/dev/urandom of="$random_file" bs=8 count=1 2>/dev/null || + [ "$(wc -c < "$random_file" | tr -d ' ')" -ne 8 ]; then + rm -f "$random_file" + rmdir "$LOCK" 2>/dev/null || : + exit 1 + fi + random="$("$SHA256" "$random_file" | cut -c 1-16)" + rm -f "$random_file" + [ "${#random}" -eq 16 ] || { rmdir "$LOCK" 2>/dev/null || :; exit 1; } + operation_id="$(date +%s)-$$-$random" + write_state starting "$action" "$app" NONE "$operation_id" "$source" + if ! "$DAEMON" -S -b -x "$SELF" -- worker "$action" "$app" >/dev/null 2>&1; then + write_state failed "$action" "$app" LAUNCH "$operation_id" "$source" + rmdir "$LOCK" 2>/dev/null || true + exit 1 + fi +} + +case "${1:-}" in + status) mkdir -p "$RUNTIME"; status;; + sizes) mkdir -p "$RUNTIME"; sizes;; + start) [ "$#" -ge 3 ] && [ "$#" -le 4 ] || exit 2; start "$2" "$3" "${4:-user}";; + worker) [ "$#" -eq 3 ] || exit 2; worker "$2" "$3";; + *) exit 2;; +esac diff --git a/luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps-metrics b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps-metrics new file mode 100755 index 000000000..1470d13aa --- /dev/null +++ b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps-metrics @@ -0,0 +1,74 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-or-later +# Durable outbox for authenticated successful user installs and updates. +# Never affects APK transactions; send only app, release, kind and receipt ID. +set -eu +umask 077 +QUEUE="${SMARTSAFEHUB_APPS_METRICS_DIR:-/etc/smartsafehub/apps-metrics-pending}" +CREDENTIAL="${SMARTSAFEHUB_APPS_METRICS_CREDENTIAL:-/etc/smartsafehub/device-credential.json}" +JSONFILTER="${SMARTSAFEHUB_APPS_JSONFILTER_BIN:-jsonfilter}" +FETCH="${SMARTSAFEHUB_APPS_METRICS_FETCH_BIN:-uclient-fetch}" +URL="${SMARTSAFEHUB_APPS_METRICS_URL:-https://www.smartsafehub.com/api/v1/app-store/installs}" +MAX_PENDING=500 +MAX_FLUSH=3 + +json_field() { "$JSONFILTER" -i "$1" -e "$2" 2>/dev/null | head -n 1; } +valid_id() { case "$1" in ''|*[!a-z0-9-]*|-*|*-) return 1;; esac; [ "${#1}" -le 80 ]; } +valid_version() { case "$1" in ''|*[!a-zA-Z0-9._+~:-]*|[-.+~:]*) return 1;; esac; [ "${#1}" -le 64 ]; } +valid_event() { + # Timestamp, process ID and 64-bit random component (no user data). + printf '%s\n' "$1" | grep -Eq '^[0-9]{10}-[0-9]+-[0-9a-f]{16}$' && [ "${#1}" -le 64 ] +} +enqueue() { + [ "$#" -eq 3 ] || [ "$#" -eq 4 ] || exit 2 + valid_id "$1" && valid_version "$2" && valid_event "$3" || exit 2 + kind="${4:-install}" + case "$kind" in install|update) ;; *) exit 2;; esac + mkdir -p "$QUEUE" || exit 1 + [ -d "$QUEUE" ] && [ ! -L "$QUEUE" ] || exit 1 + file="$QUEUE/$3.json" + [ ! -e "$file" ] || return 0 + # Bounded flash use. A full outbox never blocks installations. + count="$(find "$QUEUE" -maxdepth 1 -type f -name '*.json' | wc -l | tr -d ' ')" + [ "$count" -lt "$MAX_PENDING" ] || exit 1 + tmp="$(mktemp "$QUEUE/.pending.XXXXXXXX")" || exit 1 + if ! printf '{"app_id":"%s","version":"%s","event_id":"%s","kind":"%s"}\n' "$1" "$2" "$3" "$kind" > "$tmp"; then + rm -f "$tmp"; exit 1 + fi + mv -f "$tmp" "$file" +} +flush() { + [ -d "$QUEUE" ] || return 0 + [ -f "$CREDENTIAL" ] && [ ! -L "$CREDENTIAL" ] || return 0 + token="$(json_field "$CREDENTIAL" '@.token')" + case "$token" in ssh_dev_*) ;; *) return 0;; esac + [ "${#token}" -eq 72 ] || return 0 + # Only lower-case hex credentials can enter HTTP headers. + case "${token#ssh_dev_}" in *[!0-9a-f]*|'') return 0;; esac + mkdir "$QUEUE/.flush.lock" 2>/dev/null || return 0 + trap 'rmdir "$QUEUE/.flush.lock" 2>/dev/null || :' EXIT HUP INT TERM + n=0; failed=0 + for file in "$QUEUE"/*.json; do + [ -f "$file" ] && [ ! -L "$file" ] || continue + event="${file##*/}"; event="${event%.json}" + valid_event "$event" || continue + [ "$(json_field "$file" '@.event_id')" = "$event" ] || continue + response="$(mktemp "$QUEUE/.response.XXXXXXXX")" || return 1 + if "$FETCH" -q -T 8 -O "$response" \ + --header='Content-Type: application/json' \ + --header="Authorization: Device $token" --post-file="$file" "$URL" >/dev/null 2>&1; then + accepted="$(json_field "$response" '@.status')" + case "$accepted" in recorded|duplicate) rm -f "$file";; *) failed=1;; esac + else + failed=1 + fi + rm -f "$response" + n=$((n + 1)); [ "$n" -lt "$MAX_FLUSH" ] || break + done + [ "$failed" -eq 0 ] +} +case "${1:-}" in + enqueue) shift; enqueue "$@";; + flush) [ "$#" -eq 1 ] || exit 2; flush;; + *) exit 2;; +esac diff --git a/luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps-restore b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps-restore new file mode 100755 index 000000000..0b6337974 --- /dev/null +++ b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-apps-restore @@ -0,0 +1,165 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-or-later +# Reconcile sysupgrade-preserved Apps ownership with the new firmware's APK DB. +# The privileged Apps manager alone decides which signed packages may be added. +set -eu + +MANAGER="${SMARTSAFEHUB_APPS_MANAGER_BIN:-/usr/libexec/smartsafehub-apps-manager}" +OWNED="${SMARTSAFEHUB_APPS_OWNED_DIR:-/etc/smartsafehub/apps-installed}" +RUNTIME="${SMARTSAFEHUB_APPS_RUNTIME_DIR:-/tmp/smartsafehub}" +APK="${SMARTSAFEHUB_APPS_APK_BIN:-apk}" +SLEEP="${SMARTSAFEHUB_APPS_RESTORE_SLEEP_BIN:-sleep}" +START_DELAY="${SMARTSAFEHUB_APPS_RESTORE_START_DELAY:-30}" +RETRY_DELAY="${SMARTSAFEHUB_APPS_RESTORE_RETRY_DELAY:-120}" +RETRIES="${SMARTSAFEHUB_APPS_RESTORE_RETRIES:-12}" +POLL_INTERVAL="${SMARTSAFEHUB_APPS_RESTORE_POLL_INTERVAL:-2}" +POLL_LIMIT="${SMARTSAFEHUB_APPS_RESTORE_POLL_LIMIT:-240}" +STATE="$RUNTIME/apps-restore.state" +JOB="$RUNTIME/apps-operation.state" +LOCK="$RUNTIME/apps-restore.lock" + +valid_id() { + case "$1" in ''|*[!a-z0-9-]*|-*|*-) return 1;; esac + [ "${#1}" -le 80 ] +} +valid_package() { + case "$1" in ''|*[!a-zA-Z0-9_.+-]*|[-.+]*|*[-.+]) return 1;; esac + [ "${#1}" -le 100 ] +} +valid_sha() { + case "$1" in ''|*[!a-f0-9]*) return 1;; esac + [ "${#1}" -eq 64 ] +} +write_state() { + phase="$1"; id="$2"; code="$3" + state_tmp="$(mktemp "$RUNTIME/apps-restore-state.XXXXXXXX")" || return 1 + printf 'phase\t%s\napp_id\t%s\ncode\t%s\n' "$phase" "$id" "$code" > "$state_tmp" + mv -f "$state_tmp" "$STATE" +} +log() { + command -v logger >/dev/null 2>&1 && logger -t smartsafehub-apps-restore "$*" || : +} +# A corrupt manifest must NOT grant an arbitrary app installation right. +# Existing packages are never replaced merely because an old manifest exists. +needs_restore() { + manifest="$1"; count=0; missing=0 + [ -f "$manifest" ] && [ ! -L "$manifest" ] && [ -s "$manifest" ] || return 2 + while IFS="$(printf '\t')" read -r name version hash; do + valid_package "$name" && [ -n "$version" ] && valid_sha "$hash" || return 2 + count=$((count + 1)) + [ "$count" -le 32 ] || return 2 + "$APK" info -e "$name" >/dev/null 2>&1 || missing=1 + done < "$manifest" + [ "$count" -gt 0 ] || return 2 + [ "$missing" -eq 1 ] +} +job_field() { + [ -r "$JOB" ] || return 0 + awk -F '\t' -v key="$1" '$1 == key {print $2; exit}' "$JOB" +} +# Starts exactly the same preflight/ownership/signature/plan checks as a user +# clicking Install. Never calls apk add directly, never reuses cached catalogs. +run_job() { + id="$1"; n=0 + if ! "$MANAGER" start install "$id" restore >/dev/null 2>&1; then + RESULT=BUSY + return 1 + fi + while [ "$n" -lt "$POLL_LIMIT" ]; do + phase="$(job_field phase)"; current="$(job_field app_id)" + if [ "$current" = "$id" ]; then + case "$phase" in + success) RESULT=NONE; return 0;; + failed) RESULT="$(job_field code)"; [ -n "$RESULT" ] || RESULT=UNKNOWN; return 1;; + esac + fi + "$SLEEP" "$POLL_INTERVAL" + n=$((n + 1)) + done + RESULT=TIMEOUT + return 1 +} +restore_one() { + id="$1"; attempt=1 + while [ "$attempt" -le "$RETRIES" ]; do + # User removal while waiting takes precedence; never reinstall a removed app. + [ -f "$OWNED/$id" ] || return 0 + if needs_restore "$OWNED/$id"; then :; else + result=$? + [ "$result" -eq 1 ] && return 0 + RESULT=INVALID_MANIFEST + return 1 + fi + write_state running "$id" NONE + if run_job "$id"; then + # Successful APK transaction may still have omitted an owned package. + if needs_restore "$OWNED/$id"; then + RESULT=INCOMPLETE + else + result=$? + [ "$result" -eq 1 ] && return 0 + RESULT=INVALID_MANIFEST + fi + fi + # Only networking failures or a concurrent manual operation are retried. + # Changed approval pins, revoked apps, bad signatures and unsafe dependency + # plans are never bypassed or retried indefinitely. + case "$RESULT" in BUSY|E21|E25|E31|E35) ;; *) return 1;; esac + [ "$attempt" -lt "$RETRIES" ] || return 1 + "$SLEEP" "$RETRY_DELAY" + attempt=$((attempt + 1)) + done + return 1 +} +restore() { + mkdir -p "$RUNTIME" || exit 1 + # procd only starts one instance, but an operator may invoke run manually. + mkdir "$LOCK" 2>/dev/null || exit 0 + trap 'rmdir "$LOCK" 2>/dev/null || :' EXIT + write_state idle '' NONE + # No persistent ownership means never install anything on a fresh router. + [ -d "$OWNED" ] || return 0 + pending=0 + for manifest in "$OWNED"/*; do + [ -f "$manifest" ] || continue + id="${manifest##*/}" + valid_id "$id" || continue + if needs_restore "$manifest"; then pending=1; break; else + result=$?; [ "$result" -eq 2 ] && { pending=1; break; } + fi + done + [ "$pending" -eq 1 ] || return 0 + write_state starting '' NONE + "$SLEEP" "$START_DELAY" + failed=0; last_app=''; last_code=NONE + for manifest in "$OWNED"/*; do + [ -f "$manifest" ] || continue + id="${manifest##*/}" + valid_id "$id" || continue + if needs_restore "$manifest"; then + RESULT=NONE + if restore_one "$id"; then + log "restored $id" + else + failed=1; last_app="$id"; last_code="$RESULT" + log "restore blocked for $id ($RESULT)" + fi + else + result=$? + if [ "$result" -eq 2 ]; then + failed=1; last_app="$id"; last_code=INVALID_MANIFEST + log "invalid owned manifest for $id" + fi + fi + done + if [ "$failed" -eq 1 ]; then + write_state failed "$last_app" "$last_code" + else + write_state success '' NONE + fi +} + +case "${1:-}" in + run) [ "$#" -eq 1 ] || exit 2; restore;; + *) exit 2;; +esac diff --git a/luci-app-smartsafehub/root/usr/libexec/smartsafehub-device b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-device index 019333a50..49facb8d8 100755 --- a/luci-app-smartsafehub/root/usr/libexec/smartsafehub-device +++ b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-device @@ -29,6 +29,7 @@ LOGGER_BIN="${SMARTSAFEHUB_DEVICE_LOGGER_BIN:-logger}" HEXDUMP_BIN="${SMARTSAFEHUB_DEVICE_HEXDUMP_BIN:-hexdump}" UBUS_BIN="${SMARTSAFEHUB_DEVICE_UBUS_BIN:-ubus}" REQUEST_TIMEOUT_S=10 +APPS_METRICS="${SMARTSAFEHUB_APPS_METRICS_BIN:-/usr/libexec/smartsafehub-apps-metrics}" CHECK_INTERVAL_S=300 RECOMMENDED_POLL_INTERVAL_S=30 RECOMMENDED_POLL_MAX_RETRY_S=300 @@ -498,6 +499,8 @@ daemon() { delay="$(retry_delay "$failures")" [ "$failures" -lt 4 ] && failures=$((failures + 1)) fi + # Backlogged Apps receipts are retried independently of account sync. + [ ! -x "$APPS_METRICS" ] || "$APPS_METRICS" flush >/dev/null 2>&1 || : now="$(now_epoch)" next_full=$((now + delay)) # Full sync already handled the recommended payload. diff --git a/luci-app-smartsafehub/root/usr/libexec/smartsafehub-firmware b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-firmware index f0c4086a6..e1b66bea8 100755 --- a/luci-app-smartsafehub/root/usr/libexec/smartsafehub-firmware +++ b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-firmware @@ -21,6 +21,7 @@ SHA256SUM_BIN="${SMARTSAFEHUB_FIRMWARE_SHA256SUM_BIN:-sha256sum}" UBUS_BIN="${SMARTSAFEHUB_FIRMWARE_UBUS_BIN:-ubus}" SYSUPGRADE_BIN="${SMARTSAFEHUB_FIRMWARE_SYSUPGRADE_BIN:-/sbin/sysupgrade}" EVENTS_BIN="${SMARTSAFEHUB_FIRMWARE_EVENTS_BIN:-/usr/libexec/smartsafehub-events}" +APPS_RESTORE_BIN="${SMARTSAFEHUB_APPS_RESTORE_BIN:-/usr/libexec/smartsafehub-apps-restore}" DEFAULT_API_BASE_URL="https://www.smartsafehub.com/api/v1" CHECK_TIMEOUT_S=20 DOWNLOAD_TIMEOUT_S=180 @@ -702,8 +703,18 @@ periodic_check_if_due() { fi } +# The existing firmware daemon schedules an independent, finite restore job +# once at boot. There is no new procd service, respawn loop or idle process. +# Restore worker itself checks the preserved ownership manifest before I/O. +start_apps_restore_once() { + [ -x "$APPS_RESTORE_BIN" ] || return 0 + [ -d "${SMARTSAFEHUB_APPS_OWNED_DIR:-/etc/smartsafehub/apps-installed}" ] || return 0 + "$APPS_RESTORE_BIN" run /dev/null 2>&1 & +} + run_daemon() { sync_firmware_identity + start_apps_restore_once load_daemon_settings sleep "$DAEMON_INITIAL_DELAY_S" boot_check_with_retry || true diff --git a/luci-app-smartsafehub/root/usr/libexec/smartsafehub-recommended-rules b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-recommended-rules index 4965f9ac9..368917b63 100755 --- a/luci-app-smartsafehub/root/usr/libexec/smartsafehub-recommended-rules +++ b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-recommended-rules @@ -30,7 +30,9 @@ SNAPSHOT="$RUNTIME/recommended-snapshot.$$" REPLY="$RUNTIME/recommended-reply.$$" ALLOW="$RUNTIME/recommended-allow.$$" VERIFY="$RUNTIME/recommended-verify.$$" -cleanup() { rm -f "$DESIRED" "$OWNED" "$SNAPSHOT" "$REPLY" "$ALLOW" "$VERIFY" "$LOCK/pid"; rmdir "$LOCK" 2>/dev/null || true; } +ADD="$RUNTIME/recommended-add.$$" +REMOVE="$RUNTIME/recommended-remove.$$" +cleanup() { rm -f "$DESIRED" "$OWNED" "$SNAPSHOT" "$REPLY" "$ALLOW" "$VERIFY" "$ADD" "$REMOVE" "$LOCK/pid"; rmdir "$LOCK" 2>/dev/null || true; } trap cleanup EXIT trap 'exit 1' HUP INT TERM @@ -48,16 +50,18 @@ extract_array() { [ "$status" -eq 1 ] && [ ! -s "$output" ] fi } -valid_domain() { - [ -n "$1" ] && [ "${#1}" -le 253 ] || return 1 - printf '%s\n' "$1" | LC_ALL=C grep -Eq '^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$' || return 1 - ! printf '%s\n' "$1" | LC_ALL=C grep -Eq '\.[0-9]+$' || return 1 - rest="$1" - while [ -n "$rest" ]; do - label="${rest%%.*}" - [ "${#label}" -le 63 ] || return 1 - case "$rest" in *.*) rest="${rest#*.}" ;; *) break ;; esac - done +# Validate whole sorted domain lists in one awk process. Per-domain grep and +# subshell creation previously scaled with every saved SafeShield allow entry. +valid_domains_file() { + LC_ALL=C awk ' + length($0) == 0 || length($0) > 253 { exit 1 } + $0 !~ /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/ { exit 1 } + $0 ~ /\.[0-9]+$/ { exit 1 } + { + count = split($0, labels, /\./) + for (i = 1; i <= count; i++) if (length(labels[i]) > 63) exit 1 + } + ' "$1" } revision="$(field "$RESPONSE" '@.recommended_rules.revision')" @@ -68,7 +72,7 @@ revision="$(field "$RESPONSE" '@.recommended_rules.revision')" valid_hash "$revision" || exit 1 extract_array "$RESPONSE" '@.recommended_rules.domains' "$DESIRED" || exit 1 [ "$(wc -l < "$DESIRED")" -le 100 ] || exit 1 -while IFS= read -r domain || [ -n "$domain" ]; do valid_domain "$domain" || exit 1; done < "$DESIRED" +valid_domains_file "$DESIRED" || exit 1 sort -u "$DESIRED" -o "$DESIRED" previous='' @@ -78,14 +82,19 @@ if [ -e "$STATE" ]; then previous="$(sed -n '1p' "$STATE")" [ "$previous" = '-' ] || valid_hash "$previous" || exit 1 sed '1d' "$STATE" > "$OWNED" - while IFS= read -r domain || [ -n "$domain" ]; do valid_domain "$domain" || exit 1; done < "$OWNED" + valid_domains_file "$OWNED" || exit 1 sort -u "$OWNED" -o "$OWNED" fi persist() { temp="${STATE}.tmp.$$" { printf '%s\n' "$1"; sort -u "$OWNED"; } > "$temp" chmod 600 "$temp" - mv -f "$temp" "$STATE" + # Avoid extra flash writes on a successful metadata-only reconciliation. + if [ -f "$STATE" ] && cmp -s "$STATE" "$temp"; then + rm -f "$temp" + else + mv -f "$temp" "$STATE" + fi } # Report progress from the worker itself. The parent daemon only commits a @@ -111,9 +120,11 @@ safeshield_refreshing() { [ "$status_value" = running ] } -# Defer a different desired revision before calling potentially busy SafeShield -# rules_list, which can itself be delayed during a long refresh. -if [ "$previous" != "$revision" ] && safeshield_refreshing; then +# Always defer a reconciliation during SafeShield's full-list refresh. Even +# a matching revision may need recovery if a prior apply lost its receipt. +# Check before dropping the old receipt so interrupted refreshes are not +# mistaken for failed or unverified rules. +if safeshield_refreshing; then phase safeshield_refreshing exit 75 fi @@ -129,26 +140,41 @@ fi # A broken or truncated rules_list must never be mistaken for an empty list. LC_ALL=C grep -Eq '"allow"[[:space:]]*:[[:space:]]*\[' "$REPLY" || exit 1 extract_array "$REPLY" '@.allow' "$ALLOW" || exit 1 -while IFS= read -r domain || [ -n "$domain" ]; do valid_domain "$domain" || exit 1; done < "$ALLOW" +valid_domains_file "$ALLOW" || exit 1 sort -u "$ALLOW" -o "$ALLOW" # Do not mutate overrides while a full protection refresh is already running. # Retain ownership and let the 30-second poll retry when SafeShield settles. +# Build the two mutation sets once. Owned entries absent from SafeShield do +# not need a delete, but their claims remain until final verification. +: > "$ADD" +: > "$REMOVE" +LC_ALL=C awk -v add_file="$ADD" -v remove_file="$REMOVE" ' + FILENAME == ARGV[1] { if ($0 != "") desired[$0] = 1; next } + FILENAME == ARGV[2] { if ($0 != "") allowed[$0] = 1; next } + FILENAME == ARGV[3] { + if ($0 != "" && !($0 in desired) && ($0 in allowed)) print $0 > remove_file + next + } + END { + for (domain in desired) if (!(domain in allowed)) print domain > add_file + } +' "$DESIRED" "$ALLOW" "$OWNED" || exit 1 +sort -u "$ADD" -o "$ADD" +sort -u "$REMOVE" -o "$REMOVE" changes_needed=0 -[ "$previous" = '-' ] && changes_needed=1 -while IFS= read -r domain; do - [ -n "$domain" ] || continue - if ! grep -Fxq "$domain" "$ALLOW"; then changes_needed=1; fi -done < "$DESIRED" -while IFS= read -r domain; do - [ -n "$domain" ] || continue - if ! grep -Fxq "$domain" "$DESIRED" && grep -Fxq "$domain" "$ALLOW"; then changes_needed=1; fi -done < "$OWNED" +if [ "$previous" = '-' ] || [ -s "$ADD" ] || [ -s "$REMOVE" ]; then changes_needed=1; fi if [ "$changes_needed" -eq 1 ] && safeshield_refreshing; then phase safeshield_refreshing exit 75 fi -if [ "$changes_needed" -eq 1 ]; then phase applying; fi +if [ "$changes_needed" -eq 1 ]; then + phase applying + # Mark the entire transaction unconfirmed once, before touching any rule. + # Keeping all ownership claims prevents a partial deletion from becoming a + # future manual-allow exemption after interruption. + persist '-' +fi mutate() { method="$1"; domain="$2" @@ -159,36 +185,24 @@ mutate() { # Refresh is retried after a partial or unsuccessful reconciliation. need_refresh=0 [ "$previous" = '-' ] && need_refresh=1 -cp "$OWNED" "$SNAPSHOT" while IFS= read -r domain; do [ -n "$domain" ] || continue - if ! grep -Fxq "$domain" "$DESIRED"; then - if grep -Fxq "$domain" "$ALLOW"; then - mutate rule_delete "$domain" || exit 1 - need_refresh=1 - fi - # Keep the ownership claim until the final SafeShield read confirms the - # domain is gone. A refresh failure must not turn a leftover cloud entry - # into an apparently user-created allow rule on the next assignment. - persist '-' - fi -done < "$SNAPSHOT" + mutate rule_delete "$domain" || exit 1 + need_refresh=1 + # Ownership remains in the pending state until final verification. +done < "$REMOVE" while IFS= read -r domain; do [ -n "$domain" ] || continue - if ! grep -Fxq "$domain" "$ALLOW"; then - # Write the ownership intent before creating the allow entry. If the - # process is interrupted after rule_add, the retry must still recognize - # the entry as cloud-managed rather than silently treating it as manual. - if ! grep -Fxq "$domain" "$OWNED"; then - printf '%s\n' "$domain" >> "$OWNED" - persist '-' - fi - mutate rule_add "$domain" || exit 1 - need_refresh=1 + # Record intent before rule_add so a crash cannot reclassify a managed rule + # as a manual allow entry. Preserve ownership on partial refresh failures. + if ! grep -Fxq "$domain" "$OWNED"; then + printf '%s\n' "$domain" >> "$OWNED" persist '-' fi -done < "$DESIRED" + mutate rule_add "$domain" || exit 1 + need_refresh=1 +done < "$ADD" if [ "$need_refresh" -eq 1 ]; then phase safeshield_refreshing @@ -201,54 +215,55 @@ if [ "$need_refresh" -eq 1 ]; then exit 1 fi fi -# Read the actual SafeShield rule list again rather than trusting rule_add results. +# Verify with a second RPC only when a mutation/refresh was requested. +# Otherwise the first rules_list response is already an authoritative read. if [ "$changes_needed" -eq 1 ] || [ "$previous" != "$revision" ]; then phase verifying; fi -if ! "$UBUS" call safeshield rules_list '{}' > "$REPLY"; then - if safeshield_refreshing; then phase safeshield_refreshing; exit 75; fi - exit 1 -fi -[ "$(field "$REPLY" '@.ok')" != false ] || exit 1 -LC_ALL=C grep -Eq '"allow"[[:space:]]*:[[:space:]]*\[' "$REPLY" || exit 1 -extract_array "$REPLY" '@.allow' "$VERIFY" || exit 1 -while IFS= read -r domain || [ -n "$domain" ]; do valid_domain "$domain" || exit 1; done < "$VERIFY" -sort -u "$VERIFY" -o "$VERIFY" -while IFS= read -r domain; do - [ -n "$domain" ] || continue - grep -Fxq "$domain" "$VERIFY" || exit 1 -done < "$DESIRED" -# Do not retire ownership if a previously managed, now-unassigned domain is -# still present in SafeShield. It may reappear during a failed refresh or an -# overlapping request, and a subsequent recommendation must not adopt it as a -# manual rule. Retry the deletion while the ownership marker remains intact. -while IFS= read -r domain; do - [ -n "$domain" ] || continue - if ! grep -Fxq "$domain" "$DESIRED" && grep -Fxq "$domain" "$VERIFY"; then +if [ "$need_refresh" -eq 1 ]; then + if ! "$UBUS" call safeshield rules_list '{}' > "$REPLY"; then + if safeshield_refreshing; then phase safeshield_refreshing; exit 75; fi exit 1 fi -done < "$OWNED" -# Only after successful reconciliation may we forget ownership of removed -# domains. The preserved marker survives a failed refresh and a reassignment. -cp "$OWNED" "$SNAPSHOT" -: > "$OWNED" -while IFS= read -r domain; do - [ -n "$domain" ] || continue - if grep -Fxq "$domain" "$DESIRED"; then - printf '%s\n' "$domain" >> "$OWNED" - fi -done < "$SNAPSHOT" + [ "$(field "$REPLY" '@.ok')" != false ] || exit 1 + LC_ALL=C grep -Eq '"allow"[[:space:]]*:[[:space:]]*\[' "$REPLY" || exit 1 + extract_array "$REPLY" '@.allow' "$VERIFY" || exit 1 + valid_domains_file "$VERIFY" || exit 1 + sort -u "$VERIFY" -o "$VERIFY" +else + cp "$ALLOW" "$VERIFY" +fi +# Check desired presence and pending managed deletions with one process. +LC_ALL=C awk ' + FILENAME == ARGV[1] { if ($0 != "") desired[$0] = 1; next } + FILENAME == ARGV[2] { if ($0 != "") verified[$0] = 1; next } + FILENAME == ARGV[3] { + if ($0 != "" && !($0 in desired) && ($0 in verified)) invalid = 1 + next + } + END { + for (domain in desired) if (!(domain in verified)) invalid = 1 + exit invalid + } +' "$DESIRED" "$VERIFY" "$OWNED" || exit 1 +# Retire ownership only after final verification, never on a failed refresh. +LC_ALL=C awk ' + FILENAME == ARGV[1] { if ($0 != "") desired[$0] = 1; next } + ($0 in desired) { print } +' "$DESIRED" "$OWNED" > "$SNAPSHOT" || exit 1 +sort -u "$SNAPSHOT" -o "$SNAPSHOT" +cp "$SNAPSHOT" "$OWNED" # The receipt describes *allow-list presence*, not proven DNS query results. # Domains not in OWNED existed before this recommendation (manual configuration). receipt_tmp="${RECEIPT}.tmp.$$" { printf '{"revision":"%s","status":"confirmed","domains":[' "$revision" - first=1 - while IFS= read -r domain; do - [ -n "$domain" ] || continue - if grep -Fxq "$domain" "$OWNED"; then source=managed; else source=manual; fi - [ "$first" -eq 1 ] || printf ',' - printf '{"domain":"%s","source":"%s"}' "$domain" "$source" - first=0 - done < "$DESIRED" + LC_ALL=C awk ' + FILENAME == ARGV[1] { if ($0 != "") owned[$0] = 1; next } + FILENAME == ARGV[2] { + if ($0 == "") next + if (count++) printf "," + printf "{\"domain\":\"%s\",\"source\":\"%s\"}", $0, (($0 in owned) ? "managed" : "manual") + } + ' "$OWNED" "$DESIRED" printf ']}\n' } > "$receipt_tmp" chmod 600 "$receipt_tmp" diff --git a/luci-app-smartsafehub/root/usr/libexec/smartsafehub-rpc-jobs b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-rpc-jobs new file mode 100755 index 000000000..5d002743a --- /dev/null +++ b/luci-app-smartsafehub/root/usr/libexec/smartsafehub-rpc-jobs @@ -0,0 +1,121 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-or-later +# Bounded, single-flight subprocesses for slow read-only scans / Hub calls. +# RPC callers accept a job and read snapshots. No user-provided command/URL. +set -eu +umask 077 +RUNTIME="${SMARTSAFEHUB_RPC_JOBS_RUNTIME:-/tmp/smartsafehub/rpc-jobs}" +DAEMON="${SMARTSAFEHUB_RPC_JOBS_DAEMON:-start-stop-daemon}" +SELF="${SMARTSAFEHUB_RPC_JOBS_SELF:-/usr/libexec/smartsafehub-rpc-jobs}" +CATALOG="${SMARTSAFEHUB_RPC_JOBS_CATALOG:-/usr/libexec/smartsafehub-apps}" +MANAGER="${SMARTSAFEHUB_RPC_JOBS_MANAGER:-/usr/libexec/smartsafehub-apps-manager}" +DEVICE="${SMARTSAFEHUB_RPC_JOBS_DEVICE:-/usr/libexec/smartsafehub-device}" + +valid_job() { + case "$1" in catalog|status|sizes|device-sync|pairing|recommended-sync|recommended-revoke) return 0;; esac + return 1 +} +valid_arg() { + case "$1" in ''|0|*[!0-9]*) return 1;; esac + [ "${#1}" -le 10 ] +} +state_path() { printf '%s/%s.state' "$RUNTIME" "$1"; } +lock_path() { printf '%s/%s.lock' "$RUNTIME" "$1"; } +# All fields come from fixed enums, epoch seconds and validated digits. +write_state() { + job="$1"; phase="$2"; code="$3"; argument="$4"; started="$5" + tmp="$(mktemp "$RUNTIME/$job.XXXXXXXX")" || return 1 + printf 'phase\t%s\ncode\t%s\nargument\t%s\nstarted\t%s\nupdated\t%s\n' \ + "$phase" "$code" "$argument" "$started" "$(date +%s)" > "$tmp" + mv -f "$tmp" "$(state_path "$job")" +} +read_field() { [ -r "$1" ] && sed -n "s/^$2$(printf '\t')//p" "$1" | head -n 1 || :; } + +ensure() { + job="$1"; mode="$2"; argument="$3" + now="$(date +%s)" + state="$(state_path "$job")"; lock="$(lock_path "$job")" + ttl=0 + case "$job" in + catalog) ttl=600;; status) ttl=15;; sizes) ttl=120;; device-sync) ttl=30;; + *) ttl=0;; + esac + if [ "$mode" = auto ]; then + # Suppress redundant requests and short retry storms after errors. + stamp="$(read_field "$state" updated)" + case "$stamp" in ''|*[!0-9]*) stamp=0;; esac + if [ $((now - stamp)) -ge 0 ] && [ $((now - stamp)) -lt "$ttl" ]; then + exit 0 + fi + if [ "$ttl" -eq 0 ]; then exit 2; fi + fi + if ! mkdir "$lock" 2>/dev/null; then + # Keep a live worker. Recover only an abandoned lock, not a slow worker. + pid="$(read_field "$lock/pid" pid)" + stamp="$(read_field "$state" started)" + case "$stamp" in ''|*[!0-9]*) stamp="$now";; esac + if [ "$((now - stamp))" -gt 180 ] && { [ -z "$pid" ] || ! kill -0 "$pid" 2>/dev/null; }; then + rm -f "$lock/pid" + rmdir "$lock" 2>/dev/null || exit 0 + mkdir "$lock" 2>/dev/null || exit 0 + else + # Explicit duplicate actions are not silently counted as completed. + [ "$mode" = auto ] && exit 0 + existing="$(read_field "$state" argument)" + [ "$argument" = "$existing" ] && exit 0 + exit 3 + fi + fi + write_state "$job" starting NONE "$argument" "$now" + if ! "$DAEMON" -S -b -x "$SELF" -- worker "$job" "$argument" >/dev/null 2>&1; then + write_state "$job" failed LAUNCH "$argument" "$now" + rmdir "$lock" 2>/dev/null || : + exit 1 + fi +} +worker_cleanup() { + if [ "${finished:-0}" -ne 1 ]; then + write_state "$job" failed E70 "$argument" "$started" || : + fi + rm -f "$lock/pid" + rmdir "$lock" 2>/dev/null || : +} +worker() { + job="$1"; argument="$2" + lock="$(lock_path "$job")" + started="$(read_field "$(state_path "$job")" started)" + case "$started" in ''|*[!0-9]*) started="$(date +%s)";; esac + finished=0 + trap 'worker_cleanup' EXIT + trap 'exit 70' HUP INT TERM + printf 'pid\t%s\n' "$$" > "$lock/pid" + write_state "$job" running NONE "$argument" "$started" + rc=0 + case "$job" in + catalog) "$CATALOG" || rc=$?;; + status) "$MANAGER" status || rc=$?;; + sizes) "$MANAGER" sizes || rc=$?;; + device-sync) "$DEVICE" status-sync || rc=$?;; + pairing) "$DEVICE" pairing-session || rc=$?;; + recommended-sync) "$DEVICE" recommended-sync || rc=$?;; + recommended-revoke) "$DEVICE" recommended-revoke "$argument" || rc=$?;; + esac + if [ "$rc" -eq 0 ]; then + write_state "$job" success NONE "$argument" "$started" + else + write_state "$job" failed "E$rc" "$argument" "$started" + fi + finished=1 +} +[ "$#" -ge 2 ] && [ "$#" -le 3 ] || exit 2 +mode="$1"; job="$2"; argument="${3:-}" +valid_job "$job" || exit 2 +if [ "$job" = recommended-revoke ]; then valid_arg "$argument" || exit 2 +else [ -z "$argument" ] || exit 2; fi +mkdir -p "$RUNTIME" || exit 1 +case "$mode" in + ensure) ensure "$job" auto "$argument";; + request) ensure "$job" explicit "$argument";; + worker) worker "$job" "$argument";; + *) exit 2;; +esac diff --git a/luci-app-smartsafehub/root/usr/share/rpcd/acl.d/luci-app-smartsafehub.json b/luci-app-smartsafehub/root/usr/share/rpcd/acl.d/luci-app-smartsafehub.json index 0ffbd9e82..3ddf19f46 100644 --- a/luci-app-smartsafehub/root/usr/share/rpcd/acl.d/luci-app-smartsafehub.json +++ b/luci-app-smartsafehub/root/usr/share/rpcd/acl.d/luci-app-smartsafehub.json @@ -10,6 +10,9 @@ "wifi_summary", "updates_status", "firmware_status", + "apps_catalog", + "apps_status", + "apps_metrics", "system_time_settings", "system_scheduled_reboot_settings", "health_status", @@ -50,6 +53,9 @@ "system_reboot", "updates_check", "updates_install", + "apps_install", + "apps_update", + "apps_remove", "updates_settings_update", "firmware_check", "firmware_prepare", diff --git a/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub.uc b/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub.uc index 3d7e0e96d..4b2b5b26e 100644 --- a/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub.uc +++ b/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub.uc @@ -2,6 +2,8 @@ 'use strict'; import { failure } from './smartsafehub/core.uc'; +import { read_apps_catalog } from './smartsafehub/apps.uc'; +import { read_apps_status, read_apps_metrics, install_app, update_app, remove_app } from './smartsafehub/apps-manager.uc'; import { read_connected_devices } from './smartsafehub/devices.uc'; import { discard_uploaded_backup, @@ -173,6 +175,42 @@ const methods = { return update_update_settings(request); }), }, + apps_catalog: { + args: { refresh: false }, + call: require_root_password(function(request) { + return read_apps_catalog(request); + }), + }, + apps_status: { + args: { refresh: false }, + call: require_root_password(function(request) { + return read_apps_status(request); + }), + }, + apps_metrics: { + args: { refresh: false }, + call: require_root_password(function(request) { + return read_apps_metrics(request); + }), + }, + apps_install: { + args: { app_id: '' }, + call: require_root_password(function(request) { + return install_app(request); + }), + }, + apps_update: { + args: { app_id: '' }, + call: require_root_password(function(request) { + return update_app(request); + }), + }, + apps_remove: { + args: { app_id: '' }, + call: require_root_password(function(request) { + return remove_app(request); + }), + }, firmware_status: { call: require_root_password(function(request) { return read_firmware_status(request); diff --git a/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/apps-manager.uc b/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/apps-manager.uc new file mode 100644 index 000000000..e990d224e --- /dev/null +++ b/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/apps-manager.uc @@ -0,0 +1,162 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +'use strict'; + +import * as fs from 'fs'; +import { failure, run_command, safe_call, success } from './core.uc'; +import { from_system_root, from_statvfs } from './apps-storage.uc'; +import { ensure_job, job_state, request_job } from './rpc-jobs.uc'; + +const MANAGER = '/usr/libexec/smartsafehub-apps-manager'; +const STATE = '/tmp/smartsafehub/apps-operation.state'; +const STATUS = '/tmp/smartsafehub/apps-status.tsv'; +const SIZES = '/tmp/smartsafehub/apps-size.tsv'; +const RESTORE_STATE = '/tmp/smartsafehub/apps-restore.state'; + +// OpenWrt procd already reports the writable root filesystem in system.info. +// Those counters are KiB, unlike ucode fs.statvfs() which returns blocks. +// Prefer the existing ubus connection, then fall back to statvfs without +// spawning df or allowing optional metrics to affect core Apps status. +function writable_storage() { + const info = safe_call('system', 'info', {}); + const root_storage = from_system_root(info?.root); + if (root_storage != null) + return root_storage; + + // Do not assume /overlay is present (e.g. ext4 or extroot installs). + // Both paths are fixed trusted paths. Each call is inexpensive. + for (let mount in [ '/overlay', '/' ]) { + let stats = null; + try { + stats = fs.statvfs(mount); + } + catch (e) { + continue; + } + const storage = from_statvfs(stats, mount); + if (storage != null) + return storage; + } + return null; +} + +function job() { + const state = { phase: 'idle', action: '', appId: '', code: '', operationId: '' }; + const raw = fs.readfile(STATE); + if (type(raw) != 'string' || length(raw) > 4096) return state; + for (let line in split(type(raw) == 'string' ? raw : '', /\r?\n/)) { + const fields = split(line, /\t/); + if (length(fields) != 2) continue; + const key = fields[0]; + const value = fields[1]; + if (key == 'phase' && match(value, /^(idle|starting|running|success|failed)$/) != null) + state.phase = value; + else if (key == 'action' && (value == 'install' || value == 'update' || value == 'remove')) + state.action = value; + else if (key == 'app_id' && match(value, /^[a-z0-9][a-z0-9-]{0,79}$/) != null) + state.appId = value; + else if (key == 'code' && match(value, /^(NONE|LAUNCH|E[0-9]{1,3})$/) != null) + state.code = value; + else if (key == 'operation_id' && match(value, /^[0-9]{1,12}-[0-9]{1,12}(-[0-9a-f]{16})?$/) != null) + state.operationId = value; + } + return state; +} + +function restore_status() { + const result = { phase: 'idle', appId: '', code: '' }; + const raw = fs.readfile(RESTORE_STATE); + if (type(raw) != 'string' || length(raw) > 4096) return result; + for (let line in split(raw, /\r?\n/)) { + const fields = split(line, /\t/); + if (length(fields) != 2) continue; + if (fields[0] == 'phase' && match(fields[1], /^(idle|starting|running|success|failed)$/) != null) + result.phase = fields[1]; + else if (fields[0] == 'app_id' && (fields[1] == '' || match(fields[1], /^[a-z0-9][a-z0-9-]{0,79}$/) != null)) + result.appId = fields[1]; + else if (fields[0] == 'code' && match(fields[1], /^(NONE|BUSY|TIMEOUT|INCOMPLETE|INVALID_MANIFEST|UNKNOWN|E[0-9]{1,3})$/) != null) + result.code = fields[1]; + } + return result; +} + +export function read_apps_status(request) { + if (request?.args?.refresh == true) request_job('status'); + else ensure_job('status'); + const scan = job_state('status'); + const raw = fs.readfile(STATUS); + if (type(raw) != 'string' || length(raw) > 16384) + return failure('APPS_STATUS_INVALID', '설치 상태 데이터가 올바르지 않습니다.'); + const installed = {}; + for (let line in split(raw, /\r?\n/)) { + const fields = split(line, /\t/); + if ((length(fields) != 4 && length(fields) != 5 && length(fields) != 6 && length(fields) != 7 && length(fields) != 8) || + match(fields[0], /^[a-z0-9][a-z0-9-]{0,79}$/) == null) + continue; + installed[fields[0]] = { + installed: fields[1] == '1', + partial: fields[2] == '1', + managed: fields[3] == '1', + // Only the local manifest scanner can mark a removed approval as retired. + retired: length(fields) == 8 && fields[7] == '1', + webUiReady: length(fields) >= 5 && fields[4] == '1', + updateAvailable: length(fields) >= 6 && fields[5] == '1', + // This is a representative installed APK version, not the Hub's + // approved app/catalog version. Never guess when missing. + installedVersion: length(fields) >= 7 && fields[1] == '1' && + match(fields[6], /^[a-zA-Z0-9_][a-zA-Z0-9._+~-]{0,99}$/) != null + ? fields[6] : null, + }; + } + return success({ job: job(), restore: restore_status(), installed: installed, + ready: type(raw) == 'string', + refreshing: scan.phase == 'starting' || scan.phase == 'running', + refreshFailed: scan.phase == 'failed' }); +}; + +// Optional data lives behind an independent RPC. A slow APK database lookup +// or filesystem error must never prevent installation/removal status checks. +export function read_apps_metrics(request) { + let storage = null; + try { + storage = writable_storage(); + } + catch (e) { + // Older/broken filesystem modules cannot disable core Apps operations. + warn('smartsafehub: Apps storage statistics unavailable\n'); + } + + const installedSizes = {}; + // Disk accounting is optional and runs outside rpcd. Parse only the + // last atomically committed snapshot; it may be empty on first load. + if (request?.args?.refresh == true) request_job('sizes'); + else ensure_job('sizes'); + const sizesScan = job_state('sizes'); + const raw = fs.readfile(SIZES); + if (type(raw) == 'string' && length(raw) <= 8192) { + for (let line in split(raw, /\r?\n/)) { + const fields = split(line, /\t/); + if (length(fields) != 2 || + match(fields[0], /^[a-z0-9][a-z0-9-]{0,79}$/) == null || + match(fields[1], /^(0|[1-9][0-9]{0,12})$/) == null) + continue; + installedSizes[fields[0]] = int(fields[1]); + } + } + return success({ storage: storage, installedSizes: installedSizes, + ready: type(raw) == 'string', + refreshing: sizesScan.phase == 'starting' || sizesScan.phase == 'running' }); +}; + +function start_apps_operation(request, action) { + // rpcd passes declared method parameters in request.args, not request itself. + const app_id = request?.args?.app_id; + if (type(app_id) != 'string' || match(app_id, /^[a-z0-9][a-z0-9-]{0,79}$/) == null) + return failure('APPS_INVALID_ID', '올바르지 않은 앱입니다.'); + if (!run_command([ MANAGER, 'start', action, app_id ], 5000)) + return failure('APPS_OPERATION_REJECTED', '다른 작업이 진행 중이거나 요청을 시작하지 못했습니다.'); + return success({ accepted: true, appId: app_id, action: action }); +} + +export function install_app(request) { return start_apps_operation(request, 'install'); }; +export function update_app(request) { return start_apps_operation(request, 'update'); }; +export function remove_app(request) { return start_apps_operation(request, 'remove'); }; diff --git a/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/apps-storage.uc b/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/apps-storage.uc new file mode 100644 index 000000000..02539c163 --- /dev/null +++ b/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/apps-storage.uc @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +'use strict'; + +const MAX_BYTES = 9007199254740991; // JavaScript Number.MAX_SAFE_INTEGER + +function valid_counter(value) { + return (type(value) == 'int' || type(value) == 'double') && + value >= 0 && value <= MAX_BYTES; +} + +function storage_bytes(total, available, mount) { + if (!valid_counter(total) || !valid_counter(available) || + total <= 0 || available > total) + return null; + return { mount: mount, totalBytes: total, availableBytes: available }; +} + +// procd system.info.root.total/avail are KiB, NOT bytes. In OpenWrt +// with overlayfs, / is the writable union and its free blocks come +// from the underlying writable overlay filesystem. +export function from_system_root(root) { + if (!root || !valid_counter(root.total) || !valid_counter(root.avail) || + root.total > MAX_BYTES / 1024 || root.avail > root.total) + return null; + return storage_bytes(root.total * 1024, root.avail * 1024, '/'); +}; + +// Filesystem fallback for firmware without procd root statistics. +// The ucode type() builtin calls integers "int", not "integer". +export function from_statvfs(stats, mount) { + if (!stats || (mount != '/overlay' && mount != '/')) + return null; + const frsize = valid_counter(stats.frsize) && stats.frsize > 0 + ? stats.frsize : stats.bsize; + if (!valid_counter(frsize) || frsize <= 0 || + !valid_counter(stats.blocks) || !valid_counter(stats.bavail) || + stats.blocks <= 0 || stats.bavail > stats.blocks || + stats.blocks > MAX_BYTES / frsize) + return null; + return storage_bytes(stats.blocks * frsize, stats.bavail * frsize, mount); +}; diff --git a/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/apps.uc b/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/apps.uc new file mode 100644 index 000000000..5040035bf --- /dev/null +++ b/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/apps.uc @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +'use strict'; + +import * as fs from 'fs'; +import { failure, success } from './core.uc'; +import { ensure_job, job_state, request_job } from './rpc-jobs.uc'; + +const CATALOG_FILE = '/tmp/smartsafehub/apps-catalog.json'; + +function text(value, max_length) { + return type(value) == 'string' && length(value) <= max_length ? value : ''; +} + +// Only open LuCI pages served by this router. Reject query strings, fragments, +// percent escapes, scheme-relative URLs and path traversal from catalog data. +function luci_web_ui_path(value) { + if (!text(value, 160) || + match(value, /^\/cgi-bin\/luci\/admin\/[a-z0-9_-]+(\/[a-z0-9_-]+)*$/) == null) + return ''; + return value; +} + +// This endpoint is *read-only*. The catalog never supplies executable +// commands, repository URLs or permissions to a package installer. The +// separate privileged installer must revalidate every approval in the future. +export function read_apps_catalog(request) { + // Never perform an HTTP request on rpcd's event loop. Serve a last-known + // display-only snapshot while the detached worker updates it atomically. + if (request?.args?.refresh == true) request_job('catalog'); + else ensure_job('catalog'); + const operation = job_state('catalog'); + const raw = fs.readfile(CATALOG_FILE); + const pending = operation.phase == 'starting' || operation.phase == 'running'; + if (type(raw) != 'string' || length(raw) < 2) { + return success({ schema: 1, deviceCode: '', firmwareBuildId: '', channel: '', apps: [], + ready: false, refreshing: pending, refreshFailed: operation.phase == 'failed' }); + } + if (length(raw) > 131072) { + return failure('APPS_CATALOG_INVALID', '앱 목록 데이터가 올바르지 않습니다.'); + } + + let data; + try { + data = json(raw); + } + catch (e) { + return failure('APPS_CATALOG_INVALID', '앱 목록을 읽지 못했습니다.'); + } + if (type(data) != 'object' || data?.schema != 1 || type(data?.apps) != 'array' || + length(data.apps) > 100 || !text(data?.device_code, 80) || + !text(data?.firmware_build_id, 80)) { + return failure('APPS_CATALOG_INVALID', '앱 목록 형식이 올바르지 않습니다.'); + } + + // A firmware change invalidates the old catalog before any cards are shown. + // The ROM metadata takes precedence over writable overlay metadata. + let metadataRaw = fs.readfile('/rom/usr/share/smartsafehub/firmware.json'); + if (type(metadataRaw) != 'string' || !length(metadataRaw)) + metadataRaw = fs.readfile('/usr/share/smartsafehub/firmware.json'); + if (type(metadataRaw) == 'string' && length(metadataRaw)) { + let metadata = null; + try { metadata = json(metadataRaw); } catch (e) { /* reject stale catalog below */ } + if (metadata == null || metadata?.device_code != data.device_code || + metadata?.build_id != data.firmware_build_id || + (metadata?.channel ?? 'stable') != (data?.channel ?? 'stable')) + return success({ schema: 1, deviceCode: '', firmwareBuildId: '', channel: '', apps: [], + ready: false, refreshing: pending, refreshFailed: operation.phase == 'failed' }); + } + const apps = []; + for (let item in data.apps) { + if (type(item) != 'object' || item.runtime != 'router' || item.installer != 'apk') { + continue; + } + const id = text(item?.id, 80); + const name = text(item?.name, 120); + if (!length(id) || !length(name) || match(id, /^[a-z0-9][a-z0-9-]{0,79}$/) == null) { + continue; + } + // Backward-compatible route for the already approved nlbwmon catalog. + // The page is only launchable if its UI package is actually installed. + let path = ''; + if (id == 'wake-on-lan') { + if (item?.web_ui?.type == 'luci' && + item?.web_ui?.path == '/cgi-bin/luci/admin/services/wol' && + item?.web_ui?.package == 'luci-app-wol') + path = '/cgi-bin/luci/admin/services/wol'; + } + else if (item?.web_ui?.type == 'luci') + path = luci_web_ui_path(item.web_ui.path); + else if (id == 'retro-arcade' && item?.web_ui?.type == 'static' && + item?.web_ui?.path == '/retro-arcade/' && + item?.web_ui?.package == 'smartsafehub-app-retro-arcade') + path = '/retro-arcade/'; + else if (id == 'network-usage-monitor') + path = '/cgi-bin/luci/admin/services/nlbw/display'; + // Only UI copy crosses into the unprivileged browser. All package hashes, + // permissions and install descriptors remain server-side until an installer + // with independent verification is implemented. + push(apps, { + id: id, + name: name, + summary: text(item?.summary, 320), + description: text(item?.description, 2000), + category: text(item?.category, 64), + version: text(item?.version, 64), + webUi: length(path) ? { type: id == 'retro-arcade' && path == '/retro-arcade/' ? 'static' : 'luci', path: path } : null, + }); + } + return success({ + schema: 1, + deviceCode: data.device_code, + firmwareBuildId: data.firmware_build_id, + channel: text(data?.channel, 16), + apps: apps, + ready: true, + refreshing: pending, + refreshFailed: operation.phase == 'failed', + }); +}; diff --git a/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/device-registration.uc b/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/device-registration.uc index c1a013db3..6e0a4fce2 100644 --- a/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/device-registration.uc +++ b/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/device-registration.uc @@ -1,7 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later 'use strict'; import * as fs from 'fs'; -import { failure, run_command, success } from './core.uc'; +import { failure, success } from './core.uc'; +import { ensure_job, job_state, request_job } from './rpc-jobs.uc'; const STATE_FILE = '/tmp/smartsafehub/device.json'; const HELPER = '/usr/libexec/smartsafehub-device'; function read_state() { @@ -48,7 +49,11 @@ export function read_recommended_rules_status(request) { // A busy SafeShield refresh is pending work, not an application failure. // Keep an older verified receipt for its revision without treating a newer // in-progress operation as already complete. - const syncStatus = sync?.status == 'pending' ? 'pending' : + const syncOperation = job_state('recommended-sync'); + const revokeOperation = job_state('recommended-revoke'); + const operationRunning = syncOperation.phase == 'starting' || syncOperation.phase == 'running' || + revokeOperation.phase == 'starting' || revokeOperation.phase == 'running'; + const syncStatus = operationRunning || sync?.status == 'pending' ? 'pending' : confirmed ? 'confirmed' : sync?.status == 'delayed' ? 'delayed' : sync?.status == 'failed' ? 'failed' : 'pending'; const syncWarning = confirmed && (sync?.status == 'failed' || sync?.status == 'delayed'); @@ -60,32 +65,45 @@ export function read_recommended_rules_status(request) { confirmedDomains: confirmedDomains, syncStatus: syncStatus, syncWarning: syncWarning, - syncStage: sync?.stage ?? null, + syncStage: operationRunning ? 'server_sync' : (sync?.stage ?? null), syncReason: sync?.reason ?? null, lastCheckedAt: sync?.checkedAt ?? 0, lastDeviceSyncAt: device?.lastSuccessAt ?? 0, nextDeviceSyncAt: device?.nextSyncAt ?? 0, - accountRegistered: device?.accountRegistered ?? false + accountRegistered: device?.accountRegistered ?? false, + operation: syncOperation, + revokeOperation: revokeOperation }); }; +// A request means "accepted", never "the remote rule has been applied". +// The local receipt and operation phase remain separate authoritative fields. export function refresh_recommended_rules_status(request) { - // The blocklist download and the Hub device sync are different operations. - // Reuse the authenticated device sync, never the SafeShield blocklist refresh. - if (!run_command([ HELPER, 'recommended-sync' ], 25000)) { - const latest = read_json_file(RECOMMENDED_SYNC_STATUS); - if (latest?.status != 'pending' && latest?.status != 'delayed') - return failure('RECOMMENDED_SYNC_UNAVAILABLE', 'SmartSafeHub 서버와 동기화하지 못했습니다. 잠시 후 다시 시도해 주세요.'); - } + if (!request_job('recommended-sync')) + return failure('RECOMMENDED_SYNC_BUSY', '이미 다른 추천 규칙 동기화 작업이 진행 중입니다.'); return read_recommended_rules_status(request); }; export function revoke_recommended_rule(request) { const rule_id = request?.args?.rule_id; if (rule_id == null || match(sprintf('%s', rule_id), /^[1-9][0-9]{0,9}$/) == null) return failure('INVALID_RULE_ID', '적용 해제할 추천 규칙을 선택해 주세요.'); - if (!run_command([ HELPER, 'recommended-revoke', sprintf('%s', rule_id) ], 25000)) - return failure('RECOMMENDED_REVOKE_FAILED', '규칙 해제 또는 SafeShield 반영에 실패했습니다. 서버 변경은 다음 동기화에서 반영될 수 있습니다.'); + if (!request_job('recommended-revoke', rule_id)) + return failure('RECOMMENDED_REVOKE_BUSY', '이미 추천 규칙 해제 작업이 진행 중입니다.'); return read_recommended_rules_status(request); }; -export function read_device_registration_status(request) { const state = read_state(); return state != null ? success(state) : failure('DEVICE_STATE_INVALID', '기기 등록 상태를 읽지 못했습니다.'); }; -export function refresh_device_registration_status(request) { if (!run_command([ HELPER, 'status-sync' ], 25000)) return failure('DEVICE_SYNC_FAILED', 'SmartSafeHub 계정 연결 상태를 확인하지 못했습니다.'); const state = read_state(); return state != null ? success(state) : failure('DEVICE_STATE_INVALID', '기기 등록 상태를 읽지 못했습니다.'); }; -export function refresh_device_pairing(request) { if (!run_command([ HELPER, 'pairing-session' ], 15000)) return failure('DEVICE_PAIRING_FAILED', 'SmartSafeHub 계정 연결 코드를 발급하지 못했습니다.'); const state = read_state(); return state != null ? success(state) : failure('DEVICE_STATE_INVALID', '기기 등록 상태를 읽지 못했습니다.'); }; +export function read_device_registration_status(request) { + const state = read_state(); + if (state == null) return failure('DEVICE_STATE_INVALID', '기기 등록 상태를 읽지 못했습니다.'); + state.operation = job_state('device-sync'); + state.pairingOperation = job_state('pairing'); + return success(state); +}; +export function refresh_device_registration_status(request) { + if (!ensure_job('device-sync')) + return failure('DEVICE_SYNC_LAUNCH_FAILED', '서버 상태 확인을 시작하지 못했습니다.'); + return read_device_registration_status(request); +}; +export function refresh_device_pairing(request) { + if (!request_job('pairing')) + return failure('DEVICE_PAIRING_BUSY', '연결 코드 발급을 시작하지 못했습니다. 잠시 후 다시 시도해 주세요.'); + return read_device_registration_status(request); +}; diff --git a/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/rpc-jobs.uc b/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/rpc-jobs.uc new file mode 100644 index 000000000..0ecc5985c --- /dev/null +++ b/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/rpc-jobs.uc @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +'use strict'; + +import * as fs from 'fs'; +import { run_command } from './core.uc'; + +const HELPER = '/usr/libexec/smartsafehub-rpc-jobs'; +const RUNTIME = '/tmp/smartsafehub/rpc-jobs/'; + +// Only fixed job names reach the privileged launcher. Never accept arbitrary +// executable paths, shell fragments or network locations from the browser. +export function job_state(name) { + const state = { phase: 'idle', code: '', argument: '', updatedAt: 0 }; + const raw = fs.readfile(RUNTIME + name + '.state'); + if (type(raw) != 'string' || length(raw) > 1024) return state; + for (let line in split(raw, /\r?\n/)) { + const fields = split(line, /\t/); + if (length(fields) != 2) continue; + if (fields[0] == 'phase' && match(fields[1], /^(starting|running|success|failed)$/) != null) + state.phase = fields[1]; + else if (fields[0] == 'code' && match(fields[1], /^(NONE|LAUNCH|E[0-9]{1,3})$/) != null) + state.code = fields[1]; + else if (fields[0] == 'argument' && match(fields[1], /^[0-9]{0,10}$/) != null) + state.argument = fields[1]; + else if (fields[0] == 'updated' && match(fields[1], /^[0-9]{1,12}$/) != null) + state.updatedAt = int(fields[1]); + } + return state; +}; + +export function ensure_job(name) { + return run_command([ HELPER, 'ensure', name ], 1500); +}; + +export function request_job(name, argument) { + const command = [ HELPER, 'request', name ]; + if (argument != null) push(command, sprintf('%s', argument)); + return run_command(command, 1500); +}; diff --git a/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/system.uc b/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/system.uc index 58936f14b..a6647d7da 100644 --- a/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/system.uc +++ b/luci-app-smartsafehub/root/usr/share/rpcd/ucode/smartsafehub/system.uc @@ -4,6 +4,7 @@ import * as fs from 'fs'; import { read_activity_history } from './activity.uc'; +import { from_system_root, from_statvfs } from './apps-storage.uc'; import { defer_call, @@ -563,6 +564,27 @@ export function reboot_system(request) { }); }; +// The dashboard already has system.info; some firmware images omit its root +// counters. Reuse Apps' statvfs fallback instead of displaying an empty donut. +// No extra ubus request or spawned process is required. +function dashboard_writable_storage(root) { + const from_root = from_system_root(root); + if (from_root != null) + return from_root; + + for (let mount in [ '/overlay', '/' ]) { + try { + const storage = from_statvfs(fs.statvfs(mount), mount); + if (storage != null) + return storage; + } + catch (e) { + // Try the next known writable root; failure is optional. + } + } + return null; +} + function system_status_payload(board, info, wan) { const release = board?.release ?? {}; const memory = info?.memory ?? {}; @@ -585,6 +607,8 @@ function system_status_payload(board, info, wan) { runtime: { uptime: number_value(info?.uptime), localtime: number_value(info?.localtime), + // Reuse the same writable root counters as Apps; no extra RPC or APK scan. + storage: dashboard_writable_storage(info?.root), load: [ number_value(load?.[0]), number_value(load?.[1]), diff --git a/luci-app-smartsafehub/root/usr/share/ucode/luci/template/smartsafehub/login.ut b/luci-app-smartsafehub/root/usr/share/ucode/luci/template/smartsafehub/login.ut index c479c13d1..0cc2ba22e 100644 --- a/luci-app-smartsafehub/root/usr/share/ucode/luci/template/smartsafehub/login.ut +++ b/luci-app-smartsafehub/root/usr/share/ucode/luci/template/smartsafehub/login.ut @@ -10,16 +10,16 @@ SmartSafeHub - +
- + diff --git a/luci-app-smartsafehub/root/www/luci-static/smartsafehub/app.css b/luci-app-smartsafehub/root/www/luci-static/smartsafehub/app.css index 33ff16ce1..4958fa0ef 100644 --- a/luci-app-smartsafehub/root/www/luci-static/smartsafehub/app.css +++ b/luci-app-smartsafehub/root/www/luci-static/smartsafehub/app.css @@ -1,3 +1,3 @@ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */ -@layer properties{:host,*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-outline-style:solid;--tw-ease:initial}::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-outline-style:solid;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:#fef2f2;--color-red-100:#ffe2e2;--color-red-200:#ffcaca;--color-red-300:#ffa3a3;--color-red-500:#fb2c36;--color-red-700:#bf000f;--color-red-800:#9f0712;--color-red-900:#82181a;--color-red-950:#460809;--color-amber-50:#fffbeb;--color-amber-100:#fef3c6;--color-amber-200:#fee685;--color-amber-300:#ffd236;--color-amber-500:#f99c00;--color-amber-600:#dd7400;--color-amber-700:#b75000;--color-amber-800:#953d00;--color-amber-900:#7b3306;--color-amber-950:#461901;--color-emerald-50:#ecfdf5;--color-emerald-100:#d0fae5;--color-emerald-200:#a4f4cf;--color-emerald-500:#00bb7f;--color-emerald-700:#007956;--color-emerald-800:#005f46;--color-emerald-900:#004e3b;--color-emerald-950:#002c22;--color-teal-50:#f0fdfa;--color-teal-100:#cbfbf1;--color-teal-200:#96f7e4;--color-teal-300:#46ecd5;--color-teal-400:#00d3bd;--color-teal-500:#00baa7;--color-teal-600:#009588;--color-teal-700:#00776e;--color-teal-800:#005f5a;--color-teal-900:#0b4f4a;--color-teal-950:#022f2e;--color-sky-50:#f0f9ff;--color-sky-100:#dff2fe;--color-sky-200:#b8e6fe;--color-sky-600:#0084cc;--color-sky-700:#0069a4;--color-sky-800:#005986;--color-sky-950:#052f4a;--color-blue-50:#eff6ff;--color-blue-200:#bedbff;--color-blue-700:#1447e6;--color-rose-50:#fff1f2;--color-rose-100:#ffe4e6;--color-rose-200:#ffccd3;--color-rose-300:#ffa2ae;--color-rose-600:#e70044;--color-rose-700:#c20039;--color-rose-800:#a30037;--color-rose-900:#8b0836;--color-rose-950:#4d0218;--color-slate-50:#f8fafc;--color-slate-100:#f1f5f9;--color-slate-200:#e2e8f0;--color-slate-300:#cad5e2;--color-slate-400:#90a1b9;--color-slate-500:#62748e;--color-slate-600:#45556c;--color-slate-700:#314158;--color-slate-800:#1d293d;--color-slate-900:#0f172b;--color-slate-950:#020618;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--animate-bounce:bounce 1s infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}@supports (color:color(display-p3 0 0 0)){:root,:host{--color-red-50:color(display-p3 .988669 .951204 .950419);--color-red-100:color(display-p3 .980386 .889727 .887779);--color-red-200:color(display-p3 .969562 .798149 .794299);--color-red-300:color(display-p3 .956922 .651886 .645122);--color-red-500:color(display-p3 .903738 .262579 .253307);--color-red-700:color(display-p3 .692737 .116232 .104679);--color-red-800:color(display-p3 .569606 .121069 .108493);--color-red-900:color(display-p3 .466906 .133198 .12139);--color-red-950:color(display-p3 .25064 .0550983 .0468818);--color-amber-50:color(display-p3 .997804 .985047 .926312);--color-amber-100:color(display-p3 .989391 .954583 .796328);--color-amber-200:color(display-p3 .979824 .904554 .57325);--color-amber-300:color(display-p3 .974327 .83063 .33298);--color-amber-500:color(display-p3 .93994 .620584 .0585367);--color-amber-600:color(display-p3 .827144 .467166 .0336006);--color-amber-700:color(display-p3 .67989 .32771 .0520514);--color-amber-800:color(display-p3 .547533 .256058 .0728326);--color-amber-900:color(display-p3 .445958 .216422 .0823321);--color-amber-950:color(display-p3 .252662 .109091 .026881);--color-emerald-50:color(display-p3 .936818 .989882 .961937);--color-emerald-100:color(display-p3 .848335 .975974 .901691);--color-emerald-200:color(display-p3 .713164 .947563 .822283);--color-emerald-500:color(display-p3 .267113 .726847 .508397);--color-emerald-700:color(display-p3 .164041 .470229 .343508);--color-emerald-800:color(display-p3 .135396 .371401 .277561);--color-emerald-900:color(display-p3 .117821 .302975 .234501);--color-emerald-950:color(display-p3 .0549113 .170434 .13484);--color-teal-50:color(display-p3 .951444 .990904 .98112);--color-teal-100:color(display-p3 .834533 .980328 .946428);--color-teal-200:color(display-p3 .675869 .957879 .896029);--color-teal-300:color(display-p3 .484989 .914726 .835079);--color-teal-400:color(display-p3 .322787 .822056 .744388);--color-teal-500:color(display-p3 .266569 .721518 .655462);--color-teal-600:color(display-p3 .207114 .579584 .53668);--color-teal-700:color(display-p3 .174094 .461318 .433866);--color-teal-800:color(display-p3 .1457 .367051 .350749);--color-teal-900:color(display-p3 .135344 .303314 .290629);--color-teal-950:color(display-p3 .0664925 .181482 .179465);--color-sky-50:color(display-p3 .946501 .975402 .998336);--color-sky-100:color(display-p3 .889195 .946622 .992447);--color-sky-200:color(display-p3 .758153 .897447 .986665);--color-sky-600:color(display-p3 .162505 .509376 .796082);--color-sky-700:color(display-p3 .130314 .404568 .640847);--color-sky-800:color(display-p3 .120719 .343083 .524405);--color-sky-950:color(display-p3 .0726429 .180783 .28188);--color-blue-50:color(display-p3 .941826 .963151 .995385);--color-blue-200:color(display-p3 .76688 .855207 .987483);--color-blue-700:color(display-p3 .1379 .274983 .867624);--color-rose-50:color(display-p3 .989671 .946597 .949215);--color-rose-100:color(display-p3 .982241 .897232 .902568);--color-rose-200:color(display-p3 .96875 .808776 .827317);--color-rose-300:color(display-p3 .96017 .647703 .683715);--color-rose-600:color(display-p3 .848792 .102011 .269259);--color-rose-700:color(display-p3 .711801 .0770816 .226777);--color-rose-800:color(display-p3 .591248 .0929065 .220097);--color-rose-900:color(display-p3 .498064 .104884 .214595);--color-rose-950:color(display-p3 .275407 .0406065 .0990695);--color-slate-50:color(display-p3 .974377 .979815 .986207);--color-slate-100:color(display-p3 .947345 .959969 .97483);--color-slate-200:color(display-p3 .890322 .909405 .939294);--color-slate-300:color(display-p3 .800294 .834432 .882803);--color-slate-400:color(display-p3 .577446 .629622 .716602);--color-slate-500:color(display-p3 .397645 .452653 .547642);--color-slate-600:color(display-p3 .283418 .332214 .416355);--color-slate-700:color(display-p3 .205992 .253487 .336039);--color-slate-800:color(display-p3 .121994 .158688 .232363);--color-slate-900:color(display-p3 .0639692 .0891152 .163036);--color-slate-950:color(display-p3 .0102437 .0227555 .0878731)}}@supports (color:lab(0% 0 0)){:root,:host{--color-red-50:lab(96.5005% 4.18508 1.52328);--color-red-100:lab(92.243% 10.2865 3.83865);--color-red-200:lab(86.017% 19.8815 7.75869);--color-red-300:lab(76.5514% 36.422 15.5335);--color-red-500:lab(55.4814% 75.0732 48.8528);--color-red-700:lab(40.4273% 67.2623 53.7441);--color-red-800:lab(33.7174% 55.8993 41.0293);--color-red-900:lab(28.5139% 44.5539 29.0463);--color-red-950:lab(13.003% 29.04 16.7519);--color-amber-50:lab(98.6252% -.635922 8.42309);--color-amber-100:lab(95.916% -1.21653 23.111);--color-amber-200:lab(91.7203% -.505269 49.9084);--color-amber-300:lab(86.4156% 6.13147 78.3961);--color-amber-500:lab(72.7183% 31.8672 97.9407);--color-amber-600:lab(60.3514% 40.5624 87.1228);--color-amber-700:lab(47.2709% 42.9082 69.2966);--color-amber-800:lab(37.8822% 37.1699 52.2718);--color-amber-900:lab(31.2288% 30.2627 40.0378);--color-amber-950:lab(15.8111% 20.9107 23.3752);--color-emerald-50:lab(97.8462% -6.94966 1.85487);--color-emerald-100:lab(94.9004% -17.0769 5.63836);--color-emerald-200:lab(90.2247% -31.039 9.47084);--color-emerald-500:lab(66.9756% -58.27 19.5419);--color-emerald-700:lab(44.4871% -41.0396 11.0361);--color-emerald-800:lab(35.3675% -33.1188 8.04002);--color-emerald-900:lab(28.8637% -26.9249 5.45986);--color-emerald-950:lab(15.0582% -17.9507 2.38369);--color-teal-50:lab(98.3189% -4.74921 -.111711);--color-teal-100:lab(95.1845% -17.4212 -.425422);--color-teal-200:lab(90.7612% -33.1343 -.542295);--color-teal-300:lab(84.8977% -48.1516 -1.3321);--color-teal-400:lab(76.0109% -53.3483 -2.27906);--color-teal-500:lab(67.3859% -49.0983 -2.63511);--color-teal-600:lab(55.0223% -41.0774 -3.90277);--color-teal-700:lab(44.4134% -33.1436 -4.22149);--color-teal-800:lab(35.5975% -26.6648 -4.34487);--color-teal-900:lab(29.506% -21.4706 -3.59886);--color-teal-950:lab(16.6371% -15.3183 -3.81732);--color-sky-50:lab(97.3623% -2.33802 -4.13098);--color-sky-100:lab(94.3709% -4.56053 -8.23453);--color-sky-200:lab(88.6983% -11.3978 -16.8488);--color-sky-600:lab(51.7754% -11.4712 -49.8349);--color-sky-700:lab(41.6013% -9.10804 -42.5647);--color-sky-800:lab(35.164% -9.57692 -34.4068);--color-sky-950:lab(17.8299% -5.31271 -21.1584);--color-blue-50:lab(96.492% -1.14644 -5.11479);--color-blue-200:lab(86.15% -4.04379 -21.0797);--color-blue-700:lab(36.9089% 35.0961 -85.6872);--color-rose-50:lab(96.2369% 4.94155 1.28011);--color-rose-100:lab(92.8221% 9.86832 2.60075);--color-rose-200:lab(86.806% 19.1909 4.07754);--color-rose-300:lab(76.6339% 38.3549 9.68835);--color-rose-600:lab(49.1882% 81.577 36.0311);--color-rose-700:lab(41.1651% 71.6251 30.3087);--color-rose-800:lab(34.6481% 60.802 20.1957);--color-rose-900:lab(29.7104% 51.514 12.6253);--color-rose-950:lab(14.2323% 34.0086 9.80922);--color-slate-50:lab(98.1434% -.369519 -1.05966);--color-slate-100:lab(96.286% -.852436 -2.46847);--color-slate-200:lab(91.7353% -.998765 -4.76968);--color-slate-300:lab(84.7652% -1.94535 -7.93337);--color-slate-400:lab(65.5349% -2.25151 -14.5072);--color-slate-500:lab(48.0876% -2.03595 -16.5814);--color-slate-600:lab(35.5623% -1.74978 -15.4316);--color-slate-700:lab(26.9569% -1.47016 -15.6993);--color-slate-800:lab(16.132% -.318035 -14.6672);--color-slate-900:lab(7.78673% 1.82345 -15.0537);--color-slate-950:lab(1.76974% 1.32743 -9.28855)}}}@layer base{*,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::-webkit-file-upload-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::-webkit-file-upload-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:-webkit-any([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:-webkit-any([multiple],[size])) optgroup option{padding-inline-start:20px}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::-webkit-file-upload-button{margin-inline-end:4px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-year-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-month-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-day-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-hour-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-minute-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-second-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-millisecond-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-meridiem-field{padding-block-start:0;padding-block-end:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button{-webkit-appearance:button;appearance:button}input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;appearance:button}::-webkit-file-upload-button{-webkit-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;bottom:0;left:0;right:0}.inset-y-0{top:0;bottom:0}.top-0{top:0}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1{top:var(--spacing)}.top-\[4\.5rem\]{top:4.5rem}.right-0{right:0}.right-0\.5{right:calc(var(--spacing) * .5)}.right-1{right:var(--spacing)}.left-0{left:0}.left-1{left:var(--spacing)}.left-6{left:calc(var(--spacing) * 6)}.isolate{isolation:isolate}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[1000\]{z-index:1000}.m-0{margin:0}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-auto{margin-inline-start:auto;margin-inline-end:auto}.my-5{margin-block:calc(var(--spacing) * 5)}.my-6{margin-block:calc(var(--spacing) * 6)}.my-auto{margin-block-start:auto;margin-block-end:auto}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mb-0{margin-bottom:0}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-0{margin-left:0}.ml-1{margin-left:var(--spacing)}.ml-3{margin-left:calc(var(--spacing) * 3)}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-10{height:calc(var(--spacing) * 10)}.h-44{height:calc(var(--spacing) * 44)}.h-\[4\.5rem\]{height:4.5rem}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-\[20rem\]{max-height:20rem}.max-h-\[22rem\]{max-height:22rem}.max-h-\[28rem\]{max-height:28rem}.min-h-9{min-height:calc(var(--spacing) * 9)}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-14{min-height:calc(var(--spacing) * 14)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-52{min-height:calc(var(--spacing) * 52)}.min-h-\[4\.5rem\]{min-height:4.5rem}.min-h-screen{min-height:100vh}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[68\%\]{max-width:68%}.max-w-\[288px\]{max-width:288px}.max-w-\[1600px\]{max-width:1600px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-20{min-width:calc(var(--spacing) * 20)}.min-w-24{min-width:calc(var(--spacing) * 24)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.translate-x-1\/2{--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-180{rotate:180deg}.animate-bounce{animation:var(--animate-bounce)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.resize{resize:both}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-7>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 7) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 7) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-5{column-gap:calc(var(--spacing) * 5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-slate-200>:not(:last-child)){border-color:var(--color-slate-200)}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-300{border-color:var(--color-amber-300)}.border-current{border-color:currentColor}.border-emerald-200{border-color:var(--color-emerald-200)}.border-emerald-700{border-color:var(--color-emerald-700)}.border-red-200{border-color:var(--color-red-200)}.border-red-700{border-color:var(--color-red-700)}.border-rose-200{border-color:var(--color-rose-200)}.border-rose-300{border-color:var(--color-rose-300)}.border-sky-100{border-color:var(--color-sky-100)}.border-sky-200{border-color:var(--color-sky-200)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.border-teal-200{border-color:var(--color-teal-200)}.border-teal-300{border-color:var(--color-teal-300)}.border-teal-600{border-color:var(--color-teal-600)}.border-teal-700{border-color:var(--color-teal-700)}.border-white\/80{border-color:#fffc}@supports (color:color-mix(in lab, red, red)){.border-white\/80{border-color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-50\/70{background-color:#fffbebb3}@supports (color:color-mix(in lab, red, red)){.bg-amber-50\/70{background-color:color-mix(in oklab, var(--color-amber-50) 70%, transparent)}}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-600{background-color:var(--color-amber-600)}.bg-amber-700{background-color:var(--color-amber-700)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-50\/70{background-color:#ecfdf5b3}@supports (color:color-mix(in lab, red, red)){.bg-emerald-50\/70{background-color:color-mix(in oklab, var(--color-emerald-50) 70%, transparent)}}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-700{background-color:var(--color-emerald-700)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-700{background-color:var(--color-red-700)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-50\/70{background-color:#fff1f2b3}@supports (color:color-mix(in lab, red, red)){.bg-rose-50\/70{background-color:color-mix(in oklab, var(--color-rose-50) 70%, transparent)}}.bg-rose-100{background-color:var(--color-rose-100)}.bg-rose-700{background-color:var(--color-rose-700)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-50\/60{background-color:#f0f9ff99}@supports (color:color-mix(in lab, red, red)){.bg-sky-50\/60{background-color:color-mix(in oklab, var(--color-sky-50) 60%, transparent)}}.bg-sky-600{background-color:var(--color-sky-600)}.bg-sky-700{background-color:var(--color-sky-700)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-50\/70{background-color:#f8fafcb3}@supports (color:color-mix(in lab, red, red)){.bg-slate-50\/70{background-color:color-mix(in oklab, var(--color-slate-50) 70%, transparent)}}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-400{background-color:var(--color-slate-400)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-950{background-color:var(--color-slate-950)}.bg-slate-950\/70{background-color:#020618b3}@supports (color:color-mix(in lab, red, red)){.bg-slate-950\/70{background-color:color-mix(in oklab, var(--color-slate-950) 70%, transparent)}}.bg-teal-50{background-color:var(--color-teal-50)}.bg-teal-100{background-color:var(--color-teal-100)}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-600{background-color:var(--color-teal-600)}.bg-teal-700{background-color:var(--color-teal-700)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/70{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.bg-white\/70{background-color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab, red, red)){.bg-white\/95{background-color:color-mix(in oklab, var(--color-white) 95%, transparent)}}.p-0{padding:0}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-10{padding-block:calc(var(--spacing) * 10)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-12{padding-right:calc(var(--spacing) * 12)}.pb-1{padding-bottom:var(--spacing)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-9{padding-left:calc(var(--spacing) * 9)}.pl-11{padding-left:calc(var(--spacing) * 11)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.7rem\]{font-size:.7rem}.text-\[0\.65rem\]{font-size:.65rem}.text-\[0\.68rem\]{font-size:.68rem}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-900\/80{color:#7b3306cc}@supports (color:color-mix(in lab, red, red)){.text-amber-900\/80{color:color-mix(in oklab, var(--color-amber-900) 80%, transparent)}}.text-amber-950{color:var(--color-amber-950)}.text-blue-700{color:var(--color-blue-700)}.text-current{color:currentColor}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-800{color:var(--color-emerald-800)}.text-emerald-900{color:var(--color-emerald-900)}.text-emerald-950{color:var(--color-emerald-950)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-red-900{color:var(--color-red-900)}.text-red-950{color:var(--color-red-950)}.text-rose-600{color:var(--color-rose-600)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-rose-900{color:var(--color-rose-900)}.text-rose-950{color:var(--color-rose-950)}.text-sky-700{color:var(--color-sky-700)}.text-sky-800{color:var(--color-sky-800)}.text-sky-950{color:var(--color-sky-950)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-slate-950{color:var(--color-slate-950)}.text-teal-300{color:var(--color-teal-300)}.text-teal-600{color:var(--color-teal-600)}.text-teal-700{color:var(--color-teal-700)}.text-teal-800{color:var(--color-teal-800)}.text-teal-950{color:var(--color-teal-950)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.accent-teal-700{accent-color:var(--color-teal-700)}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-slate-900\/5{--tw-shadow-color:#0f172b0d}@supports (color:color-mix(in lab, red, red)){.shadow-slate-900\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-900) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-slate-950\/10{--tw-shadow-color:#0206181a}@supports (color:color-mix(in lab, red, red)){.shadow-slate-950\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-950) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-amber-200{--tw-ring-color:var(--color-amber-200)}.ring-blue-200{--tw-ring-color:var(--color-blue-200)}.ring-emerald-200{--tw-ring-color:var(--color-emerald-200)}.ring-red-200{--tw-ring-color:var(--color-red-200)}.ring-rose-200{--tw-ring-color:var(--color-rose-200)}.ring-sky-100{--tw-ring-color:var(--color-sky-100)}.ring-sky-200{--tw-ring-color:var(--color-sky-200)}.ring-slate-100{--tw-ring-color:var(--color-slate-100)}.ring-slate-200{--tw-ring-color:var(--color-slate-200)}.ring-teal-100{--tw-ring-color:var(--color-teal-100)}.ring-teal-200{--tw-ring-color:var(--color-teal-200)}.ring-white{--tw-ring-color:var(--color-white)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\]{transition-property:left;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.ring-inset{--tw-ring-inset:inset}.group-open\:hidden:-webkit-any(:where(.group):-webkit-any([open],:popover-open,:open) *){display:none}.group-open\:hidden:is(:where(.group):is([open],:popover-open,:open) *){display:none}.group-open\:inline-block:-webkit-any(:where(.group):-webkit-any([open],:popover-open,:open) *){display:inline-block}.group-open\:inline-block:is(:where(.group):is([open],:popover-open,:open) *){display:inline-block}.group-open\:inline-flex:-webkit-any(:where(.group):-webkit-any([open],:popover-open,:open) *){display:inline-flex}.group-open\:inline-flex:is(:where(.group):is([open],:popover-open,:open) *){display:inline-flex}.placeholder\:text-slate-400::placeholder{color:var(--color-slate-400)}.first\:mt-0:first-child{margin-top:0}.first\:pt-0:first-child{padding-top:0}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:0}@media (hover:hover){.hover\:border-emerald-800:hover{border-color:var(--color-emerald-800)}.hover\:border-red-200:hover{border-color:var(--color-red-200)}.hover\:border-red-300:hover{border-color:var(--color-red-300)}.hover\:border-red-800:hover{border-color:var(--color-red-800)}.hover\:border-slate-300:hover{border-color:var(--color-slate-300)}.hover\:border-teal-200:hover{border-color:var(--color-teal-200)}.hover\:border-teal-300:hover{border-color:var(--color-teal-300)}.hover\:border-teal-400:hover{border-color:var(--color-teal-400)}.hover\:border-teal-800:hover{border-color:var(--color-teal-800)}.hover\:bg-amber-50:hover{background-color:var(--color-amber-50)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-amber-700:hover{background-color:var(--color-amber-700)}.hover\:bg-amber-800:hover{background-color:var(--color-amber-800)}.hover\:bg-black\/5:hover{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/5:hover{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.hover\:bg-emerald-800:hover{background-color:var(--color-emerald-800)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-800:hover{background-color:var(--color-red-800)}.hover\:bg-rose-50:hover{background-color:var(--color-rose-50)}.hover\:bg-rose-100:hover{background-color:var(--color-rose-100)}.hover\:bg-rose-800:hover{background-color:var(--color-rose-800)}.hover\:bg-sky-800:hover{background-color:var(--color-sky-800)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}.hover\:bg-teal-50:hover{background-color:var(--color-teal-50)}.hover\:bg-teal-100:hover{background-color:var(--color-teal-100)}.hover\:bg-teal-800:hover{background-color:var(--color-teal-800)}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:text-rose-800:hover{color:var(--color-rose-800)}.hover\:text-slate-800:hover{color:var(--color-slate-800)}.hover\:text-slate-950:hover{color:var(--color-slate-950)}.hover\:text-teal-700:hover{color:var(--color-teal-700)}.hover\:text-teal-800:hover{color:var(--color-teal-800)}.hover\:text-teal-900:hover{color:var(--color-teal-900)}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\:border-teal-500:focus{border-color:var(--color-teal-500)}.focus\:bg-white:focus{background-color:var(--color-white)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-4:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-teal-100:focus{--tw-ring-color:var(--color-teal-100)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:rounded:focus-visible{border-radius:.25rem}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-4:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-amber-100:focus-visible{--tw-ring-color:var(--color-amber-100)}.focus-visible\:ring-amber-200:focus-visible{--tw-ring-color:var(--color-amber-200)}.focus-visible\:ring-current:focus-visible{--tw-ring-color:currentcolor}.focus-visible\:ring-emerald-100:focus-visible{--tw-ring-color:var(--color-emerald-100)}.focus-visible\:ring-red-100:focus-visible{--tw-ring-color:var(--color-red-100)}.focus-visible\:ring-red-200:focus-visible{--tw-ring-color:var(--color-red-200)}.focus-visible\:ring-teal-100:focus-visible{--tw-ring-color:var(--color-teal-100)}.focus-visible\:ring-teal-200:focus-visible{--tw-ring-color:var(--color-teal-200)}.focus-visible\:ring-teal-500:focus-visible{--tw-ring-color:var(--color-teal-500)}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-teal-500:focus-visible{outline-color:var(--color-teal-500)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-progress:disabled{cursor:progress}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:bg-red-700:disabled{background-color:var(--color-red-700)}.disabled\:bg-slate-100:disabled{background-color:var(--color-slate-100)}.disabled\:text-slate-400:disabled{color:var(--color-slate-400)}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.disabled\:opacity-80:disabled{opacity:.8}@media (min-width:40rem){.sm\:mx-6{margin-inline:calc(var(--spacing) * 6)}.sm\:mb-6{margin-bottom:calc(var(--spacing) * 6)}.sm\:h-52{height:calc(var(--spacing) * 52)}.sm\:min-h-9{min-height:calc(var(--spacing) * 9)}.sm\:min-h-10{min-height:calc(var(--spacing) * 10)}.sm\:w-auto{width:auto}.sm\:max-w-\[392px\]{max-width:392px}.sm\:max-w-\[592px\]{max-width:592px}.sm\:flex-none{flex:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:justify-start{justify-content:flex-start}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:self-auto{align-self:auto}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-7{padding:calc(var(--spacing) * 7)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:px-2{padding-inline:calc(var(--spacing) * 2)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:pt-2{padding-top:calc(var(--spacing) * 2)}.sm\:pt-6{padding-top:calc(var(--spacing) * 6)}.sm\:pb-6{padding-bottom:calc(var(--spacing) * 6)}.sm\:pb-10{padding-bottom:calc(var(--spacing) * 10)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:48rem){.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:inline-flex{display:inline-flex}.md\:h-\[4\.5rem\]{height:4.5rem}.md\:h-full{height:100%}.md\:min-h-screen{min-height:100vh}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[5rem_minmax\(0\,1fr\)\]{grid-template-columns:5rem minmax(0,1fr)}.md\:grid-cols-\[16rem_minmax\(0\,1fr\)\]{grid-template-columns:16rem minmax(0,1fr)}.md\:flex-col{flex-direction:column}.md\:py-0{padding-block-start:0;padding-block-end:0}.md\:transition-\[grid-template-columns\]{transition-property:grid-template-columns;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.md\:duration-200{--tw-duration:.2s;transition-duration:.2s}.md\:ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}}@media (min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-start-2{grid-column-start:2}.lg\:block{display:block}.lg\:w-72{width:calc(var(--spacing) * 72)}.lg\:flex-1{flex:1}.lg\:shrink-0{flex-shrink:0}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:justify-end{justify-content:flex-end}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:pt-3{padding-top:calc(var(--spacing) * 3)}.lg\:pt-8{padding-top:calc(var(--spacing) * 8)}.lg\:pb-12{padding-bottom:calc(var(--spacing) * 12)}.lg\:whitespace-nowrap{white-space:nowrap}}@media (min-width:80rem){.xl\:col-start-1{grid-column-start:1}.xl\:col-start-2{grid-column-start:2}.xl\:row-span-2{grid-row:span 2/span 2}.xl\:row-start-1{grid-row-start:1}.xl\:row-start-2{grid-row-start:2}.xl\:size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.xl\:h-full{height:100%}.xl\:w-80{width:calc(var(--spacing) * 80)}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-\[minmax\(0\,0\.95fr\)_minmax\(0\,1\.05fr\)\]{grid-template-columns:minmax(0,.95fr) minmax(0,1.05fr)}.xl\:grid-cols-\[minmax\(0\,1\.2fr\)_minmax\(18rem\,0\.8fr\)\]{grid-template-columns:minmax(0,1.2fr) minmax(18rem,.8fr)}.xl\:grid-cols-\[minmax\(0\,1\.08fr\)_minmax\(0\,0\.92fr\)\]{grid-template-columns:minmax(0,1.08fr) minmax(0,.92fr)}.xl\:grid-cols-\[minmax\(0\,1\.45fr\)_minmax\(20rem\,0\.75fr\)\]{grid-template-columns:minmax(0,1.45fr) minmax(20rem,.75fr)}.xl\:grid-cols-\[minmax\(0\,1\.55fr\)_minmax\(18rem\,0\.65fr\)\]{grid-template-columns:minmax(0,1.55fr) minmax(18rem,.65fr)}.xl\:flex-col{flex-direction:column}.xl\:items-stretch{align-items:stretch}.xl\:justify-end{justify-content:flex-end}.xl\:gap-2{gap:calc(var(--spacing) * 2)}.xl\:self-stretch{align-self:stretch}.xl\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.xl\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.xl\:p-4{padding:calc(var(--spacing) * 4)}.xl\:px-10{padding-inline:calc(var(--spacing) * 10)}.xl\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.xl\:whitespace-nowrap{white-space:nowrap}}@media (min-width:96rem){.\32 xl\:size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.\32 xl\:flex-row{flex-direction:row}.\32 xl\:p-5{padding:calc(var(--spacing) * 5)}.\32 xl\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}}:host{color:#0f172a;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:transparent;text-rendering:optimizelegibility;width:100%;min-width:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;display:block}.smartsafehub-shadow-root{width:100%;min-width:0;max-width:100%;display:block}.smartsafehub-shadow-root,.smartsafehub-shadow-root *,.smartsafehub-shadow-root :before,.smartsafehub-shadow-root :after{box-sizing:border-box}.ssh-app{width:100%;min-width:0;max-width:100%;overflow:clip}.ssh-app main,.ssh-app section,.ssh-app article,.ssh-app aside,.ssh-app nav,.ssh-app div{min-width:0}.ssh-product-hero{border-radius:0}.ssh-product-header-action{border-color:#e2e8f0!important}.ssh-product-header-action:hover{border-color:#5eead4!important}.ssh-app a,.ssh-app button,.ssh-app input,.ssh-app textarea{touch-action:manipulation}.ssh-app[data-theme=dark] .ssh-custom-select-trigger:disabled{color:#64748b;background-color:#1e293b;border-color:#334155}.ssh-app[data-theme=dark] .ssh-custom-select-trigger:focus-visible{--tw-ring-color:#134e4aa6}.ssh-app[data-theme=dark] .ssh-custom-select-menu{box-shadow:0 18px 45px #00000059}.ssh-mobile-navigation{padding-left:max(1rem, env(safe-area-inset-left));padding-right:max(1rem, env(safe-area-inset-right))}.ssh-mobile-menu{overscroll-behavior:contain;-webkit-overflow-scrolling:touch;max-height:calc(100dvh - 4.5rem);overflow-y:auto}.ssh-touch-scroll{scrollbar-width:none;overscroll-behavior-inline:contain;-webkit-overflow-scrolling:touch}.ssh-touch-scroll::-webkit-scrollbar{display:none}@media (max-width:767px){.ssh-app{min-height:100dvh;overflow-x:clip}.ssh-product-hero{padding-top:max(1.25rem, env(safe-area-inset-top));padding-left:max(1rem, env(safe-area-inset-left));padding-right:max(1rem, env(safe-area-inset-right))}.ssh-product-main{padding-right:max(1rem, env(safe-area-inset-right));padding-bottom:max(2rem, env(safe-area-inset-bottom));padding-left:max(1rem, env(safe-area-inset-left))}.ssh-app input,.ssh-app textarea{font-size:16px}.ssh-app button,.ssh-app a{min-height:44px}}.ssh-sidebar-toggle{color:#64748b;background:#fff;border:1px solid #e2e8f0;box-shadow:0 1px 3px #0f172a1f}.ssh-sidebar-toggle:hover{color:#0f766e;background:#f8fafc;border-color:#99f6e4}.ssh-app[data-theme=dark] .ssh-sidebar-toggle{color:#94a3b8;background:#1e293b;border-color:#334155;box-shadow:0 1px 3px #00000047}.ssh-app[data-theme=dark] .ssh-sidebar-toggle:hover{color:#5eead4;background:#334155;border-color:#0f766e}.ssh-update-nav-badge{color:#92400e;background:#fef3c7;border:1px solid #f59e0b;border-radius:9999px;justify-content:center;align-items:center;min-width:1.3rem;height:1.3rem;padding:0 .25rem;font-size:.75rem;font-weight:900;line-height:1;display:inline-flex;box-shadow:0 1px 2px #0f172a1f}.ssh-update-nav-badge[data-collapsed=true]{z-index:1;width:auto;min-width:1.25rem;height:1.25rem;padding:0 .25rem;position:absolute;top:.125rem;right:.125rem;box-shadow:0 0 0 2px #fff,0 2px 5px #0f172a33}.ssh-app[data-theme=dark] .ssh-update-nav-badge{color:#422006;background:#fbbf24;border-color:#fcd34d;box-shadow:0 1px 3px #0000004d}.ssh-app[data-theme=dark] .ssh-update-nav-badge[data-collapsed=true]{box-shadow:0 0 0 2px #0f172a,0 2px 6px #00000061}.ssh-update-progress-track{background:#bae6fd;border-radius:9999px;height:.375rem;position:relative;overflow:hidden}.ssh-update-progress-bar{border-radius:inherit;background:#0284c7;width:38%;animation:1.2s ease-in-out infinite ssh-update-progress;position:absolute;top:0;bottom:0;left:0}.ssh-app[data-theme=dark] .ssh-update-progress-track{background:#1e3a5f}.ssh-app[data-theme=dark] .ssh-update-progress-bar{background:#38bdf8}.ssh-app button.ssh-switch-control{box-sizing:border-box;flex:0 0 3rem;width:3rem;min-width:3rem;max-width:3rem;height:1.75rem;min-height:1.75rem;max-height:1.75rem;padding:0}.ssh-switch-thumb{aspect-ratio:1;box-sizing:border-box;background-color:#fff;border-radius:9999px;width:1.25rem;min-width:1.25rem;max-width:1.25rem;height:1.25rem;min-height:1.25rem;max-height:1.25rem}@keyframes ssh-update-progress{0%{transform:translate(-110%)}to{transform:translate(300%)}}.ssh-software-settings-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,18rem),1fr));gap:1rem;display:grid}.ssh-software-settings-channel{grid-column:1/-1}.ssh-time-select{grid-template-columns:repeat(2,minmax(0,1fr));gap:.5rem;width:100%;min-width:0;max-width:100%;display:grid}.ssh-time-select>*{min-width:0}.ssh-time-select .ssh-custom-select-trigger{gap:.5rem;min-width:0;max-width:100%;padding-inline-start:.75rem;padding-inline-end:.75rem}.ssh-ipv4-segments{grid-template-columns:repeat(4,minmax(0,1fr));gap:.75rem;width:100%;min-width:0;max-width:100%;display:grid}.ssh-ipv4-segment{min-width:0;position:relative}.ssh-ipv4-separator{pointer-events:none;position:absolute;top:50%;right:-.375rem;transform:translate(50%,-50%)}@media (min-width:640px){.ssh-ipv4-segments{gap:1rem}.ssh-ipv4-separator{right:-.5rem}}.ssh-app .ssh-rule-group-toggle:hover{background-color:#f1f5f9}.ssh-app[data-theme=dark] .ssh-rule-group-toggle:hover{background-color:#1e293b}.ssh-app[data-theme=dark] .ssh-password-input:-webkit-autofill{-webkit-text-fill-color:#f8fafc;caret-color:#f8fafc;box-shadow:inset 0 0 0 1000px #0f172a}.ssh-app[data-theme=dark] .ssh-password-input:-webkit-autofill:hover{-webkit-text-fill-color:#f8fafc;caret-color:#f8fafc;box-shadow:inset 0 0 0 1000px #0f172a}.ssh-app[data-theme=dark] .ssh-password-input:-webkit-autofill:focus{-webkit-text-fill-color:#f8fafc;caret-color:#f8fafc;box-shadow:inset 0 0 0 1000px #0f172a}.ssh-app[data-theme=light] .ssh-password-input:-webkit-autofill{-webkit-text-fill-color:#0f172a;caret-color:#0f172a;box-shadow:inset 0 0 0 1000px #fff}.ssh-app[data-theme=light] .ssh-password-input:-webkit-autofill:hover{-webkit-text-fill-color:#0f172a;caret-color:#0f172a;box-shadow:inset 0 0 0 1000px #fff}.ssh-app[data-theme=light] .ssh-password-input:-webkit-autofill:focus{-webkit-text-fill-color:#0f172a;caret-color:#0f172a;box-shadow:inset 0 0 0 1000px #fff}.ssh-app[data-theme=dark]{color:#f8fafc;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;background:#020617}.ssh-app[data-theme=dark] [class~=bg-white]{background-color:#0f172a}.ssh-app[data-theme=dark] [class~=bg-white\/95]{background-color:#0f172af2}.ssh-app[data-theme=dark] [class~=bg-white\/70]{background-color:#0f172ac7}.ssh-app[data-theme=dark] [class~=bg-slate-50]{background-color:#020617}.ssh-app[data-theme=dark] [class~=bg-slate-50\/70]{background-color:#020617b8}.ssh-app[data-theme=dark] [class~=bg-slate-100]{background-color:#1e293b}.ssh-app[data-theme=dark] [class~=bg-slate-200]{background-color:#334155}.ssh-app[data-theme=dark] [class~=bg-slate-300]{background-color:#475569}.ssh-app[data-theme=dark] [class~=bg-slate-400]{background-color:#64748b}.ssh-app[data-theme=dark] [class~=bg-black\/5]{background-color:#ffffff0d}.ssh-app[data-theme=dark] [class~=text-slate-950]{color:#f8fafc}.ssh-app[data-theme=dark] [class~=text-slate-900]{color:#f1f5f9}.ssh-app[data-theme=dark] [class~=text-slate-800]{color:#e2e8f0}.ssh-app[data-theme=dark] [class~=text-slate-700],.ssh-app[data-theme=dark] [class~=text-slate-600]{color:#cbd5e1}.ssh-app[data-theme=dark] [class~=text-slate-500],.ssh-app[data-theme=dark] [class~=text-slate-400]{color:#94a3b8}.ssh-app[data-theme=dark] [class~=text-slate-300]{color:#cbd5e1}.ssh-app[data-theme=dark] [class~=border-slate-100],.ssh-app[data-theme=dark] [class~=border-slate-200],.ssh-app[data-theme=dark] [class~=divide-slate-200]{border-color:#1e293b}.ssh-app[data-theme=dark] [class~=border-slate-300],.ssh-app[data-theme=dark] [class~=border-white\/80]{border-color:#334155}.ssh-app[data-theme=dark] [class~=ring-slate-100],.ssh-app[data-theme=dark] [class~=ring-slate-200],.ssh-app[data-theme=dark] [class~=ring-white]{--tw-ring-color:#334155}.ssh-app[data-theme=dark] [class~=bg-teal-50],.ssh-app[data-theme=dark] [class~=bg-teal-100]{background-color:#0d948829}.ssh-app[data-theme=dark] [class~=text-teal-700],.ssh-app[data-theme=dark] [class~=text-teal-800],.ssh-app[data-theme=dark] [class~=text-teal-950]{color:#5eead4}.ssh-app[data-theme=dark] [class~=border-teal-200],.ssh-app[data-theme=dark] [class~=border-teal-300]{border-color:#115e59}.ssh-app[data-theme=dark] [class~=ring-teal-100],.ssh-app[data-theme=dark] [class~=ring-teal-200]{--tw-ring-color:#134e4a}.ssh-app[data-theme=dark] [class~=bg-sky-50],.ssh-app[data-theme=dark] [class~=bg-sky-50\/60]{background-color:#0ea5e91f}.ssh-app[data-theme=dark] [class~=text-sky-700],.ssh-app[data-theme=dark] [class~=text-sky-800],.ssh-app[data-theme=dark] [class~=text-sky-950]{color:#7dd3fc}.ssh-app[data-theme=dark] [class~=border-sky-200]{border-color:#075985}.ssh-app[data-theme=dark] [class~=ring-sky-100],.ssh-app[data-theme=dark] [class~=ring-sky-200]{--tw-ring-color:#0c4a6e}.ssh-app[data-theme=dark] [class~=bg-emerald-50],.ssh-app[data-theme=dark] [class~=bg-emerald-100]{background-color:#10b98121}.ssh-app[data-theme=dark] [class~=bg-emerald-50\/70]{background-color:#10b9811a}.ssh-app[data-theme=dark] [class~=text-emerald-700],.ssh-app[data-theme=dark] [class~=text-emerald-800],.ssh-app[data-theme=dark] [class~=text-emerald-900],.ssh-app[data-theme=dark] [class~=text-emerald-950]{color:#6ee7b7}.ssh-app[data-theme=dark] [class~=border-emerald-200]{border-color:#065f46}.ssh-app[data-theme=dark] [class~=ring-emerald-100],.ssh-app[data-theme=dark] [class~=ring-emerald-200]{--tw-ring-color:#064e3b}.ssh-app[data-theme=dark] [class~=bg-amber-50],.ssh-app[data-theme=dark] [class~=bg-amber-50\/60],.ssh-app[data-theme=dark] [class~=bg-amber-100],.ssh-app[data-theme=dark] [class~=bg-amber-100\/70]{background-color:#f59e0b21}.ssh-app[data-theme=dark] [class~=bg-amber-50\/70]{background-color:#f59e0b1a}.ssh-app[data-theme=dark] [class~=text-amber-700],.ssh-app[data-theme=dark] [class~=text-amber-800],.ssh-app[data-theme=dark] [class~=text-amber-900],.ssh-app[data-theme=dark] [class~=text-amber-900\/80],.ssh-app[data-theme=dark] [class~=text-amber-950]{color:#fcd34d}.ssh-app[data-theme=dark] [class~=border-amber-200],.ssh-app[data-theme=dark] [class~=border-amber-300]{border-color:#92400e}.ssh-app[data-theme=dark] [class~=ring-amber-100],.ssh-app[data-theme=dark] [class~=ring-amber-200]{--tw-ring-color:#78350f}.ssh-app[data-theme=dark] [class~=bg-red-50],.ssh-app[data-theme=dark] [class~=bg-red-100]{background-color:#ef44441f}.ssh-app[data-theme=dark] [class~=text-red-700],.ssh-app[data-theme=dark] [class~=text-red-800],.ssh-app[data-theme=dark] [class~=text-red-900],.ssh-app[data-theme=dark] [class~=text-red-950]{color:#fca5a5}.ssh-app[data-theme=dark] [class~=border-red-200],.ssh-app[data-theme=dark] [class~=border-red-300]{border-color:#991b1b}.ssh-app[data-theme=dark] [class~=ring-red-100],.ssh-app[data-theme=dark] [class~=ring-red-200]{--tw-ring-color:#7f1d1d}.ssh-app[data-theme=dark] [class~=bg-rose-50]{background-color:#f43f5e1f}.ssh-app[data-theme=dark] [class~=bg-rose-50\/70]{background-color:#f43f5e1a}.ssh-app[data-theme=dark] [class~=text-rose-600],.ssh-app[data-theme=dark] [class~=text-rose-700],.ssh-app[data-theme=dark] [class~=text-rose-800],.ssh-app[data-theme=dark] [class~=text-rose-900],.ssh-app[data-theme=dark] [class~=text-rose-950]{color:#fda4af}.ssh-app[data-theme=dark] [class~=border-rose-200],.ssh-app[data-theme=dark] [class~=border-rose-300]{border-color:#9f1239}.ssh-app[data-theme=dark] [class~=ring-rose-200]{--tw-ring-color:#881337}.ssh-app[data-theme=dark] [class~=bg-blue-50]{background-color:#3b82f61f}.ssh-app[data-theme=dark] [class~=text-blue-700]{color:#93c5fd}.ssh-app[data-theme=dark] [class~=ring-blue-200]{--tw-ring-color:#1e3a8a}.ssh-app[data-theme=dark] .hover\:bg-slate-50:hover{background-color:#1e293b}.ssh-app[data-theme=dark] .hover\:bg-rose-50:hover{background-color:#f43f5e2e}.ssh-app[data-theme=dark] .hover\:text-slate-950:hover{color:#f8fafc}.ssh-app[data-theme=dark] .hover\:text-slate-700:hover{color:#e2e8f0}.ssh-app[data-theme=dark] .hover\:text-rose-800:hover{color:#fecdd3}.ssh-app[data-theme=dark] .hover\:border-slate-300:hover{border-color:#475569}.ssh-app[data-theme=dark] .ssh-product-header-action{color:#cbd5e1;background-color:#0f172a;border-color:#334155!important}.ssh-app[data-theme=dark] .ssh-product-header-action:hover{color:#5eead4;border-color:#0f766e!important}.ssh-app[data-theme=dark] .ssh-product-header-action:focus-visible{--tw-ring-color:#134e4a}.ssh-initial-setup-probe{color:#0f172a;background:#f8fafc;place-items:center;min-height:100dvh;padding:1.5rem;display:grid}.ssh-initial-setup-probe-card{text-align:center;background:#fff;border:1px solid #e2e8f0;border-radius:1.25rem;justify-items:center;gap:.7rem;width:min(100%,28rem);padding:2.25rem;display:grid;box-shadow:0 20px 55px #0f172a14}.ssh-initial-setup-probe-card>svg{color:#0f766e;width:2rem;height:2rem}.ssh-initial-setup-probe-card strong{font-size:1rem;font-weight:900}.ssh-initial-setup-probe-card span{color:#64748b;font-size:.84rem;line-height:1.55}.ssh-initial-setup-probe-card button{color:#fff;cursor:pointer;min-height:2.75rem;font:inherit;background:#0f766e;border:0;border-radius:.8rem;margin-top:.4rem;padding:0 1rem;font-size:.84rem;font-weight:900}.smartsafehub-login-shadow-root{background:#f8fafc;min-height:100dvh}.ssh-login-page,.ssh-login-page *,.ssh-login-page :before,.ssh-login-page :after{box-sizing:border-box}.ssh-login-page{--ssh-login-bg:#f8fafc;--ssh-login-surface:#fff;--ssh-login-surface-soft:#f8fafc;--ssh-login-border:#e2e8f0;--ssh-login-border-strong:#cbd5e1;--ssh-login-text:#0f172a;--ssh-login-muted:#64748b;--ssh-login-muted-soft:#94a3b8;--ssh-login-accent:#0f766e;--ssh-login-accent-hover:#115e59;--ssh-login-accent-soft:#f0fdfa;--ssh-login-accent-ring:#14b8a624;--ssh-login-card-shadow:0 24px 70px #0f172a14, 0 2px 10px #0f172a0a;background:var(--ssh-login-bg);min-height:100dvh;color:var(--ssh-login-text);grid-template-columns:minmax(0,1.08fr) minmax(420px,.92fr);display:grid}.ssh-login-page[data-theme=dark]{--ssh-login-bg:#020617;--ssh-login-surface:#0f172a;--ssh-login-surface-soft:#111827;--ssh-login-border:#1e293b;--ssh-login-border-strong:#334155;--ssh-login-text:#f8fafc;--ssh-login-muted:#94a3b8;--ssh-login-muted-soft:#64748b;--ssh-login-accent:#2dd4bf;--ssh-login-accent-hover:#5eead4;--ssh-login-accent-soft:#14b8a61a;--ssh-login-accent-ring:#2dd4bf2e;--ssh-login-card-shadow:0 28px 72px #0000003d, 0 0 0 1px #94a3b80a}.ssh-login-toast{top:max(1rem, env(safe-area-inset-top));z-index:20;color:#115e59;background:#f0fdfa;border:1px solid #99f6e4;border-radius:1rem;align-items:center;gap:.75rem;width:min(100% - 2rem,34rem);padding:.9rem 1rem;font-size:.88rem;font-weight:800;line-height:1.45;display:flex;position:fixed;left:50%;transform:translate(-50%);box-shadow:0 18px 45px #0f172a29}.ssh-login-toast svg{flex:none;width:1.25rem;height:1.25rem}.ssh-login-page[data-theme=dark] .ssh-login-toast{color:#99f6e4;background:#0f2f2e;border-color:#2dd4bf57;box-shadow:0 18px 45px #00000052}.ssh-login-brand{color:#f8fafc;background:radial-gradient(circle at 16% 14%,#2dd4bf29,#0000 28rem),linear-gradient(145deg,#020617 0%,#0f172a 56%,#042f2e 140%);justify-content:center;align-items:center;min-height:100dvh;padding:clamp(3rem,7vw,7rem);display:flex;position:relative;overflow:hidden}.ssh-login-brand:after{content:"";pointer-events:none;background-image:linear-gradient(#94a3b80e 1px,#0000 1px),linear-gradient(90deg,#94a3b80e 1px,#0000 1px);background-size:44px 44px;position:absolute;top:0;bottom:0;left:0;right:0;-webkit-mask-image:linear-gradient(to bottom right,#000,#0000 78%);mask-image:linear-gradient(to bottom right,#000,#0000 78%)}.ssh-login-brand-orb{filter:blur(1px);pointer-events:none;border-radius:9999px;position:absolute}.ssh-login-brand-orb-one{border:1px solid #2dd4bf29;width:30rem;height:30rem;top:-10rem;right:-8rem;box-shadow:inset 0 0 6rem #14b8a60d}.ssh-login-brand-orb-two{border:1px solid #5eead41c;width:36rem;height:36rem;bottom:-13rem;left:-10rem}.ssh-login-brand-content{z-index:1;width:min(100%,680px);position:relative}.ssh-login-brand-mark,.ssh-login-mobile-mark{color:#5eead4;background:#14b8a621;place-items:center;display:grid;box-shadow:inset 0 0 0 1px #5eead42e}.ssh-login-brand-mark{border-radius:1.5rem;width:4.5rem;height:4.5rem;margin-bottom:2rem}.ssh-login-brand-mark svg{width:2.25rem;height:2.25rem}.ssh-login-eyebrow,.ssh-login-kicker{color:#5eead4;letter-spacing:.22em;text-transform:uppercase;margin:0;font-size:.72rem;font-weight:900}.ssh-login-brand h1{letter-spacing:-.055em;margin:.7rem 0 0;font-size:clamp(2.7rem,5vw,5rem);font-weight:900;line-height:.98}.ssh-password-setup-brand-title-line{display:block}.ssh-login-brand-description{color:#cbd5e1;max-width:39rem;margin:1.6rem 0 0;font-size:clamp(1rem,1.5vw,1.16rem);line-height:1.85}.ssh-login-features{gap:.85rem;max-width:40rem;margin-top:3rem;display:grid}.ssh-login-feature{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#0f172a75;border:1px solid #94a3b81c;border-radius:1rem;align-items:center;gap:1rem;padding:.95rem 1rem;display:flex}.ssh-login-feature-icon{color:#5eead4;background:#14b8a61c;border-radius:.8rem;flex:none;place-items:center;width:2.65rem;height:2.65rem;display:grid}.ssh-login-feature-icon svg{width:1.25rem;height:1.25rem}.ssh-login-feature-copy{gap:.15rem;min-width:0;display:grid}.ssh-login-feature-copy strong{color:#f8fafc;font-size:.92rem;font-weight:800}.ssh-login-feature-copy>span{color:#94a3b8;font-size:.8rem;line-height:1.45}.ssh-login-panel{background:var(--ssh-login-bg);justify-content:center;align-items:center;min-height:100dvh;padding:clamp(2rem,5vw,5rem);transition:background-color .18s;display:flex;position:relative}.ssh-login-theme-toggle{top:max(1.25rem, env(safe-area-inset-top));right:max(1.25rem, env(safe-area-inset-right));z-index:2;border:1px solid var(--ssh-login-border);background:var(--ssh-login-surface);width:2.75rem;height:2.75rem;color:var(--ssh-login-muted);cursor:pointer;border-radius:.9rem;place-items:center;transition:border-color .15s,background-color .15s,color .15s,transform .15s;display:grid;position:absolute;box-shadow:0 5px 16px #0f172a0f}.ssh-login-theme-toggle svg{width:1.15rem;height:1.15rem}.ssh-login-theme-toggle:hover{border-color:var(--ssh-login-border-strong);color:var(--ssh-login-accent);transform:translateY(-1px)}.ssh-login-panel-inner{flex-direction:column;justify-content:center;width:min(100%,480px);min-height:min(40rem,100dvh - 4rem);display:flex}.ssh-login-card{border:1px solid var(--ssh-login-border);background:var(--ssh-login-surface);width:100%;box-shadow:var(--ssh-login-card-shadow);border-radius:1.5rem;padding:clamp(1.6rem,4vw,2.6rem);transition:background-color .18s,border-color .18s}.ssh-login-card-heading{align-items:flex-start;gap:1rem;display:flex}.ssh-login-card-heading>div{min-width:0}.ssh-login-mobile-mark{color:#fff;background:#0f766e;border-radius:1.1rem;flex:none;width:3.5rem;height:3.5rem;display:none;box-shadow:0 12px 28px #0f766e38}.ssh-login-mobile-mark svg{width:1.8rem;height:1.8rem}.ssh-login-kicker{color:var(--ssh-login-accent);letter-spacing:.18em}.ssh-login-card h2{color:var(--ssh-login-text);letter-spacing:-.035em;margin:.65rem 0 0;font-size:clamp(1.8rem,4vw,2.25rem);font-weight:900;line-height:1.15}.ssh-login-subtitle{color:var(--ssh-login-muted);margin:.7rem 0 0;font-size:.94rem;line-height:1.6}.ssh-login-alert{color:#9f1239;background:#fff1f2;border:1px solid #fecdd3;border-radius:.85rem;margin-top:1.3rem;padding:.85rem 1rem;font-size:.82rem;font-weight:700;line-height:1.55}.ssh-login-page[data-theme=dark] .ssh-login-alert{color:#fecdd3;background:#8813372e;border-color:#f43f5e59}.ssh-login-form{gap:1.1rem;margin-top:1.6rem;display:grid}.ssh-login-field{gap:.5rem;display:grid}.ssh-login-label{color:var(--ssh-login-text);font-size:.82rem;font-weight:800}.ssh-login-input-wrap{border:2px solid var(--ssh-login-border-strong);background:var(--ssh-login-surface-soft);min-height:3.3rem;color:var(--ssh-login-muted);border-radius:.9rem;align-items:center;transition:border-color .15s,background-color .15s,box-shadow .15s;display:flex;overflow:hidden;box-shadow:inset 0 1px 2px #0f172a09}.ssh-login-input-wrap:focus-within{border-color:var(--ssh-login-accent);background:var(--ssh-login-surface);box-shadow:0 0 0 4px var(--ssh-login-accent-ring)}.ssh-login-field-icon{background:var(--ssh-login-accent-soft);width:2.15rem;height:2.15rem;color:var(--ssh-login-accent);border-radius:.65rem;flex:none;place-items:center;margin-left:.55rem;transition:background-color .15s,color .15s,box-shadow .15s;display:grid}.ssh-login-field-icon svg{width:1.05rem;height:1.05rem}.ssh-login-input-wrap:focus-within .ssh-login-field-icon{box-shadow:inset 0 0 0 1px var(--ssh-login-accent-ring)}.ssh-login-input-wrap input{width:100%;min-width:0;height:3.15rem;color:var(--ssh-login-text);font:inherit;background:0 0;border:0;outline:0;padding:0 .8rem;font-size:.94rem;font-weight:700}.ssh-login-input-wrap input::placeholder{color:var(--ssh-login-muted-soft);opacity:.82;font-weight:600}.ssh-login-input-wrap input:-webkit-autofill{-webkit-text-fill-color:var(--ssh-login-text);caret-color:var(--ssh-login-text);box-shadow:0 0 0 1000px var(--ssh-login-surface-soft) inset}.ssh-login-input-wrap input:-webkit-autofill:hover{-webkit-text-fill-color:var(--ssh-login-text);caret-color:var(--ssh-login-text);box-shadow:0 0 0 1000px var(--ssh-login-surface-soft) inset}.ssh-login-input-wrap input:-webkit-autofill:focus{-webkit-text-fill-color:var(--ssh-login-text);caret-color:var(--ssh-login-text);box-shadow:0 0 0 1000px var(--ssh-login-surface-soft) inset}.ssh-login-input-wrap:focus-within input:-webkit-autofill{box-shadow:0 0 0 1000px var(--ssh-login-surface) inset}.ssh-login-input-wrap input:disabled{cursor:wait;opacity:.68}.ssh-login-password-toggle{width:2.35rem;height:2.35rem;color:var(--ssh-login-muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:.7rem;flex:none;place-items:center;margin-right:.45rem;transition:border-color .15s,background-color .15s,color .15s;display:grid}.ssh-login-password-toggle svg{width:1.05rem;height:1.05rem}.ssh-login-password-toggle:hover:not(:disabled){border-color:var(--ssh-login-border);background:var(--ssh-login-accent-soft);color:var(--ssh-login-accent)}.ssh-login-password-toggle:disabled{cursor:wait;opacity:.6}.ssh-login-theme-toggle:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-password-toggle:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-submit:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-fallback:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-password-hint{color:var(--ssh-login-muted);margin:-.55rem 0 -.15rem;font-size:.76rem;line-height:1.5}.ssh-password-requirements{gap:.4rem;margin:-.25rem 0 0;padding:0;list-style:none;display:grid}.ssh-password-requirement{color:var(--ssh-login-muted);align-items:center;gap:.5rem;font-size:.78rem;font-weight:700;display:flex}.ssh-password-requirement svg{width:1rem;height:1rem;color:var(--ssh-login-muted-soft);flex:none}.ssh-password-requirement.is-met,.ssh-password-requirement.is-met svg,.ssh-password-match.is-met{color:var(--ssh-login-accent)}.ssh-password-match{color:#be123c;margin:-.5rem 0 -.1rem;font-size:.78rem;font-weight:800}.ssh-password-setup-summary{background:#14b8a617;border:1px solid #5eead42e;border-radius:1rem;align-items:flex-start;gap:.85rem;max-width:40rem;margin-top:2.4rem;padding:1rem 1.1rem;display:flex}.ssh-password-setup-summary>svg{color:#5eead4;flex:none;width:1.3rem;height:1.3rem;margin-top:.1rem}.ssh-password-setup-summary>div{gap:.25rem;display:grid}.ssh-password-setup-summary strong{color:#f8fafc;font-size:.9rem}.ssh-password-setup-summary span{color:#94a3b8;font-size:.8rem;line-height:1.5}.ssh-login-caps{color:#b45309;margin:-.45rem 0 -.15rem;font-size:.78rem;font-weight:800}.ssh-login-page[data-theme=dark] .ssh-login-caps{color:#fbbf24}.ssh-login-submit{color:#fff;cursor:pointer;min-height:3.3rem;font:inherit;background:#0f766e;border:0;border-radius:.9rem;justify-content:center;align-items:center;gap:.65rem;margin-top:.25rem;font-size:.94rem;font-weight:900;transition:background-color .15s,transform .15s,box-shadow .15s;display:inline-flex;box-shadow:0 12px 26px #0f766e33}.ssh-login-submit:hover:not(:disabled){background:#115e59;transform:translateY(-1px);box-shadow:0 16px 30px #0f766e40}.ssh-login-submit:disabled{cursor:wait;opacity:.72}.ssh-login-submit-spinner,.ssh-login-probe-spinner{flex:none;animation:.75s linear infinite ssh-login-spin;display:inline-block}.ssh-login-submit-spinner{color:#fff;width:1rem;height:1rem}.ssh-login-security-note{color:var(--ssh-login-muted);align-items:flex-start;gap:.55rem;margin-top:1.2rem;font-size:.76rem;line-height:1.5;display:flex}.ssh-login-security-note svg{width:1rem;height:1rem;color:var(--ssh-login-accent);flex:none;margin-top:.06rem}.ssh-login-fallback{border:1px solid var(--ssh-login-border-strong);background:var(--ssh-login-surface);min-height:2.7rem;color:var(--ssh-login-muted);border-radius:.8rem;justify-content:center;align-items:center;margin-top:.9rem;font-size:.8rem;font-weight:800;text-decoration:none;display:flex}.ssh-login-fallback:hover{border-color:var(--ssh-login-muted-soft);background:var(--ssh-login-surface-soft);color:var(--ssh-login-text)}.ssh-login-probe{color:var(--ssh-login-muted);text-align:center;justify-items:center;gap:.6rem;padding:2.5rem;display:grid}.ssh-login-probe-spinner{width:2rem;height:2rem;color:var(--ssh-login-accent);margin-bottom:.4rem}.ssh-login-probe strong{color:var(--ssh-login-text);font-size:1rem}.ssh-login-probe>span:last-child{font-size:.82rem}.ssh-login-footer{color:var(--ssh-login-muted-soft);flex-wrap:wrap;justify-content:center;gap:.4rem;margin-top:1.5rem;font-size:.72rem;display:flex}@keyframes ssh-login-spin{to{transform:rotate(360deg)}}@media (max-width:980px){.ssh-login-page{grid-template-columns:1fr}.ssh-login-brand{display:none}.ssh-login-panel{padding:max(1.25rem, env(safe-area-inset-top)) max(1.25rem, env(safe-area-inset-right)) max(1.25rem, env(safe-area-inset-bottom)) max(1.25rem, env(safe-area-inset-left))}.ssh-login-panel-inner{min-height:calc(100dvh - 2.5rem)}.ssh-login-mobile-mark{display:grid}}@media (max-width:520px){.ssh-login-panel{background:var(--ssh-login-surface);align-items:stretch;padding:0}.ssh-login-theme-toggle{top:max(1rem, env(safe-area-inset-top));right:max(1rem, env(safe-area-inset-right));box-shadow:none}.ssh-login-panel-inner{width:100%;min-height:100dvh}.ssh-login-card{min-height:100dvh;padding:max(4.75rem, calc(env(safe-area-inset-top) + 4.25rem)) max(1.25rem, env(safe-area-inset-right)) max(2rem, env(safe-area-inset-bottom)) max(1.25rem, env(safe-area-inset-left));box-shadow:none;border:0;border-radius:0;flex-direction:column;justify-content:center;display:flex}.ssh-login-card-heading{display:block}.ssh-login-mobile-mark{margin-bottom:1.25rem}.ssh-login-input-wrap input{font-size:16px}.ssh-login-footer{display:none}.ssh-login-probe{align-content:center;min-height:100dvh}}@media (prefers-reduced-motion:reduce){.ssh-login-panel,.ssh-login-card,.ssh-login-theme-toggle,.ssh-login-submit,.ssh-login-input-wrap{transition:none}.ssh-login-submit-spinner,.ssh-login-probe-spinner{animation-duration:1.4s}}.ssh-safeshield-plan-badge{isolation:isolate;letter-spacing:.085em;white-space:nowrap;border:1px solid #0000;border-radius:999px;align-items:center;gap:.5rem;min-height:2rem;padding:.3rem .82rem .3rem .36rem;font-size:.75rem;font-weight:950;line-height:1;display:inline-flex;position:relative;overflow:hidden}.ssh-safeshield-plan-badge[data-compact=true]{min-height:1.72rem;padding:.22rem .66rem .22rem .3rem;font-size:.69rem}.ssh-safeshield-plan-badge-mark{z-index:2;border-radius:999px;flex:none;place-items:center;width:1.2rem;height:1.2rem;font-size:.76rem;line-height:1;display:grid;position:relative}.ssh-safeshield-plan-badge[data-compact=true] .ssh-safeshield-plan-badge-mark{width:1.02rem;height:1.02rem;font-size:.66rem}.ssh-safeshield-plan-badge[data-tier=free]{color:#475569;background:linear-gradient(135deg,#fff 0%,#f1f5f9 100%);border-color:#cbd5e1;box-shadow:inset 0 1px #ffffffe6}.ssh-safeshield-plan-badge[data-tier=free] .ssh-safeshield-plan-badge-mark{color:#475569;background:#e2e8f0}.ssh-safeshield-plan-badge[data-tier=pro]{color:#f0fdfa;background:linear-gradient(135deg,#115e59 0%,#0f766e 62%,#0d9488 100%);border-color:#0f766e;box-shadow:0 1px 2px #0f766e29,inset 0 1px #ffffff24}.ssh-safeshield-plan-badge[data-tier=pro] .ssh-safeshield-plan-badge-mark{color:#ccfbf1;box-shadow:none;background:#f0fdfa1f;border:1px solid #99f6e475}.ssh-safeshield-plan-badge[data-tier=ultimate]{color:#fffbeb;background:linear-gradient(135deg,#78350f 0%,#92400e 58%,#b45309 100%);border-color:#b45309;box-shadow:0 1px 2px #78350f2e,inset 0 1px #ffffff1f}.ssh-safeshield-plan-badge[data-tier=ultimate] .ssh-safeshield-plan-badge-mark{color:#fde68a;box-shadow:none;background:#fffbeb1f;border:1px solid #fde68a75}.ssh-safeshield-plan-badge[data-tier=paid]{color:#f0f9ff;background:linear-gradient(135deg,#0c4a6e 0%,#075985 58%,#0369a1 100%);border-color:#0369a1;box-shadow:0 1px 2px #0369a129,inset 0 1px #ffffff1f}.ssh-safeshield-plan-badge[data-tier=paid] .ssh-safeshield-plan-badge-mark{color:#bae6fd;box-shadow:none;background:#f0f9ff1f;border:1px solid #bae6fd75}.ssh-safeshield-plan-caption{color:#64748b;white-space:nowrap;align-items:center;gap:.34rem;font-size:.68rem;font-weight:850;display:inline-flex}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=free]{color:#cbd5e1;background:#1e293b;border-color:#475569}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=free] .ssh-safeshield-plan-badge-mark{color:#e2e8f0;background:#475569}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=pro]{color:#99f6e4;background:linear-gradient(135deg,#042f2e 0%,#134e4a 100%);border-color:#0f766e;box-shadow:inset 0 1px #99f6e414}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=pro] .ssh-safeshield-plan-badge-mark{color:#99f6e4;background:#0d94881f;border-color:#2dd4bf61}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=ultimate]{color:#fde68a;background:linear-gradient(135deg,#451a03 0%,#78350f 100%);border-color:#b45309;box-shadow:inset 0 1px #fde68a14}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=ultimate] .ssh-safeshield-plan-badge-mark{color:#fde68a;background:#92400e29;border-color:#d9770675}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=paid]{color:#bae6fd;background:linear-gradient(135deg,#082f49 0%,#0c4a6e 100%);border-color:#0369a1;box-shadow:inset 0 1px #bae6fd14}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=paid] .ssh-safeshield-plan-badge-mark{color:#bae6fd;background:#0369a124;border-color:#0ea5e95c}.ssh-app[data-theme=dark] .ssh-safeshield-plan-caption{color:#94a3b8}.ssh-safeshield-upgrade-card{background:linear-gradient(120deg,#f0fdfa 0%,#ecfeff 58%,#fff7ed 100%);border:1px solid #99f6e4;border-radius:1rem;align-items:center;gap:.85rem;margin-top:.75rem;padding:.9rem 1rem;display:flex;box-shadow:0 10px 24px #0f766e14}.ssh-safeshield-upgrade-mark{color:#fff;background:linear-gradient(135deg,#0f766e,#0891b2);border-radius:.8rem;flex:none;place-items:center;width:2.5rem;height:2.5rem;font-size:1.05rem;display:grid;box-shadow:0 8px 18px #0d948838}.ssh-safeshield-upgrade-copy{flex:1;gap:.2rem;min-width:0;display:grid}.ssh-safeshield-upgrade-meta{color:#0f766e;letter-spacing:.12em;text-transform:uppercase;flex-wrap:wrap;align-items:center;gap:.45rem;font-size:.62rem;font-weight:900;display:flex}.ssh-safeshield-upgrade-soon{letter-spacing:.06em;background:#0f766e1a;border-radius:999px;padding:.18rem .45rem}.ssh-safeshield-upgrade-copy strong{color:#0f172a;font-size:.86rem;line-height:1.35rem}.ssh-safeshield-upgrade-copy>span{color:#64748b;font-size:.74rem;font-weight:600;line-height:1.15rem}.ssh-safeshield-upgrade-action{color:#fff;background:#0f766e;border:1px solid #0f766e;border-radius:.8rem;flex:none;justify-content:center;align-items:center;gap:.4rem;min-height:2.45rem;padding:.55rem .8rem;font-size:.74rem;font-weight:900;text-decoration:none;transition:background-color .15s,border-color .15s,transform .15s;display:inline-flex}.ssh-safeshield-upgrade-action:hover{background:#115e59;border-color:#115e59;transform:translateY(-1px)}.ssh-safeshield-upgrade-action:focus-visible{outline-offset:2px;outline:3px solid #14b8a63d}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-card{background:linear-gradient(120deg,#0d948821 0%,#0f172afa 58%,#92400e1f 100%);border-color:#134e4a;box-shadow:0 12px 28px #0000002e}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-mark{background:linear-gradient(135deg,#0d9488,#0891b2);box-shadow:0 8px 20px #2dd4bf21}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-meta{color:#5eead4}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-soon{background:#2dd4bf1f}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-copy strong{color:#f8fafc}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-copy>span{color:#94a3b8}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-action{color:#ccfbf1;background:#0d948838;border-color:#2dd4bf}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-action:hover{background:#0d948852;border-color:#5eead4}@media (max-width:640px){.ssh-safeshield-upgrade-card{flex-wrap:wrap;align-items:flex-start}.ssh-safeshield-upgrade-action{justify-content:center;width:100%}}.ssh-safeshield-refresh{background:#f0fdfab3;border:1px solid #ccfbf1;border-radius:1rem;align-items:center;gap:.875rem;width:27rem;max-width:100%;margin-top:1rem;padding:.75rem .875rem;display:flex}.ssh-safeshield-refresh[data-state=error]{background:#fef2f2c7;border-color:#fecaca}.ssh-safeshield-refresh-copy{min-width:0}.ssh-safeshield-refresh-kicker,.ssh-safeshield-refresh-title,.ssh-safeshield-refresh-description,.ssh-safeshield-refresh-error-code{margin:0}.ssh-safeshield-refresh-kicker{color:#0f766e;letter-spacing:.14em;text-transform:uppercase;font-size:.66rem;font-weight:900}.ssh-safeshield-refresh[data-state=error] .ssh-safeshield-refresh-kicker{color:#b91c1c}.ssh-safeshield-refresh-title{color:#0f172a;margin-top:.25rem;font-size:.875rem;font-weight:800}.ssh-safeshield-refresh-description{color:#475569;margin-top:.25rem;font-size:.75rem;font-weight:600;line-height:1.25rem}.ssh-safeshield-refresh-error-code{overflow-wrap:anywhere;color:#64748b;margin-top:.375rem;font-size:.68rem;font-weight:600}.ssh-safeshield-refresh-error-code code{font:inherit}.ssh-safeshield-refresh-donut{color:#0d9488;place-items:center;width:3.35rem;min-width:3.35rem;height:3.35rem;display:grid;position:relative}.ssh-safeshield-refresh-donut[data-state=error]{color:#dc2626}.ssh-safeshield-refresh-loader-svg{transform-origin:50%;width:100%;height:100%;animation:.82s linear infinite ssh-safeshield-refresh-loader-rotate;position:absolute;top:0;bottom:0;left:0;right:0;transform:rotate(-90deg)}.ssh-safeshield-refresh-loader-svg-error{animation:none}.ssh-safeshield-refresh-loader-track{color:#cbd5e1;stroke:#cbd5e1}.ssh-safeshield-refresh-loader-arc{color:#0f172a;stroke:#0f172a;filter:drop-shadow(0 0 .06rem #0f172a47)}.ssh-safeshield-refresh-donut[data-state=error] .ssh-safeshield-refresh-loader-track{color:#dc2626;stroke:#dc2626}.ssh-safeshield-refresh-donut-label{z-index:1;color:#0f766e;font-variant-numeric:tabular-nums;font-size:.68rem;font-weight:900;position:relative}.ssh-app[data-theme=dark] .ssh-safeshield-refresh{background:#0f766e1f;border-color:#134e4a}.ssh-app[data-theme=dark] .ssh-safeshield-refresh[data-state=error]{background:#7f1d1d2e;border-color:#7f1d1d}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-title{color:#f8fafc}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-description,.ssh-app[data-theme=dark] .ssh-safeshield-refresh-error-code{color:#94a3b8}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-loader-track{color:#334155;stroke:#334155}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-loader-arc{color:#fff;stroke:#fff;filter:drop-shadow(0 0 .08rem #ffffff8c)}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-donut-label{color:#5eead4}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-donut[data-state=error] .ssh-safeshield-refresh-loader-track{color:#ef4444;stroke:#ef4444}@keyframes ssh-safeshield-refresh-loader-rotate{to{transform:rotate(270deg)}}@media (prefers-reduced-motion:reduce){.ssh-safeshield-refresh-loader-svg{animation:none}}.ssh-dashboard-account-banner{background:#f0fdfa;border-color:#99e8df}.ssh-dashboard-account-banner-icon{color:#0f766e;background:#ccfbf1}.ssh-dashboard-account-banner-title{color:#0f172a}.ssh-dashboard-account-banner-description{color:#475569}.ssh-dashboard-account-banner-badge{color:#92400e;background:#fef3c7}.ssh-dashboard-account-banner-action{color:#fff;background:#0f766e}.ssh-dashboard-account-banner-action:hover{color:#fff;background:#115e59}.ssh-dashboard-account-banner-action:focus-visible{outline-color:#0d9488}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner{background:#102927;border-color:#115e59}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-icon{color:#99f6e4;background:#134e4a}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-title{color:#f1f5f9}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-description{color:#cbd5e1}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-badge{color:#fde68a;background:#78350f}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-action{color:#fff;background:#0f766e}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-action:hover{background:#0d9488}.ssh-account-nav-dot{width:10px;height:10px;box-shadow:0 0 0 2px var(--ssh-account-dot-ring,#fff);background-color:#d97706;border-radius:50%;flex:none;margin-left:auto;display:block}.ssh-account-nav-dot-collapsed{margin-left:0;position:absolute;top:5px;right:7px}.ssh-app[data-theme=dark] .ssh-account-nav-dot{--ssh-account-dot-ring:#0f172a;background-color:#fbbf24}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}} +@layer properties{:host,*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:#fef2f2;--color-red-100:#ffe2e2;--color-red-200:#ffcaca;--color-red-300:#ffa3a3;--color-red-500:#fb2c36;--color-red-700:#bf000f;--color-red-800:#9f0712;--color-red-900:#82181a;--color-red-950:#460809;--color-amber-50:#fffbeb;--color-amber-100:#fef3c6;--color-amber-200:#fee685;--color-amber-300:#ffd236;--color-amber-500:#f99c00;--color-amber-600:#dd7400;--color-amber-700:#b75000;--color-amber-800:#953d00;--color-amber-900:#7b3306;--color-amber-950:#461901;--color-emerald-50:#ecfdf5;--color-emerald-100:#d0fae5;--color-emerald-200:#a4f4cf;--color-emerald-500:#00bb7f;--color-emerald-700:#007956;--color-emerald-800:#005f46;--color-emerald-900:#004e3b;--color-emerald-950:#002c22;--color-teal-50:#f0fdfa;--color-teal-100:#cbfbf1;--color-teal-200:#96f7e4;--color-teal-300:#46ecd5;--color-teal-400:#00d3bd;--color-teal-500:#00baa7;--color-teal-600:#009588;--color-teal-700:#00776e;--color-teal-800:#005f5a;--color-teal-900:#0b4f4a;--color-teal-950:#022f2e;--color-sky-50:#f0f9ff;--color-sky-100:#dff2fe;--color-sky-200:#b8e6fe;--color-sky-600:#0084cc;--color-sky-700:#0069a4;--color-sky-800:#005986;--color-sky-950:#052f4a;--color-blue-50:#eff6ff;--color-blue-200:#bedbff;--color-blue-700:#1447e6;--color-rose-50:#fff1f2;--color-rose-100:#ffe4e6;--color-rose-200:#ffccd3;--color-rose-300:#ffa2ae;--color-rose-600:#e70044;--color-rose-700:#c20039;--color-rose-800:#a30037;--color-rose-900:#8b0836;--color-rose-950:#4d0218;--color-slate-50:#f8fafc;--color-slate-100:#f1f5f9;--color-slate-200:#e2e8f0;--color-slate-300:#cad5e2;--color-slate-400:#90a1b9;--color-slate-500:#62748e;--color-slate-600:#45556c;--color-slate-700:#314158;--color-slate-800:#1d293d;--color-slate-900:#0f172b;--color-slate-950:#020618;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--animate-bounce:bounce 1s infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}@supports (color:color(display-p3 0 0 0)){:root,:host{--color-red-50:color(display-p3 .988669 .951204 .950419);--color-red-100:color(display-p3 .980386 .889727 .887779);--color-red-200:color(display-p3 .969562 .798149 .794299);--color-red-300:color(display-p3 .956922 .651886 .645122);--color-red-500:color(display-p3 .903738 .262579 .253307);--color-red-700:color(display-p3 .692737 .116232 .104679);--color-red-800:color(display-p3 .569606 .121069 .108493);--color-red-900:color(display-p3 .466906 .133198 .12139);--color-red-950:color(display-p3 .25064 .0550983 .0468818);--color-amber-50:color(display-p3 .997804 .985047 .926312);--color-amber-100:color(display-p3 .989391 .954583 .796328);--color-amber-200:color(display-p3 .979824 .904554 .57325);--color-amber-300:color(display-p3 .974327 .83063 .33298);--color-amber-500:color(display-p3 .93994 .620584 .0585367);--color-amber-600:color(display-p3 .827144 .467166 .0336006);--color-amber-700:color(display-p3 .67989 .32771 .0520514);--color-amber-800:color(display-p3 .547533 .256058 .0728326);--color-amber-900:color(display-p3 .445958 .216422 .0823321);--color-amber-950:color(display-p3 .252662 .109091 .026881);--color-emerald-50:color(display-p3 .936818 .989882 .961937);--color-emerald-100:color(display-p3 .848335 .975974 .901691);--color-emerald-200:color(display-p3 .713164 .947563 .822283);--color-emerald-500:color(display-p3 .267113 .726847 .508397);--color-emerald-700:color(display-p3 .164041 .470229 .343508);--color-emerald-800:color(display-p3 .135396 .371401 .277561);--color-emerald-900:color(display-p3 .117821 .302975 .234501);--color-emerald-950:color(display-p3 .0549113 .170434 .13484);--color-teal-50:color(display-p3 .951444 .990904 .98112);--color-teal-100:color(display-p3 .834533 .980328 .946428);--color-teal-200:color(display-p3 .675869 .957879 .896029);--color-teal-300:color(display-p3 .484989 .914726 .835079);--color-teal-400:color(display-p3 .322787 .822056 .744388);--color-teal-500:color(display-p3 .266569 .721518 .655462);--color-teal-600:color(display-p3 .207114 .579584 .53668);--color-teal-700:color(display-p3 .174094 .461318 .433866);--color-teal-800:color(display-p3 .1457 .367051 .350749);--color-teal-900:color(display-p3 .135344 .303314 .290629);--color-teal-950:color(display-p3 .0664925 .181482 .179465);--color-sky-50:color(display-p3 .946501 .975402 .998336);--color-sky-100:color(display-p3 .889195 .946622 .992447);--color-sky-200:color(display-p3 .758153 .897447 .986665);--color-sky-600:color(display-p3 .162505 .509376 .796082);--color-sky-700:color(display-p3 .130314 .404568 .640847);--color-sky-800:color(display-p3 .120719 .343083 .524405);--color-sky-950:color(display-p3 .0726429 .180783 .28188);--color-blue-50:color(display-p3 .941826 .963151 .995385);--color-blue-200:color(display-p3 .76688 .855207 .987483);--color-blue-700:color(display-p3 .1379 .274983 .867624);--color-rose-50:color(display-p3 .989671 .946597 .949215);--color-rose-100:color(display-p3 .982241 .897232 .902568);--color-rose-200:color(display-p3 .96875 .808776 .827317);--color-rose-300:color(display-p3 .96017 .647703 .683715);--color-rose-600:color(display-p3 .848792 .102011 .269259);--color-rose-700:color(display-p3 .711801 .0770816 .226777);--color-rose-800:color(display-p3 .591248 .0929065 .220097);--color-rose-900:color(display-p3 .498064 .104884 .214595);--color-rose-950:color(display-p3 .275407 .0406065 .0990695);--color-slate-50:color(display-p3 .974377 .979815 .986207);--color-slate-100:color(display-p3 .947345 .959969 .97483);--color-slate-200:color(display-p3 .890322 .909405 .939294);--color-slate-300:color(display-p3 .800294 .834432 .882803);--color-slate-400:color(display-p3 .577446 .629622 .716602);--color-slate-500:color(display-p3 .397645 .452653 .547642);--color-slate-600:color(display-p3 .283418 .332214 .416355);--color-slate-700:color(display-p3 .205992 .253487 .336039);--color-slate-800:color(display-p3 .121994 .158688 .232363);--color-slate-900:color(display-p3 .0639692 .0891152 .163036);--color-slate-950:color(display-p3 .0102437 .0227555 .0878731)}}@supports (color:lab(0% 0 0)){:root,:host{--color-red-50:lab(96.5005% 4.18508 1.52328);--color-red-100:lab(92.243% 10.2865 3.83865);--color-red-200:lab(86.017% 19.8815 7.75869);--color-red-300:lab(76.5514% 36.422 15.5335);--color-red-500:lab(55.4814% 75.0732 48.8528);--color-red-700:lab(40.4273% 67.2623 53.7441);--color-red-800:lab(33.7174% 55.8993 41.0293);--color-red-900:lab(28.5139% 44.5539 29.0463);--color-red-950:lab(13.003% 29.04 16.7519);--color-amber-50:lab(98.6252% -.635922 8.42309);--color-amber-100:lab(95.916% -1.21653 23.111);--color-amber-200:lab(91.7203% -.505269 49.9084);--color-amber-300:lab(86.4156% 6.13147 78.3961);--color-amber-500:lab(72.7183% 31.8672 97.9407);--color-amber-600:lab(60.3514% 40.5624 87.1228);--color-amber-700:lab(47.2709% 42.9082 69.2966);--color-amber-800:lab(37.8822% 37.1699 52.2718);--color-amber-900:lab(31.2288% 30.2627 40.0378);--color-amber-950:lab(15.8111% 20.9107 23.3752);--color-emerald-50:lab(97.8462% -6.94966 1.85487);--color-emerald-100:lab(94.9004% -17.0769 5.63836);--color-emerald-200:lab(90.2247% -31.039 9.47084);--color-emerald-500:lab(66.9756% -58.27 19.5419);--color-emerald-700:lab(44.4871% -41.0396 11.0361);--color-emerald-800:lab(35.3675% -33.1188 8.04002);--color-emerald-900:lab(28.8637% -26.9249 5.45986);--color-emerald-950:lab(15.0582% -17.9507 2.38369);--color-teal-50:lab(98.3189% -4.74921 -.111711);--color-teal-100:lab(95.1845% -17.4212 -.425422);--color-teal-200:lab(90.7612% -33.1343 -.542295);--color-teal-300:lab(84.8977% -48.1516 -1.3321);--color-teal-400:lab(76.0109% -53.3483 -2.27906);--color-teal-500:lab(67.3859% -49.0983 -2.63511);--color-teal-600:lab(55.0223% -41.0774 -3.90277);--color-teal-700:lab(44.4134% -33.1436 -4.22149);--color-teal-800:lab(35.5975% -26.6648 -4.34487);--color-teal-900:lab(29.506% -21.4706 -3.59886);--color-teal-950:lab(16.6371% -15.3183 -3.81732);--color-sky-50:lab(97.3623% -2.33802 -4.13098);--color-sky-100:lab(94.3709% -4.56053 -8.23453);--color-sky-200:lab(88.6983% -11.3978 -16.8488);--color-sky-600:lab(51.7754% -11.4712 -49.8349);--color-sky-700:lab(41.6013% -9.10804 -42.5647);--color-sky-800:lab(35.164% -9.57692 -34.4068);--color-sky-950:lab(17.8299% -5.31271 -21.1584);--color-blue-50:lab(96.492% -1.14644 -5.11479);--color-blue-200:lab(86.15% -4.04379 -21.0797);--color-blue-700:lab(36.9089% 35.0961 -85.6872);--color-rose-50:lab(96.2369% 4.94155 1.28011);--color-rose-100:lab(92.8221% 9.86832 2.60075);--color-rose-200:lab(86.806% 19.1909 4.07754);--color-rose-300:lab(76.6339% 38.3549 9.68835);--color-rose-600:lab(49.1882% 81.577 36.0311);--color-rose-700:lab(41.1651% 71.6251 30.3087);--color-rose-800:lab(34.6481% 60.802 20.1957);--color-rose-900:lab(29.7104% 51.514 12.6253);--color-rose-950:lab(14.2323% 34.0086 9.80922);--color-slate-50:lab(98.1434% -.369519 -1.05966);--color-slate-100:lab(96.286% -.852436 -2.46847);--color-slate-200:lab(91.7353% -.998765 -4.76968);--color-slate-300:lab(84.7652% -1.94535 -7.93337);--color-slate-400:lab(65.5349% -2.25151 -14.5072);--color-slate-500:lab(48.0876% -2.03595 -16.5814);--color-slate-600:lab(35.5623% -1.74978 -15.4316);--color-slate-700:lab(26.9569% -1.47016 -15.6993);--color-slate-800:lab(16.132% -.318035 -14.6672);--color-slate-900:lab(7.78673% 1.82345 -15.0537);--color-slate-950:lab(1.76974% 1.32743 -9.28855)}}}@layer base{*,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::-webkit-file-upload-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::-webkit-file-upload-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:-webkit-any([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:-webkit-any([multiple],[size])) optgroup option{padding-inline-start:20px}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::-webkit-file-upload-button{margin-inline-end:4px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-year-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-month-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-day-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-hour-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-minute-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-second-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-millisecond-field{padding-block-start:0;padding-block-end:0}::-webkit-datetime-edit-meridiem-field{padding-block-start:0;padding-block-end:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button{-webkit-appearance:button;appearance:button}input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;appearance:button}::-webkit-file-upload-button{-webkit-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;bottom:0;left:0;right:0}.inset-y-0{top:0;bottom:0}.top-0{top:0}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1{top:var(--spacing)}.top-\[4\.5rem\]{top:4.5rem}.right-0{right:0}.right-0\.5{right:calc(var(--spacing) * .5)}.right-1{right:var(--spacing)}.left-0{left:0}.left-1{left:var(--spacing)}.left-6{left:calc(var(--spacing) * 6)}.isolate{isolation:isolate}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[1000\]{z-index:1000}.m-0{margin:0}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-auto{margin-inline-start:auto;margin-inline-end:auto}.my-5{margin-block:calc(var(--spacing) * 5)}.my-6{margin-block:calc(var(--spacing) * 6)}.my-auto{margin-block-start:auto;margin-block-end:auto}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-auto{margin-top:auto}.mb-0{margin-bottom:0}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-0{margin-left:0}.ml-1{margin-left:var(--spacing)}.ml-3{margin-left:calc(var(--spacing) * 3)}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-24{width:calc(var(--spacing) * 24);height:calc(var(--spacing) * 24)}.size-\[76px\]{width:76px;height:76px}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-10{height:calc(var(--spacing) * 10)}.h-44{height:calc(var(--spacing) * 44)}.h-\[4\.5rem\]{height:4.5rem}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-\[20rem\]{max-height:20rem}.max-h-\[22rem\]{max-height:22rem}.max-h-\[28rem\]{max-height:28rem}.min-h-0{min-height:0}.min-h-9{min-height:calc(var(--spacing) * 9)}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-14{min-height:calc(var(--spacing) * 14)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-52{min-height:calc(var(--spacing) * 52)}.min-h-\[4\.5rem\]{min-height:4.5rem}.min-h-screen{min-height:100vh}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[68\%\]{max-width:68%}.max-w-\[288px\]{max-width:288px}.max-w-\[1600px\]{max-width:1600px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-20{min-width:calc(var(--spacing) * 20)}.min-w-24{min-width:calc(var(--spacing) * 24)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.translate-x-1\/2{--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-180{rotate:180deg}.animate-bounce{animation:var(--animate-bounce)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.resize{resize:both}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-7>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 7) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 7) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-1\.5{column-gap:calc(var(--spacing) * 1.5)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-5{column-gap:calc(var(--spacing) * 5)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-slate-200>:not(:last-child)){border-color:var(--color-slate-200)}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-300{border-color:var(--color-amber-300)}.border-current{border-color:currentColor}.border-emerald-200{border-color:var(--color-emerald-200)}.border-emerald-700{border-color:var(--color-emerald-700)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-red-700{border-color:var(--color-red-700)}.border-rose-200{border-color:var(--color-rose-200)}.border-rose-300{border-color:var(--color-rose-300)}.border-sky-100{border-color:var(--color-sky-100)}.border-sky-200{border-color:var(--color-sky-200)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.border-teal-200{border-color:var(--color-teal-200)}.border-teal-300{border-color:var(--color-teal-300)}.border-teal-400{border-color:var(--color-teal-400)}.border-teal-600{border-color:var(--color-teal-600)}.border-teal-700{border-color:var(--color-teal-700)}.border-white\/80{border-color:#fffc}@supports (color:color-mix(in lab, red, red)){.border-white\/80{border-color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-50\/70{background-color:#fffbebb3}@supports (color:color-mix(in lab, red, red)){.bg-amber-50\/70{background-color:color-mix(in oklab, var(--color-amber-50) 70%, transparent)}}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-600{background-color:var(--color-amber-600)}.bg-amber-700{background-color:var(--color-amber-700)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-50\/70{background-color:#ecfdf5b3}@supports (color:color-mix(in lab, red, red)){.bg-emerald-50\/70{background-color:color-mix(in oklab, var(--color-emerald-50) 70%, transparent)}}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-700{background-color:var(--color-emerald-700)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-700{background-color:var(--color-red-700)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-50\/70{background-color:#fff1f2b3}@supports (color:color-mix(in lab, red, red)){.bg-rose-50\/70{background-color:color-mix(in oklab, var(--color-rose-50) 70%, transparent)}}.bg-rose-100{background-color:var(--color-rose-100)}.bg-rose-700{background-color:var(--color-rose-700)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-50\/60{background-color:#f0f9ff99}@supports (color:color-mix(in lab, red, red)){.bg-sky-50\/60{background-color:color-mix(in oklab, var(--color-sky-50) 60%, transparent)}}.bg-sky-600{background-color:var(--color-sky-600)}.bg-sky-700{background-color:var(--color-sky-700)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-50\/70{background-color:#f8fafcb3}@supports (color:color-mix(in lab, red, red)){.bg-slate-50\/70{background-color:color-mix(in oklab, var(--color-slate-50) 70%, transparent)}}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-400{background-color:var(--color-slate-400)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-950{background-color:var(--color-slate-950)}.bg-slate-950\/70{background-color:#020618b3}@supports (color:color-mix(in lab, red, red)){.bg-slate-950\/70{background-color:color-mix(in oklab, var(--color-slate-950) 70%, transparent)}}.bg-teal-50{background-color:var(--color-teal-50)}.bg-teal-100{background-color:var(--color-teal-100)}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-600{background-color:var(--color-teal-600)}.bg-teal-700{background-color:var(--color-teal-700)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/70{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.bg-white\/70{background-color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab, red, red)){.bg-white\/95{background-color:color-mix(in oklab, var(--color-white) 95%, transparent)}}.p-0{padding:0}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-12{padding-right:calc(var(--spacing) * 12)}.pb-1{padding-bottom:var(--spacing)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-9{padding-left:calc(var(--spacing) * 9)}.pl-11{padding-left:calc(var(--spacing) * 11)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.7rem\]{font-size:.7rem}.text-\[0\.65rem\]{font-size:.65rem}.text-\[0\.68rem\]{font-size:.68rem}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-900\/80{color:#7b3306cc}@supports (color:color-mix(in lab, red, red)){.text-amber-900\/80{color:color-mix(in oklab, var(--color-amber-900) 80%, transparent)}}.text-amber-950{color:var(--color-amber-950)}.text-blue-700{color:var(--color-blue-700)}.text-current{color:currentColor}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-800{color:var(--color-emerald-800)}.text-emerald-900{color:var(--color-emerald-900)}.text-emerald-950{color:var(--color-emerald-950)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-red-900{color:var(--color-red-900)}.text-red-950{color:var(--color-red-950)}.text-rose-600{color:var(--color-rose-600)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-rose-900{color:var(--color-rose-900)}.text-rose-950{color:var(--color-rose-950)}.text-sky-700{color:var(--color-sky-700)}.text-sky-800{color:var(--color-sky-800)}.text-sky-950{color:var(--color-sky-950)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-slate-950{color:var(--color-slate-950)}.text-teal-300{color:var(--color-teal-300)}.text-teal-600{color:var(--color-teal-600)}.text-teal-700{color:var(--color-teal-700)}.text-teal-800{color:var(--color-teal-800)}.text-teal-900{color:var(--color-teal-900)}.text-teal-950{color:var(--color-teal-950)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.accent-teal-700{accent-color:var(--color-teal-700)}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-slate-900\/5{--tw-shadow-color:#0f172b0d}@supports (color:color-mix(in lab, red, red)){.shadow-slate-900\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-900) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-slate-950\/10{--tw-shadow-color:#0206181a}@supports (color:color-mix(in lab, red, red)){.shadow-slate-950\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-950) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-amber-200{--tw-ring-color:var(--color-amber-200)}.ring-blue-200{--tw-ring-color:var(--color-blue-200)}.ring-emerald-200{--tw-ring-color:var(--color-emerald-200)}.ring-red-200{--tw-ring-color:var(--color-red-200)}.ring-rose-200{--tw-ring-color:var(--color-rose-200)}.ring-sky-100{--tw-ring-color:var(--color-sky-100)}.ring-sky-200{--tw-ring-color:var(--color-sky-200)}.ring-slate-100{--tw-ring-color:var(--color-slate-100)}.ring-slate-200{--tw-ring-color:var(--color-slate-200)}.ring-teal-100{--tw-ring-color:var(--color-teal-100)}.ring-teal-200{--tw-ring-color:var(--color-teal-200)}.ring-white{--tw-ring-color:var(--color-white)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\]{transition-property:left;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.ring-inset{--tw-ring-inset:inset}.group-open\:hidden:-webkit-any(:where(.group):-webkit-any([open],:popover-open,:open) *){display:none}.group-open\:hidden:is(:where(.group):is([open],:popover-open,:open) *){display:none}.group-open\:inline-block:-webkit-any(:where(.group):-webkit-any([open],:popover-open,:open) *){display:inline-block}.group-open\:inline-block:is(:where(.group):is([open],:popover-open,:open) *){display:inline-block}.group-open\:inline-flex:-webkit-any(:where(.group):-webkit-any([open],:popover-open,:open) *){display:inline-flex}.group-open\:inline-flex:is(:where(.group):is([open],:popover-open,:open) *){display:inline-flex}.placeholder\:text-slate-400::placeholder{color:var(--color-slate-400)}.first\:mt-0:first-child{margin-top:0}.first\:pt-0:first-child{padding-top:0}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:0}@media (hover:hover){.hover\:border-emerald-800:hover{border-color:var(--color-emerald-800)}.hover\:border-red-200:hover{border-color:var(--color-red-200)}.hover\:border-red-300:hover{border-color:var(--color-red-300)}.hover\:border-red-800:hover{border-color:var(--color-red-800)}.hover\:border-slate-300:hover{border-color:var(--color-slate-300)}.hover\:border-teal-200:hover{border-color:var(--color-teal-200)}.hover\:border-teal-300:hover{border-color:var(--color-teal-300)}.hover\:border-teal-400:hover{border-color:var(--color-teal-400)}.hover\:border-teal-800:hover{border-color:var(--color-teal-800)}.hover\:bg-amber-50:hover{background-color:var(--color-amber-50)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-amber-700:hover{background-color:var(--color-amber-700)}.hover\:bg-amber-800:hover{background-color:var(--color-amber-800)}.hover\:bg-black\/5:hover{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/5:hover{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.hover\:bg-emerald-800:hover{background-color:var(--color-emerald-800)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-800:hover{background-color:var(--color-red-800)}.hover\:bg-rose-50:hover{background-color:var(--color-rose-50)}.hover\:bg-rose-100:hover{background-color:var(--color-rose-100)}.hover\:bg-rose-800:hover{background-color:var(--color-rose-800)}.hover\:bg-sky-800:hover{background-color:var(--color-sky-800)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}.hover\:bg-teal-50:hover{background-color:var(--color-teal-50)}.hover\:bg-teal-100:hover{background-color:var(--color-teal-100)}.hover\:bg-teal-800:hover{background-color:var(--color-teal-800)}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:text-rose-800:hover{color:var(--color-rose-800)}.hover\:text-slate-800:hover{color:var(--color-slate-800)}.hover\:text-slate-950:hover{color:var(--color-slate-950)}.hover\:text-teal-700:hover{color:var(--color-teal-700)}.hover\:text-teal-800:hover{color:var(--color-teal-800)}.hover\:text-teal-900:hover{color:var(--color-teal-900)}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\:border-teal-500:focus{border-color:var(--color-teal-500)}.focus\:bg-white:focus{background-color:var(--color-white)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-4:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-teal-100:focus{--tw-ring-color:var(--color-teal-100)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:rounded:focus-visible{border-radius:.25rem}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-4:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-amber-100:focus-visible{--tw-ring-color:var(--color-amber-100)}.focus-visible\:ring-amber-200:focus-visible{--tw-ring-color:var(--color-amber-200)}.focus-visible\:ring-current:focus-visible{--tw-ring-color:currentcolor}.focus-visible\:ring-emerald-100:focus-visible{--tw-ring-color:var(--color-emerald-100)}.focus-visible\:ring-red-100:focus-visible{--tw-ring-color:var(--color-red-100)}.focus-visible\:ring-red-200:focus-visible{--tw-ring-color:var(--color-red-200)}.focus-visible\:ring-teal-100:focus-visible{--tw-ring-color:var(--color-teal-100)}.focus-visible\:ring-teal-200:focus-visible{--tw-ring-color:var(--color-teal-200)}.focus-visible\:ring-teal-500:focus-visible{--tw-ring-color:var(--color-teal-500)}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-teal-500:focus-visible{outline-color:var(--color-teal-500)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-progress:disabled{cursor:progress}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:bg-red-700:disabled{background-color:var(--color-red-700)}.disabled\:bg-slate-100:disabled{background-color:var(--color-slate-100)}.disabled\:text-slate-400:disabled{color:var(--color-slate-400)}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.disabled\:opacity-80:disabled{opacity:.8}@media (min-width:40rem){.sm\:mx-6{margin-inline:calc(var(--spacing) * 6)}.sm\:mb-6{margin-bottom:calc(var(--spacing) * 6)}.sm\:h-52{height:calc(var(--spacing) * 52)}.sm\:min-h-9{min-height:calc(var(--spacing) * 9)}.sm\:min-h-10{min-height:calc(var(--spacing) * 10)}.sm\:w-52{width:calc(var(--spacing) * 52)}.sm\:w-auto{width:auto}.sm\:max-w-\[392px\]{max-width:392px}.sm\:max-w-\[592px\]{max-width:592px}.sm\:flex-none{flex:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:justify-start{justify-content:flex-start}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:self-auto{align-self:auto}.sm\:p-4{padding:calc(var(--spacing) * 4)}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-7{padding:calc(var(--spacing) * 7)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:px-2{padding-inline:calc(var(--spacing) * 2)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:pt-2{padding-top:calc(var(--spacing) * 2)}.sm\:pt-6{padding-top:calc(var(--spacing) * 6)}.sm\:pb-6{padding-bottom:calc(var(--spacing) * 6)}.sm\:pb-10{padding-bottom:calc(var(--spacing) * 10)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:48rem){.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:inline-flex{display:inline-flex}.md\:h-\[4\.5rem\]{height:4.5rem}.md\:h-full{height:100%}.md\:min-h-screen{min-height:100vh}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[5rem_minmax\(0\,1fr\)\]{grid-template-columns:5rem minmax(0,1fr)}.md\:grid-cols-\[16rem_minmax\(0\,1fr\)\]{grid-template-columns:16rem minmax(0,1fr)}.md\:flex-col{flex-direction:column}.md\:py-0{padding-block-start:0;padding-block-end:0}.md\:transition-\[grid-template-columns\]{transition-property:grid-template-columns;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.md\:duration-200{--tw-duration:.2s;transition-duration:.2s}.md\:ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}}@media (min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-start-2{grid-column-start:2}.lg\:block{display:block}.lg\:w-72{width:calc(var(--spacing) * 72)}.lg\:flex-1{flex:1}.lg\:shrink-0{flex-shrink:0}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,18\.5rem\)\]{grid-template-columns:minmax(0,1fr) minmax(0,18.5rem)}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:justify-end{justify-content:flex-end}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:pt-3{padding-top:calc(var(--spacing) * 3)}.lg\:pt-8{padding-top:calc(var(--spacing) * 8)}.lg\:pb-12{padding-bottom:calc(var(--spacing) * 12)}.lg\:whitespace-nowrap{white-space:nowrap}}@media (min-width:80rem){.xl\:col-start-1{grid-column-start:1}.xl\:col-start-2{grid-column-start:2}.xl\:row-span-2{grid-row:span 2/span 2}.xl\:row-start-1{grid-row-start:1}.xl\:row-start-2{grid-row-start:2}.xl\:size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.xl\:h-full{height:100%}.xl\:w-80{width:calc(var(--spacing) * 80)}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-\[minmax\(0\,0\.95fr\)_minmax\(0\,1\.05fr\)\]{grid-template-columns:minmax(0,.95fr) minmax(0,1.05fr)}.xl\:grid-cols-\[minmax\(0\,1\.2fr\)_minmax\(18rem\,0\.8fr\)\]{grid-template-columns:minmax(0,1.2fr) minmax(18rem,.8fr)}.xl\:grid-cols-\[minmax\(0\,1\.08fr\)_minmax\(0\,0\.92fr\)\]{grid-template-columns:minmax(0,1.08fr) minmax(0,.92fr)}.xl\:grid-cols-\[minmax\(0\,1\.45fr\)_minmax\(20rem\,0\.75fr\)\]{grid-template-columns:minmax(0,1.45fr) minmax(20rem,.75fr)}.xl\:grid-cols-\[minmax\(0\,1\.55fr\)_minmax\(18rem\,0\.65fr\)\]{grid-template-columns:minmax(0,1.55fr) minmax(18rem,.65fr)}.xl\:flex-col{flex-direction:column}.xl\:items-stretch{align-items:stretch}.xl\:justify-end{justify-content:flex-end}.xl\:gap-2{gap:calc(var(--spacing) * 2)}.xl\:self-stretch{align-self:stretch}.xl\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.xl\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.xl\:p-4{padding:calc(var(--spacing) * 4)}.xl\:px-10{padding-inline:calc(var(--spacing) * 10)}.xl\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.xl\:whitespace-nowrap{white-space:nowrap}}@media (min-width:96rem){.\32 xl\:size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.\32 xl\:flex-row{flex-direction:row}.\32 xl\:p-5{padding:calc(var(--spacing) * 5)}.\32 xl\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}}:host{color:#0f172a;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:transparent;text-rendering:optimizelegibility;width:100%;min-width:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;display:block}.smartsafehub-shadow-root{width:100%;min-width:0;max-width:100%;display:block}.smartsafehub-shadow-root,.smartsafehub-shadow-root *,.smartsafehub-shadow-root :before,.smartsafehub-shadow-root :after{box-sizing:border-box}.ssh-app{width:100%;min-width:0;max-width:100%;overflow:clip}.ssh-app main,.ssh-app section,.ssh-app article,.ssh-app aside,.ssh-app nav,.ssh-app div{min-width:0}.ssh-product-hero{border-radius:0}.ssh-product-header-action{border-color:#e2e8f0!important}.ssh-product-header-action:hover{border-color:#5eead4!important}.ssh-app a,.ssh-app button,.ssh-app input,.ssh-app textarea{touch-action:manipulation}.ssh-app[data-theme=dark] .ssh-custom-select-trigger:disabled{color:#64748b;background-color:#1e293b;border-color:#334155}.ssh-app[data-theme=dark] .ssh-custom-select-trigger:focus-visible{--tw-ring-color:#134e4aa6}.ssh-app[data-theme=dark] .ssh-custom-select-menu{box-shadow:0 18px 45px #00000059}.ssh-mobile-navigation{padding-left:max(1rem, env(safe-area-inset-left));padding-right:max(1rem, env(safe-area-inset-right))}.ssh-mobile-menu{overscroll-behavior:contain;-webkit-overflow-scrolling:touch;max-height:calc(100dvh - 4.5rem);overflow-y:auto}.ssh-touch-scroll{scrollbar-width:none;overscroll-behavior-inline:contain;-webkit-overflow-scrolling:touch}.ssh-touch-scroll::-webkit-scrollbar{display:none}@media (max-width:767px){.ssh-app{min-height:100dvh;overflow-x:clip}.ssh-product-hero{padding-top:max(1.25rem, env(safe-area-inset-top));padding-left:max(1rem, env(safe-area-inset-left));padding-right:max(1rem, env(safe-area-inset-right))}.ssh-product-main{padding-right:max(1rem, env(safe-area-inset-right));padding-bottom:max(2rem, env(safe-area-inset-bottom));padding-left:max(1rem, env(safe-area-inset-left))}.ssh-app input,.ssh-app textarea{font-size:16px}.ssh-app button,.ssh-app a{min-height:44px}}.ssh-apps-nav-link:not([aria-current=page]){color:#115e59;background-color:#f0fdfa;border:1px solid #99f6e4}.ssh-apps-nav-link:not([aria-current=page]):hover{background-color:#ccfbf1;border-color:#5eead4}.ssh-apps-nav-description{color:#0f766e}.ssh-app[data-theme=dark] .ssh-apps-nav-link:not([aria-current=page]){color:#e2e8f0;background-color:#14b8a617;border-color:#134e4a}.ssh-app[data-theme=dark] .ssh-apps-nav-link:not([aria-current=page]):hover{color:#5eead4;background-color:#14b8a629;border-color:#0f766e}.ssh-app[data-theme=dark] .ssh-apps-nav-description{color:#5eead4}.ssh-apps-nav-link:focus-visible{outline-offset:2px;outline:2px solid #0d9488}.ssh-sidebar-toggle{color:#64748b;background:#fff;border:1px solid #e2e8f0;box-shadow:0 1px 3px #0f172a1f}.ssh-sidebar-toggle:hover{color:#0f766e;background:#f8fafc;border-color:#99f6e4}.ssh-app[data-theme=dark] .ssh-sidebar-toggle{color:#94a3b8;background:#1e293b;border-color:#334155;box-shadow:0 1px 3px #00000047}.ssh-app[data-theme=dark] .ssh-sidebar-toggle:hover{color:#5eead4;background:#334155;border-color:#0f766e}.ssh-update-nav-badge{color:#92400e;background:#fef3c7;border:1px solid #f59e0b;border-radius:9999px;justify-content:center;align-items:center;min-width:1.3rem;height:1.3rem;padding:0 .25rem;font-size:.75rem;font-weight:900;line-height:1;display:inline-flex;box-shadow:0 1px 2px #0f172a1f}.ssh-update-nav-badge[data-collapsed=true]{z-index:1;width:auto;min-width:1.25rem;height:1.25rem;padding:0 .25rem;position:absolute;top:.125rem;right:.125rem;box-shadow:0 0 0 2px #fff,0 2px 5px #0f172a33}.ssh-app[data-theme=dark] .ssh-update-nav-badge{color:#422006;background:#fbbf24;border-color:#fcd34d;box-shadow:0 1px 3px #0000004d}.ssh-app[data-theme=dark] .ssh-update-nav-badge[data-collapsed=true]{box-shadow:0 0 0 2px #0f172a,0 2px 6px #00000061}.ssh-update-progress-track{background:#bae6fd;border-radius:9999px;height:.375rem;position:relative;overflow:hidden}.ssh-update-progress-bar{border-radius:inherit;background:#0284c7;width:38%;animation:1.2s ease-in-out infinite ssh-update-progress;position:absolute;top:0;bottom:0;left:0}.ssh-app[data-theme=dark] .ssh-update-progress-track{background:#1e3a5f}.ssh-app[data-theme=dark] .ssh-update-progress-bar{background:#38bdf8}.ssh-app button.ssh-switch-control{box-sizing:border-box;flex:0 0 3rem;width:3rem;min-width:3rem;max-width:3rem;height:1.75rem;min-height:1.75rem;max-height:1.75rem;padding:0}.ssh-switch-thumb{aspect-ratio:1;box-sizing:border-box;background-color:#fff;border-radius:9999px;width:1.25rem;min-width:1.25rem;max-width:1.25rem;height:1.25rem;min-height:1.25rem;max-height:1.25rem}@keyframes ssh-update-progress{0%{transform:translate(-110%)}to{transform:translate(300%)}}.ssh-software-settings-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,18rem),1fr));gap:1rem;display:grid}.ssh-software-settings-channel{grid-column:1/-1}.ssh-time-select{grid-template-columns:repeat(2,minmax(0,1fr));gap:.5rem;width:100%;min-width:0;max-width:100%;display:grid}.ssh-time-select>*{min-width:0}.ssh-time-select .ssh-custom-select-trigger{gap:.5rem;min-width:0;max-width:100%;padding-inline-start:.75rem;padding-inline-end:.75rem}.ssh-ipv4-segments{grid-template-columns:repeat(4,minmax(0,1fr));gap:.75rem;width:100%;min-width:0;max-width:100%;display:grid}.ssh-ipv4-segment{min-width:0;position:relative}.ssh-ipv4-separator{pointer-events:none;position:absolute;top:50%;right:-.375rem;transform:translate(50%,-50%)}@media (min-width:640px){.ssh-ipv4-segments{gap:1rem}.ssh-ipv4-separator{right:-.5rem}}.ssh-app .ssh-rule-group-toggle:hover{background-color:#f1f5f9}.ssh-app[data-theme=dark] .ssh-rule-group-toggle:hover{background-color:#1e293b}.ssh-app[data-theme=dark] .ssh-password-input:-webkit-autofill{-webkit-text-fill-color:#f8fafc;caret-color:#f8fafc;box-shadow:inset 0 0 0 1000px #0f172a}.ssh-app[data-theme=dark] .ssh-password-input:-webkit-autofill:hover{-webkit-text-fill-color:#f8fafc;caret-color:#f8fafc;box-shadow:inset 0 0 0 1000px #0f172a}.ssh-app[data-theme=dark] .ssh-password-input:-webkit-autofill:focus{-webkit-text-fill-color:#f8fafc;caret-color:#f8fafc;box-shadow:inset 0 0 0 1000px #0f172a}.ssh-app[data-theme=light] .ssh-password-input:-webkit-autofill{-webkit-text-fill-color:#0f172a;caret-color:#0f172a;box-shadow:inset 0 0 0 1000px #fff}.ssh-app[data-theme=light] .ssh-password-input:-webkit-autofill:hover{-webkit-text-fill-color:#0f172a;caret-color:#0f172a;box-shadow:inset 0 0 0 1000px #fff}.ssh-app[data-theme=light] .ssh-password-input:-webkit-autofill:focus{-webkit-text-fill-color:#0f172a;caret-color:#0f172a;box-shadow:inset 0 0 0 1000px #fff}.ssh-app[data-theme=dark]{color:#f8fafc;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;background:#020617}.ssh-app[data-theme=dark] [class~=bg-white]{background-color:#0f172a}.ssh-app[data-theme=dark] [class~=bg-white\/95]{background-color:#0f172af2}.ssh-app[data-theme=dark] [class~=bg-white\/70]{background-color:#0f172ac7}.ssh-app[data-theme=dark] [class~=bg-slate-50]{background-color:#020617}.ssh-app[data-theme=dark] [class~=bg-slate-50\/70]{background-color:#020617b8}.ssh-app[data-theme=dark] [class~=bg-slate-100]{background-color:#1e293b}.ssh-app[data-theme=dark] [class~=bg-slate-200]{background-color:#334155}.ssh-app[data-theme=dark] [class~=bg-slate-300]{background-color:#475569}.ssh-app[data-theme=dark] [class~=bg-slate-400]{background-color:#64748b}.ssh-app[data-theme=dark] [class~=bg-black\/5]{background-color:#ffffff0d}.ssh-app[data-theme=dark] [class~=text-slate-950]{color:#f8fafc}.ssh-app[data-theme=dark] [class~=text-slate-900]{color:#f1f5f9}.ssh-app[data-theme=dark] [class~=text-slate-800]{color:#e2e8f0}.ssh-app[data-theme=dark] [class~=text-slate-700],.ssh-app[data-theme=dark] [class~=text-slate-600]{color:#cbd5e1}.ssh-app[data-theme=dark] [class~=text-slate-500],.ssh-app[data-theme=dark] [class~=text-slate-400]{color:#94a3b8}.ssh-app[data-theme=dark] [class~=text-slate-300]{color:#cbd5e1}.ssh-app[data-theme=dark] [class~=border-slate-100],.ssh-app[data-theme=dark] [class~=border-slate-200],.ssh-app[data-theme=dark] [class~=divide-slate-200]{border-color:#1e293b}.ssh-app[data-theme=dark] [class~=border-slate-300],.ssh-app[data-theme=dark] [class~=border-white\/80]{border-color:#334155}.ssh-app[data-theme=dark] [class~=ring-slate-100],.ssh-app[data-theme=dark] [class~=ring-slate-200],.ssh-app[data-theme=dark] [class~=ring-white]{--tw-ring-color:#334155}.ssh-app[data-theme=dark] [class~=bg-teal-50],.ssh-app[data-theme=dark] [class~=bg-teal-100]{background-color:#0d948829}.ssh-app[data-theme=dark] [class~=text-teal-700],.ssh-app[data-theme=dark] [class~=text-teal-800],.ssh-app[data-theme=dark] [class~=text-teal-900],.ssh-app[data-theme=dark] [class~=text-teal-950]{color:#5eead4}.ssh-app[data-theme=dark] [class~=border-teal-200],.ssh-app[data-theme=dark] [class~=border-teal-300]{border-color:#115e59}.ssh-app[data-theme=dark] [class~=ring-teal-100],.ssh-app[data-theme=dark] [class~=ring-teal-200]{--tw-ring-color:#134e4a}.ssh-app[data-theme=dark] [class~=bg-sky-50],.ssh-app[data-theme=dark] [class~=bg-sky-50\/60]{background-color:#0ea5e91f}.ssh-app[data-theme=dark] [class~=text-sky-700],.ssh-app[data-theme=dark] [class~=text-sky-800],.ssh-app[data-theme=dark] [class~=text-sky-950]{color:#7dd3fc}.ssh-app[data-theme=dark] [class~=border-sky-200]{border-color:#075985}.ssh-app[data-theme=dark] [class~=ring-sky-100],.ssh-app[data-theme=dark] [class~=ring-sky-200]{--tw-ring-color:#0c4a6e}.ssh-app[data-theme=dark] [class~=bg-emerald-50],.ssh-app[data-theme=dark] [class~=bg-emerald-100]{background-color:#10b98121}.ssh-app[data-theme=dark] [class~=bg-emerald-50\/70]{background-color:#10b9811a}.ssh-app[data-theme=dark] [class~=text-emerald-700],.ssh-app[data-theme=dark] [class~=text-emerald-800],.ssh-app[data-theme=dark] [class~=text-emerald-900],.ssh-app[data-theme=dark] [class~=text-emerald-950]{color:#6ee7b7}.ssh-app[data-theme=dark] [class~=border-emerald-200]{border-color:#065f46}.ssh-app[data-theme=dark] [class~=ring-emerald-100],.ssh-app[data-theme=dark] [class~=ring-emerald-200]{--tw-ring-color:#064e3b}.ssh-app[data-theme=dark] [class~=bg-amber-50],.ssh-app[data-theme=dark] [class~=bg-amber-50\/60],.ssh-app[data-theme=dark] [class~=bg-amber-100],.ssh-app[data-theme=dark] [class~=bg-amber-100\/70]{background-color:#f59e0b21}.ssh-app[data-theme=dark] [class~=bg-amber-50\/70]{background-color:#f59e0b1a}.ssh-app[data-theme=dark] [class~=text-amber-700],.ssh-app[data-theme=dark] [class~=text-amber-800],.ssh-app[data-theme=dark] [class~=text-amber-900],.ssh-app[data-theme=dark] [class~=text-amber-900\/80],.ssh-app[data-theme=dark] [class~=text-amber-950]{color:#fcd34d}.ssh-app[data-theme=dark] [class~=border-amber-200],.ssh-app[data-theme=dark] [class~=border-amber-300]{border-color:#92400e}.ssh-app[data-theme=dark] [class~=ring-amber-100],.ssh-app[data-theme=dark] [class~=ring-amber-200]{--tw-ring-color:#78350f}.ssh-app[data-theme=dark] [class~=bg-red-50],.ssh-app[data-theme=dark] [class~=bg-red-100]{background-color:#ef44441f}.ssh-app[data-theme=dark] [class~=text-red-700],.ssh-app[data-theme=dark] [class~=text-red-800],.ssh-app[data-theme=dark] [class~=text-red-900],.ssh-app[data-theme=dark] [class~=text-red-950]{color:#fca5a5}.ssh-app[data-theme=dark] [class~=border-red-200],.ssh-app[data-theme=dark] [class~=border-red-300]{border-color:#991b1b}.ssh-app[data-theme=dark] [class~=ring-red-100],.ssh-app[data-theme=dark] [class~=ring-red-200]{--tw-ring-color:#7f1d1d}.ssh-app[data-theme=dark] [class~=bg-rose-50]{background-color:#f43f5e1f}.ssh-app[data-theme=dark] [class~=bg-rose-50\/70]{background-color:#f43f5e1a}.ssh-app[data-theme=dark] [class~=text-rose-600],.ssh-app[data-theme=dark] [class~=text-rose-700],.ssh-app[data-theme=dark] [class~=text-rose-800],.ssh-app[data-theme=dark] [class~=text-rose-900],.ssh-app[data-theme=dark] [class~=text-rose-950]{color:#fda4af}.ssh-app[data-theme=dark] [class~=border-rose-200],.ssh-app[data-theme=dark] [class~=border-rose-300]{border-color:#9f1239}.ssh-app[data-theme=dark] [class~=ring-rose-200]{--tw-ring-color:#881337}.ssh-app[data-theme=dark] [class~=bg-blue-50]{background-color:#3b82f61f}.ssh-app[data-theme=dark] [class~=text-blue-700]{color:#93c5fd}.ssh-app[data-theme=dark] [class~=ring-blue-200]{--tw-ring-color:#1e3a8a}.ssh-app[data-theme=dark] .hover\:bg-slate-50:hover{background-color:#1e293b}.ssh-app[data-theme=dark] .hover\:bg-red-50:hover{background-color:#ef444429}.ssh-app[data-theme=dark] .hover\:bg-rose-50:hover{background-color:#f43f5e2e}.ssh-app[data-theme=dark] .hover\:text-slate-950:hover{color:#f8fafc}.ssh-app[data-theme=dark] .hover\:text-slate-700:hover{color:#e2e8f0}.ssh-app[data-theme=dark] .hover\:text-rose-800:hover{color:#fecdd3}.ssh-app[data-theme=dark] .hover\:border-slate-300:hover{border-color:#475569}.ssh-app[data-theme=dark] .ssh-product-header-action{color:#cbd5e1;background-color:#0f172a;border-color:#334155!important}.ssh-app[data-theme=dark] .ssh-product-header-action:hover{color:#5eead4;border-color:#0f766e!important}.ssh-app[data-theme=dark] .ssh-product-header-action:focus-visible{--tw-ring-color:#134e4a}.ssh-initial-setup-probe{color:#0f172a;background:#f8fafc;place-items:center;min-height:100dvh;padding:1.5rem;display:grid}.ssh-initial-setup-probe-card{text-align:center;background:#fff;border:1px solid #e2e8f0;border-radius:1.25rem;justify-items:center;gap:.7rem;width:min(100%,28rem);padding:2.25rem;display:grid;box-shadow:0 20px 55px #0f172a14}.ssh-initial-setup-probe-card>svg{color:#0f766e;width:2rem;height:2rem}.ssh-initial-setup-probe-card strong{font-size:1rem;font-weight:900}.ssh-initial-setup-probe-card span{color:#64748b;font-size:.84rem;line-height:1.55}.ssh-initial-setup-probe-card button{color:#fff;cursor:pointer;min-height:2.75rem;font:inherit;background:#0f766e;border:0;border-radius:.8rem;margin-top:.4rem;padding:0 1rem;font-size:.84rem;font-weight:900}.smartsafehub-login-shadow-root{background:#f8fafc;min-height:100dvh}.ssh-login-page,.ssh-login-page *,.ssh-login-page :before,.ssh-login-page :after{box-sizing:border-box}.ssh-login-page{--ssh-login-bg:#f8fafc;--ssh-login-surface:#fff;--ssh-login-surface-soft:#f8fafc;--ssh-login-border:#e2e8f0;--ssh-login-border-strong:#cbd5e1;--ssh-login-text:#0f172a;--ssh-login-muted:#64748b;--ssh-login-muted-soft:#94a3b8;--ssh-login-accent:#0f766e;--ssh-login-accent-hover:#115e59;--ssh-login-accent-soft:#f0fdfa;--ssh-login-accent-ring:#14b8a624;--ssh-login-card-shadow:0 24px 70px #0f172a14, 0 2px 10px #0f172a0a;background:var(--ssh-login-bg);min-height:100dvh;color:var(--ssh-login-text);grid-template-columns:minmax(0,1.08fr) minmax(420px,.92fr);display:grid}.ssh-login-page[data-theme=dark]{--ssh-login-bg:#020617;--ssh-login-surface:#0f172a;--ssh-login-surface-soft:#111827;--ssh-login-border:#1e293b;--ssh-login-border-strong:#334155;--ssh-login-text:#f8fafc;--ssh-login-muted:#94a3b8;--ssh-login-muted-soft:#64748b;--ssh-login-accent:#2dd4bf;--ssh-login-accent-hover:#5eead4;--ssh-login-accent-soft:#14b8a61a;--ssh-login-accent-ring:#2dd4bf2e;--ssh-login-card-shadow:0 28px 72px #0000003d, 0 0 0 1px #94a3b80a}.ssh-login-toast{top:max(1rem, env(safe-area-inset-top));z-index:20;color:#115e59;background:#f0fdfa;border:1px solid #99f6e4;border-radius:1rem;align-items:center;gap:.75rem;width:min(100% - 2rem,34rem);padding:.9rem 1rem;font-size:.88rem;font-weight:800;line-height:1.45;display:flex;position:fixed;left:50%;transform:translate(-50%);box-shadow:0 18px 45px #0f172a29}.ssh-login-toast svg{flex:none;width:1.25rem;height:1.25rem}.ssh-login-page[data-theme=dark] .ssh-login-toast{color:#99f6e4;background:#0f2f2e;border-color:#2dd4bf57;box-shadow:0 18px 45px #00000052}.ssh-login-brand{color:#f8fafc;background:radial-gradient(circle at 16% 14%,#2dd4bf29,#0000 28rem),linear-gradient(145deg,#020617 0%,#0f172a 56%,#042f2e 140%);justify-content:center;align-items:center;min-height:100dvh;padding:clamp(3rem,7vw,7rem);display:flex;position:relative;overflow:hidden}.ssh-login-brand:after{content:"";pointer-events:none;background-image:linear-gradient(#94a3b80e 1px,#0000 1px),linear-gradient(90deg,#94a3b80e 1px,#0000 1px);background-size:44px 44px;position:absolute;top:0;bottom:0;left:0;right:0;-webkit-mask-image:linear-gradient(to bottom right,#000,#0000 78%);mask-image:linear-gradient(to bottom right,#000,#0000 78%)}.ssh-login-brand-orb{filter:blur(1px);pointer-events:none;border-radius:9999px;position:absolute}.ssh-login-brand-orb-one{border:1px solid #2dd4bf29;width:30rem;height:30rem;top:-10rem;right:-8rem;box-shadow:inset 0 0 6rem #14b8a60d}.ssh-login-brand-orb-two{border:1px solid #5eead41c;width:36rem;height:36rem;bottom:-13rem;left:-10rem}.ssh-login-brand-content{z-index:1;width:min(100%,680px);position:relative}.ssh-login-brand-mark,.ssh-login-mobile-mark{color:#5eead4;background:#14b8a621;place-items:center;display:grid;box-shadow:inset 0 0 0 1px #5eead42e}.ssh-login-brand-mark{border-radius:1.5rem;width:4.5rem;height:4.5rem;margin-bottom:2rem}.ssh-login-brand-mark svg{width:2.25rem;height:2.25rem}.ssh-login-eyebrow,.ssh-login-kicker{color:#5eead4;letter-spacing:.22em;text-transform:uppercase;margin:0;font-size:.72rem;font-weight:900}.ssh-login-brand h1{letter-spacing:-.055em;margin:.7rem 0 0;font-size:clamp(2.7rem,5vw,5rem);font-weight:900;line-height:.98}.ssh-password-setup-brand-title-line{display:block}.ssh-login-brand-description{color:#cbd5e1;max-width:39rem;margin:1.6rem 0 0;font-size:clamp(1rem,1.5vw,1.16rem);line-height:1.85}.ssh-login-features{gap:.85rem;max-width:40rem;margin-top:3rem;display:grid}.ssh-login-feature{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#0f172a75;border:1px solid #94a3b81c;border-radius:1rem;align-items:center;gap:1rem;padding:.95rem 1rem;display:flex}.ssh-login-feature-icon{color:#5eead4;background:#14b8a61c;border-radius:.8rem;flex:none;place-items:center;width:2.65rem;height:2.65rem;display:grid}.ssh-login-feature-icon svg{width:1.25rem;height:1.25rem}.ssh-login-feature-copy{gap:.15rem;min-width:0;display:grid}.ssh-login-feature-copy strong{color:#f8fafc;font-size:.92rem;font-weight:800}.ssh-login-feature-copy>span{color:#94a3b8;font-size:.8rem;line-height:1.45}.ssh-login-panel{background:var(--ssh-login-bg);justify-content:center;align-items:center;min-height:100dvh;padding:clamp(2rem,5vw,5rem);transition:background-color .18s;display:flex;position:relative}.ssh-login-theme-toggle{top:max(1.25rem, env(safe-area-inset-top));right:max(1.25rem, env(safe-area-inset-right));z-index:2;border:1px solid var(--ssh-login-border);background:var(--ssh-login-surface);width:2.75rem;height:2.75rem;color:var(--ssh-login-muted);cursor:pointer;border-radius:.9rem;place-items:center;transition:border-color .15s,background-color .15s,color .15s,transform .15s;display:grid;position:absolute;box-shadow:0 5px 16px #0f172a0f}.ssh-login-theme-toggle svg{width:1.15rem;height:1.15rem}.ssh-login-theme-toggle:hover{border-color:var(--ssh-login-border-strong);color:var(--ssh-login-accent);transform:translateY(-1px)}.ssh-login-panel-inner{flex-direction:column;justify-content:center;width:min(100%,480px);min-height:min(40rem,100dvh - 4rem);display:flex}.ssh-login-card{border:1px solid var(--ssh-login-border);background:var(--ssh-login-surface);width:100%;box-shadow:var(--ssh-login-card-shadow);border-radius:1.5rem;padding:clamp(1.6rem,4vw,2.6rem);transition:background-color .18s,border-color .18s}.ssh-login-card-heading{align-items:flex-start;gap:1rem;display:flex}.ssh-login-card-heading>div{min-width:0}.ssh-login-mobile-mark{color:#fff;background:#0f766e;border-radius:1.1rem;flex:none;width:3.5rem;height:3.5rem;display:none;box-shadow:0 12px 28px #0f766e38}.ssh-login-mobile-mark svg{width:1.8rem;height:1.8rem}.ssh-login-kicker{color:var(--ssh-login-accent);letter-spacing:.18em}.ssh-login-card h2{color:var(--ssh-login-text);letter-spacing:-.035em;margin:.65rem 0 0;font-size:clamp(1.8rem,4vw,2.25rem);font-weight:900;line-height:1.15}.ssh-login-subtitle{color:var(--ssh-login-muted);margin:.7rem 0 0;font-size:.94rem;line-height:1.6}.ssh-login-alert{color:#9f1239;background:#fff1f2;border:1px solid #fecdd3;border-radius:.85rem;margin-top:1.3rem;padding:.85rem 1rem;font-size:.82rem;font-weight:700;line-height:1.55}.ssh-login-page[data-theme=dark] .ssh-login-alert{color:#fecdd3;background:#8813372e;border-color:#f43f5e59}.ssh-login-form{gap:1.1rem;margin-top:1.6rem;display:grid}.ssh-login-field{gap:.5rem;display:grid}.ssh-login-label{color:var(--ssh-login-text);font-size:.82rem;font-weight:800}.ssh-login-input-wrap{border:2px solid var(--ssh-login-border-strong);background:var(--ssh-login-surface-soft);min-height:3.3rem;color:var(--ssh-login-muted);border-radius:.9rem;align-items:center;transition:border-color .15s,background-color .15s,box-shadow .15s;display:flex;overflow:hidden;box-shadow:inset 0 1px 2px #0f172a09}.ssh-login-input-wrap:focus-within{border-color:var(--ssh-login-accent);background:var(--ssh-login-surface);box-shadow:0 0 0 4px var(--ssh-login-accent-ring)}.ssh-login-field-icon{background:var(--ssh-login-accent-soft);width:2.15rem;height:2.15rem;color:var(--ssh-login-accent);border-radius:.65rem;flex:none;place-items:center;margin-left:.55rem;transition:background-color .15s,color .15s,box-shadow .15s;display:grid}.ssh-login-field-icon svg{width:1.05rem;height:1.05rem}.ssh-login-input-wrap:focus-within .ssh-login-field-icon{box-shadow:inset 0 0 0 1px var(--ssh-login-accent-ring)}.ssh-login-input-wrap input{width:100%;min-width:0;height:3.15rem;color:var(--ssh-login-text);font:inherit;background:0 0;border:0;outline:0;padding:0 .8rem;font-size:.94rem;font-weight:700}.ssh-login-input-wrap input::placeholder{color:var(--ssh-login-muted-soft);opacity:.82;font-weight:600}.ssh-login-input-wrap input:-webkit-autofill{-webkit-text-fill-color:var(--ssh-login-text);caret-color:var(--ssh-login-text);box-shadow:0 0 0 1000px var(--ssh-login-surface-soft) inset}.ssh-login-input-wrap input:-webkit-autofill:hover{-webkit-text-fill-color:var(--ssh-login-text);caret-color:var(--ssh-login-text);box-shadow:0 0 0 1000px var(--ssh-login-surface-soft) inset}.ssh-login-input-wrap input:-webkit-autofill:focus{-webkit-text-fill-color:var(--ssh-login-text);caret-color:var(--ssh-login-text);box-shadow:0 0 0 1000px var(--ssh-login-surface-soft) inset}.ssh-login-input-wrap:focus-within input:-webkit-autofill{box-shadow:0 0 0 1000px var(--ssh-login-surface) inset}.ssh-login-input-wrap input:disabled{cursor:wait;opacity:.68}.ssh-login-password-toggle{width:2.35rem;height:2.35rem;color:var(--ssh-login-muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:.7rem;flex:none;place-items:center;margin-right:.45rem;transition:border-color .15s,background-color .15s,color .15s;display:grid}.ssh-login-password-toggle svg{width:1.05rem;height:1.05rem}.ssh-login-password-toggle:hover:not(:disabled){border-color:var(--ssh-login-border);background:var(--ssh-login-accent-soft);color:var(--ssh-login-accent)}.ssh-login-password-toggle:disabled{cursor:wait;opacity:.6}.ssh-login-theme-toggle:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-password-toggle:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-submit:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-fallback:focus-visible{outline:3px solid var(--ssh-login-accent-ring);outline-offset:2px}.ssh-login-password-hint{color:var(--ssh-login-muted);margin:-.55rem 0 -.15rem;font-size:.76rem;line-height:1.5}.ssh-password-requirements{gap:.4rem;margin:-.25rem 0 0;padding:0;list-style:none;display:grid}.ssh-password-requirement{color:var(--ssh-login-muted);align-items:center;gap:.5rem;font-size:.78rem;font-weight:700;display:flex}.ssh-password-requirement svg{width:1rem;height:1rem;color:var(--ssh-login-muted-soft);flex:none}.ssh-password-requirement.is-met,.ssh-password-requirement.is-met svg,.ssh-password-match.is-met{color:var(--ssh-login-accent)}.ssh-password-match{color:#be123c;margin:-.5rem 0 -.1rem;font-size:.78rem;font-weight:800}.ssh-password-setup-summary{background:#14b8a617;border:1px solid #5eead42e;border-radius:1rem;align-items:flex-start;gap:.85rem;max-width:40rem;margin-top:2.4rem;padding:1rem 1.1rem;display:flex}.ssh-password-setup-summary>svg{color:#5eead4;flex:none;width:1.3rem;height:1.3rem;margin-top:.1rem}.ssh-password-setup-summary>div{gap:.25rem;display:grid}.ssh-password-setup-summary strong{color:#f8fafc;font-size:.9rem}.ssh-password-setup-summary span{color:#94a3b8;font-size:.8rem;line-height:1.5}.ssh-login-caps{color:#b45309;margin:-.45rem 0 -.15rem;font-size:.78rem;font-weight:800}.ssh-login-page[data-theme=dark] .ssh-login-caps{color:#fbbf24}.ssh-login-submit{color:#fff;cursor:pointer;min-height:3.3rem;font:inherit;background:#0f766e;border:0;border-radius:.9rem;justify-content:center;align-items:center;gap:.65rem;margin-top:.25rem;font-size:.94rem;font-weight:900;transition:background-color .15s,transform .15s,box-shadow .15s;display:inline-flex;box-shadow:0 12px 26px #0f766e33}.ssh-login-submit:hover:not(:disabled){background:#115e59;transform:translateY(-1px);box-shadow:0 16px 30px #0f766e40}.ssh-login-submit:disabled{cursor:wait;opacity:.72}.ssh-login-submit-spinner,.ssh-login-probe-spinner{flex:none;animation:.75s linear infinite ssh-login-spin;display:inline-block}.ssh-login-submit-spinner{color:#fff;width:1rem;height:1rem}.ssh-login-security-note{color:var(--ssh-login-muted);align-items:flex-start;gap:.55rem;margin-top:1.2rem;font-size:.76rem;line-height:1.5;display:flex}.ssh-login-security-note svg{width:1rem;height:1rem;color:var(--ssh-login-accent);flex:none;margin-top:.06rem}.ssh-login-fallback{border:1px solid var(--ssh-login-border-strong);background:var(--ssh-login-surface);min-height:2.7rem;color:var(--ssh-login-muted);border-radius:.8rem;justify-content:center;align-items:center;margin-top:.9rem;font-size:.8rem;font-weight:800;text-decoration:none;display:flex}.ssh-login-fallback:hover{border-color:var(--ssh-login-muted-soft);background:var(--ssh-login-surface-soft);color:var(--ssh-login-text)}.ssh-login-probe{color:var(--ssh-login-muted);text-align:center;justify-items:center;gap:.6rem;padding:2.5rem;display:grid}.ssh-login-probe-spinner{width:2rem;height:2rem;color:var(--ssh-login-accent);margin-bottom:.4rem}.ssh-login-probe strong{color:var(--ssh-login-text);font-size:1rem}.ssh-login-probe>span:last-child{font-size:.82rem}.ssh-login-footer{color:var(--ssh-login-muted-soft);flex-wrap:wrap;justify-content:center;gap:.4rem;margin-top:1.5rem;font-size:.72rem;display:flex}@keyframes ssh-login-spin{to{transform:rotate(360deg)}}@media (max-width:980px){.ssh-login-page{grid-template-columns:1fr}.ssh-login-brand{display:none}.ssh-login-panel{padding:max(1.25rem, env(safe-area-inset-top)) max(1.25rem, env(safe-area-inset-right)) max(1.25rem, env(safe-area-inset-bottom)) max(1.25rem, env(safe-area-inset-left))}.ssh-login-panel-inner{min-height:calc(100dvh - 2.5rem)}.ssh-login-mobile-mark{display:grid}}@media (max-width:520px){.ssh-login-panel{background:var(--ssh-login-surface);align-items:stretch;padding:0}.ssh-login-theme-toggle{top:max(1rem, env(safe-area-inset-top));right:max(1rem, env(safe-area-inset-right));box-shadow:none}.ssh-login-panel-inner{width:100%;min-height:100dvh}.ssh-login-card{min-height:100dvh;padding:max(4.75rem, calc(env(safe-area-inset-top) + 4.25rem)) max(1.25rem, env(safe-area-inset-right)) max(2rem, env(safe-area-inset-bottom)) max(1.25rem, env(safe-area-inset-left));box-shadow:none;border:0;border-radius:0;flex-direction:column;justify-content:center;display:flex}.ssh-login-card-heading{display:block}.ssh-login-mobile-mark{margin-bottom:1.25rem}.ssh-login-input-wrap input{font-size:16px}.ssh-login-footer{display:none}.ssh-login-probe{align-content:center;min-height:100dvh}}@media (prefers-reduced-motion:reduce){.ssh-login-panel,.ssh-login-card,.ssh-login-theme-toggle,.ssh-login-submit,.ssh-login-input-wrap{transition:none}.ssh-login-submit-spinner,.ssh-login-probe-spinner{animation-duration:1.4s}}.ssh-safeshield-plan-badge{isolation:isolate;letter-spacing:.085em;white-space:nowrap;border:1px solid #0000;border-radius:999px;align-items:center;gap:.5rem;min-height:2rem;padding:.3rem .82rem .3rem .36rem;font-size:.75rem;font-weight:950;line-height:1;display:inline-flex;position:relative;overflow:hidden}.ssh-safeshield-plan-badge[data-compact=true]{min-height:1.72rem;padding:.22rem .66rem .22rem .3rem;font-size:.69rem}.ssh-safeshield-plan-badge-mark{z-index:2;border-radius:999px;flex:none;place-items:center;width:1.2rem;height:1.2rem;font-size:.76rem;line-height:1;display:grid;position:relative}.ssh-safeshield-plan-badge[data-compact=true] .ssh-safeshield-plan-badge-mark{width:1.02rem;height:1.02rem;font-size:.66rem}.ssh-safeshield-plan-badge[data-tier=free]{color:#475569;background:linear-gradient(135deg,#fff 0%,#f1f5f9 100%);border-color:#cbd5e1;box-shadow:inset 0 1px #ffffffe6}.ssh-safeshield-plan-badge[data-tier=free] .ssh-safeshield-plan-badge-mark{color:#475569;background:#e2e8f0}.ssh-safeshield-plan-badge[data-tier=pro]{color:#f0fdfa;background:linear-gradient(135deg,#115e59 0%,#0f766e 62%,#0d9488 100%);border-color:#0f766e;box-shadow:0 1px 2px #0f766e29,inset 0 1px #ffffff24}.ssh-safeshield-plan-badge[data-tier=pro] .ssh-safeshield-plan-badge-mark{color:#ccfbf1;box-shadow:none;background:#f0fdfa1f;border:1px solid #99f6e475}.ssh-safeshield-plan-badge[data-tier=ultimate]{color:#fffbeb;background:linear-gradient(135deg,#78350f 0%,#92400e 58%,#b45309 100%);border-color:#b45309;box-shadow:0 1px 2px #78350f2e,inset 0 1px #ffffff1f}.ssh-safeshield-plan-badge[data-tier=ultimate] .ssh-safeshield-plan-badge-mark{color:#fde68a;box-shadow:none;background:#fffbeb1f;border:1px solid #fde68a75}.ssh-safeshield-plan-badge[data-tier=paid]{color:#f0f9ff;background:linear-gradient(135deg,#0c4a6e 0%,#075985 58%,#0369a1 100%);border-color:#0369a1;box-shadow:0 1px 2px #0369a129,inset 0 1px #ffffff1f}.ssh-safeshield-plan-badge[data-tier=paid] .ssh-safeshield-plan-badge-mark{color:#bae6fd;box-shadow:none;background:#f0f9ff1f;border:1px solid #bae6fd75}.ssh-safeshield-plan-caption{color:#64748b;white-space:nowrap;align-items:center;gap:.34rem;font-size:.68rem;font-weight:850;display:inline-flex}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=free]{color:#cbd5e1;background:#1e293b;border-color:#475569}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=free] .ssh-safeshield-plan-badge-mark{color:#e2e8f0;background:#475569}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=pro]{color:#99f6e4;background:linear-gradient(135deg,#042f2e 0%,#134e4a 100%);border-color:#0f766e;box-shadow:inset 0 1px #99f6e414}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=pro] .ssh-safeshield-plan-badge-mark{color:#99f6e4;background:#0d94881f;border-color:#2dd4bf61}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=ultimate]{color:#fde68a;background:linear-gradient(135deg,#451a03 0%,#78350f 100%);border-color:#b45309;box-shadow:inset 0 1px #fde68a14}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=ultimate] .ssh-safeshield-plan-badge-mark{color:#fde68a;background:#92400e29;border-color:#d9770675}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=paid]{color:#bae6fd;background:linear-gradient(135deg,#082f49 0%,#0c4a6e 100%);border-color:#0369a1;box-shadow:inset 0 1px #bae6fd14}.ssh-app[data-theme=dark] .ssh-safeshield-plan-badge[data-tier=paid] .ssh-safeshield-plan-badge-mark{color:#bae6fd;background:#0369a124;border-color:#0ea5e95c}.ssh-app[data-theme=dark] .ssh-safeshield-plan-caption{color:#94a3b8}.ssh-safeshield-upgrade-card{background:linear-gradient(120deg,#f0fdfa 0%,#ecfeff 58%,#fff7ed 100%);border:1px solid #99f6e4;border-radius:1rem;align-items:center;gap:.85rem;margin-top:.75rem;padding:.9rem 1rem;display:flex;box-shadow:0 10px 24px #0f766e14}.ssh-safeshield-upgrade-mark{color:#fff;background:linear-gradient(135deg,#0f766e,#0891b2);border-radius:.8rem;flex:none;place-items:center;width:2.5rem;height:2.5rem;font-size:1.05rem;display:grid;box-shadow:0 8px 18px #0d948838}.ssh-safeshield-upgrade-copy{flex:1;gap:.2rem;min-width:0;display:grid}.ssh-safeshield-upgrade-meta{color:#0f766e;letter-spacing:.12em;text-transform:uppercase;flex-wrap:wrap;align-items:center;gap:.45rem;font-size:.62rem;font-weight:900;display:flex}.ssh-safeshield-upgrade-soon{letter-spacing:.06em;background:#0f766e1a;border-radius:999px;padding:.18rem .45rem}.ssh-safeshield-upgrade-copy strong{color:#0f172a;font-size:.86rem;line-height:1.35rem}.ssh-safeshield-upgrade-copy>span{color:#64748b;font-size:.74rem;font-weight:600;line-height:1.15rem}.ssh-safeshield-upgrade-action{color:#fff;background:#0f766e;border:1px solid #0f766e;border-radius:.8rem;flex:none;justify-content:center;align-items:center;gap:.4rem;min-height:2.45rem;padding:.55rem .8rem;font-size:.74rem;font-weight:900;text-decoration:none;transition:background-color .15s,border-color .15s,transform .15s;display:inline-flex}.ssh-safeshield-upgrade-action:hover{background:#115e59;border-color:#115e59;transform:translateY(-1px)}.ssh-safeshield-upgrade-action:focus-visible{outline-offset:2px;outline:3px solid #14b8a63d}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-card{background:linear-gradient(120deg,#0d948821 0%,#0f172afa 58%,#92400e1f 100%);border-color:#134e4a;box-shadow:0 12px 28px #0000002e}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-mark{background:linear-gradient(135deg,#0d9488,#0891b2);box-shadow:0 8px 20px #2dd4bf21}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-meta{color:#5eead4}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-soon{background:#2dd4bf1f}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-copy strong{color:#f8fafc}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-copy>span{color:#94a3b8}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-action{color:#ccfbf1;background:#0d948838;border-color:#2dd4bf}.ssh-app[data-theme=dark] .ssh-safeshield-upgrade-action:hover{background:#0d948852;border-color:#5eead4}@media (max-width:640px){.ssh-safeshield-upgrade-card{flex-wrap:wrap;align-items:flex-start}.ssh-safeshield-upgrade-action{justify-content:center;width:100%}}.ssh-safeshield-refresh{background:#f0fdfab3;border:1px solid #ccfbf1;border-radius:1rem;align-items:center;gap:.875rem;width:27rem;max-width:100%;margin-top:1rem;padding:.75rem .875rem;display:flex}.ssh-safeshield-refresh[data-state=error]{background:#fef2f2c7;border-color:#fecaca}.ssh-safeshield-refresh-copy{min-width:0}.ssh-safeshield-refresh-kicker,.ssh-safeshield-refresh-title,.ssh-safeshield-refresh-description,.ssh-safeshield-refresh-error-code{margin:0}.ssh-safeshield-refresh-kicker{color:#0f766e;letter-spacing:.14em;text-transform:uppercase;font-size:.66rem;font-weight:900}.ssh-safeshield-refresh[data-state=error] .ssh-safeshield-refresh-kicker{color:#b91c1c}.ssh-safeshield-refresh-title{color:#0f172a;margin-top:.25rem;font-size:.875rem;font-weight:800}.ssh-safeshield-refresh-description{color:#475569;margin-top:.25rem;font-size:.75rem;font-weight:600;line-height:1.25rem}.ssh-safeshield-refresh-error-code{overflow-wrap:anywhere;color:#64748b;margin-top:.375rem;font-size:.68rem;font-weight:600}.ssh-safeshield-refresh-error-code code{font:inherit}.ssh-safeshield-refresh-donut{color:#0d9488;place-items:center;width:3.35rem;min-width:3.35rem;height:3.35rem;display:grid;position:relative}.ssh-safeshield-refresh-donut[data-state=error]{color:#dc2626}.ssh-safeshield-refresh-loader-svg{transform-origin:50%;width:100%;height:100%;animation:.82s linear infinite ssh-safeshield-refresh-loader-rotate;position:absolute;top:0;bottom:0;left:0;right:0;transform:rotate(-90deg)}.ssh-safeshield-refresh-loader-svg-error{animation:none}.ssh-safeshield-refresh-loader-track{color:#cbd5e1;stroke:#cbd5e1}.ssh-safeshield-refresh-loader-arc{color:#0f172a;stroke:#0f172a;filter:drop-shadow(0 0 .06rem #0f172a47)}.ssh-safeshield-refresh-donut[data-state=error] .ssh-safeshield-refresh-loader-track{color:#dc2626;stroke:#dc2626}.ssh-safeshield-refresh-donut-label{z-index:1;color:#0f766e;font-variant-numeric:tabular-nums;font-size:.68rem;font-weight:900;position:relative}.ssh-app[data-theme=dark] .ssh-safeshield-refresh{background:#0f766e1f;border-color:#134e4a}.ssh-app[data-theme=dark] .ssh-safeshield-refresh[data-state=error]{background:#7f1d1d2e;border-color:#7f1d1d}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-title{color:#f8fafc}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-description,.ssh-app[data-theme=dark] .ssh-safeshield-refresh-error-code{color:#94a3b8}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-loader-track{color:#334155;stroke:#334155}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-loader-arc{color:#fff;stroke:#fff;filter:drop-shadow(0 0 .08rem #ffffff8c)}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-donut-label{color:#5eead4}.ssh-app[data-theme=dark] .ssh-safeshield-refresh-donut[data-state=error] .ssh-safeshield-refresh-loader-track{color:#ef4444;stroke:#ef4444}@keyframes ssh-safeshield-refresh-loader-rotate{to{transform:rotate(270deg)}}@media (prefers-reduced-motion:reduce){.ssh-safeshield-refresh-loader-svg{animation:none}}.ssh-dashboard-account-banner{background:#f0fdfa;border-color:#99e8df}.ssh-dashboard-account-banner-icon{color:#0f766e;background:#ccfbf1}.ssh-dashboard-account-banner-title{color:#0f172a}.ssh-dashboard-account-banner-description{color:#475569}.ssh-dashboard-account-banner-badge{color:#92400e;background:#fef3c7}.ssh-dashboard-account-banner-action{color:#fff;background:#0f766e}.ssh-dashboard-account-banner-action:hover{color:#fff;background:#115e59}.ssh-dashboard-account-banner-action:focus-visible{outline-color:#0d9488}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner{background:#102927;border-color:#115e59}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-icon{color:#99f6e4;background:#134e4a}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-title{color:#f1f5f9}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-description{color:#cbd5e1}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-badge{color:#fde68a;background:#78350f}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-action{color:#fff;background:#0f766e}.ssh-app[data-theme=dark] .ssh-dashboard-account-banner-action:hover{background:#0d9488}.ssh-account-nav-dot{width:10px;height:10px;box-shadow:0 0 0 2px var(--ssh-account-dot-ring,#fff);background-color:#d97706;border-radius:50%;flex:none;margin-left:auto;display:block}.ssh-account-nav-dot-collapsed{margin-left:0;position:absolute;top:5px;right:7px}.ssh-app[data-theme=dark] .ssh-account-nav-dot{--ssh-account-dot-ring:#0f172a;background-color:#fbbf24}.ssh-apps-storage-track,.ssh-apps-storage-free{fill:none;stroke-width:9px}.ssh-apps-storage-track{stroke:#e2e8f0}.ssh-apps-storage-free{stroke:#0d9488;transform-origin:50%;transform:rotate(-90deg)}.ssh-apps-storage-ring[data-level=warning] .ssh-apps-storage-free{stroke:#d97706}.ssh-apps-storage-ring[data-level=critical] .ssh-apps-storage-free{stroke:#e11d48}.ssh-app[data-theme=dark] .ssh-apps-storage-track{stroke:#334155}.ssh-app[data-theme=dark] .ssh-apps-storage-free{stroke:#2dd4bf}.ssh-app[data-theme=dark] .ssh-apps-storage-ring[data-level=warning] .ssh-apps-storage-free{stroke:#fbbf24}.ssh-app[data-theme=dark] .ssh-apps-storage-ring[data-level=critical] .ssh-apps-storage-free{stroke:#fb7185}.ssh-apps-storage-card[data-level=warning] .ssh-apps-storage-available,.ssh-dashboard-storage-card[data-level=warning] .ssh-apps-storage-available{color:#b45309}.ssh-apps-storage-card[data-level=critical] .ssh-apps-storage-available,.ssh-dashboard-storage-card[data-level=critical] .ssh-apps-storage-available{color:#be123c}.ssh-app[data-theme=dark] .ssh-apps-storage-card[data-level=warning] .ssh-apps-storage-available,.ssh-app[data-theme=dark] .ssh-dashboard-storage-card[data-level=warning] .ssh-apps-storage-available{color:#fbbf24}.ssh-app[data-theme=dark] .ssh-apps-storage-card[data-level=critical] .ssh-apps-storage-available,.ssh-app[data-theme=dark] .ssh-dashboard-storage-card[data-level=critical] .ssh-apps-storage-available{color:#fb7185}.ssh-apps-installed-badge{color:#475569;background:#f1f5f9;border-color:#cbd5e1}.ssh-apps-update-badge{color:#92400e;background:#fffbeb;border-color:#fcd34d}.ssh-apps-update-button{color:#fff;background:#d97706;border-color:#d97706}.ssh-apps-update-button:hover:not(:disabled){background:#b45309;border-color:#b45309}.ssh-apps-update-button:focus-visible{outline-offset:2px;outline:2px solid #d97706}.ssh-app[data-theme=dark] .ssh-apps-installed-badge{color:#cbd5e1;background:#1e293b;border-color:#475569}.ssh-app[data-theme=dark] .ssh-apps-update-badge{color:#fcd34d;background:#451a03;border-color:#92400e}.ssh-app[data-theme=dark] .ssh-apps-update-button{color:#fff;background:#b45309;border-color:#b45309}.ssh-app[data-theme=dark] .ssh-apps-update-button:hover:not(:disabled){background:#d97706;border-color:#d97706}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}} /*$vite$:1*/ \ No newline at end of file diff --git a/luci-app-smartsafehub/root/www/luci-static/smartsafehub/app.js b/luci-app-smartsafehub/root/www/luci-static/smartsafehub/app.js index 71107a19d..2ba53ce00 100644 --- a/luci-app-smartsafehub/root/www/luci-static/smartsafehub/app.js +++ b/luci-app-smartsafehub/root/www/luci-static/smartsafehub/app.js @@ -1,4 +1,3 @@ -var e,t,n,r,i,a,o,s,c,l,u={},d=[],f=/^m(i|n|o|s|text|space)$/,p=Array.isArray,m=d.slice,h=Object.assign;function g(e){e&&e.parentNode&&e.remove()}function _(n,r,i,a,o){var s={type:n,props:r,key:i,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o||++t,__i:-1,__u:0};return!o&&e.vnode&&e.vnode(s),s}function v(e){return e.children}function y(e,t){this.props=e,this.context=t,this.__g=0}function b(e,t){if(t==null)return e.__?b(e.__,e.__i+1):null;for(var n;tr&&n.sort(a),t=n.shift(),r=n.length,8&t.__g&&(s=void 0,c=void 0,l=(c=(o=t).__v).__e,u=[],d=[],(f=o.__P)&&((s=h({constructor:void 0},c)).__v=c.__v+1,e.vnode&&e.vnode(s),ee(f,s,c,o.__n,f.namespaceURI,32&c.__u?[l]:null,u,l||b(c),32&c.__u,d),s.__v=c.__v,s.__.__k[s.__i]=s,ne(u,s,d),c.__=c.__e=null,s.__e!=l&&x(s)))}finally{n.length=i=0}}function w(e,t,n,r,i,a,o,s,c,l,f){var p,m,h,g,_,v,y=r.__k||d,b=t.length;for(c=T(n,t,y,c,b),p=0;pc?x--:x++,S=!0)):(~l||(i>g?x--:i>1]+!!u){for(i=n-1,a=n+1;i>=0||a=0?i--:a++])&&!(2&l.__u)&&s==l.key&&c==l.type)return o}return-1}function k(e,t,n){n??(n=``),t[0]==`-`?e.setProperty(t,n):e[t]=n}function A(e,t,n,r,i){var a,o;n:if(t==`style`){if(typeof n==`string`)e.style.cssText=n;else{if(typeof r==`string`&&(e.style.cssText=r=``),r)for(t in r)n&&t in n||k(e.style,t,``);if(n)for(t in n)r&&n[t]==r[t]||k(e.style,t,n[t])}}else if(t[0]==`o`&&t[1]==`n`)(e.__e||(e.__e={}))[t]=n,n&&r||(o=l[t]||(l[t]=j(t)),(e.__a||(e.__a={}))[t]=c,a=t!=(t=t.replace(s,`$1`)),(t=t.slice(2))[0]<`a`&&(t=t.toLowerCase()),n?e.addEventListener(t,o,a):e.removeEventListener(t,o,a));else{if(i==`http://www.w3.org/2000/svg`)t=t.replace(/xlink(H|:h)/,`h`).replace(/sName$/,`s`);else if(t!=`width`&&t!=`height`&&t!=`href`&&t!=`list`&&t!=`form`&&t!=`tabIndex`&&t!=`download`&&t!=`rowSpan`&&t!=`colSpan`&&t!=`role`&&t!=`popover`&&t in e)try{e[t]=n??``;break n}catch{}typeof n==`function`||(n==null||!1===n&&t[4]!=`-`?e.removeAttribute(t):e.setAttribute(t,t==`popover`&&n==1?``:n))}}function j(t){return function(n){if(this.__e){var r=this.__e[t];if(n[o]==null)n[o]=c++;else if(n[o]=0?e.slice(0,t+13):he}function _e(){let e=ge();return e.endsWith(`/luci`)?e.slice(0,-5):me}function ve(e){let t=e.startsWith(`/`)?e:`/${e}`;return`${_e()}${t}`}function ye(e){let t=e.startsWith(`/`)?e:`/${e}`;return`${ge()}${t}`}function be(e){return ye(e)}function xe(e=``){return`/${e?e.startsWith(`#`)?e:`#${e}`:``}`}var Se=/^[0-9a-f]{32}$/i;function Ce(){return ye(`/smartsafehub/session`)}function we(e){return e.headers.get(`X-LuCI-Login-Required`)===`yes`}async function Te(e){if(e.status===401||e.status===403||we(e))return null;if(!e.ok)throw Error(`LuCI session endpoint returned HTTP ${e.status}`);let t=(await e.text()).trim();if(Se.test(t))return t;if(e.redirected||/^(?:access|permission)\s+denied\.?$/i.test(t)||/^)/i.test(t))return null;throw Error(`LuCI session endpoint returned an invalid session id`)}async function Ee(e={}){return Te(await fetch(Ce(),{cache:`no-store`,credentials:`same-origin`,redirect:`follow`,...e}))}function De(){return Ee()}async function Oe(){await fetch(ye(`/admin/logout`),{cache:`no-store`,credentials:`same-origin`,redirect:`manual`})}function ke(e,t){let n=new URLSearchParams;return n.set(`luci_username`,e),n.set(`luci_password`,t),Ee({method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded;charset=UTF-8`},body:n})}var Ae=`smartsafehub:session-expired`,je=`로그인 세션이 만료되었습니다. 계속하려면 다시 로그인해 주세요.`,Me=null;function Ne(){Me=null}function Pe(e){Me!==e&&(Me=e,window.dispatchEvent(new CustomEvent(Ae)))}var Fe,Ie,Le,Re,ze=Object.is,Be=0,Ve=[],He=[],Ue=e,We=Ue.__b,Ge=Ue.__r,Ke=Ue.diffed,qe=Ue.__c,Je=Ue.unmount,Ye=Ue.__;function Xe(e,t){Ue.__h&&Ue.__h(Ie,e,Be||t),Be=0;var n=Ie.__H||(Ie.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function M(e){return Be=1,Ze(st,e)}function Ze(e,t,n){var r=Xe(Fe++,2);if(r.t=e,!r.__c&&(r.__=[n?n(t):st(void 0,t),function(e){var t=r.__N?r.__N[0]:r.__[0],n=r.t(t,e);ze(t,n)||(r.__N=[n,r.__[1]],r.__c.setState({}))}],r.__c=Ie,!Ie.__f)){Ie.__f=!0;var i=Ie.shouldComponentUpdate;Ie.shouldComponentUpdate=function(e,t,n){var r=this.__H;if(!r)return!0;var a=!1,o=this.props!=e;if(r.__.some(function(e){e.__N&&(a=!0,ze(e.__[0],e.__N[0])||(o=!0))}),i){var s=i.call(this,e,t,n);return a?s||o:s}return!a||o}}return r.__}function N(e,t){var n=Xe(Fe++,3);!Ue.__s&&ot(n.__H,t)&&(n.__P=!0,n.__=e,n.u=t,Ie.__H.__h.push(n))}function P(e){return Be=5,Qe(function(){return{current:e}},[])}function Qe(e,t){var n=Xe(Fe++,7);return ot(n.__H,t)&&(n.__=e(),n.__H=t),n.__}function F(e,t){return Be=8,Qe(function(){return e},t)}function $e(){var e=Xe(Fe++,11);if(!e.__){for(var t=Ie.__v;!t.__m&&t.__;)t=t.__;var n=t.__m||(t.__m=[0,0]);e.__=`P`+n[0]+`-`+n[1]++}return e.__}function et(){var e;do{for(;e=He.shift();)try{it(e)}catch(t){Ue.__e(t,{__:(e=e.__P)&&e.__v})}for(;e=Ve.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(it),t.__h.some(at),t.__h=[]}catch(n){t.__h=[],Ue.__e(n,e.__v)}}}while(He.length)}Ue.__b=function(e){Ie=null,We&&We(e)},Ue.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),Ye&&Ye(e,t)},Ue.__r=function(e){Ge&&Ge(e),Fe=0;var t=(Ie=e.__c).__H;t&&(Le==Ie?Ie.__h=[]:(t.__h.some(it),t.__h.some(at),Fe=0),t.__h=[],t.__.some(function(e){e.__N&&(e.__=e.__N),e.u=e.__N=void 0})),Le=Ie},Ue.diffed=function(e){Ke&&Ke(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&rt(Ve.push(t)),t.__H.__.some(function(e){e.u&&(e.__H=e.u)})),Le=Ie=null},Ue.__c=function(e,t){t.some(function(e){try{e.__h.some(it),e.__h=e.__h.filter(function(e){return!e.__||at(e)})}catch(n){t.some(function(e){e.__h&&(e.__h=[])}),t=[],Ue.__e(n,e.__v)}}),qe&&qe(e,t)},Ue.unmount=function(e){Je&&Je(e);var t,n,r=e.__c;r&&r.__H&&(r.__H.__.some(function(r){try{if(r.__P&&r.__c){if(n===void 0){for(n=e.__;n&&(!n.__c||!n.__c.__P);)n=n.__;n=n&&n.__c}r.__P=n,rt(He.push(r))}else it(r)}catch(e){t=e}}),r.__H=void 0,t&&Ue.__e(t,r.__v))};var tt=typeof requestAnimationFrame==`function`;function nt(e){var t,n=function(){clearTimeout(r),tt&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,35);tt&&(t=requestAnimationFrame(n))}function rt(e){e!=1&&Re==Ue.requestAnimationFrame||((Re=Ue.requestAnimationFrame)||nt)(et)}function it(e){var t=Ie,n=e.__c;typeof n==`function`&&(e.__c=void 0,n()),Ie=t}function at(e){var t=Ie;e.__c=e.__(),Ie=t}function ot(e,t){return!e||e.length!=t.length||t.some(function(t,n){return!ze(t,e[n])})}function st(e,t){return typeof t==`function`?t(e):t}function ct(e){"@babel/helpers - typeof";return ct=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},ct(e)}function lt(e,t){if(ct(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(ct(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function ut(e){var t=lt(e,`string`);return ct(t)==`symbol`?t:t+``}function I(e,t,n){return(t=ut(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var dt={1:`잘못된 명령입니다.`,2:`요청 인자가 올바르지 않습니다.`,3:`요청한 메서드를 찾을 수 없습니다.`,4:`요청한 리소스를 찾을 수 없습니다.`,5:`응답 데이터가 없습니다.`,6:`접근 권한이 없습니다.`,7:`요청 시간이 초과되었습니다.`,8:`지원하지 않는 기능입니다.`,9:`장치에서 알 수 없는 오류가 발생했습니다.`,10:`장치 연결이 끊어졌습니다.`},ft=2e4,pt=3e3,mt=1e3,ht=6e4,gt=1,L=class extends Error{constructor(e,t){super(t),I(this,`code`,void 0),this.name=`RpcError`,this.code=e}};function _t(){let e=window.__SMARTHUB_BOOTSTRAP__;if(!e?.sessionId||!e.rpcUrl)throw new L(`BOOTSTRAP_MISSING`,`LuCI 세션 정보를 찾을 수 없습니다. 페이지를 새로고침해 주세요.`);return e}function vt(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function yt(){return new L(`INVALID_RESPONSE`,`장치 API가 올바르지 않은 응답을 반환했습니다.`)}function bt(e){return typeof e!=`number`||!Number.isFinite(e)?ft:Math.min(ht,Math.max(mt,Math.trunc(e)))}function xt(e){let t=e.message.trim().toLowerCase();return e.code===`UBUS_6`||e.code===`JSON_RPC_-32002`||e.code===`HTTP_ERROR`&&/HTTP (401|403)\b/.test(e.message)||t.includes(`access denied`)||t.includes(`permission denied`)||t.includes(`접근 권한`)}function St(e){return window.__SMARTHUB_BOOTSTRAP__?.sessionId===e}async function Ct(e){let t=gt++,n=new AbortController,r=window.setTimeout(()=>n.abort(),pt);try{let r=await fetch(e.rpcUrl,{method:`POST`,credentials:`same-origin`,headers:{"Content-Type":`application/json`},body:JSON.stringify({jsonrpc:`2.0`,id:t,method:`call`,params:[e.sessionId,`smartsafehub`,`system_root_password_status`,{}]}),signal:n.signal});if(r.status===401||r.status===403)return`expired`;if(!r.ok)return`unknown`;let i=await r.json();if(!vt(i)||i.jsonrpc!==`2.0`||i.id!==t)return`unknown`;if(`error`in i){let e=i.error;return vt(e)&&typeof e.code==`number`&&e.code===-32002?`expired`:`unknown`}let a=i.result;return!Array.isArray(a)||a.length<1?`unknown`:a[0]===0?`active`:a[0]===6?`expired`:`unknown`}catch{return`unknown`}finally{window.clearTimeout(r)}}async function wt(e,t){if(!xt(e)||!St(t.sessionId))return e;let n=await Ct(t);return St(t.sessionId)?n===`active`?new L(`RPC_PERMISSION_DENIED`,`현재 로그인 세션에 이 기능 권한이 없습니다. SmartSafeHub 업데이트 직후라면 로그아웃 후 다시 로그인해 주세요.`):n===`expired`?(Pe(t.sessionId),new L(`SESSION_EXPIRED`,je)):e:e}function Tt(e,t){if(!vt(e)||e.jsonrpc!==`2.0`||e.id!==t)throw yt();if(`error`in e){let t=e.error;throw!vt(t)||typeof t.code!=`number`?yt():new L(`JSON_RPC_${t.code}`,typeof t.message==`string`&&t.message.length>0?t.message:`JSON-RPC 요청에 실패했습니다.`)}let n=e.result;if(!Array.isArray(n)||n.length<1||n.length>2)throw yt();let r=n[0];if(typeof r!=`number`||!Number.isInteger(r))throw yt();if(r!==0)throw new L(`UBUS_${r}`,dt[r]??`ubus 오류 코드 ${r}가 반환되었습니다.`);if(n.length<2||n[1]===void 0)throw new L(`EMPTY_RESPONSE`,`장치 API 응답이 비어 있습니다.`);return n[1]}async function Et(e,t,n={},r={}){let i=_t(),a=performance.now(),o=gt++,s=new AbortController,c=window.setTimeout(()=>s.abort(),bt(r.timeoutMs));try{let r=await fetch(i.rpcUrl,{method:`POST`,credentials:`same-origin`,headers:{"Content-Type":`application/json`},body:JSON.stringify({jsonrpc:`2.0`,id:o,method:`call`,params:[i.sessionId,e,t,n]}),signal:s.signal});if(!r.ok)throw new L(`HTTP_ERROR`,`장치 API가 HTTP ${r.status} 오류를 반환했습니다.`);let a;try{a=await r.json()}catch{throw yt()}return Tt(a,o)}catch(e){throw s.signal.aborted?new L(`RPC_TIMEOUT`,`장치 응답 시간이 초과되었습니다. 잠시 후 다시 시도해 주세요.`):e instanceof L?await wt(e,i):new L(`NETWORK_ERROR`,`공유기와 통신할 수 없습니다. 네트워크 연결을 확인해 주세요.`)}finally{window.clearTimeout(c),Math.round(performance.now()-a)}}async function R(e,t,n={},r={}){let i=await Et(e,t,n,r);if(!i.ok)throw new L(i.error.code,i.error.message);return i.data}function Dt(){return R(`smartsafehub`,`system_root_password_status`)}function Ot(e){return R(`smartsafehub`,`system_root_password_set`,{password:e})}var kt=0;Array.isArray;function z(t,n,r,i,a,o){n||(n={});var s,c,l=n;if(`ref`in l&&typeof t!=`function`)for(c in l={},n)c==`ref`?s=n[c]:l[c]=n[c];var u={type:t,props:l,key:r,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--kt,__i:-1,__u:0};return(a||o)&&(u.__source=a,u.__self=o),e.vnode&&e.vnode(u),u}function B({children:e,title:t,...n}){return z(`svg`,{"aria-hidden":!t||void 0,fill:`none`,role:t?`img`:void 0,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`1.8`,viewBox:`0 0 24 24`,...n,children:[t?z(`title`,{children:t}):null,e]})}function At(e){return z(B,{...e,children:[z(`path`,{d:`M12 3 5 6v5c0 4.6 2.8 8.1 7 10 4.2-1.9 7-5.4 7-10V6l-7-3Z`}),z(`path`,{d:`m9 12 2 2 4-4`})]})}function jt(e){return z(B,{...e,children:[z(`rect`,{height:`7`,rx:`2`,width:`18`,x:`3`,y:`13`}),z(`path`,{d:`M7 16.5h.01M11 16.5h.01M7 10a7 7 0 0 1 10 0M9.5 7.5a3.5 3.5 0 0 1 5 0`})]})}function Mt(e){return z(B,{...e,children:[z(`rect`,{height:`11`,rx:`2`,width:`16`,x:`4`,y:`3`}),z(`path`,{d:`M8 21h8M12 14v7`})]})}function Nt(e){return z(B,{...e,children:[z(`path`,{d:`m3 11 9-8 9 8`}),z(`path`,{d:`M5 10v10h14V10M9 20v-6h6v6`})]})}function Pt(e){return z(B,{...e,children:[z(`circle`,{cx:`12`,cy:`8`,r:`4`}),z(`path`,{d:`M4.5 21a7.5 7.5 0 0 1 15 0`})]})}function Ft(e){return z(B,{...e,children:[z(`path`,{d:`M12 16V4`}),z(`path`,{d:`m7 9 5-5 5 5`}),z(`path`,{d:`M5 14v5h14v-5`})]})}function It(e){return z(B,{...e,children:[z(`circle`,{cx:`12`,cy:`12`,r:`3`}),z(`path`,{d:`M19.4 15a1.7 1.7 0 0 0 .3 1.9l.1.1-2.8 2.8-.1-.1a1.7 1.7 0 0 0-1.9-.3 1.7 1.7 0 0 0-1 1.6v.2h-4V21a1.7 1.7 0 0 0-1-1.6 1.7 1.7 0 0 0-1.9.3l-.1.1L4.2 17l.1-.1a1.7 1.7 0 0 0 .3-1.9A1.7 1.7 0 0 0 3 14H2.8v-4H3a1.7 1.7 0 0 0 1.6-1 1.7 1.7 0 0 0-.3-1.9L4.2 7 7 4.2l.1.1a1.7 1.7 0 0 0 1.9.3A1.7 1.7 0 0 0 10 3V2.8h4V3a1.7 1.7 0 0 0 1 1.6 1.7 1.7 0 0 0 1.9-.3l.1-.1L19.8 7l-.1.1a1.7 1.7 0 0 0-.3 1.9 1.7 1.7 0 0 0 1.6 1h.2v4H21a1.7 1.7 0 0 0-1.6 1Z`})]})}function Lt(e){return z(B,{...e,children:[z(`path`,{d:`M5 9.5a10 10 0 0 1 14 0M8 13a6 6 0 0 1 8 0M11 16.5a2 2 0 0 1 2 0`}),z(`path`,{d:`M12 20h.01`})]})}function Rt(e){return z(B,{...e,children:[z(`path`,{d:`M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4z`}),z(`path`,{d:`M6.5 6.5h1M16.5 6.5h1M6.5 16.5h1`}),z(`path`,{d:`M14 14h2v2h-2zM18 14h2v2h-2zM16 16h2v2h-2zM18 18h2v2h-2zM14 18h1`})]})}function zt(e){return z(B,{...e,children:[z(`path`,{d:`M7 3v4M17 3v4M5 7h14v4a7 7 0 0 1-14 0V7Z`}),z(`path`,{d:`M12 18v3`})]})}function Bt(e){return z(B,{...e,children:[z(`circle`,{cx:`12`,cy:`12`,r:`9`}),z(`path`,{d:`M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18`})]})}function Vt(e){return z(B,{...e,children:[z(`rect`,{height:`13`,rx:`2`,width:`18`,x:`3`,y:`6`}),z(`path`,{d:`m8 2 4 4 4-4M8 22h8`})]})}function Ht(e){return z(B,{...e,children:[z(`circle`,{cx:`12`,cy:`12`,r:`9`}),z(`path`,{d:`M12 7v5l3 2`})]})}function Ut(e){return z(B,{...e,children:[z(`rect`,{height:`14`,rx:`2`,width:`14`,x:`5`,y:`5`}),z(`path`,{d:`M9 9h6v6H9zM9 2v3M15 2v3M9 19v3M15 19v3M2 9h3M2 15h3M19 9h3M19 15h3`})]})}function V(e){return z(B,{...e,children:[z(`path`,{d:`M20 11a8 8 0 1 0-2.3 5.7`}),z(`path`,{d:`M20 4v7h-7`})]})}function Wt(e){return z(B,{...e,children:[z(`path`,{d:`M12 2v10`}),z(`path`,{d:`M18.4 6.6a8 8 0 1 1-12.8 0`})]})}function Gt(e){return z(B,{...e,children:[z(`path`,{d:`M12 3v12`}),z(`path`,{d:`m7 10 5 5 5-5`}),z(`path`,{d:`M5 21h14`})]})}function Kt(e){return z(B,{...e,children:[z(`ellipse`,{cx:`12`,cy:`5`,rx:`8`,ry:`3`}),z(`path`,{d:`M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6`})]})}function qt(e){return z(B,{...e,children:[z(`circle`,{cx:`8`,cy:`15`,r:`4`}),z(`path`,{d:`m11 12 8-8M15 8l2 2M17 6l2 2`})]})}function Jt(e){return z(B,{...e,children:[z(`rect`,{height:`13`,rx:`2`,width:`13`,x:`8`,y:`8`}),z(`path`,{d:`M16 8V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h3`})]})}function Yt(e){return z(B,{...e,children:[z(`path`,{d:`M2.5 12s3.5-6 9.5-6 9.5 6 9.5 6-3.5 6-9.5 6-9.5-6-9.5-6Z`}),z(`circle`,{cx:`12`,cy:`12`,r:`2.5`})]})}function Xt(e){return z(B,{...e,children:[z(`path`,{d:`m3 3 18 18`}),z(`path`,{d:`M10.6 6.2A8.8 8.8 0 0 1 12 6c6 0 9.5 6 9.5 6a15.5 15.5 0 0 1-2.6 3.2`}),z(`path`,{d:`M6.2 6.3C3.8 8 2.5 12 2.5 12s3.5 6 9.5 6a9.8 9.8 0 0 0 3.1-.5`}),z(`path`,{d:`M10.3 10.3a2.5 2.5 0 0 0 3.4 3.4`})]})}function Zt(e){return z(B,{...e,children:[z(`rect`,{height:`17`,rx:`2`,width:`18`,x:`3`,y:`4`}),z(`path`,{d:`M8 2v4M16 2v4M3 9h18`})]})}function H(e){return z(B,{...e,children:[z(`circle`,{cx:`12`,cy:`12`,r:`9`}),z(`path`,{d:`m8 12 2.5 2.5L16 9`})]})}function U(e){return z(B,{...e,children:[z(`path`,{d:`M10.3 4.2 2.7 17.5A2 2 0 0 0 4.4 20h15.2a2 2 0 0 0 1.7-2.5L13.7 4.2a2 2 0 0 0-3.4 0Z`}),z(`path`,{d:`M12 9v4M12 17h.01`})]})}function Qt(e){return z(B,{...e,children:z(`path`,{d:`M12 5v14M5 12h14`})})}function $t(e){return z(B,{...e,children:z(`path`,{d:`M4 7h16M9 7V4h6v3M7 7l1 13h8l1-13M10 11v5M14 11v5`})})}function en(e){return z(B,{...e,children:[z(`circle`,{cx:`11`,cy:`11`,r:`7`}),z(`path`,{d:`m20 20-4-4`})]})}function tn(e){return z(B,{...e,children:[z(`path`,{d:`M8 6h12M8 12h12M8 18h12`}),z(`path`,{d:`M4 6h.01M4 12h.01M4 18h.01`})]})}function nn(e){return z(B,{...e,children:[z(`path`,{d:`M10 5H6a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h4`}),z(`path`,{d:`M14 8l4 4-4 4M8 12h10`})]})}function rn(e){return z(B,{...e,children:z(`path`,{d:`M4 7h16M4 12h16M4 17h16`})})}function an(e){return z(B,{...e,children:z(`path`,{d:`m6 9 6 6 6-6`})})}function on(e){return z(B,{...e,children:z(`path`,{d:`m6 6 12 12M18 6 6 18`})})}function sn(e){return z(B,{...e,children:z(`path`,{d:`m15 18-6-6 6-6`})})}function cn(e){return z(B,{...e,children:z(`path`,{d:`m9 18 6-6-6-6`})})}function ln(e){return z(B,{...e,children:z(`path`,{d:`M20.7 13.2A8.5 8.5 0 1 1 10.8 3.3 6.7 6.7 0 0 0 20.7 13.2Z`})})}function un(e){return z(B,{...e,children:[z(`circle`,{cx:`12`,cy:`12`,r:`4`}),z(`path`,{d:`M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41`})]})}var dn=`smartsafehub.theme`;function fn(){if(typeof window>`u`)return`light`;try{let e=window.localStorage.getItem(dn);if(e===`dark`||e===`light`)return e}catch{}return window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}function pn(e){try{window.localStorage.setItem(dn,e)}catch{}}function mn(e){let t=document.querySelector(`meta[name="theme-color"]`);t&&(t.content=e===`dark`?`#0f172a`:`#f8fafc`),document.documentElement.style.colorScheme=e,document.body.style.backgroundColor=e===`dark`?`#020617`:`#f8fafc`}function hn(e){return{length:e.length>=8,letter:/[A-Za-z]/.test(e),number:/[0-9]/.test(e)}}function gn(e){return e.length&&e.letter&&e.number}function _n({theme:e}){return z(e===`dark`?un:ln,{})}function vn({met:e,children:t}){return z(`li`,{class:e?`ssh-password-requirement is-met`:`ssh-password-requirement`,children:[z(H,{"aria-hidden":`true`}),z(`span`,{children:t})]})}function yn({onCompleted:e,recovery:t}){let n=P(null),r=P(null),[i,a]=M(``),[o,s]=M(``),[c,l]=M(!1),[u,d]=M(!1),[f,p]=M(!1),[m,h]=M(null),[g,_]=M(fn),v=hn(i),y=gn(v),b=o.length>0&&i===o,x=g===`dark`?`라이트 모드로 전환`:`다크 모드로 전환`;N(()=>{pn(g),mn(g)},[g]),N(()=>{let e=window.requestAnimationFrame(()=>n.current?.focus());return()=>window.cancelAnimationFrame(e)},[]);let S=e=>{d(e.getModifierState?.(`CapsLock`)??!1)};return z(`main`,{class:`ssh-login-page`,"data-theme":g,children:[z(`section`,{class:`ssh-login-brand`,"aria-labelledby":`ssh-password-setup-brand-title`,children:[z(`div`,{class:`ssh-login-brand-orb ssh-login-brand-orb-one`,"aria-hidden":`true`}),z(`div`,{class:`ssh-login-brand-orb ssh-login-brand-orb-two`,"aria-hidden":`true`}),z(`div`,{class:`ssh-login-brand-content`,children:[z(`span`,{class:`ssh-login-brand-mark`,"aria-hidden":`true`,children:z(At,{})}),z(`p`,{class:`ssh-login-eyebrow`,children:t?`PASSWORD RECOVERY`:`FIRST SECURITY SETUP`}),z(`h1`,{id:`ssh-password-setup-brand-title`,children:[z(`span`,{class:`ssh-password-setup-brand-title-line`,children:`SmartSafeHub`}),z(`span`,{class:`ssh-password-setup-brand-title-line`,children:t?`비밀번호 복구`:`보호 시작`})]}),z(`p`,{class:`ssh-login-brand-description`,children:t?`물리 Reset 버튼으로 관리자 비밀번호 복구가 요청되었습니다. 네트워크, Wi-Fi, SafeShield 등 기존 설정은 그대로 유지됩니다.`:`관리자 비밀번호가 없는 상태에서는 SmartSafeHub 관리 기능을 사용할 수 없습니다. 먼저 이 공유기의 root 관리자 비밀번호를 설정해 주세요.`}),z(`div`,{class:`ssh-password-setup-summary`,children:[z(At,{"aria-hidden":`true`}),z(`div`,{children:[z(`strong`,{children:t?`새 관리자 비밀번호를 설정해 주세요`:`초기 보안 설정이 필요합니다`}),z(`span`,{children:t?`새 비밀번호를 설정하기 전까지 SSH 접근은 비활성화되고 다른 관리 기능도 잠겨 있습니다.`:`설정이 완료되기 전까지 다른 SmartSafeHub 기능은 잠겨 있습니다.`})]})]})]})]}),z(`section`,{class:`ssh-login-panel`,"aria-labelledby":`ssh-password-setup-title`,children:[z(`button`,{"aria-label":x,class:`ssh-login-theme-toggle`,onClick:()=>_(e=>e===`dark`?`light`:`dark`),title:x,type:`button`,children:z(_n,{theme:g})}),z(`div`,{class:`ssh-login-panel-inner`,children:[z(`div`,{class:`ssh-login-card`,children:[z(`div`,{class:`ssh-login-card-heading`,children:[z(`span`,{class:`ssh-login-mobile-mark`,"aria-hidden":`true`,children:z(qt,{})}),z(`div`,{children:[z(`p`,{class:`ssh-login-kicker`,children:`ADMIN PASSWORD`}),z(`h2`,{id:`ssh-password-setup-title`,children:t?`관리자 비밀번호 복구`:`관리자 비밀번호 설정`}),z(`p`,{class:`ssh-login-subtitle`,children:`비밀번호 설정 후 새 비밀번호로 다시 로그인해야 합니다.`})]})]}),m?z(`div`,{class:`ssh-login-alert`,role:`alert`,"aria-live":`polite`,children:m}):null,z(`form`,{class:`ssh-login-form`,onSubmit:async t=>{if(t.preventDefault(),h(null),!y)h(`비밀번호는 8자 이상이며 영문과 숫자를 각각 하나 이상 포함해야 합니다.`),window.requestAnimationFrame(()=>n.current?.focus());else if(i!==o)h(`비밀번호 확인 값이 일치하지 않습니다.`),window.requestAnimationFrame(()=>r.current?.focus());else{p(!0);try{await Ot(i),a(``),s(``);try{await Oe()}catch{}e()}catch(e){h(e instanceof L?e.message:`관리자 비밀번호를 설정하지 못했습니다. 잠시 후 다시 시도해 주세요.`)}finally{p(!1)}}},noValidate:!0,children:[z(`label`,{class:`ssh-login-field`,for:`smartsafehub-new-root-password`,children:[z(`span`,{class:`ssh-login-label`,children:`새 비밀번호`}),z(`span`,{class:`ssh-login-input-wrap`,children:[z(`span`,{class:`ssh-login-field-icon`,"aria-hidden":`true`,children:z(qt,{})}),z(`input`,{autoComplete:`new-password`,disabled:f,id:`smartsafehub-new-root-password`,name:`new-password`,onBlur:()=>d(!1),onInput:e=>a(e.currentTarget.value),onKeyDown:S,onKeyUp:S,placeholder:`새 관리자 비밀번호`,ref:n,...c?{type:`text`}:{type:`password`},value:i}),z(`button`,{"aria-label":c?`비밀번호 숨기기`:`비밀번호 표시`,"aria-pressed":c,class:`ssh-login-password-toggle`,disabled:f,onClick:()=>l(e=>!e),title:c?`비밀번호 숨기기`:`비밀번호 표시`,type:`button`,children:z(c?Xt:Yt,{})})]})]}),z(`ul`,{class:`ssh-password-requirements`,"aria-label":`비밀번호 요구 사항`,children:[z(vn,{met:v.length,children:`8자 이상`}),z(vn,{met:v.letter,children:`영문자 1자 이상 포함`}),z(vn,{met:v.number,children:`숫자 1자 이상 포함`})]}),z(`label`,{class:`ssh-login-field`,for:`smartsafehub-confirm-root-password`,children:[z(`span`,{class:`ssh-login-label`,children:`비밀번호 확인`}),z(`span`,{class:`ssh-login-input-wrap`,children:[z(`span`,{class:`ssh-login-field-icon`,"aria-hidden":`true`,children:z(qt,{})}),z(`input`,{autoComplete:`new-password`,disabled:f,id:`smartsafehub-confirm-root-password`,name:`confirm-password`,onBlur:()=>d(!1),onInput:e=>s(e.currentTarget.value),onKeyDown:S,onKeyUp:S,placeholder:`새 관리자 비밀번호 다시 입력`,ref:r,...c?{type:`text`}:{type:`password`},value:o})]})]}),o.length>0?z(`p`,{class:b?`ssh-password-match is-met`:`ssh-password-match`,role:`status`,children:b?`비밀번호가 일치합니다.`:`비밀번호가 일치하지 않습니다.`}):null,u?z(`p`,{class:`ssh-login-caps`,role:`status`,children:`Caps Lock이 켜져 있습니다.`}):null,z(`button`,{class:`ssh-login-submit`,disabled:f,type:`submit`,children:[f?z(V,{class:`ssh-login-submit-spinner`,"aria-hidden":`true`}):null,z(`span`,{children:f?`설정 중…`:`비밀번호 설정`})]})]}),z(`div`,{class:`ssh-login-security-note`,children:[z(At,{"aria-hidden":`true`}),z(`span`,{children:`비밀번호는 현재 공유기에 직접 설정되며 외부 서버로 전송되지 않습니다.`})]})]}),z(`footer`,{class:`ssh-login-footer`,children:[z(`span`,{children:`SmartSafeHub`}),z(`span`,{"aria-hidden":`true`,children:`·`}),z(`span`,{children:window.location.host})]})]})]})]})}var W=`smartsafehub`,bn=`smartsafehub_guest`,xn=`smartsafehub_network`;function Sn(){return R(W,`connected_devices`)}async function Cn(){let e=await R(W,`activity_history`);return{...e,cloud:{...e.cloud,enabled:e.cloud.enabled??!1}}}function wn(e){return R(W,`activity_cloud_sync_update`,{enabled:e})}function Tn(){return R(W,`status`)}function En(){return R(W,`device_recommended_rules_status`,{},{timeoutMs:5e3})}function Dn(){return R(W,`device_recommended_rules_refresh`,{},{timeoutMs:3e4})}function On(e){return R(W,`device_recommended_rules_revoke`,{rule_id:e},{timeoutMs:3e4})}function kn(){return R(W,`device_registration_status`,{},{timeoutMs:5e3})}function An(){return R(W,`device_registration_refresh`,{},{timeoutMs:3e4})}function jn(){return R(W,`device_pairing_refresh`,{},{timeoutMs:15e3})}function Mn(){return R(W,`health_status`)}function Nn(){return R(W,`health_run`)}function Pn(e){return R(W,`health_reporter_update`,{enabled:e})}function Fn(){return R(W,`updates_status`)}function In(){return R(W,`firmware_status`)}function Ln(){return R(W,`firmware_check`)}function Rn(){return R(W,`firmware_prepare`)}function zn(e){return R(W,`firmware_validate_upload`,{filename:e})}function Bn(e){return R(W,`firmware_install`,{confirm:`install`,keep_settings:e})}function Vn(){return R(W,`firmware_discard`)}function Hn(){return R(W,`updates_check`)}function Un(){return R(W,`updates_install`,{confirm:`install`})}function Wn(e){return R(W,`updates_settings_update`,{check_enabled:e.checkEnabled,check_interval_s:e.checkIntervalSeconds,auto_install:e.autoInstall,auto_install_time:e.autoInstallTime})}function Gn(){return R(W,`system_time_settings`)}function Kn(e){return R(W,`system_timezone_initialize`,{zonename:e})}function qn(e){return R(W,`system_timezone_update`,{zonename:e})}function Jn(){return R(W,`system_time_sync`)}function Yn(){return R(W,`system_scheduled_reboot_settings`)}function Xn(e){return R(W,`system_scheduled_reboot_update`,{enabled:e.enabled,frequency:e.frequency,day_of_week:e.dayOfWeek,time:e.time})}function Zn(e){return R(W,`system_backup_validate`,{filename:e})}function Qn(){return R(W,`system_backup_restore`,{confirm:`restore`},{timeoutMs:35e3})}function $n(){return R(W,`system_backup_discard`)}function er(){return R(W,`system_reboot`,{confirm:`reboot`})}function tr(){return R(xn,`wan_settings`)}function nr(e){return R(xn,`wan_update`,{protocol:e.protocol,pppoe_username:e.pppoeUsername,pppoe_password:e.pppoePassword,pppoe_password_changed:e.pppoePasswordChanged,static_address:e.staticAddress,static_prefix_length:e.staticPrefixLength,static_gateway:e.staticGateway,dns_primary:e.dnsPrimary,dns_secondary:e.dnsSecondary,confirm:`apply`},{timeoutMs:1e4})}function rr(){return R(xn,`wan_reconnect`,{confirm:`reconnect`},{timeoutMs:1e4})}function ir(){return R(xn,`lan_settings`)}function ar(e){return R(xn,`lan_update`,{ip_address:e.ipAddress,prefix_length:e.prefixLength,dhcp_enabled:e.dhcpEnabled,dhcp_start:e.dhcpStart,dhcp_end:e.dhcpEnd,lease_time:e.leaseTime,confirm:`apply`},{timeoutMs:1e4})}function or(){return R(xn,`lan_auto_subnet`,{confirm:`apply`},{timeoutMs:1e4})}function sr(){return R(xn,`iptv_settings`)}function cr(e){return R(xn,`iptv_update`,{enabled:e.enabled,provider:e.provider,confirm:`apply`},{timeoutMs:2e4})}function lr(e){return R(W,`wifi_qr`,{section:e},{timeoutMs:8e3})}function ur(){return R(bn,`wifi_guest_qr`,{},{timeoutMs:8e3})}async function dr(){let e=await R(W,`wifi_summary`);try{let t=await R(bn,`wifi_guest_summary`);return{...e,guest:t,guestError:!1}}catch{return{...e,guest:null,guestError:!0}}}function fr(e){return R(W,`wifi_update`,{...e},{timeoutMs:35e3})}function pr(e){return R(bn,`wifi_guest_update`,{...e},{timeoutMs:95e3})}var mr=Object.fromEntries([{route:`home`,hash:`#home`,label:`대시보드`,title:`대시보드`,description:`네트워크, 장치와 시스템 상태를 한눈에 확인합니다.`},{route:`activity`,hash:`#activity`,label:`최근 활동`,title:`최근 활동`,description:`현재 부팅 이후 인터넷, 보호, 업데이트와 진단 상태 변화를 확인합니다.`},{route:`network`,hash:`#network`,label:`네트워크`,title:`네트워크`,description:`인터넷 연결과 내부 네트워크 주소, DHCP 및 네트워크 충돌을 한 곳에서 관리합니다.`},{route:`wifi`,hash:`#wifi`,label:`Wi-Fi`,title:`Wi-Fi`,description:`기본 무선 네트워크의 이름, 보안과 사용 상태를 관리합니다.`},{route:`iptv`,hash:`#iptv`,label:`IPTV`,title:`IPTV`,description:`SK Broadband와 LG U+ 멀티캐스트 IPTV를 설정합니다.`},{route:`devices`,hash:`#devices`,label:`연결된 기기`,title:`연결된 기기`,description:`네트워크에서 확인된 기기와 연결 방식을 살펴봅니다.`},{route:`safeshield`,hash:`#safeshield`,label:`SafeShield`,title:`SafeShield`,description:`DNS 보호 상태를 확인하고 차단 목록을 관리합니다.`},{route:`rules`,hash:`#rules`,label:`사용자 규칙`,title:`사용자 규칙`,description:`직접 허용하거나 차단할 도메인을 관리합니다.`},{route:`account`,hash:`#account`,label:`SmartSafeHub 계정`,title:`SmartSafeHub 계정`,description:`이 기기의 SmartSafeHub 계정 연결 상태와 구독 플랜을 확인합니다.`},{route:`system`,hash:`#system`,label:`업데이트`,title:`업데이트`,description:`기기의 펌웨어와 관리 소프트웨어 업데이트를 관리합니다.`},{route:`settings`,hash:`#settings`,label:`설정`,title:`설정`,description:`시스템 상태와 시간대를 확인하고 장치 관리 및 진단 기능을 설정합니다.`}].map(e=>[e.route,e])),hr=[`home`,`activity`,`network`,`wifi`,`devices`,`safeshield`,`rules`,`system`];function gr({description:e,loading:t,onRefresh:n,onToggleTheme:r,refreshing:i,theme:a,title:o}){return z(`header`,{class:`ssh-product-hero border-b border-slate-200 bg-white px-4 py-4 sm:px-6 md:h-[4.5rem] md:py-0 lg:px-8 xl:px-10`,children:z(`div`,{class:`flex w-full items-center justify-between gap-4 md:h-full`,children:[z(`div`,{class:`min-w-0`,children:[z(`p`,{class:`m-0 text-[0.68rem] font-extrabold uppercase tracking-[0.18em] text-teal-700`,children:`SmartSafeHub`}),z(`div`,{class:`mt-1 flex min-w-0 items-baseline gap-3`,children:[z(`h1`,{class:`m-0 truncate text-xl font-black tracking-tight text-slate-950 sm:text-2xl`,children:o}),z(`p`,{class:`m-0 hidden truncate text-sm text-slate-500 lg:block`,children:e})]})]}),z(`div`,{class:`flex shrink-0 items-center gap-2`,children:[z(`button`,{"aria-label":a===`dark`?`라이트 모드로 전환`:`다크 모드로 전환`,class:`ssh-product-header-action hidden h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white text-slate-600 shadow-sm transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 md:inline-flex`,onClick:r,title:a===`dark`?`라이트 모드`:`다크 모드`,type:`button`,children:z(a===`dark`?un:ln,{class:`size-5`})}),z(`button`,{"aria-busy":i,"aria-label":i?`새로고침 중`:`현재 화면 새로고침`,class:`ssh-product-header-action hidden h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white shadow-sm transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-wait disabled:opacity-60 md:inline-flex ${i?`text-teal-700`:`text-slate-600`}`,disabled:t||i,onClick:n,title:i?`새로고침 중`:`새로고침`,type:`button`,children:i?z(V,{class:`size-5 animate-spin`}):z(V,{class:`size-5`})})]})]})})}var _r=[{label:`Overview`,routes:[`home`,`activity`]},{label:`Network`,routes:[`network`,`wifi`,`iptv`,`devices`]},{label:`Security`,routes:[`safeshield`,`rules`]},{label:`System`,routes:[`account`,`system`,`settings`]}];function vr({route:e}){switch(e){case`home`:return z(Nt,{class:`size-5`});case`activity`:return z(Ht,{class:`size-5`});case`network`:return z(Bt,{class:`size-5`});case`wifi`:return z(Lt,{class:`size-5`});case`iptv`:return z(Vt,{class:`size-5`});case`devices`:return z(Mt,{class:`size-5`});case`safeshield`:return z(At,{class:`size-5`});case`rules`:return z(Pt,{class:`size-5`});case`account`:return z(qt,{class:`size-5`});case`system`:return z(Ft,{class:`size-5`});case`settings`:return z(It,{class:`size-5`})}}function yr({theme:e}){return z(e===`dark`?un:ln,{class:`size-5`})}function br(e){return e===`dark`?`라이트 모드`:`다크 모드`}function xr(e,t=!1){return`relative flex min-h-11 min-w-0 items-center rounded-xl py-2.5 text-sm font-extrabold no-underline transition ${t?`justify-center px-2`:`gap-3 px-3`} ${e?`bg-teal-50 text-teal-800 ring-1 ring-inset ring-teal-200`:`text-slate-600 hover:bg-slate-50 hover:text-slate-950`}`}function Sr({accountRegistered:e,collapsed:t=!1,route:n,updateCount:r,demo:i=!1}){return z(`div`,{class:t?`space-y-3`:`space-y-5`,children:_r.filter(e=>!i||e.routes.some(e=>hr.includes(e))).map((a,o)=>z(`section`,{"aria-label":a.label,class:t&&o>0?`border-t border-slate-100 pt-3`:void 0,children:[t?null:z(`p`,{class:`mb-2 px-3 text-[0.65rem] font-black uppercase tracking-[0.18em] text-slate-400`,children:a.label}),z(`div`,{class:`space-y-1`,children:a.routes.filter(e=>!i||hr.includes(e)).map(i=>{let a=mr[i],o=n===i;return z(`a`,{"aria-current":o?`page`:void 0,"aria-label":i===`account`&&e===!1?`${a.label} (계정 연결 필요)`:t?a.label:void 0,class:xr(o,t),href:a.hash,title:i===`account`&&e===!1?`SmartSafeHub 계정 연결 필요`:t?a.label:void 0,children:[z(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg ${o?`bg-teal-700 text-white`:`bg-slate-100 text-slate-500`}`,children:z(vr,{route:i})}),t?null:z(`span`,{class:`flex min-w-0 flex-1 items-center gap-2`,children:[z(`span`,{class:`truncate`,children:a.label}),i===`iptv`?z(`span`,{class:`rounded-full border border-amber-300 bg-amber-100 px-1.5 py-0.5 text-[9px] font-black uppercase tracking-[0.08em] text-amber-800`,children:`Beta`}):null]}),t&&i===`iptv`?z(`span`,{"aria-label":`Beta 기능`,class:`absolute right-0.5 top-0.5 inline-flex size-5 items-center justify-center rounded-full border border-amber-300 bg-amber-100 text-[13px] font-extrabold leading-none text-amber-900 shadow-sm ring-2 ring-white`,children:`β`}):null,i===`account`&&e===!1?z(`span`,{"aria-label":`계정 연결 필요`,class:`ssh-account-nav-dot ${t?`ssh-account-nav-dot-collapsed`:``}`,"aria-hidden":`true`,title:`계정 연결 필요`}):null,i===`system`&&r>0?t?z(`span`,{"aria-label":`${r}개의 업데이트 유형`,class:`ssh-update-nav-badge`,"data-collapsed":`true`,children:r}):z(`span`,{class:`ssh-update-nav-badge`,"data-collapsed":`false`,children:r}):null]},i)})})]},a.label))})}function Cr({accountRegistered:e,collapsed:t,loading:n,onRefresh:r,onToggleCollapsed:i,onToggleTheme:a,refreshing:o,route:s,theme:c,title:l,updateCount:u,demo:d=!1}){let[f,p]=M(!1),m=br(c);return N(()=>{p(!1)},[s]),N(()=>{if(!f)return;let e=e=>{e.key===`Escape`&&p(!1)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[f]),z(v,{children:[z(`nav`,{"aria-label":`SmartSafeHub 모바일 메뉴`,class:`ssh-mobile-navigation sticky top-0 z-40 border-b border-slate-200 bg-white/95 px-4 shadow-sm shadow-slate-900/5 backdrop-blur md:hidden`,children:[z(`div`,{class:`flex min-h-16 items-center justify-between gap-3`,children:[z(`a`,{class:`flex min-w-0 items-center gap-3 no-underline`,href:`#home`,children:[z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-950 text-teal-300`,children:z(At,{class:`size-5`})}),z(`span`,{class:`min-w-0`,children:[z(`strong`,{class:`block truncate text-sm font-black text-slate-950`,children:`SmartSafeHub`}),z(`span`,{class:`block truncate text-xs font-semibold text-slate-500`,children:l})]})]}),z(`div`,{class:`flex shrink-0 items-center gap-2`,children:[z(`button`,{"aria-label":`${m}로 전환`,class:`inline-flex size-11 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white text-slate-600 transition hover:border-slate-300 hover:bg-slate-50 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:a,title:m,type:`button`,children:z(yr,{theme:c})}),z(`button`,{"aria-busy":o,"aria-label":o?`새로고침 중`:`현재 화면 새로고침`,class:`inline-flex size-11 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white transition hover:border-slate-300 hover:bg-slate-50 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-wait disabled:opacity-60 ${o?`text-teal-700`:`text-slate-600`}`,disabled:n||o,onClick:r,title:o?`새로고침 중`:`새로고침`,type:`button`,children:o?z(V,{class:`size-5 animate-spin`}):z(V,{class:`size-5`})}),z(`button`,{"aria-controls":`smartsafehub-mobile-menu`,"aria-expanded":f,"aria-label":f?`모바일 메뉴 닫기`:`모바일 메뉴 열기`,class:`inline-flex size-11 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white text-slate-700 transition hover:bg-slate-50 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:()=>p(e=>!e),type:`button`,children:z(f?on:rn,{class:`size-5`})})]})]}),f?z(`div`,{class:`ssh-mobile-menu border-t border-slate-100 py-4`,id:`smartsafehub-mobile-menu`,children:[z(Sr,{accountRegistered:e,demo:d,route:s,updateCount:u}),d?null:z(`div`,{class:`mt-5 space-y-1 border-t border-slate-100 pt-4`,children:z(`a`,{class:`${xr(!1)} text-rose-700 hover:bg-rose-50 hover:text-rose-800`,href:be(`/admin/logout`),children:[z(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg bg-rose-50 text-rose-600`,children:z(nn,{class:`size-5`})}),`로그아웃`]})})]}):null]}),z(`aside`,{class:`hidden min-h-screen border-r border-slate-200 bg-white md:flex md:flex-col`,"data-collapsed":t?`true`:`false`,children:z(`div`,{class:`sticky top-0 flex h-screen flex-col`,children:[z(`div`,{class:`flex h-[4.5rem] min-h-[4.5rem] shrink-0 items-center border-b border-slate-100 ${t?`justify-center px-2`:`gap-3 px-4`}`,children:[z(`a`,{"aria-label":`SmartSafeHub Dashboard`,class:`flex items-center no-underline ${t?`justify-center`:`min-w-0 flex-1 gap-3`}`,href:`#home`,title:t?`SmartSafeHub`:void 0,children:[z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-950 text-teal-300 shadow-sm shadow-slate-950/10`,children:z(At,{class:`size-5`})}),t?null:z(`div`,{class:`min-w-0`,children:[z(`strong`,{class:`block truncate text-sm font-black tracking-tight text-slate-950`,children:`SmartSafeHub`}),z(`span`,{class:`block text-[0.68rem] font-bold uppercase tracking-[0.14em] text-slate-400`,children:`Home Gateway`})]})]}),z(`button`,{"aria-controls":`smartsafehub-desktop-navigation`,"aria-expanded":!t,"aria-label":t?`사이드바 펼치기`:`사이드바 접기`,class:`ssh-sidebar-toggle absolute right-0 top-[4.5rem] z-20 inline-flex size-7 translate-x-1/2 -translate-y-1/2 shrink-0 items-center justify-center rounded-full transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:i,title:t?`사이드바 펼치기`:`사이드바 접기`,type:`button`,children:z(t?cn:sn,{class:`size-4`})})]}),z(`nav`,{"aria-label":`SmartSafeHub 메뉴`,class:`flex-1 overflow-y-auto py-5 ${t?`px-2`:`px-3`}`,id:`smartsafehub-desktop-navigation`,children:z(Sr,{accountRegistered:e,collapsed:t,demo:d,route:s,updateCount:u})}),d?null:z(`div`,{class:`border-t border-slate-100 ${t?`p-2`:`p-3`}`,children:z(`a`,{"aria-label":`SmartSafeHub에서 로그아웃`,class:`${xr(!1,t)} mt-1 text-rose-700 hover:bg-rose-50 hover:text-rose-800`,href:be(`/admin/logout`),title:t?`로그아웃`:void 0,children:[z(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg bg-rose-50 text-rose-600`,children:z(nn,{class:`size-5`})}),t?null:`로그아웃`]})})]})})]})}var wr=`smartsafehub.sidebar.collapsed`;function Tr(){if(typeof window>`u`)return!1;try{return window.localStorage.getItem(wr)===`1`}catch{return!1}}function Er({accountRegistered:e,children:t,loading:n,onRefresh:r,refreshing:i,route:a,updateCount:o,demo:s=!1}){let c=mr[a],[l,u]=M(Tr),[d,f]=M(fn);return N(()=>{try{window.localStorage.setItem(wr,l?`1`:`0`)}catch{}},[l]),N(()=>{pn(d),mn(d)},[d]),z(`div`,{class:`ssh-app min-h-screen bg-slate-50 text-slate-950 md:grid md:transition-[grid-template-columns] md:duration-200 md:ease-out ${l?`md:grid-cols-[5rem_minmax(0,1fr)]`:`md:grid-cols-[16rem_minmax(0,1fr)]`}`,"data-theme":d,children:[z(Cr,{accountRegistered:e,demo:s,collapsed:l,loading:n,onRefresh:r,onToggleCollapsed:()=>u(e=>!e),onToggleTheme:()=>f(e=>e===`dark`?`light`:`dark`),refreshing:i,route:a,theme:d,title:c.title,updateCount:o}),z(`div`,{class:`min-w-0 md:min-h-screen`,children:[z(gr,{description:c.description,loading:n,onRefresh:r,onToggleTheme:()=>f(e=>e===`dark`?`light`:`dark`),refreshing:i,theme:d,title:c.title}),z(`main`,{class:`ssh-product-main w-full max-w-[1600px] bg-slate-50 px-4 pb-8 sm:px-6 sm:pb-10 lg:px-8 lg:pb-12 xl:px-10 ${n?`pt-2 sm:pt-2 lg:pt-3`:`pt-5 sm:pt-6 lg:pt-8`}`,children:t})]})]})}function Dr({active:e,label:t,tabs:n}){return z(`nav`,{"aria-label":t,class:`mb-5 min-w-0`,role:`tablist`,children:z(`div`,{class:`grid w-full min-w-0 gap-2 ${n.length===3?`grid-cols-3 sm:max-w-[592px]`:`grid-cols-2 sm:max-w-[392px]`}`,children:n.map(t=>{let r=t.id===e;return z(`a`,{"aria-controls":`${t.id}-panel`,"aria-selected":r,class:`flex min-h-11 min-w-0 items-center justify-center rounded-xl border px-2 py-2.5 text-center text-[11px] font-extrabold leading-5 transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-teal-500 sm:px-4 sm:text-sm ${r?`border-teal-200 bg-teal-50 text-teal-800`:`border-slate-200 bg-white text-slate-600 hover:border-teal-200 hover:text-teal-700`}`,href:t.href,id:`${t.id}-tab`,role:`tab`,tabIndex:r?0:-1,onKeyDown:e=>{if(![`ArrowLeft`,`ArrowRight`,`Home`,`End`].includes(e.key))return;e.preventDefault();let r=n.findIndex(e=>e.id===t.id),i=e.key===`Home`?0:e.key===`End`?n.length-1:(r+(e.key===`ArrowRight`?1:-1)+n.length)%n.length,a=e.currentTarget.parentElement?.children[i];a?.focus(),a?.click()},children:t.label},t.id)})})})}function G(e,t){return e instanceof L||e instanceof Error?e.message:t}function Or({active:e=!0,fallbackError:t,loader:n,pollInterval:r,refreshOnFocus:i=!1,refreshOnVisible:a=!1,staleTimeMs:o=3e4}){let[s,c]=M({data:null,error:null,loading:e,refreshing:!1}),l=P(!1),u=P(!0),d=P(null),f=P(null),p=P(null),m=P(0);N(()=>(u.current=!0,()=>{u.current=!1}),[]);let h=F((e=!1)=>{if(d.current)return d.current;u.current&&c(t=>({...t,error:null,loading:t.data===null,refreshing:e}));let r;return f.current=Date.now(),r=n().then(e=>{p.current=Date.now(),m.current=0,u.current&&c({data:e,error:null,loading:!1,refreshing:!1})}).catch(e=>{m.current+=1,u.current&&c(n=>({...n,error:G(e,t),loading:!1,refreshing:!1}))}).finally(()=>{d.current===r&&(d.current=null)}),d.current=r,r},[t,n]);N(()=>{e?l.current||(l.current=!0,s.data!==null&&p.current!==null&&Date.now()-p.current{if(!e||g==null||g<=0)return;let t=!1,n=null,r=()=>{n!==null&&(window.clearTimeout(n),n=null)},o=()=>{let e=Date.now();if(m.current>0&&f.current!==null){let t=Math.min(3e4,3e3*2**Math.min(m.current-1,4));return Math.max(0,f.current+t-e)}return p.current===null?0:Math.max(0,p.current+g-e)},s=()=>{r(),!(t||document.visibilityState===`hidden`)&&(n=window.setTimeout(()=>{n=null,!(t||document.visibilityState===`hidden`)&&(o()>0?s():h(!1).finally(s))},o()))},c=()=>{r(),!(t||document.visibilityState===`hidden`)&&(o()>0?s():h(!1).finally(s))},l=()=>{document.visibilityState===`hidden`?r():a?h(!1).finally(s):c()},u=()=>{c()};return document.addEventListener(`visibilitychange`,l),i&&window.addEventListener(`focus`,u),s(),()=>{t=!0,r(),document.removeEventListener(`visibilitychange`,l),i&&window.removeEventListener(`focus`,u)}},[e,g,h,i,a]);let _=F(()=>h(!0),[h]),v=F(e=>{u.current&&(p.current=Date.now(),m.current=0,c(t=>({...t,data:e,error:null,loading:!1,refreshing:!1})))},[]);return{...s,refresh:_,replaceData:v}}var kr=6e4;function Ar(e){let t=Or({active:e,fallbackError:`최근 활동을 불러오지 못했습니다.`,loader:()=>Cn(),pollInterval:kr,refreshOnFocus:!0}),[n,r]=M({savingCloudSync:!1,actionError:null,actionMessage:null}),i=F(async e=>{r({savingCloudSync:!0,actionError:null,actionMessage:null});try{let n=await wn(e);return t.replaceData(n),r({savingCloudSync:!1,actionError:null,actionMessage:e?`Cloud 활동 기록 전송을 켰습니다. 지금부터 발생하는 활동을 Cloud에 전송합니다.`:`Cloud 활동 기록 전송을 껐습니다. 로컬 최근 활동은 계속 기록됩니다.`}),!0}catch(e){return r({savingCloudSync:!1,actionError:G(e,`Cloud 활동 기록 설정을 변경하지 못했습니다.`),actionMessage:null}),!1}},[t.replaceData]),a=F(()=>{r(e=>({...e,actionError:null,actionMessage:null}))},[]);return{...t,...n,dismissActionFeedback:a,setCloudSyncEnabled:i}}var jr=`/tmp/smartsafehub/config-backup.tar.gz`,Mr=`/cgi-backup`,Nr=`/cgi-upload`;function Pr(){let e=window.__SMARTHUB_BOOTSTRAP__?.sessionId;if(!e)throw new L(`BOOTSTRAP_MISSING`,`LuCI 세션 정보를 찾을 수 없습니다.`);return e}function Fr(e){return(e?.match(/filename="?([^";]+)"?/i))?.[1]?.trim()||`backup-openwrt.tar.gz`}function Ir(e,t){let n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=e,r.style.display=`none`,(document.body??document.documentElement).appendChild(r),r.click(),r.remove(),window.setTimeout(()=>URL.revokeObjectURL(n),1e3)}async function Lr(){let e=ve(Mr),t=await fetch(e,{method:`POST`,credentials:`same-origin`,headers:{"Content-Type":`application/x-www-form-urlencoded;charset=UTF-8`},body:new URLSearchParams({sessionid:Pr()}).toString()});if(!t.ok)throw new L(`SYSTEM_BACKUP_DOWNLOAD_FAILED`,`설정 백업 생성에 실패했습니다. (HTTP ${t.status})`);let n=await t.blob();if(n.size<=0)throw new L(`SYSTEM_BACKUP_DOWNLOAD_EMPTY`,`설정 백업 파일이 비어 있습니다.`);Ir(Fr(t.headers.get(`Content-Disposition`)),n)}function Rr(e,t){let n;try{n=Pr()}catch(e){return Promise.reject(e)}return new Promise((r,i)=>{let a=new XMLHttpRequest,o=new FormData;o.append(`sessionid`,n),o.append(`filename`,jr),o.append(`filedata`,e),a.open(`POST`,ve(Nr)),a.timeout=0,a.upload.addEventListener(`progress`,e=>{!e.lengthComputable||e.total<=0||t?.(Math.min(100,Math.max(0,e.loaded/e.total*100)))}),a.addEventListener(`error`,()=>{i(new L(`SYSTEM_BACKUP_UPLOAD_FAILED`,`설정 백업 파일을 공유기에 업로드하지 못했습니다.`))}),a.addEventListener(`load`,()=>{if(a.status<200||a.status>=300){i(new L(`SYSTEM_BACKUP_UPLOAD_HTTP_ERROR`,`설정 백업 업로드가 HTTP ${a.status} 오류를 반환했습니다.`));return}let n;try{n=JSON.parse(a.responseText)}catch{i(new L(`SYSTEM_BACKUP_UPLOAD_INVALID_RESPONSE`,`설정 백업 업로드 응답을 확인하지 못했습니다.`));return}n.failure?i(new L(n.failure,n.message||`설정 백업 파일 업로드가 거부되었습니다.`)):(t?.(100),r({...n,name:e.name}))}),a.send(o)})}var zr=16777216;function Br(){let[e,t]=M(null),[n,r]=M(null),[i,a]=M(null),[o,s]=M(null),[c,l]=M(null),[u,d]=M(!1),f=F(async()=>{t(`download`),r(null),a(null);try{await Lr(),a(`현재 설정 백업을 다운로드했습니다.`)}catch(e){r(G(e,`설정 백업을 다운로드하지 못했습니다.`))}finally{t(null)}},[]),p=F(async e=>{if(r(null),a(null),s(null),d(!1),e.size<=0||e.size>zr)return r(`설정 백업 파일은 16MB 이하여야 합니다.`),!1;try{t(`upload`),l(0),await Rr(e,l),t(`validate`);let n=await Zn(e.name);return s(n),a(`백업 파일 검증이 완료되었습니다. 복원 내용을 확인해 주세요.`),!0}catch(e){return r(G(e,`설정 백업 파일을 검증하지 못했습니다.`)),!1}finally{t(null),l(null)}},[]),m=F(async()=>{t(`discard`),r(null),a(null);try{return await $n(),s(null),d(!1),a(`업로드한 백업 파일을 삭제했습니다.`),!0}catch(e){return r(G(e,`업로드한 백업 파일을 삭제하지 못했습니다.`)),!1}finally{t(null)}},[]),h=F(async()=>{if(!o)return r(`먼저 복원할 백업 파일을 업로드하고 검증해 주세요.`),!1;t(`restore`),r(null),a(null);try{let e=await Qn();return d(e.accepted&&e.rebooting),s(null),a(e.accepted?`설정을 복원했습니다. 공유기가 재부팅되며 네트워크 설정에 따라 다시 연결해야 할 수 있습니다.`:`설정 복원 요청이 접수되지 않았습니다.`),e.accepted}catch(e){return r(G(e,`설정 백업을 복원하지 못했습니다.`)),!1}finally{t(null)}},[o]);return{action:e,discard:m,dismissFeedback:F(()=>{r(null),a(null)},[]),download:f,error:n,message:i,restore:h,restoreAccepted:u,upload:p,uploadProgress:c,validated:o}}var Vr=15e3;function Hr(e,t=!0){return Or({active:e,fallbackError:`연결된 기기 목록을 불러오지 못했습니다.`,loader:Sn,...t?{pollInterval:Vr}:{}})}var Ur=`/tmp/smartsafehub/firmware.bin`,Wr=`/cgi-upload`;function Gr(e,t){let n=window.__SMARTHUB_BOOTSTRAP__;return n?.sessionId?new Promise((r,i)=>{let a=new XMLHttpRequest,o=new FormData;o.append(`sessionid`,n.sessionId),o.append(`filename`,Ur),o.append(`filedata`,e);let s=ve(Wr);a.open(`POST`,s),a.timeout=0,a.upload.addEventListener(`progress`,e=>{!e.lengthComputable||e.total<=0||t?.(Math.min(100,Math.max(0,e.loaded/e.total*100)))}),a.addEventListener(`error`,()=>{console.error(`[SmartSafeHub] firmware upload network error`,{endpoint:s,destination:Ur,fileName:e.name,fileSize:e.size,readyState:a.readyState,status:a.status}),i(new L(`FIRMWARE_UPLOAD_FAILED`,`펌웨어 파일 업로드에 실패했습니다. (${s}, 네트워크 오류)`))}),a.addEventListener(`load`,()=>{if(a.status<200||a.status>=300){console.error(`[SmartSafeHub] firmware upload HTTP error`,{endpoint:s,destination:Ur,fileName:e.name,fileSize:e.size,readyState:a.readyState,status:a.status,response:a.responseText}),i(new L(`FIRMWARE_UPLOAD_HTTP_ERROR`,`펌웨어 업로드가 HTTP ${a.status} 오류를 반환했습니다. (${s})`));return}let n;try{n=JSON.parse(a.responseText)}catch{console.error(`[SmartSafeHub] firmware upload returned invalid JSON`,{endpoint:s,destination:Ur,fileName:e.name,fileSize:e.size,readyState:a.readyState,status:a.status,response:a.responseText}),i(new L(`FIRMWARE_UPLOAD_INVALID_RESPONSE`,`펌웨어 업로드 응답을 확인하지 못했습니다. (${s})`));return}n.failure?i(new L(n.failure,n.message||`펌웨어 파일 업로드가 거부되었습니다.`)):(t?.(100),r({...n,name:e.name}))}),a.send(o)}):Promise.reject(new L(`BOOTSTRAP_MISSING`,`LuCI 세션 정보를 찾을 수 없습니다.`))}var Kr=3e5,qr=1e3,Jr=500,Yr=3e3,Xr=3e4,Zr=15e3,Qr=5e3;function $r(e){return new Promise(t=>window.setTimeout(t,e))}function ei(e){return e===`checking`||e===`downloading`||e===`verifying`}function ti(e=!0){let[t,n]=M(null),r=Or({active:e||ei(t??void 0),fallbackError:`펌웨어 업데이트 상태를 불러오지 못했습니다.`,loader:In,pollInterval:e=>ei(e?.phase)?qr:Kr,refreshOnFocus:!0,refreshOnVisible:ei(t??void 0)});N(()=>{n(r.data?.phase??null)},[r.data?.phase]);let[i,a]=M(null),[o,s]=M(null),[c,l]=M(null),[u,d]=M(null),[f,p]=M(!1),m=P(null);N(()=>()=>{m.current!==null&&window.clearTimeout(m.current)},[]);let h=F(e=>{n(e),r.data&&r.replaceData({...r.data,phase:e,lastError:null})},[r]),g=F(async(e,t,n,i)=>{a(e),s(null),l(null);try{if(!(await n()).accepted)throw Error(`펌웨어 작업 요청이 접수되지 않았습니다.`);h(t),a(null),window.setTimeout(()=>void r.refresh(),400)}catch(e){a(null),s(G(e,i))}},[h,r]),_=F(()=>g(`check`,`checking`,Ln,`펌웨어 업데이트 확인을 시작하지 못했습니다.`),[g]),v=F(()=>g(`prepare`,`downloading`,Rn,`펌웨어 다운로드를 시작하지 못했습니다.`),[g]),y=F(async()=>{let e=Date.now(),t=null;for(;Date.now()-e{a(`upload`),s(null),l(null),d(0);try{if(await Gr(e,d),a(`validate-upload`),!(await zn(e.name)).accepted)throw Error(`업로드한 펌웨어 검증 요청이 접수되지 않았습니다.`);h(`verifying`),d(null);let t=await y();if(a(null),t.phase===`error`)return!1;if(!t.prepared)throw Error(`검증된 펌웨어의 설치 준비 정보를 확인하지 못했습니다. 다시 시도해 주세요.`);return l(`펌웨어 검증이 완료되었습니다. 설치 옵션을 확인해 주세요.`),!0}catch(e){return a(null),d(null),s(G(e,`펌웨어 파일을 업로드하지 못했습니다.`)),!1}},[h,y]),x=F(()=>{p(!0);let e=async()=>{try{if((await fetch(window.location.pathname,{cache:`no-store`,credentials:`same-origin`})).ok){window.location.reload();return}}catch{}m.current=window.setTimeout(e,Qr)};m.current=window.setTimeout(e,Zr)},[]),S=F(async e=>{a(`install`),s(null),l(null);try{if(!(await Bn(e)).accepted)throw Error(`펌웨어 설치 요청이 접수되지 않았습니다.`);return h(`flashing`),a(null),x(),!0}catch(e){return a(null),s(G(e,`펌웨어 설치를 시작하지 못했습니다.`)),!1}},[h,x]),C=F(async()=>{a(`discard`),s(null),l(null);try{if(!(await Vn()).accepted)throw Error(`준비된 펌웨어 정리 요청이 접수되지 않았습니다.`);return a(null),l(`준비된 펌웨어 파일을 삭제했습니다.`),await r.refresh(),!0}catch(e){return a(null),s(G(e,`준비된 펌웨어를 정리하지 못했습니다.`)),!1}},[r]),w=F(()=>{s(null),l(null)},[]);return{...r,action:i,actionError:o,message:c,uploadProgress:u,reconnecting:f,check:_,prepare:v,upload:b,install:S,discard:C,dismissFeedback:w}}var ni={"#home":`home`,"#activity":`activity`,"#network":`network`,"#network/internet":`network`,"#network/lan":`network`,"#wan":`network`,"#lan":`network`,"#wifi":`wifi`,"#iptv":`iptv`,"#devices":`devices`,"#safeshield":`safeshield`,"#rules":`rules`,"#account":`account`,"#system":`system`,"#settings":`settings`,"#settings/diagnostics":`settings`,"#settings/time":`settings`,"#settings/management":`settings`};function ri(){return ni[window.location.hash]??`home`}function ii(){let[e,t]=M(ri);return N(()=>{let e=()=>t(ri());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),e}function ai(e){return e===`#lan`||e===`#network/lan`?`lan`:`internet`}function oi(e){return e===`#settings/time`?`time`:e===`#settings/management`?`management`:`diagnostics`}function si(){let e=window.location.hash;return{network:ai(e),settings:oi(e)}}function ci(){let[e,t]=M(si);return N(()=>{let e=()=>t(si());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),e}var li=6e4,ui=1e3,di=[400,800,1200,1600],fi=[400,800,1200,2e3,4e3];function pi(e){return new Promise(t=>window.setTimeout(t,e))}function mi(e){let t=Or({active:e,fallbackError:`장치 진단 상태를 불러오지 못했습니다.`,loader:Mn,pollInterval:e=>e?.generatedAt?li:ui,refreshOnFocus:!0}),n=P(0),[r,i]=M({running:!1,savingReporter:!1,actionError:null,actionMessage:null}),a=F(async()=>{i({running:!0,savingReporter:!1,actionError:null,actionMessage:null});try{let e=t.data?.generatedAt??0;if(!(await Nn()).accepted)throw Error(`장치가 진단 요청을 접수하지 않았습니다.`);let n=t.data;for(let t of di)if(await pi(t),n=await Mn(),n.generatedAt>0&&n.generatedAt!==e)break;return n&&t.replaceData(n),i({running:!1,savingReporter:!1,actionError:null,actionMessage:`장치 상태를 다시 진단했습니다.`}),!0}catch(e){return i({running:!1,savingReporter:!1,actionError:G(e,`장치 상태 진단을 실행하지 못했습니다.`),actionMessage:null}),!1}},[t.data,t.replaceData]),o=F(async(e,r)=>{for(let i of fi){if(await pi(i),n.current!==r)return;try{let i=await Mn();if(n.current!==r)return;if(t.replaceData(i),i.reporter.enabled!==e)continue;if(!e||![`disabled`,`never`,`initializing`].includes(i.reporter.lastResult))return}catch{}}},[t.replaceData]),s=F(async e=>{let r=n.current+1;n.current=r;let a=t.data;a&&t.replaceData({...a,reporter:{...a.reporter,enabled:e,lastResult:e?`initializing`:`disabled`,lastErrorCode:null,nextReportAt:e?a.reporter.nextReportAt:0}}),i({running:!1,savingReporter:!0,actionError:null,actionMessage:null});try{let a=await Pn(e);return n.current===r&&(t.replaceData(a),i({running:!1,savingReporter:!1,actionError:null,actionMessage:e?`원격 상태 보고를 켰습니다. 첫 서버 보고를 준비합니다.`:`원격 상태 보고를 껐습니다. 로컬 진단은 계속 동작합니다.`}),o(e,r)),!0}catch(e){return n.current===r&&(a&&t.replaceData(a),i({running:!1,savingReporter:!1,actionError:G(e,`원격 상태 보고 설정을 변경하지 못했습니다.`),actionMessage:null})),!1}},[o,t.data,t.replaceData]),c=F(()=>{i(e=>({...e,actionError:null,actionMessage:null}))},[]);return{...t,...r,dismissActionFeedback:c,runDiagnostic:a,setReporterEnabled:s}}function hi(e){let t=Or({active:e,fallbackError:`IPTV 설정을 불러오지 못했습니다.`,loader:sr,refreshOnFocus:!0}),[n,r]=M(!1),[i,a]=M(null),o=F(async e=>{r(!0),a(null);try{let n=await cr(e);return t.replaceData(n.settings),r(!1),a({kind:`success`,message:e.enabled?n.changed?`IPTV 설정을 적용했습니다.`:`IPTV 설정을 다시 적용했습니다.`:`IPTV 기능을 껐습니다.`}),!0}catch(e){return r(!1),a({kind:`error`,message:G(e,`IPTV 설정을 적용하지 못했습니다.`)}),!1}},[t.replaceData]),s=F(()=>a(null),[]);return{...t,saving:n,feedback:i,save:o,dismissFeedback:s}}var gi=4e3;function _i(e){let t=Or({active:e,fallbackError:`내부 네트워크 설정을 불러오지 못했습니다.`,loader:ir}),n=P(e),[r,i]=M({action:null,feedback:null});N(()=>{n.current=e},[e]);let a=F((e,r)=>{t.replaceData(e.settings),e.changed?e.addressChanged?i({action:null,feedback:{kind:`warning`,message:r?`추천 대역 ${e.settings.lan.subnet}을 저장했습니다. 네트워크가 다시 적용되면 새 공유기 주소로 다시 연결해 주세요.`:`내부 네트워크 주소를 저장했습니다. 네트워크가 다시 적용되면 새 공유기 주소로 다시 연결해 주세요.`,newAddress:e.newAddress??e.settings.lan.address}}):(i({action:null,feedback:{kind:`success`,message:r?`추천 내부 네트워크 설정을 적용했습니다.`:`내부 네트워크 설정을 저장했습니다.`}}),e.reloadScheduled&&window.setTimeout(()=>{n.current&&t.refresh()},gi)):i({action:null,feedback:{kind:`success`,message:`변경된 내부 네트워크 설정이 없습니다.`}})},[t.refresh,t.replaceData]),o=F(async e=>{i({action:`saving`,feedback:null});try{let t=await ar(e);return a(t,!1),!0}catch(e){return i({action:null,feedback:{kind:`error`,message:G(e,`내부 네트워크 설정을 저장하지 못했습니다.`)}}),!1}},[a]),s=F(async()=>{i({action:`auto`,feedback:null});try{let e=await or();return a(e,!0),!0}catch(e){return i({action:null,feedback:{kind:`error`,message:G(e,`추천 내부 네트워크를 적용하지 못했습니다.`)}}),!1}},[a]),c=F(()=>{i(e=>({...e,feedback:null}))},[]);return{...t,...r,save:o,applyRecommendation:s,dismissFeedback:c}}var vi=5e3;function yi(e){let t=Or({active:e,fallbackError:`인터넷 연결 설정을 불러오지 못했습니다.`,loader:tr}),n=P(e),[r,i]=M({action:null,feedback:null});N(()=>{n.current=e},[e]);let a=F(()=>{window.setTimeout(()=>{n.current&&t.refresh()},vi)},[t.refresh]),o=F(async e=>{i({action:`saving`,feedback:null});try{let n=await nr(e);return t.replaceData(n.settings),i({action:null,feedback:{kind:n.changed?`warning`:`success`,message:n.changed?`인터넷 연결 설정을 저장했습니다. WAN을 다시 연결하는 동안 잠시 인터넷이 끊길 수 있습니다.`:`변경된 인터넷 연결 설정이 없습니다.`}}),n.reconnectScheduled&&a(),!0}catch(e){return i({action:null,feedback:{kind:`error`,message:G(e,`인터넷 연결 설정을 저장하지 못했습니다.`)}}),!1}},[t.replaceData,a]),s=F(async()=>{i({action:`reconnecting`,feedback:null});try{let e=await rr();t.replaceData(e.settings),i({action:null,feedback:{kind:`warning`,message:`WAN 재연결을 시작했습니다. 인터넷 연결이 다시 올라오면 상태를 자동으로 새로고침합니다.`}}),e.reconnectScheduled&&a()}catch(e){i({action:null,feedback:{kind:`error`,message:G(e,`WAN 재연결을 시작하지 못했습니다.`)}})}},[t.replaceData,a]),c=F(()=>{i(e=>({...e,feedback:null}))},[]);return{...t,...r,save:o,reconnect:s,dismissFeedback:c}}var bi=`safeshield`,xi=`smartsafehub`;function Si(e,t){return typeof e==`string`&&e.length>0?e:t}function Ci(e){return typeof e==`string`?e:``}function wi(e){return typeof e==`number`&&Number.isFinite(e)?e:0}function K(e){return e===!0}function Ti(e){return Array.isArray(e)?e.length:0}function Ei(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Di(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:{}}function Oi(e){let t=Di(e.error),n=Ci(t.code)||`UNKNOWN_ERROR`,r=Ci(t.message)||`SafeShield API 요청을 처리하지 못했습니다.`;return new L(`SAFESHIELD_${n.toUpperCase()}`,r)}async function ki(e,t={}){let n=await Et(bi,e,t),r=Di(n);if(r.ok===!1)throw Oi(r);return n}async function Ai(e,t,n,r=t){try{return await R(xi,e,t)}catch(e){if(e instanceof L&&[`RPC_PERMISSION_DENIED`,`UBUS_3`,`UBUS_6`].includes(e.code))return ki(n,r);throw e}}function ji(){return{enabled:!1,collectorRunning:!1,available:!1,schemaVersion:0,volatile:!0,startedAt:0,updatedAt:0,retentionHours:0,totals:{queries:0,blocked:0},hourly:[],deviceLimit:0,devicesTruncated:!1,devices:[]}}function Mi(e){let t=Di(e);if(Object.keys(t).length===0)return ji();let n=Di(t.schema),r=Di(t.totals),i=Array.isArray(t.hourly)?t.hourly.map(e=>Di(e)).map(e=>({bucketStart:wi(e.bucket_start),queries:wi(e.queries),blocked:wi(e.blocked)})).filter(e=>e.bucketStart>0).sort((e,t)=>e.bucketStart-t.bucketStart):[],a=Array.isArray(t.devices)?t.devices.map(e=>Di(e)).map(e=>{let t=Ci(e.ip),n=Ci(e.mac);return{id:Ci(e.id)||n||(t?`ip:${t}`:``),mac:n,ip:t,hostname:Ci(e.hostname),identified:K(e.identified),queries:wi(e.queries),blocked:wi(e.blocked)}}).filter(e=>e.id.length>0):[];return{enabled:K(t.enabled),collectorRunning:K(t.collector_running),available:t.available!==!1,schemaVersion:wi(n.version),volatile:t.volatile!==!1,startedAt:wi(t.started_at),updatedAt:wi(t.updated_at),retentionHours:wi(t.retention_hours),totals:{queries:wi(r.queries),blocked:wi(r.blocked)},hourly:i,deviceLimit:wi(t.device_limit),devicesTruncated:K(t.devices_truncated),devices:a}}function Ni(){return{available:!1,version:null,enabled:!1,active:!1,status:`unavailable`,stage:null,summary:{label:`Unavailable`,message:`SafeShield status API is unavailable`,severity:`warning`},runtime:{refreshdRunning:!1,dnsmasqRunning:!1,dnsRuntimeOk:!1,lastResult:null,lastErrorCode:null},entitlement:{plan:null,status:null},artifact:{resolved:!1,tier:null,version:null,uniqueDomains:0,rules:0},localOverrides:{enabled:!1,allowlistPath:null,blocklistPath:null},blocklist:{installed:!1,validLineCount:0,fileSizeKb:0,verificationOk:!1},health:{overall:`unavailable`},issueCounts:{warnings:0,errors:0},timestamps:{lastAttempt:0,lastSuccess:0,lastFailure:0,lastLocalApply:0,lastLocalApplyFailure:0,nextRefreshAt:0,refreshIntervalS:0}}}function Pi(e){let t=Di(e);if(Object.keys(t).length===0)return Ni();let n=Di(t.summary),r=Di(t.runtime),i=Di(t.entitlement),a=Di(t.artifact),o=Di(t.local_overrides),s=Di(t.blocklist),c=Di(t.health),l=Di(t.timestamps);return{available:!0,version:Si(t.version,null),enabled:K(t.enabled),active:K(t.active),status:Si(t.status,`unknown`)??`unknown`,stage:Si(t.stage,null),summary:{label:Si(n.label,`Unknown`)??`Unknown`,message:Si(n.message,`SafeShield status is unknown`)??`SafeShield status is unknown`,severity:Si(n.severity,`warning`)??`warning`},runtime:{refreshdRunning:K(r.refreshd_running),dnsmasqRunning:K(r.dnsmasq_running),dnsRuntimeOk:K(r.dns_runtime_ok),lastResult:Si(r.last_result,null),lastErrorCode:Si(r.last_error_code,null)},entitlement:{plan:Si(i.plan,null),status:Si(i.status,null)},artifact:{resolved:K(a.resolved),tier:Si(a.tier,null),version:Si(a.version,null),uniqueDomains:wi(a.unique_domains),rules:wi(a.rules)},localOverrides:{enabled:K(o.enabled),allowlistPath:Si(o.allowlist_path,null),blocklistPath:Si(o.blocklist_path,null)},blocklist:{installed:K(s.installed),validLineCount:wi(s.valid_line_count),fileSizeKb:wi(s.file_size_kb),verificationOk:K(s.verification_ok)},health:{overall:Si(c.overall,`unknown`)??`unknown`},issueCounts:{warnings:Ti(t.warnings),errors:Ti(t.errors)},timestamps:{lastAttempt:wi(l.last_attempt),lastSuccess:wi(l.last_success),lastFailure:wi(l.last_failure),lastLocalApply:wi(l.last_local_apply),lastLocalApplyFailure:wi(l.last_local_apply_failure),nextRefreshAt:wi(l.next_refresh_at),refreshIntervalS:wi(l.refresh_interval_s)}}}function Fi(e){let t=Di(Di(e).values);return{enabled:K(t.enabled),applyLocalOverrides:K(t.apply_local_overrides)}}function Ii(e){let t=Di(e);return{requested:K(t.requested),accepted:K(t.accepted),reason:Ci(t.reason)}}async function Li(){try{return Mi(await ki(`statistics`))}catch(e){if(e instanceof L&&[`UBUS_3`,`UBUS_4`,`UBUS_5`].includes(e.code))return ji();throw e}}async function Ri(e){let t=await Ai(`safeshield_statistics_update`,{enabled:e},`config_update`,{values:{statistics_enabled:e}});return{changed:Array.isArray(t.changed)?t.changed.some(e=>e===`statistics_enabled`):!1,enabled:e,restarted:K(t.restarted),reconciled:K(t.reconciled)}}async function zi(){try{return Pi(await ki(`status`))}catch(e){if(e instanceof L&&[`UBUS_3`,`UBUS_4`,`UBUS_5`].includes(e.code))return Ni();throw e}}async function Bi(){return Fi(await ki(`config`))}async function Vi(e){let t=await Ai(`safeshield_set_enabled`,{enabled:e},`set_enabled`);return{changed:K(t.changed),accepted:K(t.accepted),targetEnabled:K(t.target_enabled),reconciled:K(t.reconciled)}}async function Hi(){let e=await Ai(`safeshield_refresh`,{},`refresh`);return{accepted:K(e.accepted),reason:Ci(e.reason),status:Pi(e.status)}}async function Ui(){let[e,t]=await Promise.all([ki(`rules_list`),Bi()]),n=Ei(e.allow),r=Ei(e.block);return{allow:n,block:r,counts:{allow:n.length,block:r.length,total:n.length+r.length},safeshieldEnabled:t.enabled,applyLocalOverrides:t.applyLocalOverrides}}async function Wi(e,t,n,r=!0){let i=await Ai(e===`rule_add`?`safeshield_rule_add`:`safeshield_rule_delete`,{action:t,domain:n,refresh:r},e),a=K(e===`rule_add`?i.added:i.deleted);return{action:t,domain:Ci(i.domain)||n,changed:a,refresh:Ii(i.refresh),rules:await Ui()}}function Gi(e,t,n=!0){return Wi(`rule_add`,e,t,n)}function Ki(e,t,n=!0){return Wi(`rule_delete`,e,t,n)}var qi=4500;function Ji(e,t){let[n,r]=M({action:null,error:null,message:null}),i=P([]),a=P([]),o=P(null),s=F(()=>{for(let e of i.current)window.clearTimeout(e);i.current=[]},[]),c=F(()=>{for(let e of a.current)window.clearTimeout(e);a.current=[]},[]),l=F(()=>{o.current!==null&&(window.clearTimeout(o.current),o.current=null)},[]),u=F(e=>{l(),r({action:e,error:null,message:null})},[l]),d=F(e=>{l(),r({action:null,error:null,message:e}),o.current=window.setTimeout(()=>{o.current=null,r(e=>e.error!==null||e.action!==null?e:{...e,message:null})},qi)},[l]),f=F(t=>{s(),i.current=t.map(t=>window.setTimeout(()=>{e()},t))},[s,e]),p=F(e=>{c(),a.current=e.map(e=>window.setTimeout(()=>{t()},e))},[c,t]);N(()=>()=>{s(),c(),l()},[l,c,s]);let m=F(async t=>{u(t?`enable`:`disable`);try{let n=await Vi(t);d(n.changed?t?`SafeShield 보호 활성화 요청을 적용했습니다.`:`SafeShield 보호 비활성화 요청을 적용했습니다.`:t?`SafeShield 보호가 이미 활성화 상태입니다.`:`SafeShield 보호가 이미 비활성화 상태입니다.`),await e(),f([800,2e3,5e3])}catch(e){r({action:null,error:G(e,`SafeShield 작업을 수행하지 못했습니다.`),message:null})}},[u,e,f,d]),h=F(async e=>{u(e?`statistics-enable`:`statistics-disable`);try{let n=await Ri(e);await t(),d(n.changed?n.reconciled?e?`차단 통계 수집을 활성화했습니다.`:`차단 통계 수집을 비활성화했습니다.`:`차단 통계 설정을 저장했습니다.`:e?`차단 통계 수집이 이미 활성화되어 있습니다.`:`차단 통계 수집이 이미 비활성화되어 있습니다.`),n.changed&&p([500,1500])}catch(e){r({action:null,error:G(e,`차단 통계 설정을 변경하지 못했습니다.`),message:null})}},[u,t,p,d]),g=F(async()=>{u(`refresh`);try{await Hi(),r({action:null,error:null,message:null}),f([700,2500,6e3,12e3])}catch(e){r({action:null,error:G(e,`SafeShield 작업을 수행하지 못했습니다.`),message:null})}},[u,f]),_=F(()=>{l(),r(e=>({...e,error:null,message:null}))},[l]);return{...n,dismissFeedback:_,refreshBlocklist:g,setEnabled:m,setStatisticsEnabled:h}}var Yi=500,Xi=45e3;function Zi(e){return new Promise(t=>window.setTimeout(t,e))}function Qi(e){return e===`allow`?`허용`:`차단`}function $i(e,t){if(!t.changed)return e===`add`?t.action===`allow`?`이미 허용 목록에 있는 도메인입니다.`:`이미 차단 목록에 있는 도메인입니다.`:`이미 삭제된 규칙입니다.`;let n=Qi(t.action),r=e===`add`?`저장`:`삭제`;return t.rules.safeshieldEnabled?t.rules.applyLocalOverrides?`${t.domain} ${n} 규칙을 ${r}했습니다.`:`${t.domain} ${n} 규칙을 ${r}했습니다. 로컬 규칙 적용 설정이 꺼져 있어 아직 DNS에는 반영되지 않습니다.`:`${t.domain} ${n} 규칙을 ${r}했습니다. SafeShield를 켜면 다음 갱신에서 적용됩니다.`}function ea(e,t){let n=e===`add`?`추가`:`삭제`;return`${t.domain} ${Qi(t.action)} 규칙 ${n}를 저장했습니다. 로컬 규칙을 DNS에 적용하고 있습니다…`}function ta(e,t){let n=e===`add`?`추가`:`삭제`;return`${t.domain} ${Qi(t.action)} 규칙 ${n}와 DNS 적용이 완료되었습니다.`}async function na(e){let t=Date.now()+Xi,n=null;for(;Date.now()e.timestamps.lastLocalApply)return{kind:`success`,status:n};if(n.timestamps.lastLocalApplyFailure>e.timestamps.lastLocalApplyFailure)return{kind:`failure`,status:n};await Zi(Yi)}return{kind:`timeout`,status:n}}function ra(e){let t=Or({active:e,fallbackError:`사용자 규칙을 불러오지 못했습니다.`,loader:Ui}),[n,r]=M({action:null,error:null,feedback:null}),i=P(0),a=F(async(e,n,a,o)=>{let s=++i.current,c=e=>{i.current===s&&r(e)};c({action:{operation:e,action:n,domain:a},error:null,feedback:null});try{let r=await zi(),i=e===`add`?await Gi(n,a,!0):await Ki(n,a,!0);if(t.replaceData(i.rules),o?.(),!(i.changed&&i.rules.safeshieldEnabled&&i.rules.applyLocalOverrides))return c({action:null,error:null,feedback:$i(e,i)}),!0;if(!i.refresh.accepted)return c({action:null,error:`규칙은 저장되었지만 로컬 DNS 적용 요청을 시작하지 못했습니다${i.refresh.reason?` (${i.refresh.reason})`:``}.`,feedback:null}),!0;c({action:null,error:null,feedback:ea(e,i)});let s;try{s=await na(r)}catch{return c({action:null,error:`규칙은 저장되었지만 DNS 적용 상태를 확인하지 못했습니다. SafeShield 상태를 확인해 주세요.`,feedback:null}),!0}return s.kind===`success`?(c({action:null,error:null,feedback:ta(e,i)}),!0):s.kind===`disabled`?(c({action:null,error:null,feedback:`규칙은 저장되었지만 SafeShield가 꺼져 있어 DNS 적용을 대기하고 있습니다.`}),!0):s.kind===`failure`?(c({action:null,error:`규칙은 저장되었지만 로컬 DNS 적용이 실패했습니다. SafeShield 상태를 확인해 주세요.`,feedback:null}),!0):(c({action:null,error:`규칙은 저장되었지만 제한 시간 안에 로컬 DNS 적용 완료를 확인하지 못했습니다.`,feedback:null}),!0)}catch(e){return c({action:null,error:G(e,`사용자 규칙을 변경하지 못했습니다.`),feedback:null}),!1}},[t.replaceData]),o=F((e,t,n)=>a(`add`,e,t,n),[a]),s=F((e,t)=>a(`delete`,e,t),[a]),c=F(async()=>{r(e=>({...e,error:null})),await t.refresh()},[t.refresh]),l=F(()=>{r(e=>({...e,feedback:null}))},[]);return{...t,...n,error:n.error??t.error,addRule:o,deleteRule:s,dismissFeedback:l,refresh:c}}var ia=6e4;function aa(e,t=!0){return Or({active:e,fallbackError:`SafeShield 통계를 불러오지 못했습니다.`,loader:Li,...t?{pollInterval:ia}:{}})}var oa=[{label:`갱신 준비`,description:`차단 목록 갱신을 준비하고 있습니다.`,stages:[`starting`,`boot_delay`,`boot_refresh`,`boot_refresh_skipped`,`scheduled_refresh`,`init`]},{label:`최신 차단 목록 확인`,description:`서버에서 최신 차단 목록 정보를 확인하고 있습니다.`,stages:[`resolve_api`]},{label:`차단 목록 다운로드`,description:`최신 차단 목록을 안전하게 다운로드하고 있습니다.`,stages:[`download_artifact`]},{label:`사용자 규칙 적용`,description:`허용·차단 사용자 규칙을 새 차단 목록에 반영하고 있습니다.`,stages:[`local_overrides`,`merge`]},{label:`보호 규칙 적용`,description:`새 차단 규칙을 설치하고 DNS 보호 서비스를 갱신하고 있습니다.`,stages:[`install`,`restart_dnsmasq`]},{label:`보호 상태 확인`,description:`새 차단 목록과 DNS 보호가 정상적으로 동작하는지 확인하고 있습니다.`,stages:[`runtime_check`,`blocklist_verify`]}],sa=new Map;oa.forEach((e,t)=>{e.stages.forEach(e=>sa.set(e,t))});function ca(e,t){return e===`running`||t!==null&&sa.has(t)}function la(e){let t=e===null?0:sa.get(e)??0,n=oa[t];return{description:n.description,label:n.label,number:t+1,total:oa.length}}function ua(e){return(e??``).trim().toLowerCase()}function da(e,t){let n=ua(e);if(n.includes(`upgrade`)||n.includes(`version`))return`현재 SafeShield 버전으로는 갱신을 계속할 수 없습니다. 시스템 업데이트에서 SafeShield를 최신 버전으로 업데이트해 주세요.`;if(n.includes(`entitlement`)||n.includes(`license`)||n.includes(`unauthorized`)||n.includes(`forbidden`))return`차단 목록을 사용할 권한을 확인하지 못했습니다. SmartSafeHub 계정과 요금제 상태를 확인해 주세요.`;if(n.includes(`dnsmasq`)||n.includes(`restart`)||n.includes(`runtime`))return`DNS 보호 서비스를 정상적으로 갱신하지 못했습니다. 잠시 후 다시 갱신해 보고 문제가 계속되면 상태 점검 정보를 확인해 주세요.`;if(n.includes(`verify`)||n.includes(`sanity`))return`새 차단 목록을 적용한 뒤 보호 상태 확인을 완료하지 못했습니다. 다시 갱신해 주세요.`;if(n.includes(`download`)||n.includes(`fetch`)||n.includes(`timeout`)||n.includes(`network`)||n.includes(`wan`))return`차단 목록을 다운로드하지 못했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`;if(n.includes(`resolve`)||n.includes(`manifest`)||n.includes(`artifact`)||n.includes(`api`))return`최신 차단 목록 정보를 확인하지 못했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`;if(n.includes(`override`)||n.includes(`allowlist`)||n.includes(`merge`)||n.includes(`rule`))return`사용자 허용·차단 규칙을 새 차단 목록에 반영하지 못했습니다. 사용자 규칙을 확인한 뒤 다시 갱신해 주세요.`;if(n.includes(`install`)||n.includes(`write`)||n.includes(`space`))return`새 차단 규칙을 장치에 적용하지 못했습니다. 저장 공간과 SafeShield 상태를 확인한 뒤 다시 갱신해 주세요.`;let r=la(t);return r.number===2?`최신 차단 목록 정보를 확인하는 중 문제가 발생했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`:r.number===3?`차단 목록을 다운로드하는 중 문제가 발생했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`:r.number===4?`사용자 규칙을 적용하는 중 문제가 발생했습니다. 사용자 규칙을 확인한 뒤 다시 갱신해 주세요.`:r.number===5?`새 보호 규칙을 적용하는 중 문제가 발생했습니다. 잠시 후 다시 갱신해 주세요.`:r.number===6?`새 차단 목록의 보호 상태를 확인하지 못했습니다. 다시 갱신해 주세요.`:`차단 목록 갱신을 완료하지 못했습니다. 잠시 후 다시 갱신해 주세요.`}var fa=3e3;function pa(e){return e?ca(e.status,e.stage):!1}function ma(e){return Or({active:e,fallbackError:`SafeShield 상태를 불러오지 못했습니다.`,loader:zi,pollInterval:e=>pa(e)?fa:null})}var ha=3e5,ga=1e3,_a=3e3,va=`luci-app-smartsafehub`;function ya(e=!0){let[t,n]=M(null),r=Or({active:e||t===`checking`||t===`installing`,fallbackError:`소프트웨어 업데이트 상태를 불러오지 못했습니다.`,loader:Fn,pollInterval:e=>e?.phase===`checking`?ga:e?.phase===`installing`?_a:ha,refreshOnFocus:!0,refreshOnVisible:t===`checking`||t===`installing`});N(()=>{n(r.data?.phase??null)},[r.data?.phase]);let[i,a]=M(null),[o,s]=M(null),[c,l]=M(null),u=P(!1),d=P(void 0);N(()=>{if(u.current||!r.data)return;let e=r.data.lastInstallAt??null,t=d.current;if(t===void 0){d.current=e;return}if(d.current=e,e===null||e===t||r.data.phase!==`idle`)return;let n=r.data.packages.find(e=>e.name===va)?.installedVersion,i=window.__SMARTHUB_BOOTSTRAP__?.assetVersion;n&&i&&n!==i&&(u.current=!0,window.location.reload())},[r.data]);let f=F(e=>{n(e),r.data&&r.replaceData({...r.data,phase:e,lastError:null})},[r]),p=F(async()=>{a(`check`),s(null),l(null);try{if(!(await Hn()).accepted)throw Error(`업데이트 확인 요청이 접수되지 않았습니다.`);f(`checking`),a(null),window.setTimeout(()=>void r.refresh(),500)}catch(e){a(null),s(G(e,`업데이트 확인을 시작하지 못했습니다.`))}},[f,r]),m=F(async()=>{a(`install`),s(null),l(null);try{if(!(await Un()).accepted)throw Error(`업데이트 설치 요청이 접수되지 않았습니다.`);f(`installing`),a(null),window.setTimeout(()=>void r.refresh(),750)}catch(e){a(null),s(G(e,`업데이트 설치를 시작하지 못했습니다.`))}},[f,r]),h=F(async e=>{a(`settings`),s(null),l(null);try{let t=await Wn(e);return r.data&&r.replaceData({...r.data,settings:t}),a(null),l(`자동 업데이트 설정을 저장했습니다.`),!0}catch(e){return a(null),s(G(e,`자동 업데이트 설정을 저장하지 못했습니다.`)),!1}},[r]),g=F(()=>{s(null),l(null)},[]);return{...r,action:i,actionError:o,message:c,check:p,dismissFeedback:g,install:m,saveSettings:h}}var ba=6e4;function xa(e){return Or({active:e,fallbackError:`장치 상태를 불러오지 못했습니다.`,loader:Tn,pollInterval:ba})}function Sa(e){let t=Or({active:e,fallbackError:`예약 재부팅 설정을 불러오지 못했습니다.`,loader:Yn,refreshOnFocus:!0}),[n,r]=M({saving:!1,saveError:null,saveMessage:null}),i=F(async e=>{r({saving:!0,saveError:null,saveMessage:null});try{let n=await Xn(e);return t.replaceData(n),r({saving:!1,saveError:null,saveMessage:e.enabled?`예약 재부팅 일정을 저장했습니다.`:`예약 재부팅을 껐습니다.`}),!0}catch(e){return r({saving:!1,saveError:G(e,`예약 재부팅 설정을 저장하지 못했습니다.`),saveMessage:null}),!1}},[t.replaceData]),a=F(()=>{r(e=>({...e,saveError:null,saveMessage:null}))},[]);return{...t,...n,dismissSaveFeedback:a,saveSettings:i}}function Ca(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,`-`)||`openwrt`}function wa(e,t){let n=new Date(t*1e3).toISOString().replace(/[:.]/g,`-`);return`smartsafehub-diagnostics-${Ca(e)}-${n}.json`}function Ta(e,t){let n=new Blob([`${JSON.stringify(t,null,2)}\n`],{type:`application/json;charset=utf-8`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,i.style.display=`none`,(document.body??document.documentElement).appendChild(i),i.click(),i.remove(),window.setTimeout(()=>URL.revokeObjectURL(r),1e3)}function Ea(e){return{enabled:e.available?e.enabled:null,status:e.status,lastResult:e.runtime.lastResult,validLineCount:e.blocklist.validLineCount,blocklistInstalled:e.blocklist.installed,dnsmasqOk:e.runtime.dnsRuntimeOk}}function Da(){return{networks:[],totalClients:0,guest:null}}function Oa(){return{enabled:null,status:`unavailable`,lastResult:null,validLineCount:0,blocklistInstalled:!1,dnsmasqOk:!1}}async function ka(e){if(!e)throw Error(`시스템 상태가 준비되지 않았습니다. 새로고침한 뒤 다시 시도해 주세요.`);let[t,n,r]=await Promise.allSettled([dr(),zi(),Mn()]);return{generatedAt:Math.floor(Date.now()/1e3),health:r.status===`fulfilled`?r.value:null,system:e,wifi:t.status===`fulfilled`?t.value:Da(),safeshield:n.status===`fulfilled`?Ea(n.value):Oa()}}function Aa(e){let[t,n]=M({action:null,error:null,message:null,rebootAccepted:!1}),r=F(async()=>{n(e=>({...e,action:`diagnostics`,error:null,message:null}));try{let t=await ka(e);Ta(wa(t.system.device.hostname,t.generatedAt),t),n(e=>({...e,action:null,message:`진단 정보 파일을 만들었습니다.`}))}catch(e){n(t=>({...t,action:null,error:G(e,`시스템 작업을 완료하지 못했습니다.`)}))}},[e]),i=F(async()=>{n(e=>({...e,action:`reboot`,error:null,message:null}));try{let e=await er();n({action:null,error:null,message:e.accepted?`재부팅을 시작했습니다. 잠시 후 공유기에 다시 연결해 주세요.`:`재부팅 요청이 접수되지 않았습니다.`,rebootAccepted:e.accepted})}catch(e){n(t=>({...t,action:null,error:G(e,`시스템 작업을 완료하지 못했습니다.`)}))}},[]),a=F(()=>{n(e=>({...e,error:null,message:null}))},[]);return{...t,dismissFeedback:a,downloadDiagnostics:r,reboot:i}}function ja(e){let t=Or({active:e,fallbackError:`시간대 설정을 불러오지 못했습니다.`,loader:Gn,refreshOnFocus:!0}),[n,r]=M({saving:!1,syncing:!1,saveError:null,saveMessage:null}),i=F(async e=>{r({saving:!0,syncing:!1,saveError:null,saveMessage:null});try{let n=await qn(e);return t.replaceData(n),r({saving:!1,syncing:!1,saveError:null,saveMessage:`시간대를 저장하고 시스템 시간 설정에 적용했습니다.`}),!0}catch(e){return r({saving:!1,syncing:!1,saveError:G(e,`시간대 설정을 저장하지 못했습니다.`),saveMessage:null}),!1}},[t.replaceData]),a=F(async()=>{r({saving:!1,syncing:!0,saveError:null,saveMessage:null});try{await Jn(),await new Promise(e=>{window.setTimeout(e,1500)});let e=await Gn();return t.replaceData(e),r({saving:!1,syncing:!1,saveError:null,saveMessage:`NTP 시간 동기화를 요청하고 장치 시간을 다시 확인했습니다.`}),!0}catch(e){return r({saving:!1,syncing:!1,saveError:G(e,`시간을 동기화하지 못했습니다.`),saveMessage:null}),!1}},[t.replaceData]),o=F(()=>{r(e=>({...e,saveError:null,saveMessage:null}))},[]);return{...t,...n,dismissSaveFeedback:o,saveTimezone:i,syncTime:a}}var Ma=5e3,Na=5e3;function Pa(e){if(!e?.pairingCode||e.accountRegistered===!0)return!1;if(!e.pairingExpiresAt)return!0;let t=Date.parse(e.pairingExpiresAt);return!Number.isFinite(t)||t>Date.now()}function Fa(e){let[t,n]=M(null),[r,i]=M(null),[a,o]=M(null),[s,c]=M(e),[l,u]=M(!1),[d,f]=M(!1),p=P(null),m=P(0),h=P(!0),g=F((e,t)=>!h.current||t!==m.current?!1:(n(e),i(null),c(!1),!0),[]),_=F(()=>{if(!e)return Promise.resolve(null);if(p.current)return p.current;let t=++m.current;o(null),u(!0);let n=(async()=>{try{let e=await An();return g(e,t)&&o(null),e}catch{let e=await kn().catch(()=>null);return e&&g(e,t),h.current&&t===m.current&&o(`SmartSafeHub 서버의 최신 상태 확인이 지연되고 있습니다.`),e}finally{h.current&&u(!1),p.current=null}})();return p.current=n,n},[e,g]),v=F(async()=>{let e=++m.current;f(!0);try{let t=await jn();return g(t,e)&&o(null),t}finally{f(!1)}},[g]);N(()=>{if(!e)return;let t=!0;h.current=!0;let n=++m.current;return c(!0),i(null),o(null),kn().then(e=>{t&&(g(e,n)&&c(!1),_())}).catch(()=>{t&&(n===m.current&&(i(`기기 등록 상태를 확인하지 못했습니다.`),c(!1)),_())}),()=>{t=!1,m.current+=1}},[e,_,g]),N(()=>{if(!e)return;let t=!0,n=window.setInterval(()=>{if(document.visibilityState===`hidden`||p.current)return;let e=++m.current;kn().then(n=>{t&&g(n,e)&&o(null)}).catch(()=>{})},Na);return()=>{t=!1,window.clearInterval(n)}},[e,g]),N(()=>()=>{h.current=!1},[]);let y=Qe(()=>Pa(t),[t]);return N(()=>{if(!e||!y)return;let t=!0,n=0,r=async()=>{await _(),t&&(n=window.setTimeout(()=>void r(),Ma))};return n=window.setTimeout(()=>void r(),Ma),()=>{t=!1,window.clearTimeout(n)}},[e,_,y]),{data:t,error:r,loading:s,pairingBusy:d,refresh:_,refreshing:l,requestPairing:v,syncError:a}}var Ia=6e4;function La(e,t){let[n,r]=M(null),i=P(0);return N(()=>{e&&t!==null&&(i.current+=1,r(t))},[e,t]),N(()=>{if(e)return;let t=!1,n=null,a=!1,o=0,s=async(e=!1)=>{if(t||document.visibilityState===`hidden`||a||!e&&Date.now()-oe??null)}finally{a=!1}},c=()=>{document.visibilityState===`visible`&&s()},l=()=>void s();return s(!0),n=window.setInterval(()=>void s(),Ia),document.addEventListener(`visibilitychange`,c),window.addEventListener(`focus`,l),()=>{t=!0,i.current+=1,n!==null&&window.clearInterval(n),document.removeEventListener(`visibilitychange`,c),window.removeEventListener(`focus`,l)}},[e]),n}var Ra=[2e3,3e3];function za(e){return new Promise(t=>window.setTimeout(t,e))}function Ba(e){let t=Or({active:e,fallbackError:`Wi-Fi 설정을 처리하지 못했습니다.`,loader:dr}),n=P(!0),r=P(e),[i,a]=M({updatingSection:null,feedback:null});N(()=>(n.current=!0,()=>{n.current=!1}),[]),N(()=>{r.current=e},[e]);let o=F(async()=>{for(let e of Ra){if(await za(e),!n.current||!r.current)return;await t.refresh()}},[t.refresh]),s=F(async e=>{a({updatingSection:e.section,feedback:null});try{let n=await fr(e);return t.replaceData({...n.summary,guest:t.data?.guest??null,guestError:t.data?.guestError??!1}),a({updatingSection:null,feedback:{kind:`success`,message:n.changed?`Wi-Fi 설정을 저장하고 무선 네트워크를 다시 불러왔습니다.`:`변경된 Wi-Fi 설정이 없습니다.`}}),n.reloaded&&o(),!0}catch(e){let t=e instanceof L&&[`NETWORK_ERROR`,`RPC_TIMEOUT`].includes(e.code);return a({updatingSection:null,feedback:{kind:t?`warning`:`error`,message:t?`Wi-Fi가 다시 시작되면서 연결이 끊어졌을 수 있습니다. 변경한 SSID로 다시 연결한 뒤 화면을 새로고침해 주세요.`:G(e,`Wi-Fi 설정을 처리하지 못했습니다.`)}}),!1}},[o,t.replaceData,t.data]),c=F(async e=>{a({updatingSection:`ssh_guest`,feedback:null});try{let n=await pr(e);return await t.refresh(),a({updatingSection:null,feedback:{kind:`success`,message:n.changed?`게스트 Wi-Fi 설정이 저장되었습니다.`:`변경된 게스트 Wi-Fi 설정이 없습니다.`}}),n.reloaded&&o(),!0}catch(e){let t=e instanceof L&&[`NETWORK_ERROR`,`RPC_TIMEOUT`].includes(e.code);return a({updatingSection:null,feedback:{kind:t?`warning`:`error`,message:t?`무선 네트워크가 다시 시작되어 연결이 끊어졌을 수 있습니다. 다시 연결한 뒤 확인해 주세요.`:G(e,`게스트 Wi-Fi 설정을 처리하지 못했습니다.`)}}),!1}},[t.refresh,o]),l=F(()=>{a(e=>({...e,feedback:null}))},[]);return{...t,...i,update:s,updateGuest:c,dismissFeedback:l}}function q({action:e,description:t,eyebrow:n,id:r,title:i}){return z(`div`,{class:`ssh-section-heading mb-4 min-w-0`,children:[z(`p`,{class:`m-0 text-[0.68rem] font-black uppercase tracking-[0.18em] text-teal-700`,children:n}),z(`div`,{class:`mt-2 flex min-w-0 flex-wrap items-center justify-between gap-3`,children:[z(`h2`,{class:`m-0 min-w-0 text-xl font-black tracking-tight text-slate-950`,id:r,children:i}),e?z(`div`,{class:`shrink-0`,children:e}):null]}),z(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500`,children:t})]})}var Va=new Intl.NumberFormat(`ko-KR`),Ha=new Intl.DateTimeFormat(`ko-KR`,{dateStyle:`medium`,timeStyle:`short`});function Ua(e){if(!Number.isFinite(e)||e<0)return`확인 불가`;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}일 ${n}시간`:n>0?`${n}시간 ${r}분`:`${Math.max(r,1)}분`}function Wa(e){if(!Number.isFinite(e)||e<0)return`확인 불가`;let t=[`B`,`KB`,`MB`,`GB`],n=e,r=0;for(;n>=1024&&r864e10?`기록 없음`:!Number.isFinite(t)||e>t+300||t-e>=604800?qa(e):Ja(e,t)}function Xa(e){let t=/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z$/.exec(e??``);if(!t)return null;let[,n,r,i,a,o,s]=t,c=Date.UTC(Number(n),Number(r)-1,Number(i),Number(a),Number(o),Number(s)),l=new Date(c);return l.getUTCFullYear()!==Number(n)||l.getUTCMonth()+1!==Number(r)||l.getUTCDate()!==Number(i)||l.getUTCHours()!==Number(a)||l.getUTCMinutes()!==Number(o)||l.getUTCSeconds()!==Number(s)||c<=0?null:c/1e3}function Za(e,t){if(!Number.isFinite(e)||e<=0)return`확인 불가`;let n=t.replaceAll(` `,`_`);try{return new Intl.DateTimeFormat(`ko-KR`,{dateStyle:`medium`,timeStyle:`medium`,timeZone:n}).format(new Date(e*1e3))}catch{return Ha.format(new Date(e*1e3))}}function Qa(e){if(!Number.isFinite(e)||e<=0)return`확인 불가`;let t=Math.floor(e/3600),n=Math.floor(e%3600/60);return t>0?n>0?`${t}시간 ${n}분`:`${t}시간`:`${n}분`}function $a(e){let t=Math.max(0,e.total),n=e.free+e.buffered+e.cached,r=Math.min(t,Math.max(0,e.available>0?e.available:n)),i=Math.max(0,t-r);return{used:i,percent:t>0?i/t*100:0}}function eo(e,t){let n=e.metadata[t];return typeof n==`string`&&n.trim().length>0?n.trim():null}function to(e,t){let n=e.metadata[t];return typeof n==`number`&&Number.isFinite(n)?n:null}function no(e,t){let n=e.metadata[t];return typeof n==`boolean`?n:null}function ro(e,t){let n=eo(e,`error_code`);return n?`${t} (오류 코드: ${n})`:t}function io(e){let t=Math.max(0,Math.floor(e));if(t<60)return`${t}초`;let n=Math.floor(t/60),r=t%60;if(n<60)return r>0?`${n}분 ${r}초`:`${n}분`;let i=Math.floor(n/60),a=n%60;return a>0?`${i}시간 ${a}분`:`${i}시간`}function ao(e){let t=eo(e,`from_version`),n=eo(e,`to_version`);return t&&n?`${t} → ${n}`:n?`${n} 버전이 적용되었습니다.`:null}function oo(e){return e?e.toUpperCase():null}function so(e){switch(e){case`dhcp`:return`자동 IP(DHCP)`;case`pppoe`:return`PPPoE`;case`static`:return`고정 IPv4`;default:return e.toUpperCase()}}function co(e){switch(e.eventType){case`system.booted`:return{title:`공유기 부팅 감지`,description:`공유기가 켜지거나 재시작된 것을 확인했습니다.`};case`network.internet.disconnected`:return{title:`인터넷 연결 끊김 감지`,description:`공유기에서 인터넷 연결을 확인할 수 없었습니다.`};case`network.internet.recovered`:{let t=to(e,`downtime_seconds`);return{title:`인터넷 연결 복구`,description:t!==null&&t>0?`약 ${io(t)} 동안 인터넷 연결이 확인되지 않았습니다.`:`공유기에서 인터넷 연결을 다시 확인했습니다.`}}case`safeshield.protection.enabled`:return{title:`SafeShield 보호 활성화`,description:`DNS 보호 기능이 활성화되었습니다.`};case`safeshield.protection.disabled`:return{title:`SafeShield 보호 비활성화`,description:`DNS 보호 기능이 비활성화되었습니다.`};case`safeshield.blocklist.updated`:{let t=to(e,`domain_count`),n=eo(e,`artifact_version`),r=[];return t!==null&&t>0&&r.push(`${J(t)}개 도메인 적용`),n&&r.push(`목록 ${n}`),{title:`SafeShield 차단 목록 업데이트 완료`,description:r.length>0?r.join(` · `):`최신 차단 목록을 적용했습니다.`}}case`safeshield.blocklist.update_failed`:return{title:`SafeShield 차단 목록 업데이트 실패`,description:ro(e,`차단 목록을 업데이트하지 못했습니다.`)};case`safeshield.statistics.enabled`:return{title:`SafeShield 차단 통계 수집 활성화`,description:`기기별 차단 통계 수집을 활성화했습니다.`};case`safeshield.statistics.disabled`:return{title:`SafeShield 차단 통계 수집 비활성화`,description:`기기별 차단 통계 수집을 비활성화했습니다.`};case`safeshield.rule.added`:return{title:eo(e,`rule_action`)===`allow`?`사용자 허용 규칙 추가`:`사용자 차단 규칙 추가`,description:`SafeShield 사용자 규칙이 변경되었습니다.`};case`safeshield.rule.removed`:return{title:eo(e,`rule_action`)===`allow`?`사용자 허용 규칙 삭제`:`사용자 차단 규칙 삭제`,description:`SafeShield 사용자 규칙이 변경되었습니다.`};case`settings.scheduled_reboot.updated`:{let t=no(e,`enabled`);return{title:`예약 재부팅 설정 변경`,description:t===!0?`예약 재부팅 설정을 저장하고 새 일정에 적용했습니다.`:t===!1?`예약 재부팅을 비활성화했습니다.`:`예약 재부팅 설정을 변경했습니다.`}}case`settings.software_updates.updated`:return{title:`관리 소프트웨어 업데이트 설정 변경`,description:no(e,`auto_install`)===!0?`자동 설치를 포함한 업데이트 설정을 저장했습니다.`:`관리 소프트웨어 업데이트 설정을 저장했습니다.`};case`settings.health_reporter.enabled`:return{title:`원격 상태 보고 활성화`,description:`장치 상태를 SmartSafeHub Cloud에 보고하도록 설정했습니다.`};case`settings.health_reporter.disabled`:return{title:`원격 상태 보고 비활성화`,description:`SmartSafeHub Cloud로의 장치 상태 보고를 중지했습니다.`};case`settings.activity_cloud_sync.enabled`:return{title:`Cloud 활동 기록 전송 활성화`,description:`이후 발생하는 활동을 SmartSafeHub Cloud에 전송하도록 설정했습니다.`};case`settings.activity_cloud_sync.disabled`:return{title:`Cloud 활동 기록 전송 비활성화`,description:`Cloud 전송을 중지했습니다. 로컬 최근 활동은 계속 기록됩니다.`};case`settings.timezone.updated`:{let t=eo(e,`zonename`);return{title:`시간대 설정 변경`,description:t?`공유기 시간대를 ${t}(으)로 변경했습니다.`:`공유기 시간대를 변경했습니다.`}}case`settings.wifi.updated`:return{title:`Wi-Fi 설정 변경`,description:`Wi-Fi 설정을 저장하고 무선 네트워크에 적용했습니다.`};case`settings.wan.updated`:{let t=eo(e,`protocol`);return{title:`인터넷 설정 변경`,description:t?`${so(t)} 방식으로 WAN 설정을 변경했습니다.`:`WAN 인터넷 연결 설정을 변경했습니다.`}}case`settings.lan.updated`:return{title:`LAN 설정 변경`,description:`내부 네트워크 및 DHCP 설정을 변경했습니다.`};case`settings.iptv.updated`:{let t=no(e,`enabled`),n=eo(e,`provider`),r=n===`skb`?`SK Broadband`:n===`lgu`?`LG U+`:null;return{title:`IPTV 설정 변경`,description:t===!1?`IPTV 기능을 비활성화했습니다.`:r?`${r} IPTV 설정을 적용했습니다.`:`IPTV 설정을 적용했습니다.`}}case`software.update.completed`:return{title:`관리 소프트웨어 업데이트 완료`,description:ao(e)};case`software.update.failed`:return{title:`관리 소프트웨어 업데이트 실패`,description:ro(e,`관리 소프트웨어를 업데이트하지 못했습니다.`)};case`firmware.update.started`:return{title:`펌웨어 업데이트 시작`,description:`펌웨어 설치를 시작했습니다. 완료 과정에서 공유기가 재부팅됩니다.`};case`firmware.update.failed`:return{title:`펌웨어 업데이트 실패`,description:ro(e,`펌웨어 설치 준비 또는 검증에 실패했습니다.`)};case`license.activated`:{let t=oo(eo(e,`to_plan`));return{title:`요금제 활성화`,description:t?`${t} 요금제가 활성화되었습니다.`:`요금제가 활성화되었습니다.`}}case`license.changed`:{let t=oo(eo(e,`from_plan`)),n=oo(eo(e,`to_plan`));return{title:`요금제 변경`,description:t&&n?`${t} → ${n}`:n?`${n} 요금제로 변경되었습니다.`:`요금제 상태가 변경되었습니다.`}}case`license.cleared`:return{title:`계정 권한 해제`,description:eo(e,`reason`)===`manual`?`이 공유기에서 계정 권한 연결을 해제했습니다.`:`서버의 계정 권한 상태가 반영되어 이 공유기의 권한 연결이 해제되었습니다.`};case`health.issue.started`:{let t=to(e,`warning_count`)??0,n=to(e,`critical_count`)??0,r=[];return n>0&&r.push(`이상 ${J(n)}건`),t>0&&r.push(`주의 ${J(t)}건`),{title:`확인이 필요한 장치 상태 발견`,description:r.length>0?r.join(` · `):`장치 상태에서 확인이 필요한 항목이 발견되었습니다.`}}case`health.issue.changed`:{let t=to(e,`warning_count`)??0,n=to(e,`critical_count`)??0,r=[];return n>0&&r.push(`이상 ${J(n)}건`),t>0&&r.push(`주의 ${J(t)}건`),{title:`확인이 필요한 장치 상태 변경`,description:r.length>0?r.join(` · `):`확인이 필요한 장치 상태 항목이 변경되었습니다.`}}case`health.issue.resolved`:return{title:`장치 상태 정상으로 복구`,description:`이전에 확인이 필요했던 장치 상태가 정상으로 돌아왔습니다.`};default:return{title:`SmartSafeHub 활동`,description:`장치에서 새로운 활동이 기록되었습니다.`}}}function lo(e){return e===`error`?{icon:z(U,{class:`size-4`}),surface:`bg-rose-50 text-rose-700 ring-rose-200`}:e===`warning`?{icon:z(U,{class:`size-4`}),surface:`bg-amber-50 text-amber-800 ring-amber-200`}:e===`success`?{icon:z(H,{class:`size-4`}),surface:`bg-emerald-50 text-emerald-700 ring-emerald-200`}:{icon:z(Ht,{class:`size-4`}),surface:`bg-slate-100 text-slate-600 ring-slate-200`}}function uo(e){let t=new Date(e*1e3);return new Intl.DateTimeFormat(`ko-KR`,{hour:`2-digit`,minute:`2-digit`,hour12:!1}).format(t)}function fo(e){let t=new Date(e*1e3);return`${t.getFullYear()}-${t.getMonth()+1}-${t.getDate()}`}function po(e){let t=new Date(e*1e3),n=new Date,r=new Date(n.getFullYear(),n.getMonth(),n.getDate()),i=new Date(t.getFullYear(),t.getMonth(),t.getDate()),a=Math.round((r.getTime()-i.getTime())/864e5);return a===0?`오늘`:a===1?`어제`:new Intl.DateTimeFormat(`ko-KR`,{month:`long`,day:`numeric`,weekday:`short`}).format(t)}function mo({compact:e=!1,events:t}){if(t.length===0)return z(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 px-4 py-5 text-center`,children:[z(Ht,{class:`mx-auto size-5 text-slate-400`}),z(`p`,{class:`mt-2 mb-0 text-sm font-extrabold text-slate-700`,children:`아직 기록된 활동이 없습니다.`}),z(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`상태가 실제로 변경되면 이곳에 시간순으로 기록됩니다.`})]});let n=``;return z(`div`,{class:e?`space-y-2`:`space-y-1`,children:t.map(t=>{let r=co(t),i=lo(t.severity),a=fo(t.occurredAt),o=!e&&a!==n;return n=a,z(`div`,{children:[o?z(`p`,{class:`mt-5 mb-2 first:mt-0 text-xs font-black text-slate-500`,children:po(t.occurredAt)}):null,z(`article`,{class:`relative flex min-w-0 gap-3 ${e?`border-b border-slate-100 py-3 first:pt-0 last:border-b-0 last:pb-0`:`rounded-xl px-2 py-3 hover:bg-slate-50`}`,children:[z(`div`,{class:`w-12 shrink-0 pt-1 text-xs font-bold tabular-nums text-slate-400`,children:z(`time`,{dateTime:new Date(t.occurredAt*1e3).toISOString(),title:qa(t.occurredAt),children:uo(t.occurredAt)})}),z(`span`,{class:`mt-0.5 grid size-8 shrink-0 place-items-center rounded-full ring-1 ring-inset ${i.surface}`,children:i.icon}),z(`div`,{class:`min-w-0 flex-1`,children:[z(`p`,{class:`m-0 text-sm font-black leading-5 text-slate-950`,children:r.title}),r.description?z(`p`,{class:`mt-1 mb-0 break-words text-xs font-medium leading-5 text-slate-500`,children:r.description}):null]})]})]},t.eventId)})})}function ho({error:e,loading:t,onRetry:n}){return t?z(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 px-4 py-5 text-center`,children:[z(V,{class:`mx-auto size-5 animate-spin text-teal-700`}),z(`p`,{class:`mt-2 mb-0 text-sm font-bold text-slate-500`,children:`최근 활동을 불러오는 중입니다.`})]}):e?z(`div`,{class:`rounded-xl border border-amber-200 bg-amber-50/70 px-4 py-4`,children:z(`div`,{class:`flex items-start gap-3`,children:[z(U,{class:`mt-0.5 size-5 shrink-0 text-amber-700`}),z(`div`,{class:`min-w-0 flex-1`,children:[z(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:`최근 활동을 불러오지 못했습니다.`}),z(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:e}),n?z(`button`,{class:`mt-3 inline-flex min-h-9 items-center justify-center rounded-lg border border-amber-300 bg-white px-3 text-xs font-extrabold text-amber-800 transition hover:bg-amber-50`,onClick:n,type:`button`,children:`다시 시도`}):null]})]})}):null}function go(e){return e.enabled?e.eligible===!1||e.phase===`ineligible`?{label:`계정 연결 필요`,description:`SmartSafeHub 계정을 연결하면 이후 발생하는 활동을 Cloud에 자동으로 동기화할 수 있습니다.`,tone:`bg-slate-100 text-slate-600 ring-slate-200`}:e.phase===`error`?{label:`동기화 확인 필요`,description:`최근 Cloud 전송을 완료하지 못했습니다. 로컬 활동 기록은 계속 보관됩니다.`,tone:`bg-amber-50 text-amber-800 ring-amber-200`}:e.phase===`syncing`?{label:`동기화 중`,description:`새 활동을 SmartSafeHub Cloud에 전송하고 있습니다.`,tone:`bg-teal-50 text-teal-800 ring-teal-200`}:e.eligible===!0?{label:`자동 동기화`,description:`새 활동이 생기면 SmartSafeHub Cloud에 자동으로 안전하게 전송합니다.`,tone:`bg-emerald-50 text-emerald-800 ring-emerald-200`}:{label:`확인 중`,description:`Cloud 활동 기록 사용 가능 여부를 확인하고 있습니다.`,tone:`bg-slate-100 text-slate-600 ring-slate-200`}:e.eligible===!1?{label:`계정 연결 필요`,description:`SmartSafeHub 계정을 연결하면 Free에서도 Cloud 활동 기록을 사용할 수 있습니다.`,tone:`bg-slate-100 text-slate-600 ring-slate-200`}:{label:`Cloud 전송 꺼짐`,description:`활동 기록은 이 공유기에만 저장됩니다. Cloud에는 새로운 활동을 전송하지 않습니다.`,tone:`bg-slate-100 text-slate-700 ring-slate-200`}}function _o(e){if(e.eligible!==!0)return`—`;if(e.retentionDays>0)return`${e.retentionDays}일`;switch(e.plan?.toLowerCase()){case`free`:return`7일`;case`pro`:case`ultimate`:return`90일`;default:return`확인 중`}}function vo({actionError:e,actionMessage:t,cloud:n,onDismissFeedback:r,onSetEnabled:i,saving:a}){let o=go(n),s=n.plan?.toUpperCase()??null,c=n.eligible===!0,l=n.enabled||c;return z(`section`,{"aria-label":`Cloud 활동 기록 설정`,class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:[z(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[z(`div`,{class:`min-w-0 flex-1`,children:[z(`div`,{class:`flex flex-wrap items-center gap-2`,children:z(`span`,{class:`rounded-full px-2.5 py-1 text-xs font-extrabold ring-1 ring-inset ${o.tone}`,children:a?`설정 중`:o.label})}),z(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:o.description})]}),z(`div`,{class:`flex shrink-0 items-center justify-end gap-3 sm:justify-start`,children:[z(`span`,{class:`text-xs font-bold text-slate-600`,children:[`Cloud 전송 `,n.enabled?`켜짐`:`꺼짐`]}),z(`button`,{"aria-checked":n.enabled,"aria-label":`Cloud 활동 기록 전송 사용`,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${n.enabled?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:a||!l,onClick:()=>i(!n.enabled),role:`switch`,type:`button`,children:z(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${n.enabled?`left-6`:`left-1`}`})})]})]}),(e||t)&&z(`div`,{class:`mt-4 flex min-w-0 items-start justify-between gap-3 rounded-xl border px-4 py-3 text-sm font-bold ${e?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,role:e?`alert`:`status`,children:[z(`span`,{class:`min-w-0`,children:e||t}),z(`button`,{class:`shrink-0 rounded-lg px-2 py-1 text-xs font-extrabold hover:bg-black/5`,onClick:r,type:`button`,children:`닫기`})]}),n.enabled?z(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`Cloud 전송을 끄면 아직 전송하지 않은 대기 기록이 삭제됩니다. 공유기의 로컬 기록은 유지됩니다.`}):null,z(`div`,{class:`mt-4 flex flex-wrap items-center gap-x-5 gap-y-1 border-t border-slate-200 pt-3 text-xs font-semibold text-slate-500`,children:[z(`span`,{children:[`마지막 동기화: `,n.lastSuccessAt>0?Ja(n.lastSuccessAt):`아직 없음`]}),z(`span`,{children:[`Cloud 보관: `,_o(n)]}),n.pendingEvents>0?z(`span`,{children:[`전송 대기: `,J(n.pendingEvents),`건`]}):null]}),n.enabled&&n.phase===`error`&&n.lastErrorCode?z(`p`,{class:`mt-3 mb-0 text-xs font-semibold text-amber-700`,children:[`오류 코드: `,z(`code`,{children:n.lastErrorCode})]}):null,z(`details`,{class:`mt-3 border-t border-slate-200 pt-3`,children:[z(`summary`,{class:`cursor-pointer text-xs font-extrabold text-teal-700 hover:text-teal-800 focus-visible:rounded focus-visible:outline focus-visible:outline-2 focus-visible:outline-teal-500`,children:`Cloud 동기화 상세 정보`}),z(`dl`,{class:`mt-3 grid gap-3 sm:grid-cols-4`,children:[z(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[z(`dt`,{class:`text-xs font-bold text-slate-500`,children:`멤버십`}),z(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:s??(n.eligible===!1?`Free`:`확인 중`)})]}),z(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[z(`dt`,{class:`text-xs font-bold text-slate-500`,children:`전송 대기`}),z(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:[J(n.pendingEvents),`건`]})]}),z(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[z(`dt`,{class:`text-xs font-bold text-slate-500`,children:`마지막 동기화`}),z(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:n.lastSuccessAt>0?Ja(n.lastSuccessAt):`아직 없음`})]}),z(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[z(`dt`,{class:`text-xs font-bold text-slate-500`,children:`Cloud 보관`}),z(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:_o(n)})]})]}),z(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`SmartSafeHub 계정에 연결된 Free는 최근 7일, Pro와 Ultimate는 최근 90일 동안 Cloud 활동 기록을 보관합니다. 끄면 전송 대기 데이터와 임시 인증 정보를 삭제하며, 다시 켠 뒤 새로 발생한 활동부터 Cloud에 전송합니다. 로컬 최근 활동은 항상 유지됩니다.`})]})]})}function yo({actionError:e,actionMessage:t,data:n,error:r,loading:i,onDismissActionFeedback:a,onRetry:o,onSetCloudSync:s,savingCloudSync:c}){let[l,u]=M(20),d=n?.events??[],f=d.slice(0,l),p=d.length-f.length;return z(`div`,{class:`min-w-0 space-y-6`,children:[z(`section`,{"aria-labelledby":`activity-cloud-title`,class:`min-w-0`,children:[z(q,{id:`activity-cloud-title`,eyebrow:`Cloud history`,title:`Cloud 활동 기록`,description:`활동 기록을 Cloud에 자동으로 전송할지 설정합니다. 공유기 내 최근 활동은 항상 기록됩니다.`}),z(vo,{actionError:e,actionMessage:t,cloud:n?.cloud??{enabled:!1,phase:`preparing`,eligible:null,plan:null,retentionDays:0,pendingEvents:0,lastAttemptAt:0,lastSuccessAt:0,lastUploadedCount:0,lastErrorCode:null,nextSyncAt:0},onDismissFeedback:a,onSetEnabled:s,saving:c})]}),z(`section`,{"aria-labelledby":`activity-history-title`,class:`min-w-0`,children:[z(q,{id:`activity-history-title`,eyebrow:`Local history`,title:`현재 부팅 이후의 최근 활동`,description:`인터넷, SafeShield, 업데이트, 계정 권한과 주요 설정에서 실제 상태가 변경된 시점만 기록합니다.`,action:z(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5 text-xs font-extrabold text-slate-600 ring-1 ring-inset ring-slate-200`,children:[`최대 `,n?.maxEvents??128,`건`]})}),z(`div`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:i||r&&!n?z(ho,{error:r,loading:i,onRetry:o}):z(v,{children:[z(mo,{events:f}),d.length>20?z(`div`,{class:`mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-slate-200 pt-4`,children:[z(`p`,{class:`m-0 text-xs font-semibold text-slate-500`,children:[J(f.length),` / `,J(d.length),`건 표시 중`]}),z(`div`,{class:`flex flex-wrap items-center gap-2`,children:[l>20?z(`button`,{class:`inline-flex min-h-10 items-center justify-center rounded-xl border border-slate-200 bg-white px-4 py-2 text-xs font-extrabold text-slate-700 transition hover:bg-slate-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>u(20),type:`button`,children:`최신 20건만 보기`}):null,p>0?z(`button`,{class:`inline-flex min-h-10 items-center justify-center rounded-xl border border-teal-200 bg-teal-50 px-4 py-2 text-xs font-extrabold text-teal-800 transition hover:bg-teal-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>u(e=>Math.min(e+20,d.length)),type:`button`,children:[`이전 활동 더 보기 (`,J(Math.min(20,p)),`건)`]}):null]})]}):null]})})]}),z(`aside`,{class:`rounded-2xl border border-slate-200 bg-slate-50 px-5 py-4`,children:[z(`p`,{class:`m-0 text-sm font-extrabold text-slate-800`,children:`로컬 활동 기록 안내`}),z(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`이 기록은 공유기의 메모리 영역에만 보관되어 재부팅하면 초기화됩니다. 직접 설정을 변경한 작업은 성공 시점에 즉시 기록하고, 인터넷 및 장치 진단처럼 외부 상태를 확인해야 하는 항목은 실제 상태 변화가 관찰된 경우에만 추가합니다.`})]})]})}function bo(){return z(`section`,{"aria-busy":`true`,"aria-live":`polite`,class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:z(`div`,{class:`flex items-center gap-4`,children:[z(V,{class:`size-8 shrink-0 animate-spin text-teal-700`}),z(`div`,{class:`min-w-0 text-left`,children:z(`h2`,{class:`m-0 text-lg font-extrabold text-slate-950`,children:`장치 상태를 확인하고 있습니다`})})]})})}function xo({message:e,onRetry:t}){return z(`section`,{"aria-live":`assertive`,class:`rounded-2xl border border-red-200 bg-red-50 p-5 sm:p-6`,children:[z(`p`,{class:`m-0 text-xs font-bold uppercase tracking-[0.16em] text-red-700`,children:`연결 오류`}),z(`h2`,{class:`mt-2 mb-0 text-lg font-extrabold text-red-950`,children:`장치 상태를 불러오지 못했습니다`}),z(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-red-800`,children:e}),z(`button`,{class:`mt-5 inline-flex min-h-10 items-center justify-center gap-2 rounded-xl border-0 bg-red-700 px-4 py-2 text-sm font-bold text-white shadow-sm transition hover:bg-red-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-red-200`,onClick:t,type:`button`,children:[z(V,{class:`size-4`}),`다시 시도`]})]})}var So=[{value:`all`,label:`전체`},{value:`online`,label:`현재 연결`},{value:`wifi`,label:`Wi-Fi`},{value:`ethernet`,label:`유선/기타`},{value:`offline`,label:`최근 기기`}],Co=new Intl.Collator(`ko`),wo=new Intl.DateTimeFormat(`ko-KR`,{month:`numeric`,day:`numeric`,hour:`2-digit`,minute:`2-digit`});function To(e){switch(e){case`wifi`:return`Wi-Fi`;case`ethernet`:return`유선/기타`;default:return`연결 방식 미확인`}}function Eo(e){return e.hostname??e.ipv4Address??`이름 없는 기기`}function Do(e){return e===null?null:e>=-50?`매우 좋음`:e>=-60?`좋음`:e>=-70?`보통`:`약함`}function Oo(e){if(e===null||e<0)return null;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}일 ${n}시간`:n>0?`${n}시간 ${r}분`:`${Math.max(r,1)}분`}function ko(e){return e.leaseActive?e.leaseExpiresAt===null?`DHCP 임대 활성`:`DHCP ${wo.format(new Date(e.leaseExpiresAt*1e3))}까지`:null}function Ao(e,t){switch(t){case`online`:return e.online;case`wifi`:return e.online&&e.connection===`wifi`;case`ethernet`:return e.online&&e.connection===`ethernet`;case`offline`:return!e.online;default:return!0}}function jo({device:e}){return z(`span`,{class:`inline-flex items-center gap-2 rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${e.online?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}`,children:[z(`span`,{class:`size-2 rounded-full ${e.online?`bg-emerald-500`:`bg-slate-400`}`}),e.online?`현재 연결`:`최근 임대`]})}function Mo({device:e}){let t=Do(e.signalDbm),n=Oo(e.connectedSeconds),r=ko(e);return z(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:[z(`div`,{class:`flex min-w-0 flex-col items-start gap-4 sm:flex-row sm:justify-between`,children:[z(`div`,{class:`flex min-w-0 items-start gap-3`,children:[z(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl ${e.connection===`wifi`?`bg-teal-50 text-teal-700`:e.connection===`ethernet`?`bg-blue-50 text-blue-700`:`bg-slate-100 text-slate-600`}`,children:e.connection===`wifi`?z(Lt,{class:`size-6`}):e.connection===`ethernet`?z(zt,{class:`size-6`}):z(Mt,{class:`size-6`})}),z(`div`,{class:`min-w-0`,children:[z(`h3`,{class:`m-0 break-words text-base font-extrabold text-slate-950`,children:Eo(e)}),z(`p`,{class:`mt-1 mb-0 break-all font-mono text-xs leading-5 text-slate-500`,children:e.mac})]})]}),z(`span`,{class:`shrink-0 self-start`,children:z(jo,{device:e})})]}),z(`dl`,{class:`mt-5 grid gap-3 text-sm sm:grid-cols-2`,children:[z(`div`,{class:`rounded-xl bg-slate-50 p-3.5`,children:[z(`dt`,{class:`text-xs font-bold text-slate-500`,children:`IP 주소`}),z(`dd`,{class:`mt-1.5 mb-0 ml-0 font-extrabold text-slate-900`,children:e.ipv4Address??`확인되지 않음`})]}),z(`div`,{class:`rounded-xl bg-slate-50 p-3.5`,children:[z(`dt`,{class:`text-xs font-bold text-slate-500`,children:`연결 방식`}),z(`dd`,{class:`mt-1.5 mb-0 ml-0 font-extrabold text-slate-900`,children:To(e.connection)})]})]}),z(`div`,{class:`mt-4 flex flex-wrap gap-2 text-xs font-bold text-slate-600`,children:[e.ssid?z(`span`,{class:`rounded-full bg-teal-50 px-3 py-1.5 text-teal-800`,children:[e.ssid,e.bandLabel?` · ${e.bandLabel}`:``]}):null,t?z(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:[`신호 `,t,` · `,e.signalDbm,` dBm`]}):null,n?z(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:[`연결 `,n]}):null,r?z(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:r}):null,e.interface?z(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:e.interface}):null]})]})}function No({data:e,error:t,loading:n,onRetry:r}){let[i,a]=M(``),[o,s]=M(`all`),c=Qe(()=>{if(!e)return[];let t=i.trim().toLocaleLowerCase();return[...e.devices].filter(e=>Ao(e,o)).filter(e=>!t||[e.hostname,e.ipv4Address,e.mac,e.ssid].filter(e=>!!e).some(e=>e.toLocaleLowerCase().includes(t))).sort((e,t)=>e.online===t.online?e.connection===t.connection?Co.compare(Eo(e),Eo(t)):e.connection===`wifi`?-1:1:e.online?-1:1)},[e,o,i]);return n?z(bo,{}):t?z(xo,{message:t,onRetry:r}):e?z(v,{children:[z(q,{eyebrow:`Overview`,title:`연결 기기 현황`,description:`네트워크에 연결되었거나 최근 확인된 기기를 요약합니다.`}),z(`section`,{"aria-label":`연결 기기 요약`,class:`grid gap-4 sm:grid-cols-2 xl:grid-cols-4`,children:[z(Po,{description:`${e.totals.offline}대는 최근 DHCP 임대에서 확인`,icon:z(Mt,{class:`size-6`}),label:`확인된 기기`,value:e.totals.known}),z(Po,{description:`Wi-Fi 또는 ARP에서 현재 확인됨`,icon:z(Ht,{class:`size-6`}),label:`현재 연결`,value:e.totals.online}),z(Po,{description:`무선 AP에 연결된 기기`,icon:z(Lt,{class:`size-6`}),label:`Wi-Fi`,value:e.totals.wireless}),z(Po,{description:`LAN ARP에서 확인된 비무선 기기`,icon:z(zt,{class:`size-6`}),label:`유선/기타`,value:e.totals.ethernet})]}),z(`section`,{class:`mt-7`,"aria-label":`기기 목록 및 필터`,children:[z(q,{eyebrow:`Device inventory`,title:`기기 목록`,description:`연결된 기기를 검색하고 무선·유선 상태별로 확인합니다.`}),z(`div`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:z(`div`,{class:`flex min-w-0 flex-col gap-3 lg:flex-row lg:items-center lg:justify-between`,children:[z(`div`,{class:`ssh-touch-scroll flex min-w-0 gap-2 overflow-x-auto pb-1 lg:flex-1`,role:`group`,"aria-label":`기기 필터`,children:So.map(e=>z(`button`,{"aria-pressed":o===e.value,class:`min-h-10 shrink-0 rounded-xl border px-4 py-2 text-sm font-extrabold transition ${o===e.value?`border-teal-700 bg-teal-700 text-white`:`border-slate-200 bg-white text-slate-600 hover:bg-slate-50 hover:text-slate-950`}`,onClick:()=>s(e.value),type:`button`,children:e.label},e.value))}),z(`label`,{class:`relative block w-full lg:w-72 lg:shrink-0 xl:w-80`,children:[z(`span`,{class:`sr-only`,children:`기기 검색`}),z(`span`,{class:`pointer-events-none absolute inset-y-0 left-0 flex w-11 items-center justify-center text-slate-400`,children:z(en,{class:`size-5`})}),z(`input`,{class:`min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 py-2.5 pr-4 pl-11 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100`,onInput:e=>a(e.currentTarget.value),placeholder:`이름, IP, MAC 또는 SSID 검색`,type:`search`,value:i})]})]})})]}),c.length?z(`section`,{"aria-live":`polite`,class:`mt-5 grid gap-4 lg:grid-cols-2`,children:c.map(e=>z(Mo,{device:e},e.id))}):z(`section`,{class:`mt-5 rounded-2xl border border-dashed border-slate-300 bg-white p-5 text-center sm:p-8`,children:[z(Mt,{class:`mx-auto size-10 text-slate-400`}),z(`h2`,{class:`mt-4 mb-0 text-lg font-extrabold text-slate-950`,children:`조건에 맞는 기기가 없습니다`}),z(`p`,{class:`mt-2 mb-0 text-sm text-slate-600`,children:`검색어 또는 필터를 변경해 주세요.`})]}),z(`p`,{class:`mt-5 mb-0 rounded-xl bg-slate-100 px-4 py-3 text-xs leading-5 text-slate-600`,children:`유선/기타 상태는 ARP 테이블을 기준으로 하며, 최근 DHCP 임대는 기기가 연결 해제된 뒤에도 일정 시간 남을 수 있습니다.`})]}):null}function Po({description:e,icon:t,label:n,value:r}){return z(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:[z(`div`,{class:`flex items-start justify-between gap-4`,children:[z(`div`,{children:[z(`p`,{class:`m-0 text-xs font-bold uppercase tracking-[0.14em] text-slate-500`,children:n}),z(`p`,{class:`mt-3 mb-0 text-3xl font-black tracking-tight text-slate-950`,children:r})]}),z(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:t})]}),z(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:e})]})}function Fo(e){return e+.5|0}var Io=(e,t,n)=>Math.max(Math.min(e,n),t);function Lo(e){return Io(Fo(e*2.55),0,255)}function Ro(e){return Io(Fo(e*255),0,255)}function zo(e){return Io(Fo(e/2.55)/100,0,1)}function Bo(e){return Io(Fo(e*100),0,100)}var Vo={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Ho=[...`0123456789ABCDEF`],Uo=e=>Ho[e&15],Wo=e=>Ho[(e&240)>>4]+Ho[e&15],Go=e=>(e&240)>>4==(e&15),Ko=e=>Go(e.r)&&Go(e.g)&&Go(e.b)&&Go(e.a);function qo(e){var t=e.length,n;return e[0]===`#`&&(t===4||t===5?n={r:255&Vo[e[1]]*17,g:255&Vo[e[2]]*17,b:255&Vo[e[3]]*17,a:t===5?Vo[e[4]]*17:255}:(t===7||t===9)&&(n={r:Vo[e[1]]<<4|Vo[e[2]],g:Vo[e[3]]<<4|Vo[e[4]],b:Vo[e[5]]<<4|Vo[e[6]],a:t===9?Vo[e[7]]<<4|Vo[e[8]]:255})),n}var Jo=(e,t)=>e<255?t(e):``;function Yo(e){var t=Ko(e)?Uo:Wo;return e?`#`+t(e.r)+t(e.g)+t(e.b)+Jo(e.a,t):void 0}var Xo=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Zo(e,t,n){let r=t*Math.min(n,1-n),i=(t,i=(t+e/30)%12)=>n-r*Math.max(Math.min(i-3,9-i,1),-1);return[i(0),i(8),i(4)]}function Qo(e,t,n){let r=(r,i=(r+e/60)%6)=>n-n*t*Math.max(Math.min(i,4-i,1),0);return[r(5),r(3),r(1)]}function $o(e,t,n){let r=Zo(e,1,.5),i;for(t+n>1&&(i=1/(t+n),t*=i,n*=i),i=0;i<3;i++)r[i]*=1-t-n,r[i]+=t;return r}function es(e,t,n,r,i){return e===i?(t-n)/r+(t.5?l/(2-i-a):l/(i+a),s=es(t,n,r,l,i),s=s*60+.5),[s|0,c||0,o]}function ns(e,t,n,r){return(Array.isArray(t)?e(t[0],t[1],t[2]):e(t,n,r)).map(Ro)}function rs(e,t,n){return ns(Zo,e,t,n)}function is(e,t,n){return ns($o,e,t,n)}function as(e,t,n){return ns(Qo,e,t,n)}function os(e){return(e%360+360)%360}function ss(e){let t=Xo.exec(e),n=255,r;if(!t)return;t[5]!==r&&(n=t[6]?Lo(+t[5]):Ro(+t[5]));let i=os(+t[2]),a=t[3]/100,o=t[4]/100;return r=t[1]===`hwb`?is(i,a,o):t[1]===`hsv`?as(i,a,o):rs(i,a,o),{r:r[0],g:r[1],b:r[2],a:n}}function cs(e,t){var n=ts(e);n[0]=os(n[0]+t),n=rs(n),e.r=n[0],e.g=n[1],e.b=n[2]}function ls(e){if(!e)return;let t=ts(e),n=t[0],r=Bo(t[1]),i=Bo(t[2]);return e.a<255?`hsla(${n}, ${r}%, ${i}%, ${zo(e.a)})`:`hsl(${n}, ${r}%, ${i}%)`}var us={x:`dark`,Z:`light`,Y:`re`,X:`blu`,W:`gr`,V:`medium`,U:`slate`,A:`ee`,T:`ol`,S:`or`,B:`ra`,C:`lateg`,D:`ights`,R:`in`,Q:`turquois`,E:`hi`,P:`ro`,O:`al`,N:`le`,M:`de`,L:`yello`,F:`en`,K:`ch`,G:`arks`,H:`ea`,I:`ightg`,J:`wh`},ds={OiceXe:`f0f8ff`,antiquewEte:`faebd7`,aqua:`ffff`,aquamarRe:`7fffd4`,azuY:`f0ffff`,beige:`f5f5dc`,bisque:`ffe4c4`,black:`0`,blanKedOmond:`ffebcd`,Xe:`ff`,XeviTet:`8a2be2`,bPwn:`a52a2a`,burlywood:`deb887`,caMtXe:`5f9ea0`,KartYuse:`7fff00`,KocTate:`d2691e`,cSO:`ff7f50`,cSnflowerXe:`6495ed`,cSnsilk:`fff8dc`,crimson:`dc143c`,cyan:`ffff`,xXe:`8b`,xcyan:`8b8b`,xgTMnPd:`b8860b`,xWay:`a9a9a9`,xgYF:`6400`,xgYy:`a9a9a9`,xkhaki:`bdb76b`,xmagFta:`8b008b`,xTivegYF:`556b2f`,xSange:`ff8c00`,xScEd:`9932cc`,xYd:`8b0000`,xsOmon:`e9967a`,xsHgYF:`8fbc8f`,xUXe:`483d8b`,xUWay:`2f4f4f`,xUgYy:`2f4f4f`,xQe:`ced1`,xviTet:`9400d3`,dAppRk:`ff1493`,dApskyXe:`bfff`,dimWay:`696969`,dimgYy:`696969`,dodgerXe:`1e90ff`,fiYbrick:`b22222`,flSOwEte:`fffaf0`,foYstWAn:`228b22`,fuKsia:`ff00ff`,gaRsbSo:`dcdcdc`,ghostwEte:`f8f8ff`,gTd:`ffd700`,gTMnPd:`daa520`,Way:`808080`,gYF:`8000`,gYFLw:`adff2f`,gYy:`808080`,honeyMw:`f0fff0`,hotpRk:`ff69b4`,RdianYd:`cd5c5c`,Rdigo:`4b0082`,ivSy:`fffff0`,khaki:`f0e68c`,lavFMr:`e6e6fa`,lavFMrXsh:`fff0f5`,lawngYF:`7cfc00`,NmoncEffon:`fffacd`,ZXe:`add8e6`,ZcSO:`f08080`,Zcyan:`e0ffff`,ZgTMnPdLw:`fafad2`,ZWay:`d3d3d3`,ZgYF:`90ee90`,ZgYy:`d3d3d3`,ZpRk:`ffb6c1`,ZsOmon:`ffa07a`,ZsHgYF:`20b2aa`,ZskyXe:`87cefa`,ZUWay:`778899`,ZUgYy:`778899`,ZstAlXe:`b0c4de`,ZLw:`ffffe0`,lime:`ff00`,limegYF:`32cd32`,lRF:`faf0e6`,magFta:`ff00ff`,maPon:`800000`,VaquamarRe:`66cdaa`,VXe:`cd`,VScEd:`ba55d3`,VpurpN:`9370db`,VsHgYF:`3cb371`,VUXe:`7b68ee`,VsprRggYF:`fa9a`,VQe:`48d1cc`,VviTetYd:`c71585`,midnightXe:`191970`,mRtcYam:`f5fffa`,mistyPse:`ffe4e1`,moccasR:`ffe4b5`,navajowEte:`ffdead`,navy:`80`,Tdlace:`fdf5e6`,Tive:`808000`,TivedBb:`6b8e23`,Sange:`ffa500`,SangeYd:`ff4500`,ScEd:`da70d6`,pOegTMnPd:`eee8aa`,pOegYF:`98fb98`,pOeQe:`afeeee`,pOeviTetYd:`db7093`,papayawEp:`ffefd5`,pHKpuff:`ffdab9`,peru:`cd853f`,pRk:`ffc0cb`,plum:`dda0dd`,powMrXe:`b0e0e6`,purpN:`800080`,YbeccapurpN:`663399`,Yd:`ff0000`,Psybrown:`bc8f8f`,PyOXe:`4169e1`,saddNbPwn:`8b4513`,sOmon:`fa8072`,sandybPwn:`f4a460`,sHgYF:`2e8b57`,sHshell:`fff5ee`,siFna:`a0522d`,silver:`c0c0c0`,skyXe:`87ceeb`,UXe:`6a5acd`,UWay:`708090`,UgYy:`708090`,snow:`fffafa`,sprRggYF:`ff7f`,stAlXe:`4682b4`,tan:`d2b48c`,teO:`8080`,tEstN:`d8bfd8`,tomato:`ff6347`,Qe:`40e0d0`,viTet:`ee82ee`,JHt:`f5deb3`,wEte:`ffffff`,wEtesmoke:`f5f5f5`,Lw:`ffff00`,LwgYF:`9acd32`};function fs(){let e={},t=Object.keys(ds),n=Object.keys(us),r,i,a,o,s;for(r=0;r>16&255,a>>8&255,a&255]}return e}var ps;function ms(e){ps||(ps=fs(),ps.transparent=[0,0,0,0]);let t=ps[e.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}var hs=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function gs(e){let t=hs.exec(e),n=255,r,i,a;if(t){if(t[7]!==r){let e=+t[7];n=t[8]?Lo(e):Io(e*255,0,255)}return r=+t[1],i=+t[3],a=+t[5],r=255&(t[2]?Lo(r):Io(r,0,255)),i=255&(t[4]?Lo(i):Io(i,0,255)),a=255&(t[6]?Lo(a):Io(a,0,255)),{r,g:i,b:a,a:n}}}function _s(e){return e&&(e.a<255?`rgba(${e.r}, ${e.g}, ${e.b}, ${zo(e.a)})`:`rgb(${e.r}, ${e.g}, ${e.b})`)}var vs=e=>e<=.0031308?e*12.92:e**(1/2.4)*1.055-.055,ys=e=>e<=.04045?e/12.92:((e+.055)/1.055)**2.4;function bs(e,t,n){let r=ys(zo(e.r)),i=ys(zo(e.g)),a=ys(zo(e.b));return{r:Ro(vs(r+n*(ys(zo(t.r))-r))),g:Ro(vs(i+n*(ys(zo(t.g))-i))),b:Ro(vs(a+n*(ys(zo(t.b))-a))),a:e.a+n*(t.a-e.a)}}function xs(e,t,n){if(e){let r=ts(e);r[t]=Math.max(0,Math.min(r[t]+r[t]*n,t===0?360:1)),r=rs(r),e.r=r[0],e.g=r[1],e.b=r[2]}}function Ss(e,t){return e&&Object.assign(t||{},e)}function Cs(e){var t={r:0,g:0,b:0,a:255};return Array.isArray(e)?e.length>=3&&(t={r:e[0],g:e[1],b:e[2],a:255},e.length>3&&(t.a=Ro(e[3]))):(t=Ss(e,{r:0,g:0,b:0,a:1}),t.a=Ro(t.a)),t}function ws(e){return e.charAt(0)===`r`?gs(e):ss(e)}var Ts=class e{constructor(t){if(t instanceof e)return t;let n=typeof t,r;n===`object`?r=Cs(t):n===`string`&&(r=qo(t)||ms(t)||ws(t)),this._rgb=r,this._valid=!!r}get valid(){return this._valid}get rgb(){var e=Ss(this._rgb);return e&&(e.a=zo(e.a)),e}set rgb(e){this._rgb=Cs(e)}rgbString(){return this._valid?_s(this._rgb):void 0}hexString(){return this._valid?Yo(this._rgb):void 0}hslString(){return this._valid?ls(this._rgb):void 0}mix(e,t){if(e){let n=this.rgb,r=e.rgb,i,a=t===i?.5:t,o=2*a-1,s=n.a-r.a,c=((o*s===-1?o:(o+s)/(1+o*s))+1)/2;i=1-c,n.r=255&c*n.r+i*r.r+.5,n.g=255&c*n.g+i*r.g+.5,n.b=255&c*n.b+i*r.b+.5,n.a=a*n.a+(1-a)*r.a,this.rgb=n}return this}interpolate(e,t){return e&&(this._rgb=bs(this._rgb,e._rgb,t)),this}clone(){return new e(this.rgb)}alpha(e){return this._rgb.a=Ro(e),this}clearer(e){let t=this._rgb;return t.a*=1-e,this}greyscale(){let e=this._rgb;return e.r=e.g=e.b=Fo(e.r*.3+e.g*.59+e.b*.11),this}opaquer(e){let t=this._rgb;return t.a*=1+e,this}negate(){let e=this._rgb;return e.r=255-e.r,e.g=255-e.g,e.b=255-e.b,this}lighten(e){return xs(this._rgb,2,e),this}darken(e){return xs(this._rgb,2,-e),this}saturate(e){return xs(this._rgb,1,e),this}desaturate(e){return xs(this._rgb,1,-e),this}rotate(e){return cs(this._rgb,e),this}};function Es(){}var Ds=(()=>{let e=0;return()=>e++})();function Y(e){return e==null}function Os(e){if(Array.isArray&&Array.isArray(e))return!0;let t=Object.prototype.toString.call(e);return t.slice(0,7)===`[object`&&t.slice(-6)===`Array]`}function X(e){return e!==null&&Object.prototype.toString.call(e)===`[object Object]`}function ks(e){return(typeof e==`number`||e instanceof Number)&&isFinite(+e)}function As(e,t){return ks(e)?e:t}function Z(e,t){return e===void 0?t:e}var js=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100:+e/t,Ms=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100*t:+e;function Ns(e,t,n){if(e&&typeof e.call==`function`)return e.apply(n,t)}function Q(e,t,n,r){let i,a,o;if(Os(e)){if(a=e.length,r)for(i=a-1;i>=0;i--)t.call(n,e[i],i);else for(i=0;ie,x:e=>e.x,y:e=>e.y};function Hs(e){let t=e.split(`.`),n=[],r=``;for(let e of t)r+=e,r.endsWith(`\\`)?r=r.slice(0,-1)+`.`:(n.push(r),r=``);return n}function Us(e){let t=Hs(e);return e=>{for(let n of t){if(n===``)break;e=e&&e[n]}return e}}function Ws(e,t){return(Vs[t]||(Vs[t]=Us(t)))(e)}function Gs(e){return e.charAt(0).toUpperCase()+e.slice(1)}var Ks=e=>e!==void 0,qs=e=>typeof e==`function`,Js=(e,t)=>{if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0};function Ys(e){return e.type===`mouseup`||e.type===`click`||e.type===`contextmenu`}var $=Math.PI,Xs=2*$,Zs=Xs+$,Qs=1/0,$s=$/180,ec=$/2,tc=$/4,nc=$*2/3,rc=Math.log10,ic=Math.sign;function ac(e,t,n){return Math.abs(e-t)e-t).pop(),t}function cc(e){return typeof e==`symbol`||typeof e==`object`&&!!e&&!(Symbol.toPrimitive in e||`toString`in e||`valueOf`in e)}function lc(e){return!cc(e)&&!isNaN(parseFloat(e))&&isFinite(e)}function uc(e,t){let n=Math.round(e);return n-t<=e&&n+t>=e}function dc(e,t,n){let r,i,a;for(r=0,i=e.length;rc&&l=Math.min(t,n)-r&&e<=Math.max(t,n)+r}function Cc(e,t,n){n=n||(n=>e[n]1;)a=i+r>>1,n(a)?i=a:r=a;return{lo:i,hi:r}}var wc=(e,t,n,r)=>Cc(e,n,r?r=>{let i=e[r][t];return ie[r][t]Cc(e,n,r=>e[r][t]>=n);function Ec(e,t,n){let r=0,i=e.length;for(;rr&&e[i-1]>n;)i--;return r>0||i{let n=`_onData`+Gs(t),r=e[t];Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value(...t){let i=r.apply(this,t);return e._chartjs.listeners.forEach(e=>{typeof e[n]==`function`&&e[n](...t)}),i}})}))}function kc(e,t){let n=e._chartjs;if(!n)return;let r=n.listeners,i=r.indexOf(t);i!==-1&&r.splice(i,1),!(r.length>0)&&(Dc.forEach(t=>{delete e[t]}),delete e._chartjs)}function Ac(e){let t=new Set(e);return t.size===e.length?e:Array.from(t)}var jc=function(){return typeof window>`u`?function(e){return e()}:window.requestAnimationFrame}();function Mc(e,t){let n=[],r=!1;return function(...i){n=i,r||(r=!0,jc.call(window,()=>{r=!1,e.apply(t,n)}))}}function Nc(e,t){let n;return function(...r){return t?(clearTimeout(n),n=setTimeout(e,t,r)):e.apply(this,r),t}}var Pc=e=>e===`start`?`left`:e===`end`?`right`:`center`,Fc=(e,t,n)=>e===`start`?t:e===`end`?n:(t+n)/2;function Ic(e,t,n){let r=t.length,i=0,a=r;if(e._sorted){let{iScale:o,vScale:s,_parsed:c}=e,l=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null,u=o.axis,{min:d,max:f,minDefined:p,maxDefined:m}=o.getUserBounds();if(p){if(i=Math.min(wc(c,u,d).lo,n?r:wc(t,u,o.getPixelForValue(d)).lo),l){let e=c.slice(0,i+1).reverse().findIndex(e=>!Y(e[s.axis]));i-=Math.max(0,e)}i=bc(i,0,r-1)}if(m){let e=Math.max(wc(c,o.axis,f,!0).hi+1,n?0:wc(t,u,o.getPixelForValue(f),!0).hi+1);if(l){let t=c.slice(e-1).findIndex(e=>!Y(e[s.axis]));e+=Math.max(0,t)}a=bc(e,i,r)-i}else a=r-i}return{start:i,count:a}}function Lc(e){let{xScale:t,yScale:n,_scaleRanges:r}=e,i={xmin:t.min,xmax:t.max,ymin:n.min,ymax:n.max};if(!r)return e._scaleRanges=i,!0;let a=r.xmin!==t.min||r.xmax!==t.max||r.ymin!==n.min||r.ymax!==n.max;return Object.assign(r,i),a}var Rc=e=>e===0||e===1,zc=(e,t,n)=>-(2**(10*--e)*Math.sin((e-t)*Xs/n)),Bc=(e,t,n)=>2**(-10*e)*Math.sin((e-t)*Xs/n)+1,Vc={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>-e*(e-2),easeInOutQuad:e=>(e/=.5)<1?.5*e*e:-.5*(--e*(e-2)-1),easeInCubic:e=>e*e*e,easeOutCubic:e=>--e*e*e+1,easeInOutCubic:e=>(e/=.5)<1?.5*e*e*e:.5*((e-=2)*e*e+2),easeInQuart:e=>e*e*e*e,easeOutQuart:e=>-(--e*e*e*e-1),easeInOutQuart:e=>(e/=.5)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2),easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>--e*e*e*e*e+1,easeInOutQuint:e=>(e/=.5)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2),easeInSine:e=>-Math.cos(e*ec)+1,easeOutSine:e=>Math.sin(e*ec),easeInOutSine:e=>-.5*(Math.cos($*e)-1),easeInExpo:e=>e===0?0:2**(10*(e-1)),easeOutExpo:e=>e===1?1:-(2**(-10*e))+1,easeInOutExpo:e=>Rc(e)?e:e<.5?.5*2**(10*(e*2-1)):.5*(-(2**(-10*(e*2-1)))+2),easeInCirc:e=>e>=1?e:-(Math.sqrt(1-e*e)-1),easeOutCirc:e=>Math.sqrt(1- --e*e),easeInOutCirc:e=>(e/=.5)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1),easeInElastic:e=>Rc(e)?e:zc(e,.075,.3),easeOutElastic:e=>Rc(e)?e:Bc(e,.075,.3),easeInOutElastic(e){let t=.1125,n=.45;return Rc(e)?e:e<.5?.5*zc(e*2,t,n):.5+.5*Bc(e*2-1,t,n)},easeInBack(e){return e*e*(2.70158*e-1.70158)},easeOutBack(e){return--e*e*(2.70158*e+1.70158)+1},easeInOutBack(e){let t=1.70158;return(e/=.5)<1?.5*(e*e*(((t*=1.525)+1)*e-t)):.5*((e-=2)*e*(((t*=1.525)+1)*e+t)+2)},easeInBounce:e=>1-Vc.easeOutBounce(1-e),easeOutBounce(e){let t=7.5625,n=2.75;return e<1/n?t*e*e:e<2/n?t*(e-=1.5/n)*e+.75:e<2.5/n?t*(e-=2.25/n)*e+.9375:t*(e-=2.625/n)*e+.984375},easeInOutBounce:e=>e<.5?Vc.easeInBounce(e*2)*.5:Vc.easeOutBounce(e*2-1)*.5+.5};function Hc(e){if(e&&typeof e==`object`){let t=e.toString();return t===`[object CanvasPattern]`||t===`[object CanvasGradient]`}return!1}function Uc(e){return Hc(e)?e:new Ts(e)}function Wc(e){return Hc(e)?e:new Ts(e).saturate(.5).darken(.1).hexString()}var Gc=[`x`,`y`,`borderWidth`,`radius`,`tension`],Kc=[`color`,`borderColor`,`backgroundColor`];function qc(e){e.set(`animation`,{delay:void 0,duration:1e3,easing:`easeOutQuart`,fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),e.describe(`animation`,{_fallback:!1,_indexable:!1,_scriptable:e=>e!==`onProgress`&&e!==`onComplete`&&e!==`fn`}),e.set(`animations`,{colors:{type:`color`,properties:Kc},numbers:{type:`number`,properties:Gc}}),e.describe(`animations`,{_fallback:`animation`}),e.set(`transitions`,{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:`transparent`},visible:{type:`boolean`,duration:0}}},hide:{animations:{colors:{to:`transparent`},visible:{type:`boolean`,easing:`linear`,fn:e=>e|0}}}})}function Jc(e){e.set(`layout`,{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}var Yc=new Map;function Xc(e,t){t=t||{};let n=e+JSON.stringify(t),r=Yc.get(n);return r||(r=new Intl.NumberFormat(e,t),Yc.set(n,r)),r}function Zc(e,t,n){return Xc(t,n).format(e)}var Qc={values(e){return Os(e)?e:``+e},numeric(e,t,n){if(e===0)return`0`;let r=this.chart.options.locale,i,a=e;if(n.length>1){let t=Math.max(Math.abs(n[0].value),Math.abs(n[n.length-1].value));(t<1e-4||t>0x38d7ea4c68000)&&(i=`scientific`),a=$c(e,n)}let o=rc(Math.abs(a)),s=isNaN(o)?1:Math.max(Math.min(-1*Math.floor(o),20),0),c={notation:i,minimumFractionDigits:s,maximumFractionDigits:s};return Object.assign(c,this.options.ticks.format),Zc(e,r,c)},logarithmic(e,t,n){if(e===0)return`0`;let r=n[t].significand||e/10**Math.floor(rc(e));return[1,2,3,5,10,15].includes(r)||t>.8*n.length?Qc.numeric.call(this,e,t,n):``}};function $c(e,t){let n=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(n)>=1&&e!==Math.floor(e)&&(n=e-Math.floor(e)),n}var el={formatters:Qc};function tl(e){e.set(`scale`,{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:`ticks`,clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(e,t)=>t.lineWidth,tickColor:(e,t)=>t.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:``,padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:``,padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:el.formatters.values,minor:{},major:{},align:`center`,crossAlign:`near`,showLabelBackdrop:!1,backdropColor:`rgba(255, 255, 255, 0.75)`,backdropPadding:2}}),e.route(`scale.ticks`,`color`,``,`color`),e.route(`scale.grid`,`color`,``,`borderColor`),e.route(`scale.border`,`color`,``,`borderColor`),e.route(`scale.title`,`color`,``,`color`),e.describe(`scale`,{_fallback:!1,_scriptable:e=>!e.startsWith(`before`)&&!e.startsWith(`after`)&&e!==`callback`&&e!==`parser`,_indexable:e=>e!==`borderDash`&&e!==`tickBorderDash`&&e!==`dash`}),e.describe(`scales`,{_fallback:`scale`}),e.describe(`scale.ticks`,{_scriptable:e=>e!==`backdropPadding`&&e!==`callback`,_indexable:e=>e!==`backdropPadding`})}var nl=Object.create(null),rl=Object.create(null);function il(e,t){if(!t)return e;let n=t.split(`.`);for(let t=0,r=n.length;te.chart.platform.getDevicePixelRatio(),this.elements={},this.events=[`mousemove`,`mouseout`,`click`,`touchstart`,`touchmove`],this.font={family:`'Helvetica Neue', 'Helvetica', 'Arial', sans-serif`,size:12,style:`normal`,lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(e,t)=>Wc(t.backgroundColor),this.hoverBorderColor=(e,t)=>Wc(t.borderColor),this.hoverColor=(e,t)=>Wc(t.color),this.indexAxis=`x`,this.interaction={mode:`nearest`,intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(e),this.apply(t)}set(e,t){return al(this,e,t)}get(e){return il(this,e)}describe(e,t){return al(rl,e,t)}override(e,t){return al(nl,e,t)}route(e,t,n,r){let i=il(this,e),a=il(this,n),o=`_`+t;Object.defineProperties(i,{[o]:{value:i[t],writable:!0},[t]:{enumerable:!0,get(){let e=this[o],t=a[r];return X(e)?Object.assign({},t,e):Z(e,t)},set(e){this[o]=e}}})}apply(e){e.forEach(e=>e(this))}}({_scriptable:e=>!e.startsWith(`on`),_indexable:e=>e!==`events`,hover:{_fallback:`interaction`},interaction:{_scriptable:!1,_indexable:!1}},[qc,Jc,tl]);function sl(e){return!e||Y(e.size)||Y(e.family)?null:(e.style?e.style+` `:``)+(e.weight?e.weight+` `:``)+e.size+`px `+e.family}function cl(e,t,n,r,i){let a=t[i];return a||(a=t[i]=e.measureText(i).width,n.push(i)),a>r&&(r=a),r}function ll(e,t,n,r){r=r||{};let i=r.data=r.data||{},a=r.garbageCollect=r.garbageCollect||[];r.font!==t&&(i=r.data={},a=r.garbageCollect=[],r.font=t),e.save(),e.font=t;let o=0,s=n.length,c,l,u,d,f;for(c=0;cn.length){for(c=0;c0&&e.stroke()}}function ml(e,t,n){return n=n||.5,!t||e&&e.x>t.left-n&&e.xt.top-n&&e.y0&&a.strokeColor!==``,c,l;for(e.save(),e.font=i.string,yl(e,a),c=0;c+e||0;function Ol(e,t){let n={},r=X(t),i=r?Object.keys(t):t,a=X(e)?r?n=>Z(e[n],e[t[n]]):t=>e[t]:()=>e;for(let e of i)n[e]=Dl(a(e));return n}function kl(e){return Ol(e,{top:`y`,right:`x`,bottom:`y`,left:`x`})}function Al(e){return Ol(e,[`topLeft`,`topRight`,`bottomLeft`,`bottomRight`])}function jl(e){let t=kl(e);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function Ml(e,t){e=e||{},t=t||ol.font;let n=Z(e.size,t.size);typeof n==`string`&&(n=parseInt(n,10));let r=Z(e.style,t.style);r&&!(``+r).match(Tl)&&(console.warn(`Invalid font style specified: "`+r+`"`),r=void 0);let i={family:Z(e.family,t.family),lineHeight:El(Z(e.lineHeight,t.lineHeight),n),size:n,style:r,weight:Z(e.weight,t.weight),string:``};return i.string=sl(i),i}function Nl(e,t,n,r){let i=!0,a,o,s;for(a=0,o=e.length;an&&e===0?0:e+t;return{min:o(r,-Math.abs(a)),max:o(i,a)}}function Fl(e,t){return Object.assign(Object.create(e),t)}function Il(e,t=[``],n,r,i=()=>e[0]){let a=n||e;return r===void 0&&(r=Ql(`_fallback`,e)),new Proxy({[Symbol.toStringTag]:`Object`,_cacheable:!0,_scopes:e,_rootScopes:a,_fallback:r,_getTarget:i,override:n=>Il([n,...e],t,a,r)},{deleteProperty(t,n){return delete t[n],delete t._keys,delete e[0][n],!0},get(n,r){return Vl(n,r,()=>Zl(r,t,e,n))},getOwnPropertyDescriptor(e,t){return Reflect.getOwnPropertyDescriptor(e._scopes[0],t)},getPrototypeOf(){return Reflect.getPrototypeOf(e[0])},has(e,t){return $l(e).includes(t)},ownKeys(e){return $l(e)},set(e,t,n){let r=e._storage||(e._storage=i());return e[t]=r[t]=n,delete e._keys,!0}})}function Ll(e,t,n,r){let i={_cacheable:!1,_proxy:e,_context:t,_subProxy:n,_stack:new Set,_descriptors:Rl(e,r),setContext:t=>Ll(e,t,n,r),override:i=>Ll(e.override(i),t,n,r)};return new Proxy(i,{deleteProperty(t,n){return delete t[n],delete e[n],!0},get(e,t,n){return Vl(e,t,()=>Hl(e,t,n))},getOwnPropertyDescriptor(t,n){return t._descriptors.allKeys?Reflect.has(e,n)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(e,n)},getPrototypeOf(){return Reflect.getPrototypeOf(e)},has(t,n){return Reflect.has(e,n)},ownKeys(){return Reflect.ownKeys(e)},set(t,n,r){return e[n]=r,delete t[n],!0}})}function Rl(e,t={scriptable:!0,indexable:!0}){let{_scriptable:n=t.scriptable,_indexable:r=t.indexable,_allKeys:i=t.allKeys}=e;return{allKeys:i,scriptable:n,indexable:r,isScriptable:qs(n)?n:()=>n,isIndexable:qs(r)?r:()=>r}}var zl=(e,t)=>e?e+Gs(t):t,Bl=(e,t)=>X(t)&&e!==`adapters`&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function Vl(e,t,n){if(Object.prototype.hasOwnProperty.call(e,t)||t===`constructor`)return e[t];let r=n();return e[t]=r,r}function Hl(e,t,n){let{_proxy:r,_context:i,_subProxy:a,_descriptors:o}=e,s=r[t];return qs(s)&&o.isScriptable(t)&&(s=Ul(t,s,e,n)),Os(s)&&s.length&&(s=Wl(t,s,e,o.isIndexable)),Bl(t,s)&&(s=Ll(s,i,a&&a[t],o)),s}function Ul(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_stack:s}=n;if(s.has(e))throw Error(`Recursion detected: `+Array.from(s).join(`->`)+`->`+e);s.add(e);let c=t(a,o||r);return s.delete(e),Bl(e,c)&&(c=Jl(i._scopes,i,e,c)),c}function Wl(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_descriptors:s}=n;if(a.index!==void 0&&r(e))return t[a.index%t.length];if(X(t[0])){let n=t,r=i._scopes.filter(e=>e!==n);t=[];for(let c of n){let n=Jl(r,i,e,c);t.push(Ll(n,a,o&&o[e],s))}}return t}function Gl(e,t,n){return qs(e)?e(t,n):e}var Kl=(e,t)=>e===!0?t:typeof e==`string`?Ws(t,e):void 0;function ql(e,t,n,r,i){for(let a of t){let t=Kl(n,a);if(t){e.add(t);let a=Gl(t._fallback,n,i);if(a!==void 0&&a!==n&&a!==r)return a}else if(t===!1&&r!==void 0&&n!==r)return null}return!1}function Jl(e,t,n,r){let i=t._rootScopes,a=Gl(t._fallback,n,r),o=[...e,...i],s=new Set;s.add(r);let c=Yl(s,o,n,a||n,r);return c===null||a!==void 0&&a!==n&&(c=Yl(s,o,a,c,r),c===null)?!1:Il(Array.from(s),[``],i,a,()=>Xl(t,n,r))}function Yl(e,t,n,r,i){for(;n;)n=ql(e,t,n,r,i);return n}function Xl(e,t,n){let r=e._getTarget();t in r||(r[t]={});let i=r[t];return Os(i)&&X(n)?n:i||{}}function Zl(e,t,n,r){let i;for(let a of t)if(i=Ql(zl(a,e),n),i!==void 0)return Bl(e,i)?Jl(n,r,e,i):i}function Ql(e,t){for(let n of t){if(!n)continue;let t=n[e];if(t!==void 0)return t}}function $l(e){let t=e._keys;return t||(t=e._keys=eu(e._scopes)),t}function eu(e){let t=new Set;for(let n of e)for(let e of Object.keys(n).filter(e=>!e.startsWith(`_`)))t.add(e);return Array.from(t)}function tu(e,t,n,r){let{iScale:i}=e,{key:a=`r`}=this._parsing,o=Array(r),s,c,l,u;for(s=0,c=r;ste===`x`?`y`:`x`;function au(e,t,n,r){let i=e.skip?t:e,a=t,o=n.skip?t:n,s=gc(a,i),c=gc(o,a),l=s/(s+c),u=c/(s+c);l=isNaN(l)?0:l,u=isNaN(u)?0:u;let d=r*l,f=r*u;return{previous:{x:a.x-d*(o.x-i.x),y:a.y-d*(o.y-i.y)},next:{x:a.x+f*(o.x-i.x),y:a.y+f*(o.y-i.y)}}}function ou(e,t,n){let r=e.length,i,a,o,s,c,l=ru(e,0);for(let u=0;u!e.skip)),t.cubicInterpolationMode===`monotone`)cu(e,i);else{let n=r?e[e.length-1]:e[0];for(a=0,o=e.length;ae.ownerDocument.defaultView.getComputedStyle(e,null);function gu(e,t){return hu(e).getPropertyValue(t)}var _u=[`top`,`right`,`bottom`,`left`];function vu(e,t,n){let r={};n=n?`-`+n:``;for(let i=0;i<4;i++){let a=_u[i];r[a]=parseFloat(e[t+`-`+a+n])||0}return r.width=r.left+r.right,r.height=r.top+r.bottom,r}var yu=(e,t,n)=>(e>0||t>0)&&(!n||!n.shadowRoot);function bu(e,t){let n=e.touches,r=n&&n.length?n[0]:e,{offsetX:i,offsetY:a}=r,o=!1,s,c;if(yu(i,a,e.target))s=i,c=a;else{let e=t.getBoundingClientRect();s=r.clientX-e.left,c=r.clientY-e.top,o=!0}return{x:s,y:c,box:o}}function xu(e,t){if(`native`in e)return e;let{canvas:n,currentDevicePixelRatio:r}=t,i=hu(n),a=i.boxSizing===`border-box`,o=vu(i,`padding`),s=vu(i,`border`,`width`),{x:c,y:l,box:u}=bu(e,n),d=o.left+(u&&s.left),f=o.top+(u&&s.top),{width:p,height:m}=t;return a&&(p-=o.width+s.width,m-=o.height+s.height),{x:Math.round((c-d)/p*n.width/r),y:Math.round((l-f)/m*n.height/r)}}function Su(e,t,n){let r,i;if(t===void 0||n===void 0){let a=e&&pu(e);if(!a)t=e.clientWidth,n=e.clientHeight;else{let e=a.getBoundingClientRect(),o=hu(a),s=vu(o,`border`,`width`),c=vu(o,`padding`);t=e.width-c.width-s.width,n=e.height-c.height-s.height,r=mu(o.maxWidth,a,`clientWidth`),i=mu(o.maxHeight,a,`clientHeight`)}}return{width:t,height:n,maxWidth:r||Qs,maxHeight:i||Qs}}var Cu=e=>Math.round(e*10)/10;function wu(e,t,n,r){let i=hu(e),a=vu(i,`margin`),o=mu(i.maxWidth,e,`clientWidth`)||Qs,s=mu(i.maxHeight,e,`clientHeight`)||Qs,c=Su(e,t,n),{width:l,height:u}=c;if(i.boxSizing===`content-box`){let e=vu(i,`border`,`width`),t=vu(i,`padding`);l-=t.width+e.width,u-=t.height+e.height}return l=Math.max(0,l-a.width),u=Math.max(0,r?l/r:u-a.height),l=Cu(Math.min(l,o,c.maxWidth)),u=Cu(Math.min(u,s,c.maxHeight)),l&&!u&&(u=Cu(l/2)),(t!==void 0||n!==void 0)&&r&&c.height&&u>c.height&&(u=c.height,l=Cu(Math.floor(u*r))),{width:l,height:u}}function Tu(e,t,n){let r=t||1,i=Cu(e.height*r),a=Cu(e.width*r);e.height=Cu(e.height),e.width=Cu(e.width);let o=e.canvas;return o.style&&(n||!o.style.height&&!o.style.width)&&(o.style.height=`${e.height}px`,o.style.width=`${e.width}px`),e.currentDevicePixelRatio!==r||o.height!==i||o.width!==a?(e.currentDevicePixelRatio=r,o.height=i,o.width=a,e.ctx.setTransform(r,0,0,r,0,0),!0):!1}var Eu=function(){let e=!1;try{let t={get passive(){return e=!0,!1}};fu()&&(window.addEventListener(`test`,null,t),window.removeEventListener(`test`,null,t))}catch{}return e}();function Du(e,t){let n=gu(e,t),r=n&&n.match(/^(\d+)(\.\d+)?px$/);return r?+r[1]:void 0}function Ou(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:e.y+n*(t.y-e.y)}}function ku(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:r===`middle`?n<.5?e.y:t.y:r===`after`?n<1?e.y:t.y:n>0?t.y:e.y}}function Au(e,t,n,r){let i={x:e.cp2x,y:e.cp2y},a={x:t.cp1x,y:t.cp1y},o=Ou(e,i,n),s=Ou(i,a,n),c=Ou(a,t,n);return Ou(Ou(o,s,n),Ou(s,c,n),n)}var ju=function(e,t){return{x(n){return e+e+t-n},setWidth(e){t=e},textAlign(e){return e===`center`?e:e===`right`?`left`:`right`},xPlus(e,t){return e-t},leftForLtr(e,t){return e-t}}},Mu=function(){return{x(e){return e},setWidth(e){},textAlign(e){return e},xPlus(e,t){return e+t},leftForLtr(e,t){return e}}};function Nu(e,t,n){return e?ju(t,n):Mu()}function Pu(e,t){let n,r;(t===`ltr`||t===`rtl`)&&(n=e.canvas.style,r=[n.getPropertyValue(`direction`),n.getPropertyPriority(`direction`)],n.setProperty(`direction`,t,`important`),e.prevTextDirection=r)}function Fu(e,t){t!==void 0&&(delete e.prevTextDirection,e.canvas.style.setProperty(`direction`,t[0],t[1]))}function Iu(e){return e===`angle`?{between:yc,compare:_c,normalize:vc}:{between:Sc,compare:(e,t)=>e-t,normalize:e=>e}}function Lu({start:e,end:t,count:n,loop:r,style:i}){return{start:e%n,end:t%n,loop:r&&(t-e+1)%n===0,style:i}}function Ru(e,t,n){let{property:r,start:i,end:a}=n,{between:o,normalize:s}=Iu(r),c=t.length,{start:l,end:u,loop:d}=e,f,p;if(d){for(l+=c,u+=c,f=0,p=c;fc(i,y,_)&&s(i,y)!==0,x=()=>s(a,_)===0||c(a,y,_),S=()=>h||b(),C=()=>!h||x();for(let e=u,n=u;e<=d;++e)v=t[e%o],!v.skip&&(_=l(v[r]),_!==y&&(h=c(_,i,a),g===null&&S()&&(g=s(_,i)===0?e:n),g!==null&&C()&&(m.push(Lu({start:g,end:e,loop:f,count:o,style:p})),g=null),n=e,y=_));return g!==null&&m.push(Lu({start:g,end:d,loop:f,count:o,style:p})),m}function Bu(e,t){let n=[],r=e.segments;for(let i=0;ii&&e[a%t].skip;)a--;return a%=t,{start:i,end:a}}function Hu(e,t,n,r){let i=e.length,a=[],o=t,s=e[t],c;for(c=t+1;c<=n;++c){let n=e[c%i];n.skip||n.stop?s.skip||(r=!1,a.push({start:t%i,end:(c-1)%i,loop:r}),t=o=n.stop?c:null):(o=c,s.skip&&(t=c)),s=n}return o!==null&&a.push({start:t%i,end:o%i,loop:r}),a}function Uu(e,t){let n=e.points,r=e.options.spanGaps,i=n.length;if(!i)return[];let a=!!e._loop,{start:o,end:s}=Vu(n,i,a,r);return r===!0?Wu(e,[{start:o,end:s,loop:a}],n,t):Wu(e,Hu(n,o,sr({chart:e,initial:t.initial,numSteps:a,currentStep:Math.min(n-t.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=jc.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(e=Date.now()){let t=0;this._charts.forEach((n,r)=>{if(!n.running||!n.items.length)return;let i=n.items,a=i.length-1,o=!1,s;for(;a>=0;--a)s=i[a],s._active?(s._total>n.duration&&(n.duration=s._total),s.tick(e),o=!0):(i[a]=i[i.length-1],i.pop());o&&(r.draw(),this._notify(r,n,e,`progress`)),i.length||(n.running=!1,this._notify(r,n,e,`complete`),n.initial=!1),t+=i.length}),this._lastDate=e,t===0&&(this._running=!1)}_getAnims(e){let t=this._charts,n=t.get(e);return n||(n={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},t.set(e,n)),n}listen(e,t,n){this._getAnims(e).listeners[t].push(n)}add(e,t){t&&t.length&&this._getAnims(e).items.push(...t)}has(e){return this._getAnims(e).items.length>0}start(e){let t=this._charts.get(e);t&&(t.running=!0,t.start=Date.now(),t.duration=t.items.reduce((e,t)=>Math.max(e,t._duration),0),this._refresh())}running(e){if(!this._running)return!1;let t=this._charts.get(e);return!(!t||!t.running||!t.items.length)}stop(e){let t=this._charts.get(e);if(!t||!t.items.length)return;let n=t.items,r=n.length-1;for(;r>=0;--r)n[r].cancel();t.items=[],this._notify(e,t,Date.now(),`complete`)}remove(e){return this._charts.delete(e)}},Qu=`transparent`,$u={boolean(e,t,n){return n>.5?t:e},color(e,t,n){let r=Uc(e||Qu),i=r.valid&&Uc(t||Qu);return i&&i.valid?i.mix(r,n).hexString():t},number(e,t,n){return e+(t-e)*n}},ed=class{constructor(e,t,n,r){let i=t[n];r=Nl([e.to,r,i,e.from]);let a=Nl([e.from,i,r]);this._active=!0,this._fn=e.fn||$u[e.type||typeof a],this._easing=Vc[e.easing]||Vc.linear,this._start=Math.floor(Date.now()+(e.delay||0)),this._duration=this._total=Math.floor(e.duration),this._loop=!!e.loop,this._target=t,this._prop=n,this._from=a,this._to=r,this._promises=void 0}active(){return this._active}update(e,t,n){if(this._active){this._notify(!1);let r=this._target[this._prop],i=n-this._start,a=this._duration-i;this._start=n,this._duration=Math.floor(Math.max(a,e.duration)),this._total+=i,this._loop=!!e.loop,this._to=Nl([e.to,t,r,e.from]),this._from=Nl([e.from,r,t])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(e){let t=e-this._start,n=this._duration,r=this._prop,i=this._from,a=this._loop,o=this._to,s;this._active=i!==o&&(a||t1?2-s:s,s=this._easing(Math.min(1,Math.max(0,s))),this._target[r]=this._fn(i,o,s)):(this._target[r]=o,this._notify(!0))}wait(){let e=this._promises||(this._promises=[]);return new Promise((t,n)=>{e.push({res:t,rej:n})})}_notify(e){let t=e?`res`:`rej`,n=this._promises||[];for(let e=0;e{let i=e[r];if(!X(i))return;let a={};for(let e of t)a[e]=i[e];(Os(i.properties)&&i.properties||[r]).forEach(e=>{(e===r||!n.has(e))&&n.set(e,a)})})}_animateOptions(e,t){let n=t.options,r=rd(e,n);if(!r)return[];let i=this._createAnimations(r,n);return n.$shared&&nd(e.options.$animations,n).then(()=>{e.options=n},()=>{}),i}_createAnimations(e,t){let n=this._properties,r=[],i=e.$animations||(e.$animations={}),a=Object.keys(t),o=Date.now(),s;for(s=a.length-1;s>=0;--s){let c=a[s];if(c.charAt(0)===`$`)continue;if(c===`options`){r.push(...this._animateOptions(e,t));continue}let l=t[c],u=i[c],d=n.get(c);if(u){if(d&&u.active()){u.update(d,l,o);continue}u.cancel()}!d||!d.duration?e[c]=l:(i[c]=u=new ed(d,e,c,l),r.push(u))}return r}update(e,t){if(this._properties.size===0){Object.assign(e,t);return}let n=this._createAnimations(e,t);if(n.length)return Zu.add(this._chart,n),!0}};function nd(e,t){let n=[],r=Object.keys(t);for(let t=0;t0||!n&&t<0)return i.index}return null}function hd(e,t){let{chart:n,_cachedMeta:r}=e,i=n._stacks||(n._stacks={}),{iScale:a,vScale:o,index:s}=r,c=a.axis,l=o.axis,u=dd(a,o,r),d=t.length,f;for(let e=0;en[e].axis===t).shift()}function _d(e,t){return Fl(e,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:`default`,type:`dataset`})}function vd(e,t,n){return Fl(e,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:n,index:t,mode:`default`,type:`data`})}function yd(e,t){let n=e.controller.index,r=e.vScale&&e.vScale.axis;if(r){t=t||e._parsed;for(let e of t){let t=e._stacks;if(!t||t[r]===void 0||t[r][n]===void 0)return;delete t[r][n],t[r]._visualValues!==void 0&&t[r]._visualValues[n]!==void 0&&delete t[r]._visualValues[n]}}}var bd=e=>e===`reset`||e===`none`,xd=(e,t)=>t?e:Object.assign({},e),Sd=(e,t,n)=>e&&!t.hidden&&t._stacked&&{keys:sd(n,!0),values:null},Cd=class{constructor(e,t){this.chart=e,this._ctx=e.ctx,this.index=t,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){let e=this._cachedMeta;this.configure(),this.linkScales(),e._stacked=ud(e.vScale,e),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled(`filler`)&&console.warn(`Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options`)}updateIndex(e){this.index!==e&&yd(this._cachedMeta),this.index=e}linkScales(){let e=this.chart,t=this._cachedMeta,n=this.getDataset(),r=(e,t,n,r)=>e===`x`?t:e===`r`?r:n,i=t.xAxisID=Z(n.xAxisID,gd(e,`x`)),a=t.yAxisID=Z(n.yAxisID,gd(e,`y`)),o=t.rAxisID=Z(n.rAxisID,gd(e,`r`)),s=t.indexAxis,c=t.iAxisID=r(s,i,a,o),l=t.vAxisID=r(s,a,i,o);t.xScale=this.getScaleForId(i),t.yScale=this.getScaleForId(a),t.rScale=this.getScaleForId(o),t.iScale=this.getScaleForId(c),t.vScale=this.getScaleForId(l)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(e){return this.chart.scales[e]}_getOtherScale(e){let t=this._cachedMeta;return e===t.iScale?t.vScale:t.iScale}reset(){this._update(`reset`)}_destroy(){let e=this._cachedMeta;this._data&&kc(this._data,this),e._stacked&&yd(e)}_dataCheck(){let e=this.getDataset(),t=e.data||(e.data=[]),n=this._data;if(X(t)){let e=this._cachedMeta;this._data=ld(t,e)}else if(n!==t){if(n){kc(n,this);let e=this._cachedMeta;yd(e),e._parsed=[]}t&&Object.isExtensible(t)&&Oc(t,this),this._syncList=[],this._data=t}}addElements(){let e=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(e.dataset=new this.datasetElementType)}buildOrUpdateElements(e){let t=this._cachedMeta,n=this.getDataset(),r=!1;this._dataCheck();let i=t._stacked;t._stacked=ud(t.vScale,t),t.stack!==n.stack&&(r=!0,yd(t),t.stack=n.stack),this._resyncElements(e),(r||i!==t._stacked)&&(hd(this,t._parsed),t._stacked=ud(t.vScale,t))}configure(){let e=this.chart.config,t=e.datasetScopeKeys(this._type),n=e.getOptionScopes(this.getDataset(),t,!0);this.options=e.createResolver(n,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(e,t){let{_cachedMeta:n,_data:r}=this,{iScale:i,_stacked:a}=n,o=i.axis,s=e===0&&t===r.length||n._sorted,c=e>0&&n._parsed[e-1],l,u,d;if(this._parsing===!1)n._parsed=r,n._sorted=!0,d=r;else{d=Os(r[e])?this.parseArrayData(n,r,e,t):X(r[e])?this.parseObjectData(n,r,e,t):this.parsePrimitiveData(n,r,e,t);let i=()=>u[o]===null||c&&u[o]t||u=0;--d)if(!p()){this.updateRangeFromParsed(c,e,f,s);break}}return c}getAllParsedValues(e){let t=this._cachedMeta._parsed,n=[],r,i,a;for(r=0,i=t.length;r=0&&ethis.getContext(n,r,t),u);return p.$shared&&(p.$shared=s,i[a]=Object.freeze(xd(p,s))),p}_resolveAnimations(e,t,n){let r=this.chart,i=this._cachedDataOpts,a=`animation-${t}`,o=i[a];if(o)return o;let s;if(r.options.animation!==!1){let r=this.chart.config,i=r.datasetAnimationScopeKeys(this._type,t),a=r.getOptionScopes(this.getDataset(),i);s=r.createResolver(a,this.getContext(e,n,t))}let c=new td(r,s&&s.animations);return s&&s._cacheable&&(i[a]=Object.freeze(c)),c}getSharedOptions(e){if(e.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},e))}includeOptions(e,t){return!t||bd(e)||this.chart._animationsDisabled}_getSharedOptions(e,t){let n=this.resolveDataElementOptions(e,t),r=this._sharedOptions,i=this.getSharedOptions(n),a=this.includeOptions(t,i)||i!==r;return this.updateSharedOptions(i,t,n),{sharedOptions:i,includeOptions:a}}updateElement(e,t,n,r){bd(r)?Object.assign(e,n):this._resolveAnimations(t,r).update(e,n)}updateSharedOptions(e,t,n){e&&!bd(t)&&this._resolveAnimations(void 0,t).update(e,n)}_setStyle(e,t,n,r){e.active=r;let i=this.getStyle(t,r);this._resolveAnimations(t,n,r).update(e,{options:!r&&this.getSharedOptions(i)||i})}removeHoverStyle(e,t,n){this._setStyle(e,n,`active`,!1)}setHoverStyle(e,t,n){this._setStyle(e,n,`active`,!0)}_removeDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!1)}_setDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!0)}_resyncElements(e){let t=this._data,n=this._cachedMeta.data;for(let[e,t,n]of this._syncList)this[e](t,n);this._syncList=[];let r=n.length,i=t.length,a=Math.min(i,r);a&&this.parse(0,a),i>r?this._insertElements(r,i-r,e):i{for(e.length+=t,o=e.length-1;o>=a;o--)e[o]=e[o-t]};for(s(i),o=e;oe-t))}return e._cache.$bar}function Td(e){let t=e.iScale,n=wd(t,e.type),r=t._length,i,a,o,s,c=()=>{o!==32767&&o!==-32768&&(Ks(s)&&(r=Math.min(r,Math.abs(o-s)||r)),s=o)};for(i=0,a=n.length;i0?i[e-1]:null,s=eMath.abs(s)&&(c=s,l=o),t[n.axis]=l,t._custom={barStart:c,barEnd:l,start:i,end:a,min:o,max:s}}function kd(e,t,n,r){return Os(e)?Od(e,t,n,r):t[n.axis]=n.parse(e,r),t}function Ad(e,t,n,r){let i=e.iScale,a=e.vScale,o=i.getLabels(),s=i===a,c=[],l,u,d,f;for(l=n,u=n+r;l=n?1:-1):ic(e)}function Nd(e){let t,n,r,i,a;return e.horizontal?(t=e.base>e.x,n=`left`,r=`right`):(t=e.basee.controller.options.grouped),i=n.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(t),s=o&&o[n.axis],c=e=>{let t=e._parsed.find(e=>e[n.axis]===s),r=t&&t[e.vScale.axis];if(Y(r)||isNaN(r))return!0};for(let n of r)if(!(t!==void 0&&c(n))&&((i===!1||a.indexOf(n.stack)===-1||i===void 0&&n.stack===void 0)&&a.push(n.stack),n.index===e))break;return a.length||a.push(void 0),a}_getStackCount(e){return this._getStacks(void 0,e).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){let e=this.chart.scales,t=this.chart.options.indexAxis;return Object.keys(e).filter(n=>e[n].axis===t).shift()}_getAxis(){let e={},t=this.getFirstScaleIdForIndexAxis();for(let n of this.chart.data.datasets)e[Z(this.chart.options.indexAxis===`x`?n.xAxisID:n.yAxisID,t)]=!0;return Object.keys(e)}_getStackIndex(e,t,n){let r=this._getStacks(e,n),i=t===void 0?-1:r.indexOf(t);return i===-1?r.length-1:i}_getRuler(){let e=this.options,t=this._cachedMeta,n=t.iScale,r=[],i,a;for(i=0,a=t.data.length;i=0;--n)t=Math.max(t,e[n].size(this.resolveDataElementOptions(n))/2);return t>0&&t}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart.data.labels||[],{xScale:r,yScale:i}=t,a=this.getParsed(e),o=r.getLabelForValue(a.x),s=i.getLabelForValue(a.y),c=a._custom;return{label:n[e]||``,value:`(`+o+`, `+s+(c?`, `+c:``)+`)`}}update(e){let t=this._cachedMeta.data;this.updateElements(t,0,t.length,e)}updateElements(e,t,n,r){let i=r===`reset`,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:s,includeOptions:c}=this._getSharedOptions(t,r),l=a.axis,u=o.axis;for(let d=t;dyc(e,s,c,!0)?1:Math.max(t,t*n,r,r*n),m=(e,t,r)=>yc(e,s,c,!0)?-1:Math.min(t,t*n,r,r*n),h=p(0,l,d),g=p(ec,u,f),_=m($,l,d),v=m($+ec,u,f);r=(h-_)/2,i=(g-v)/2,a=-(h+_)/2,o=-(g+v)/2}return{ratioX:r,ratioY:i,offsetX:a,offsetY:o}}var Hd=class extends Cd{constructor(e,t){super(e,t),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(e,t){let n=this.getDataset().data,r=this._cachedMeta;if(this._parsing===!1)r._parsed=n;else{let i=e=>+n[e];if(X(n[e])){let{key:e=`value`}=this._parsing;i=t=>+Ws(n[t],e)}let a,o;for(a=e,o=e+t;a0&&!isNaN(e)?Math.abs(e)/t*Xs:0}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart,r=n.data.labels||[],i=Zc(t._parsed[e],n.options.locale);return{label:r[e]||``,value:i}}getMaxBorderWidth(e){let t=0,n=this.chart,r,i,a,o,s;if(!e){for(r=0,i=n.data.datasets.length;re!==`spacing`,_indexable:e=>e!==`spacing`&&!e.startsWith(`borderDash`)&&!e.startsWith(`hoverBorderDash`)}),I(Hd,`overrides`,{aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){let t=e.data,{labels:{pointStyle:n,textAlign:r,color:i,useBorderRadius:a,borderRadius:o}}=e.legend.options;return t.labels.length&&t.datasets.length?t.labels.map((t,s)=>{let c=e.getDatasetMeta(0).controller.getStyle(s);return{text:t,fillStyle:c.backgroundColor,fontColor:i,hidden:!e.getDataVisibility(s),lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:c.borderWidth,strokeStyle:c.borderColor,textAlign:r,pointStyle:n,borderRadius:a&&(o||c.borderRadius),index:s}}):[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}}});var Ud=class extends Cd{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(e){let t=this._cachedMeta,{dataset:n,data:r=[],_dataset:i}=t,a=this.chart._animationsDisabled,{start:o,count:s}=Ic(t,r,a);this._drawStart=o,this._drawCount=s,Lc(t)&&(o=0,s=r.length),n._chart=this.chart,n._datasetIndex=this.index,n._decimated=!!i._decimated,n.points=r;let c=this.resolveDatasetElementOptions(e);this.options.showLine||(c.borderWidth=0),c.segment=this.options.segment,this.updateElement(n,void 0,{animated:!a,options:c},e),this.updateElements(r,o,s,e)}updateElements(e,t,n,r){let i=r===`reset`,{iScale:a,vScale:o,_stacked:s,_dataset:c}=this._cachedMeta,{sharedOptions:l,includeOptions:u}=this._getSharedOptions(t,r),d=a.axis,f=o.axis,{spanGaps:p,segment:m}=this.options,h=lc(p)?p:1/0,g=this.chart._animationsDisabled||i||r===`none`,_=t+n,v=e.length,y=t>0&&this.getParsed(t-1);for(let n=0;n=_){v.skip=!0;continue}let b=this.getParsed(n),x=Y(b[f]),S=v[d]=a.getPixelForValue(b[d],n),C=v[f]=i||x?o.getBasePixel():o.getPixelForValue(s?this.applyStack(o,b,s):b[f],n);v.skip=isNaN(S)||isNaN(C)||x,v.stop=n>0&&Math.abs(b[d]-y[d])>h,m&&(v.parsed=b,v.raw=c.data[n]),u&&(v.options=l||this.resolveDataElementOptions(n,p.active?`active`:r)),g||this.updateElement(p,n,v,r),y=b}}getMaxOverflow(){let e=this._cachedMeta,t=e.dataset,n=t.options&&t.options.borderWidth||0,r=e.data||[];if(!r.length)return n;let i=r[0].size(this.resolveDataElementOptions(0)),a=r[r.length-1].size(this.resolveDataElementOptions(r.length-1));return Math.max(n,i,a)/2}draw(){let e=this._cachedMeta;e.dataset.updateControlPoints(this.chart.chartArea,e.iScale.axis),super.draw()}};I(Ud,`id`,`line`),I(Ud,`defaults`,{datasetElementType:`line`,dataElementType:`point`,showLine:!0,spanGaps:!1}),I(Ud,`overrides`,{scales:{_index_:{type:`category`},_value_:{type:`linear`}}});var Wd=class extends Cd{constructor(e,t){super(e,t),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart,r=n.data.labels||[],i=Zc(t._parsed[e].r,n.options.locale);return{label:r[e]||``,value:i}}parseObjectData(e,t,n,r){return tu.bind(this)(e,t,n,r)}update(e){let t=this._cachedMeta.data;this._updateRadius(),this.updateElements(t,0,t.length,e)}getMinMax(){let e=this._cachedMeta,t={min:1/0,max:-1/0};return e.data.forEach((e,n)=>{let r=this.getParsed(n).r;!isNaN(r)&&this.chart.getDataVisibility(n)&&(rt.max&&(t.max=r))}),t}_updateRadius(){let e=this.chart,t=e.chartArea,n=e.options,r=Math.min(t.right-t.left,t.bottom-t.top),i=Math.max(r/2,0),a=(i-Math.max(n.cutoutPercentage?i/100*n.cutoutPercentage:1,0))/e.getVisibleDatasetCount();this.outerRadius=i-a*this.index,this.innerRadius=this.outerRadius-a}updateElements(e,t,n,r){let i=r===`reset`,a=this.chart,o=a.options.animation,s=this._cachedMeta.rScale,c=s.xCenter,l=s.yCenter,u=s.getIndexAngle(0)-.5*$,d=u,f,p=360/this.countVisibleElements();for(f=0;f{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&t++}),t}_computeAngle(e,t,n){return this.chart.getDataVisibility(e)?fc(this.resolveDataElementOptions(e,t).angle||n):0}};I(Wd,`id`,`polarArea`),I(Wd,`defaults`,{dataElementType:`arc`,animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:`number`,properties:[`x`,`y`,`startAngle`,`endAngle`,`innerRadius`,`outerRadius`]}},indexAxis:`r`,startAngle:0}),I(Wd,`overrides`,{aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){let t=e.data;if(t.labels.length&&t.datasets.length){let{labels:{pointStyle:n,color:r}}=e.legend.options;return t.labels.map((t,i)=>{let a=e.getDatasetMeta(0).controller.getStyle(i);return{text:t,fillStyle:a.backgroundColor,strokeStyle:a.borderColor,fontColor:r,lineWidth:a.borderWidth,pointStyle:n,hidden:!e.getDataVisibility(i),index:i}})}return[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}},scales:{r:{type:`radialLinear`,angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});var Gd=class extends Hd{};I(Gd,`id`,`pie`),I(Gd,`defaults`,{cutout:0,rotation:0,circumference:360,radius:`100%`});var Kd=class extends Cd{getLabelAndValue(e){let t=this._cachedMeta.vScale,n=this.getParsed(e);return{label:t.getLabels()[e],value:``+t.getLabelForValue(n[t.axis])}}parseObjectData(e,t,n,r){return tu.bind(this)(e,t,n,r)}update(e){let t=this._cachedMeta,n=t.dataset,r=t.data||[],i=t.iScale.getLabels();if(n.points=r,e!==`resize`){let t=this.resolveDatasetElementOptions(e);this.options.showLine||(t.borderWidth=0);let a={_loop:!0,_fullLoop:i.length===r.length,options:t};this.updateElement(n,void 0,a,e)}this.updateElements(r,0,r.length,e)}updateElements(e,t,n,r){let i=this._cachedMeta.rScale,a=r===`reset`;for(let o=t;o0&&this.getParsed(t-1);for(let l=t;l0&&Math.abs(n[f]-v[f])>g,h&&(m.parsed=n,m.raw=c.data[l]),d&&(m.options=u||this.resolveDataElementOptions(l,t.active?`active`:r)),_||this.updateElement(t,l,m,r),v=n}this.updateSharedOptions(u,r,l)}getMaxOverflow(){let e=this._cachedMeta,t=e.data||[];if(!this.options.showLine){let e=0;for(let n=t.length-1;n>=0;--n)e=Math.max(e,t[n].size(this.resolveDataElementOptions(n))/2);return e>0&&e}let n=e.dataset,r=n.options&&n.options.borderWidth||0;if(!t.length)return r;let i=t[0].size(this.resolveDataElementOptions(0)),a=t[t.length-1].size(this.resolveDataElementOptions(t.length-1));return Math.max(r,i,a)/2}};I(qd,`id`,`scatter`),I(qd,`defaults`,{datasetElementType:!1,dataElementType:`point`,showLine:!1,fill:!1}),I(qd,`overrides`,{interaction:{mode:`point`},scales:{x:{type:`linear`},y:{type:`linear`}}});function Jd(){throw Error(`This method is not implemented: Check that a complete date adapter is provided.`)}var Yd={_date:class e{static override(t){Object.assign(e.prototype,t)}constructor(e){I(this,`options`,void 0),this.options=e||{}}init(){}formats(){return Jd()}parse(){return Jd()}format(){return Jd()}add(){return Jd()}diff(){return Jd()}startOf(){return Jd()}endOf(){return Jd()}}};function Xd(e,t,n,r){let{controller:i,data:a,_sorted:o}=e,s=i._cachedMeta.iScale,c=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null;if(s&&t===s.axis&&t!==`r`&&o&&a.length){let o=s._reversePixels?Tc:wc;if(!r){let r=o(a,t,n);if(c){let{vScale:t}=i._cachedMeta,{_parsed:n}=e,a=n.slice(0,r.lo+1).reverse().findIndex(e=>!Y(e[t.axis]));r.lo-=Math.max(0,a);let o=n.slice(r.hi).findIndex(e=>!Y(e[t.axis]));r.hi+=Math.max(0,o)}return r}if(i._sharedOptions){let e=a[0],r=typeof e.getRange==`function`&&e.getRange(t);if(r){let e=o(a,t,n-r),i=o(a,t,n+r);return{lo:e.lo,hi:i.hi}}}}return{lo:0,hi:a.length-1}}function Zd(e,t,n,r,i){let a=e.getSortedVisibleDatasetMetas(),o=n[t];for(let e=0,n=a.length;e{e[o]&&e[o](t[n],i)&&(a.push({element:e,datasetIndex:r,index:c}),s=s||e.inRange(t.x,t.y,i))}),r&&!s?[]:a}var af={evaluateInteractionItems:Zd,modes:{index(e,t,n,r){let i=xu(t,e),a=n.axis||`x`,o=n.includeInvisible||!1,s=n.intersect?$d(e,i,a,r,o):nf(e,i,a,!1,r,o),c=[];return s.length?(e.getSortedVisibleDatasetMetas().forEach(e=>{let t=s[0].index,n=e.data[t];n&&!n.skip&&c.push({element:n,datasetIndex:e.index,index:t})}),c):[]},dataset(e,t,n,r){let i=xu(t,e),a=n.axis||`xy`,o=n.includeInvisible||!1,s=n.intersect?$d(e,i,a,r,o):nf(e,i,a,!1,r,o);if(s.length>0){let t=s[0].datasetIndex,n=e.getDatasetMeta(t).data;s=[];for(let e=0;ee.pos===t)}function cf(e,t){return e.filter(e=>of.indexOf(e.pos)===-1&&e.box.axis===t)}function lf(e,t){return e.sort((e,n)=>{let r=t?n:e,i=t?e:n;return r.weight===i.weight?r.index-i.index:r.weight-i.weight})}function uf(e){let t=[],n,r,i,a,o,s;for(n=0,r=(e||[]).length;ne.box.fullSize),!0),r=lf(sf(t,`left`),!0),i=lf(sf(t,`right`)),a=lf(sf(t,`top`),!0),o=lf(sf(t,`bottom`)),s=cf(t,`x`),c=cf(t,`y`);return{fullSize:n,leftAndTop:r.concat(a),rightAndBottom:i.concat(c).concat(o).concat(s),chartArea:sf(t,`chartArea`),vertical:r.concat(i).concat(c),horizontal:a.concat(o).concat(s)}}function mf(e,t,n,r){return Math.max(e[n],t[n])+Math.max(e[r],t[r])}function hf(e,t){e.top=Math.max(e.top,t.top),e.left=Math.max(e.left,t.left),e.bottom=Math.max(e.bottom,t.bottom),e.right=Math.max(e.right,t.right)}function gf(e,t,n,r){let{pos:i,box:a}=n,o=e.maxPadding;if(!X(i)){n.size&&(e[i]-=n.size);let t=r[n.stack]||{size:0,count:1};t.size=Math.max(t.size,n.horizontal?a.height:a.width),n.size=t.size/t.count,e[i]+=n.size}a.getPadding&&hf(o,a.getPadding());let s=Math.max(0,t.outerWidth-mf(o,e,`left`,`right`)),c=Math.max(0,t.outerHeight-mf(o,e,`top`,`bottom`)),l=s!==e.w,u=c!==e.h;return e.w=s,e.h=c,n.horizontal?{same:l,other:u}:{same:u,other:l}}function _f(e){let t=e.maxPadding;function n(n){let r=Math.max(t[n]-e[n],0);return e[n]+=r,r}e.y+=n(`top`),e.x+=n(`left`),n(`right`),n(`bottom`)}function vf(e,t){let n=t.maxPadding;function r(e){let r={left:0,top:0,right:0,bottom:0};return e.forEach(e=>{r[e]=Math.max(t[e],n[e])}),r}return r(e?[`left`,`right`]:[`top`,`bottom`])}function yf(e,t,n,r){let i=[],a,o,s,c,l,u;for(a=0,o=e.length,l=0;a{typeof e.beforeLayout==`function`&&e.beforeLayout()});let u=c.reduce((e,t)=>t.box.options&&t.box.options.display===!1?e:e+1,0)||1,d=Object.freeze({outerWidth:t,outerHeight:n,padding:i,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/u,hBoxMaxHeight:o/2}),f=Object.assign({},i);hf(f,jl(r));let p=Object.assign({maxPadding:f,w:a,h:o,x:i.left,y:i.top},i),m=ff(c.concat(l),d);yf(s.fullSize,p,d,m),yf(c,p,d,m),yf(l,p,d,m)&&yf(c,p,d,m),_f(p),xf(s.leftAndTop,p,d,m),p.x+=p.w,p.y+=p.h,xf(s.rightAndBottom,p,d,m),e.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},Q(s.chartArea,t=>{let n=t.box;Object.assign(n,e.chartArea),n.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}},Cf=class{acquireContext(e,t){}releaseContext(e){return!1}addEventListener(e,t,n){}removeEventListener(e,t,n){}getDevicePixelRatio(){return 1}getMaximumSize(e,t,n,r){return t=Math.max(0,t||e.width),n=n||e.height,{width:t,height:Math.max(0,r?Math.floor(t/r):n)}}isAttached(e){return!0}updateConfig(e){}},wf=class extends Cf{acquireContext(e){return e&&e.getContext&&e.getContext(`2d`)||null}updateConfig(e){e.options.animation=!1}},Tf=`$chartjs`,Ef={touchstart:`mousedown`,touchmove:`mousemove`,touchend:`mouseup`,pointerenter:`mouseenter`,pointerdown:`mousedown`,pointermove:`mousemove`,pointerup:`mouseup`,pointerleave:`mouseout`,pointerout:`mouseout`},Df=e=>e===null||e===``;function Of(e,t){let n=e.style,r=e.getAttribute(`height`),i=e.getAttribute(`width`);if(e[Tf]={initial:{height:r,width:i,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||`block`,n.boxSizing=n.boxSizing||`border-box`,Df(i)){let t=Du(e,`width`);t!==void 0&&(e.width=t)}if(Df(r)){if(e.style.height===``)e.height=e.width/(t||2);else{let t=Du(e,`height`);t!==void 0&&(e.height=t)}}return e}var kf=Eu?{passive:!0}:!1;function Af(e,t,n){e&&e.addEventListener(t,n,kf)}function jf(e,t,n){e&&e.canvas&&e.canvas.removeEventListener(t,n,kf)}function Mf(e,t){let n=Ef[e.type]||e.type,{x:r,y:i}=xu(e,t);return{type:n,chart:t,native:e,x:r===void 0?null:r,y:i===void 0?null:i}}function Nf(e,t){for(let n of e)if(n===t||n.contains(t))return!0}function Pf(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t=t||Nf(n.addedNodes,r),t=t&&!Nf(n.removedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}function Ff(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t=t||Nf(n.removedNodes,r),t=t&&!Nf(n.addedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}var If=new Map,Lf=0;function Rf(){let e=window.devicePixelRatio;e!==Lf&&(Lf=e,If.forEach((t,n)=>{n.currentDevicePixelRatio!==e&&t()}))}function zf(e,t){If.size||window.addEventListener(`resize`,Rf),If.set(e,t)}function Bf(e){If.delete(e),If.size||window.removeEventListener(`resize`,Rf)}function Vf(e,t,n){let r=e.canvas,i=r&&pu(r);if(!i)return;let a=Mc((e,t)=>{let r=i.clientWidth;n(e,t),r{let t=e[0],n=t.contentRect.width,r=t.contentRect.height;(n!==0||r!==0)&&a(n,r)});return o.observe(i),zf(e,a),o}function Hf(e,t,n){n&&n.disconnect(),t===`resize`&&Bf(e)}function Uf(e,t,n){let r=e.canvas,i=Mc(t=>{e.ctx!==null&&n(Mf(t,e))},e);return Af(r,t,i),i}var Wf=class extends Cf{acquireContext(e,t){let n=e&&e.getContext&&e.getContext(`2d`);return n&&n.canvas===e?(Of(e,t),n):null}releaseContext(e){let t=e.canvas;if(!t[Tf])return!1;let n=t[Tf].initial;[`height`,`width`].forEach(e=>{let r=n[e];Y(r)?t.removeAttribute(e):t.setAttribute(e,r)});let r=n.style||{};return Object.keys(r).forEach(e=>{t.style[e]=r[e]}),t.width=t.width,delete t[Tf],!0}addEventListener(e,t,n){this.removeEventListener(e,t);let r=e.$proxies||(e.$proxies={});r[t]=({attach:Pf,detach:Ff,resize:Vf}[t]||Uf)(e,t,n)}removeEventListener(e,t){let n=e.$proxies||(e.$proxies={}),r=n[t];r&&(({attach:Hf,detach:Hf,resize:Hf}[t]||jf)(e,t,r),n[t]=void 0)}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(e,t,n,r){return wu(e,t,n,r)}isAttached(e){let t=e&&pu(e);return!!(t&&t.isConnected)}};function Gf(e){return!fu()||typeof OffscreenCanvas<`u`&&e instanceof OffscreenCanvas?wf:Wf}var Kf=class{constructor(){I(this,`x`,void 0),I(this,`y`,void 0),I(this,`active`,!1),I(this,`options`,void 0),I(this,`$animations`,void 0)}tooltipPosition(e){let{x:t,y:n}=this.getProps([`x`,`y`],e);return{x:t,y:n}}hasValue(){return lc(this.x)&&lc(this.y)}getProps(e,t){let n=this.$animations;if(!t||!n)return this;let r={};return e.forEach(e=>{r[e]=n[e]&&n[e].active()?n[e]._to:this[e]}),r}};I(Kf,`defaults`,{}),I(Kf,`defaultRoutes`,void 0);function qf(e,t){let n=e.options.ticks,r=Jf(e),i=Math.min(n.maxTicksLimit||r,r),a=n.major.enabled?Xf(t):[],o=a.length,s=a[0],c=a[o-1],l=[];if(o>i)return Zf(t,l,a,o/i),l;let u=Yf(a,t,i);if(o>0){let e,n,r=o>1?Math.round((c-s)/(o-1)):null;for(Qf(t,l,u,Y(r)?0:s-r,s),e=0,n=o-1;ei)return t}return Math.max(i,1)}function Xf(e){let t=[],n,r;for(n=0,r=e.length;ne===`left`?`right`:e===`right`?`left`:e,tp=(e,t,n)=>t===`top`||t===`left`?e[t]+n:e[t]-n,np=(e,t)=>Math.min(t||e,e);function rp(e,t){let n=[],r=e.length/t,i=e.length,a=0;for(;ao+s)))return c}function ap(e,t){Q(e,e=>{let n=e.gc,r=n.length/2,i;if(r>t){for(i=0;in?n:t,n=r&&t>n?t:n,{min:As(t,As(n,t)),max:As(n,As(t,n))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){let e=this.chart.data;return this.options.labels||(this.isHorizontal()?e.xLabels:e.yLabels)||e.labels||[]}getLabelItems(e=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(e))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){Ns(this.options.beforeUpdate,[this])}update(e,t,n){let{beginAtZero:r,grace:i,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=e,this.maxHeight=t,this._margins=n=Object.assign({left:0,right:0,top:0,bottom:0},n),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+n.left+n.right:this.height+n.top+n.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=Pl(this,i,r),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();let s=o=i||n<=1||!this.isHorizontal()){this.labelRotation=r;return}let l=this._getLabelSizes(),u=l.widest.width,d=l.highest.height,f=bc(this.chart.width-u,0,this.maxWidth);o=e.offset?this.maxWidth/n:f/(n-1),u+6>o&&(o=f/(n-(e.offset?.5:1)),s=this.maxHeight-op(e.grid)-t.padding-sp(e.title,this.chart.options.font),c=Math.sqrt(u*u+d*d),a=pc(Math.min(Math.asin(bc((l.highest.height+6)/o,-1,1)),Math.asin(bc(s/c,-1,1))-Math.asin(bc(d/c,-1,1)))),a=Math.max(r,Math.min(i,a))),this.labelRotation=a}afterCalculateLabelRotation(){Ns(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){Ns(this.options.beforeFit,[this])}fit(){let e={width:0,height:0},{chart:t,options:{ticks:n,title:r,grid:i}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){let a=sp(r,t.options.font);if(o?(e.width=this.maxWidth,e.height=op(i)+a):(e.height=this.maxHeight,e.width=op(i)+a),n.display&&this.ticks.length){let{first:t,last:r,widest:i,highest:a}=this._getLabelSizes(),s=n.padding*2,c=fc(this.labelRotation),l=Math.cos(c),u=Math.sin(c);if(o){let t=n.mirror?0:u*i.width+l*a.height;e.height=Math.min(this.maxHeight,e.height+t+s)}else{let t=n.mirror?0:l*i.width+u*a.height;e.width=Math.min(this.maxWidth,e.width+t+s)}this._calculatePadding(t,r,u,l)}}this._handleMargins(),o?(this.width=this._length=t.width-this._margins.left-this._margins.right,this.height=e.height):(this.width=e.width,this.height=this._length=t.height-this._margins.top-this._margins.bottom)}_calculatePadding(e,t,n,r){let{ticks:{align:i,padding:a},position:o}=this.options,s=this.labelRotation!==0,c=o!==`top`&&this.axis===`x`;if(this.isHorizontal()){let o=this.getPixelForTick(0)-this.left,l=this.right-this.getPixelForTick(this.ticks.length-1),u=0,d=0;s?c?(u=r*e.width,d=n*t.height):(u=n*e.height,d=r*t.width):i===`start`?d=t.width:i===`end`?u=e.width:i!==`inner`&&(u=e.width/2,d=t.width/2),this.paddingLeft=Math.max((u-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((d-l+a)*this.width/(this.width-l),0)}else{let n=t.height/2,r=e.height/2;i===`start`?(n=0,r=e.height):i===`end`&&(n=t.height,r=0),this.paddingTop=n+a,this.paddingBottom=r+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){Ns(this.options.afterFit,[this])}isHorizontal(){let{axis:e,position:t}=this.options;return t===`top`||t===`bottom`||e===`x`}isFullSize(){return this.options.fullSize}_convertTicksToLabels(e){this.beforeTickToLabelConversion(),this.generateTickLabels(e);let t,n;for(t=0,n=e.length;t({width:a[e]||0,height:o[e]||0});return{first:C(0),last:C(t-1),widest:C(x),highest:C(S),widths:a,heights:o}}getLabelForValue(e){return e}getPixelForValue(e,t){return NaN}getValueForPixel(e){}getPixelForTick(e){let t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e].value)}getPixelForDecimal(e){this._reversePixels&&(e=1-e);let t=this._startPixel+e*this._length;return xc(this._alignToPixels?ul(this.chart,t,0):t)}getDecimalForPixel(e){let t=(e-this._startPixel)/this._length;return this._reversePixels?1-t:t}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){let{min:e,max:t}=this;return e<0&&t<0?t:e>0&&t>0?e:0}getContext(e){let t=this.ticks||[];if(e>=0&&eo*r?o/n:s/r:s*r0:!!e}_computeGridLineItems(e){let t=this.axis,n=this.chart,r=this.options,{grid:i,position:a,border:o}=r,s=i.offset,c=this.isHorizontal(),l=this.ticks.length+ +!!s,u=op(i),d=[],f=o.setContext(this.getContext()),p=f.display?f.width:0,m=p/2,h=function(e){return ul(n,e,p)},g,_,v,y,b,x,S,C,w,T,E,D;if(a===`top`)g=h(this.bottom),x=this.bottom-u,C=g-m,T=h(e.top)+m,D=e.bottom;else if(a===`bottom`)g=h(this.top),T=e.top,D=h(e.bottom)-m,x=g+m,C=this.top+u;else if(a===`left`)g=h(this.right),b=this.right-u,S=g-m,w=h(e.left)+m,E=e.right;else if(a===`right`)g=h(this.left),w=e.left,E=h(e.right)-m,b=g+m,S=this.left+u;else if(t===`x`){if(a===`center`)g=h((e.top+e.bottom)/2+.5);else if(X(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}T=e.top,D=e.bottom,x=g+m,C=x+u}else if(t===`y`){if(a===`center`)g=h((e.left+e.right)/2);else if(X(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}b=g-m,S=b-u,w=e.left,E=e.right}let O=Z(r.ticks.maxTicksLimit,l),k=Math.max(1,Math.ceil(l/O));for(_=0;_0&&(a-=r/2)}f={left:a,top:i,width:r+t.width,height:n+t.height,color:e.backdropColor}}h.push({label:y,font:w,textOffset:D,options:{rotation:m,color:n,strokeColor:s,strokeWidth:l,textAlign:d,textBaseline:O,translation:[b,x],backdrop:f}})}return h}_getXAxisLabelAlignment(){let{position:e,ticks:t}=this.options;if(-fc(this.labelRotation))return e===`top`?`left`:`right`;let n=`center`;return t.align===`start`?n=`left`:t.align===`end`?n=`right`:t.align===`inner`&&(n=`inner`),n}_getYAxisLabelAlignment(e){let{position:t,ticks:{crossAlign:n,mirror:r,padding:i}}=this.options,a=this._getLabelSizes(),o=e+i,s=a.widest.width,c,l;return t===`left`?r?(l=this.right+i,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l+=s)):(l=this.right-o,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l=this.left)):t===`right`?r?(l=this.left+i,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l-=s)):(l=this.left+o,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l=this.right)):c=`right`,{textAlign:c,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;let e=this.chart,t=this.options.position;if(t===`left`||t===`right`)return{top:0,left:this.left,bottom:e.height,right:this.right};if(t===`top`||t===`bottom`)return{top:this.top,left:0,bottom:this.bottom,right:e.width}}drawBackground(){let{ctx:e,options:{backgroundColor:t},left:n,top:r,width:i,height:a}=this;t&&(e.save(),e.fillStyle=t,e.fillRect(n,r,i,a),e.restore())}getLineWidthForValue(e){let t=this.options.grid;if(!this._isVisible()||!t.display)return 0;let n=this.ticks.findIndex(t=>t.value===e);return n>=0?t.setContext(this.getContext(n)).lineWidth:0}drawGrid(e){let t=this.options.grid,n=this.ctx,r=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(e)),i,a,o=(e,t,r)=>{r.width&&r.color&&(n.save(),n.lineWidth=r.width,n.strokeStyle=r.color,n.setLineDash(r.borderDash||[]),n.lineDashOffset=r.borderDashOffset,n.beginPath(),n.moveTo(e.x,e.y),n.lineTo(t.x,t.y),n.stroke(),n.restore())};if(t.display)for(i=0,a=r.length;i{this.draw(e)}}]:[{z:r,draw:e=>{this.drawBackground(),this.drawGrid(e),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:n,draw:e=>{this.drawLabels(e)}}]}getMatchingVisibleMetas(e){let t=this.chart.getSortedVisibleDatasetMetas(),n=this.axis+`AxisID`,r=[],i,a;for(i=0,a=t.length;i{let r=n.split(`.`),i=r.pop(),a=[e].concat(r).join(`.`),o=t[n].split(`.`),s=o.pop(),c=o.join(`.`);ol.route(a,i,c,s)})}function gp(e){return`id`in e&&`defaults`in e}var _p=new class{constructor(){this.controllers=new pp(Cd,`datasets`,!0),this.elements=new pp(Kf,`elements`),this.plugins=new pp(Object,`plugins`),this.scales=new pp(fp,`scales`),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...e){this._each(`register`,e)}remove(...e){this._each(`unregister`,e)}addControllers(...e){this._each(`register`,e,this.controllers)}addElements(...e){this._each(`register`,e,this.elements)}addPlugins(...e){this._each(`register`,e,this.plugins)}addScales(...e){this._each(`register`,e,this.scales)}getController(e){return this._get(e,this.controllers,`controller`)}getElement(e){return this._get(e,this.elements,`element`)}getPlugin(e){return this._get(e,this.plugins,`plugin`)}getScale(e){return this._get(e,this.scales,`scale`)}removeControllers(...e){this._each(`unregister`,e,this.controllers)}removeElements(...e){this._each(`unregister`,e,this.elements)}removePlugins(...e){this._each(`unregister`,e,this.plugins)}removeScales(...e){this._each(`unregister`,e,this.scales)}_each(e,t,n){[...t].forEach(t=>{let r=n||this._getRegistryForType(t);n||r.isForType(t)||r===this.plugins&&t.id?this._exec(e,r,t):Q(t,t=>{let r=n||this._getRegistryForType(t);this._exec(e,r,t)})})}_exec(e,t,n){let r=Gs(e);Ns(n[`before`+r],[],n),t[e](n),Ns(n[`after`+r],[],n)}_getRegistryForType(e){for(let t=0;te.filter(e=>!t.some(t=>e.plugin.id===t.plugin.id));this._notify(r(t,n),e,`stop`),this._notify(r(n,t),e,`start`)}};function yp(e){let t={},n=[],r=Object.keys(_p.plugins.items);for(let e=0;e1&&Ep(e[0].toLowerCase());if(t)return t}throw Error(`Cannot determine type of '${e}' axis. Please provide 'axis' or 'position' option.`)}function kp(e,t,n){if(n[t+`AxisID`]===e)return{axis:t}}function Ap(e,t){if(t.data&&t.data.datasets){let n=t.data.datasets.filter(t=>t.xAxisID===e||t.yAxisID===e);if(n.length)return kp(e,`x`,n[0])||kp(e,`y`,n[0])}return{}}function jp(e,t){let n=nl[e.type]||{scales:{}},r=t.scales||{},i=Cp(e.type,t),a=Object.create(null);return Object.keys(r).forEach(t=>{let o=r[t];if(!X(o))return console.error(`Invalid scale configuration for scale: ${t}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);let s=Op(t,o,Ap(t,e),ol.scales[o.type]),c=Tp(s,i),l=n.scales||{};a[t]=zs(Object.create(null),[{axis:s},o,l[s],l[c]])}),e.data.datasets.forEach(n=>{let i=n.type||e.type,o=n.indexAxis||Cp(i,t),s=(nl[i]||{}).scales||{};Object.keys(s).forEach(e=>{let t=wp(e,o),i=n[t+`AxisID`]||t;a[i]=a[i]||Object.create(null),zs(a[i],[{axis:t},r[i],s[e]])})}),Object.keys(a).forEach(e=>{let t=a[e];zs(t,[ol.scales[t.type],ol.scale])}),a}function Mp(e){let t=e.options||(e.options={});t.plugins=Z(t.plugins,{}),t.scales=jp(e,t)}function Np(e){return e=e||{},e.datasets=e.datasets||[],e.labels=e.labels||[],e}function Pp(e){return e=e||{},e.data=Np(e.data),Mp(e),e}var Fp=new Map,Ip=new Set;function Lp(e,t){let n=Fp.get(e);return n||(n=t(),Fp.set(e,n),Ip.add(n)),n}var Rp=(e,t,n)=>{let r=Ws(t,n);r!==void 0&&e.add(r)},zp=class{constructor(e){this._config=Pp(e),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(e){this._config.type=e}get data(){return this._config.data}set data(e){this._config.data=Np(e)}get options(){return this._config.options}set options(e){this._config.options=e}get plugins(){return this._config.plugins}update(){let e=this._config;this.clearCache(),Mp(e)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(e){return Lp(e,()=>[[`datasets.${e}`,``]])}datasetAnimationScopeKeys(e,t){return Lp(`${e}.transition.${t}`,()=>[[`datasets.${e}.transitions.${t}`,`transitions.${t}`],[`datasets.${e}`,``]])}datasetElementScopeKeys(e,t){return Lp(`${e}-${t}`,()=>[[`datasets.${e}.elements.${t}`,`datasets.${e}`,`elements.${t}`,``]])}pluginScopeKeys(e){let t=e.id,n=this.type;return Lp(`${n}-plugin-${t}`,()=>[[`plugins.${t}`,...e.additionalOptionScopes||[]]])}_cachedScopes(e,t){let n=this._scopeCache,r=n.get(e);return(!r||t)&&(r=new Map,n.set(e,r)),r}getOptionScopes(e,t,n){let{options:r,type:i}=this,a=this._cachedScopes(e,n),o=a.get(t);if(o)return o;let s=new Set;t.forEach(t=>{e&&(s.add(e),t.forEach(t=>Rp(s,e,t))),t.forEach(e=>Rp(s,r,e)),t.forEach(e=>Rp(s,nl[i]||{},e)),t.forEach(e=>Rp(s,ol,e)),t.forEach(e=>Rp(s,rl,e))});let c=Array.from(s);return c.length===0&&c.push(Object.create(null)),Ip.has(t)&&a.set(t,c),c}chartOptionScopes(){let{options:e,type:t}=this;return[e,nl[t]||{},ol.datasets[t]||{},{type:t},ol,rl]}resolveNamedOptions(e,t,n,r=[``]){let i={$shared:!0},{resolver:a,subPrefixes:o}=Bp(this._resolverCache,e,r),s=a;if(Hp(a,t)){i.$shared=!1,n=qs(n)?n():n;let t=this.createResolver(e,n,o);s=Ll(a,n,t)}for(let e of t)i[e]=s[e];return i}createResolver(e,t,n=[``],r){let{resolver:i}=Bp(this._resolverCache,e,n);return X(t)?Ll(i,t,void 0,r):i}};function Bp(e,t,n){let r=e.get(t);r||(r=new Map,e.set(t,r));let i=n.join(),a=r.get(i);return a||(a={resolver:Il(t,n),subPrefixes:n.filter(e=>!e.toLowerCase().includes(`hover`))},r.set(i,a)),a}var Vp=e=>X(e)&&Object.getOwnPropertyNames(e).some(t=>qs(e[t]));function Hp(e,t){let{isScriptable:n,isIndexable:r}=Rl(e);for(let i of t){let t=n(i),a=r(i),o=(a||t)&&e[i];if(t&&(qs(o)||Vp(o))||a&&Os(o))return!0}return!1}var Up=`4.5.1`,Wp=[`top`,`bottom`,`left`,`right`,`chartArea`];function Gp(e,t){return e===`top`||e===`bottom`||Wp.indexOf(e)===-1&&t===`x`}function Kp(e,t){return function(n,r){return n[e]===r[e]?n[t]-r[t]:n[e]-r[e]}}function qp(e){let t=e.chart,n=t.options.animation;t.notifyPlugins(`afterRender`),Ns(n&&n.onComplete,[e],t)}function Jp(e){let t=e.chart,n=t.options.animation;Ns(n&&n.onProgress,[e],t)}function Yp(e){return fu()&&typeof e==`string`?e=document.getElementById(e):e&&e.length&&(e=e[0]),e&&e.canvas&&(e=e.canvas),e}var Xp={},Zp=e=>{let t=Yp(e);return Object.values(Xp).filter(e=>e.canvas===t).pop()};function Qp(e,t,n){let r=Object.keys(e);for(let i of r){let r=+i;if(r>=t){let a=e[i];delete e[i],(n>0||r>t)&&(e[r+n]=a)}}}function $p(e,t,n,r){return!n||e.type===`mouseout`?null:r?t:e}var em=class{static register(...e){_p.add(...e),tm()}static unregister(...e){_p.remove(...e),tm()}constructor(e,t){let n=this.config=new zp(t),r=Yp(e),i=Zp(r);if(i)throw Error(`Canvas is already in use. Chart with ID '`+i.id+`' must be destroyed before the canvas with ID '`+i.canvas.id+`' can be reused.`);let a=n.createResolver(n.chartOptionScopes(),this.getContext());this.platform=new(n.platform||(Gf(r))),this.platform.updateConfig(n);let o=this.platform.acquireContext(r,a.aspectRatio),s=o&&o.canvas,c=s&&s.height,l=s&&s.width;this.id=Ds(),this.ctx=o,this.canvas=s,this.width=l,this.height=c,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new vp,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=Nc(e=>this.update(e),a.resizeDelay||0),this._dataChanges=[],Xp[this.id]=this,!o||!s?console.error(`Failed to create chart: can't acquire context from the given item`):(Zu.listen(this,`complete`,qp),Zu.listen(this,`progress`,Jp),this._initialize(),this.attached&&this.update())}get aspectRatio(){let{options:{aspectRatio:e,maintainAspectRatio:t},width:n,height:r,_aspectRatio:i}=this;return Y(e)?t&&i?i:r?n/r:null:e}get data(){return this.config.data}set data(e){this.config.data=e}get options(){return this._options}set options(e){this.config.options=e}get registry(){return _p}_initialize(){return this.notifyPlugins(`beforeInit`),this.options.responsive?this.resize():Tu(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins(`afterInit`),this}clear(){return dl(this.canvas,this.ctx),this}stop(){return Zu.stop(this),this}resize(e,t){Zu.running(this)?this._resizeBeforeDraw={width:e,height:t}:this._resize(e,t)}_resize(e,t){let n=this.options,r=this.canvas,i=n.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(r,e,t,i),o=n.devicePixelRatio||this.platform.getDevicePixelRatio(),s=this.width?`resize`:`attach`;this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,Tu(this,o,!0)&&(this.notifyPlugins(`resize`,{size:a}),Ns(n.onResize,[this,a],this),this.attached&&this._doResize(s)&&this.render())}ensureScalesHaveIDs(){Q(this.options.scales||{},(e,t)=>{e.id=t})}buildOrUpdateScales(){let e=this.options,t=e.scales,n=this.scales,r=Object.keys(n).reduce((e,t)=>(e[t]=!1,e),{}),i=[];t&&(i=i.concat(Object.keys(t).map(e=>{let n=t[e],r=Op(e,n),i=r===`r`,a=r===`x`;return{options:n,dposition:i?`chartArea`:a?`bottom`:`left`,dtype:i?`radialLinear`:a?`category`:`linear`}}))),Q(i,t=>{let i=t.options,a=i.id,o=Op(a,i),s=Z(i.type,t.dtype);(i.position===void 0||Gp(i.position,o)!==Gp(t.dposition))&&(i.position=t.dposition),r[a]=!0;let c=null;a in n&&n[a].type===s?c=n[a]:(c=new(_p.getScale(s))({id:a,type:s,ctx:this.ctx,chart:this}),n[c.id]=c),c.init(i,e)}),Q(r,(e,t)=>{e||delete n[t]}),Q(n,e=>{Sf.configure(this,e,e.options),Sf.addBox(this,e)})}_updateMetasets(){let e=this._metasets,t=this.data.datasets.length,n=e.length;if(e.sort((e,t)=>e.index-t.index),n>t){for(let e=t;et.length&&delete this._stacks,e.forEach((e,n)=>{t.filter(t=>t===e._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){let e=[],t=this.data.datasets,n,r;for(this._removeUnreferencedMetasets(),n=0,r=t.length;n{this.getDatasetMeta(t).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins(`reset`)}update(e){let t=this.config;t.update();let n=this._options=t.createResolver(t.chartOptionScopes(),this.getContext()),r=this._animationsDisabled=!n.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins(`beforeUpdate`,{mode:e,cancelable:!0})===!1)return;let i=this.buildOrUpdateControllers();this.notifyPlugins(`beforeElementsUpdate`);let a=0;for(let e=0,t=this.data.datasets.length;e{e.reset()}),this._updateDatasets(e),this.notifyPlugins(`afterUpdate`,{mode:e}),this._layers.sort(Kp(`z`,`_idx`));let{_active:o,_lastEvent:s}=this;s?this._eventHandler(s,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){Q(this.scales,e=>{Sf.removeBox(this,e)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){let e=this.options;(!Js(new Set(Object.keys(this._listeners)),new Set(e.events))||!!this._responsiveListeners!==e.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){let{_hiddenIndices:e}=this,t=this._getUniformDataChanges()||[];for(let{method:n,start:r,count:i}of t)Qp(e,r,n===`_removeElements`?-i:i)}_getUniformDataChanges(){let e=this._dataChanges;if(!e||!e.length)return;this._dataChanges=[];let t=this.data.datasets.length,n=t=>new Set(e.filter(e=>e[0]===t).map((e,t)=>t+`,`+e.splice(1).join(`,`))),r=n(0);for(let e=1;ee.split(`,`)).map(e=>({method:e[1],start:+e[2],count:+e[3]}))}_updateLayout(e){if(this.notifyPlugins(`beforeLayout`,{cancelable:!0})===!1)return;Sf.update(this,this.width,this.height,e);let t=this.chartArea,n=t.width<=0||t.height<=0;this._layers=[],Q(this.boxes,e=>{n&&e.position===`chartArea`||(e.configure&&e.configure(),this._layers.push(...e._layers()))},this),this._layers.forEach((e,t)=>{e._idx=t}),this.notifyPlugins(`afterLayout`)}_updateDatasets(e){if(this.notifyPlugins(`beforeDatasetsUpdate`,{mode:e,cancelable:!0})!==!1){for(let e=0,t=this.data.datasets.length;e=0;--t)this._drawDataset(e[t]);this.notifyPlugins(`afterDatasetsDraw`)}_drawDataset(e){let t=this.ctx,n={meta:e,index:e.index,cancelable:!0},r=Xu(this,e);this.notifyPlugins(`beforeDatasetDraw`,n)!==!1&&(r&&hl(t,r),e.controller.draw(),r&&gl(t),n.cancelable=!1,this.notifyPlugins(`afterDatasetDraw`,n))}isPointInArea(e){return ml(e,this.chartArea,this._minPadding)}getElementsAtEventForMode(e,t,n,r){let i=af.modes[t];return typeof i==`function`?i(this,e,n,r):[]}getDatasetMeta(e){let t=this.data.datasets[e],n=this._metasets,r=n.filter(e=>e&&e._dataset===t).pop();return r||(r={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:t&&t.order||0,index:e,_dataset:t,_parsed:[],_sorted:!1},n.push(r)),r}getContext(){return this.$context||(this.$context=Fl(null,{chart:this,type:`chart`}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(e){let t=this.data.datasets[e];if(!t)return!1;let n=this.getDatasetMeta(e);return typeof n.hidden==`boolean`?!n.hidden:!t.hidden}setDatasetVisibility(e,t){let n=this.getDatasetMeta(e);n.hidden=!t}toggleDataVisibility(e){this._hiddenIndices[e]=!this._hiddenIndices[e]}getDataVisibility(e){return!this._hiddenIndices[e]}_updateVisibility(e,t,n){let r=n?`show`:`hide`,i=this.getDatasetMeta(e),a=i.controller._resolveAnimations(void 0,r);Ks(t)?(i.data[t].hidden=!n,this.update()):(this.setDatasetVisibility(e,n),a.update(i,{visible:n}),this.update(t=>t.datasetIndex===e?r:void 0))}hide(e,t){this._updateVisibility(e,t,!1)}show(e,t){this._updateVisibility(e,t,!0)}_destroyDatasetMeta(e){let t=this._metasets[e];t&&t.controller&&t.controller._destroy(),delete this._metasets[e]}_stop(){let e,t;for(this.stop(),Zu.remove(this),e=0,t=this.data.datasets.length;e{t.addEventListener(this,n,r),e[n]=r},r=(e,t,n)=>{e.offsetX=t,e.offsetY=n,this._eventHandler(e)};Q(this.options.events,e=>n(e,r))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});let e=this._responsiveListeners,t=this.platform,n=(n,r)=>{t.addEventListener(this,n,r),e[n]=r},r=(n,r)=>{e[n]&&(t.removeEventListener(this,n,r),delete e[n])},i=(e,t)=>{this.canvas&&this.resize(e,t)},a,o=()=>{r(`attach`,o),this.attached=!0,this.resize(),n(`resize`,i),n(`detach`,a)};a=()=>{this.attached=!1,r(`resize`,i),this._stop(),this._resize(0,0),n(`attach`,o)},t.isAttached(this.canvas)?o():a()}unbindEvents(){Q(this._listeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._listeners={},Q(this._responsiveListeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._responsiveListeners=void 0}updateHoverStyle(e,t,n){let r=n?`set`:`remove`,i,a,o,s;for(t===`dataset`&&(i=this.getDatasetMeta(e[0].datasetIndex),i.controller[`_`+r+`DatasetHoverStyle`]()),o=0,s=e.length;o{let n=this.getDatasetMeta(e);if(!n)throw Error(`No dataset found at index `+e);return{datasetIndex:e,element:n.data[t],index:t}});Ps(n,t)||(this._active=n,this._lastEvent=null,this._updateHoverStyles(n,t))}notifyPlugins(e,t,n){return this._plugins.notify(this,e,t,n)}isPluginEnabled(e){return this._plugins._cache.filter(t=>t.plugin.id===e).length===1}_updateHoverStyles(e,t,n){let r=this.options.hover,i=(e,t)=>e.filter(e=>!t.some(t=>e.datasetIndex===t.datasetIndex&&e.index===t.index)),a=i(t,e),o=n?e:i(e,t);a.length&&this.updateHoverStyle(a,r.mode,!1),o.length&&r.mode&&this.updateHoverStyle(o,r.mode,!0)}_eventHandler(e,t){let n={event:e,replay:t,cancelable:!0,inChartArea:this.isPointInArea(e)},r=t=>(t.options.events||this.options.events).includes(e.native.type);if(this.notifyPlugins(`beforeEvent`,n,r)===!1)return;let i=this._handleEvent(e,t,n.inChartArea);return n.cancelable=!1,this.notifyPlugins(`afterEvent`,n,r),(i||n.changed)&&this.render(),this}_handleEvent(e,t,n){let{_active:r=[],options:i}=this,a=t,o=this._getActiveElements(e,r,n,a),s=Ys(e),c=$p(e,this._lastEvent,n,s);n&&(this._lastEvent=null,Ns(i.onHover,[e,o,this],this),s&&Ns(i.onClick,[e,o,this],this));let l=!Ps(o,r);return(l||t)&&(this._active=o,this._updateHoverStyles(o,r,t)),this._lastEvent=c,l}_getActiveElements(e,t,n,r){if(e.type===`mouseout`)return[];if(!n)return t;let i=this.options.hover;return this.getElementsAtEventForMode(e,i.mode,i,r)}};I(em,`defaults`,ol),I(em,`instances`,Xp),I(em,`overrides`,nl),I(em,`registry`,_p),I(em,`version`,Up),I(em,`getChart`,Zp);function tm(){return Q(em.instances,e=>e._plugins.invalidate())}function nm(e,t,n){let{startAngle:r,x:i,y:a,outerRadius:o,innerRadius:s,options:c}=t,{borderWidth:l,borderJoinStyle:u}=c,d=Math.min(l/o,vc(r-n));if(e.beginPath(),e.arc(i,a,o-l/2,r+d/2,n-d/2),s>0){let t=Math.min(l/s,vc(r-n));e.arc(i,a,s+l/2,n-t/2,r+t/2,!0)}else{let t=Math.min(l/2,o*vc(r-n));if(u===`round`)e.arc(i,a,t,n-$/2,r+$/2,!0);else if(u===`bevel`){let o=2*t*t,s=-o*Math.cos(n+$/2)+i,c=-o*Math.sin(n+$/2)+a,l=o*Math.cos(r+$/2)+i,u=o*Math.sin(r+$/2)+a;e.lineTo(s,c),e.lineTo(l,u)}}e.closePath(),e.moveTo(0,0),e.rect(0,0,e.canvas.width,e.canvas.height),e.clip(`evenodd`)}function rm(e,t,n){let{startAngle:r,pixelMargin:i,x:a,y:o,outerRadius:s,innerRadius:c}=t,l=i/s;e.beginPath(),e.arc(a,o,s,r-l,n+l),c>i?(l=i/c,e.arc(a,o,c,n+l,r-l,!0)):e.arc(a,o,i,n+ec,r-ec),e.closePath(),e.clip()}function im(e){return Ol(e,[`outerStart`,`outerEnd`,`innerStart`,`innerEnd`])}function am(e,t,n,r){let i=im(e.options.borderRadius),a=(n-t)/2,o=Math.min(a,r*t/2),s=e=>{let t=(n-Math.min(a,e))*r/2;return bc(e,0,Math.min(a,t))};return{outerStart:s(i.outerStart),outerEnd:s(i.outerEnd),innerStart:bc(i.innerStart,0,o),innerEnd:bc(i.innerEnd,0,o)}}function om(e,t,n,r){return{x:n+e*Math.cos(t),y:r+e*Math.sin(t)}}function sm(e,t,n,r,i,a){let{x:o,y:s,startAngle:c,pixelMargin:l,innerRadius:u}=t,d=Math.max(t.outerRadius+r+n-l,0),f=u>0?u+r+n+l:0,p=0,m=i-c;if(r){let e=((u>0?u-r:0)+(d>0?d-r:0))/2;p=(m-(e===0?m:m*e/(e+r)))/2}let h=(m-Math.max(.001,m*d-n/$)/d)/2,g=c+h+p,_=i-h-p,{outerStart:v,outerEnd:y,innerStart:b,innerEnd:x}=am(t,f,d,_-g),S=d-v,C=d-y,w=g+v/S,T=_-y/C,E=f+b,D=f+x,O=g+b/E,k=_-x/D;if(e.beginPath(),a){let t=(w+T)/2;if(e.arc(o,s,d,w,t),e.arc(o,s,d,t,T),y>0){let t=om(C,T,o,s);e.arc(t.x,t.y,y,T,_+ec)}let n=om(D,_,o,s);if(e.lineTo(n.x,n.y),x>0){let t=om(D,k,o,s);e.arc(t.x,t.y,x,_+ec,k+Math.PI)}let r=(_-x/f+(g+b/f))/2;if(e.arc(o,s,f,_-x/f,r,!0),e.arc(o,s,f,r,g+b/f,!0),b>0){let t=om(E,O,o,s);e.arc(t.x,t.y,b,O+Math.PI,g-ec)}let i=om(S,g,o,s);if(e.lineTo(i.x,i.y),v>0){let t=om(S,w,o,s);e.arc(t.x,t.y,v,g-ec,w)}}else{e.moveTo(o,s);let t=Math.cos(w)*d+o,n=Math.sin(w)*d+s;e.lineTo(t,n);let r=Math.cos(T)*d+o,i=Math.sin(T)*d+s;e.lineTo(r,i)}e.closePath()}function cm(e,t,n,r,i){let{fullCircles:a,startAngle:o,circumference:s}=t,c=t.endAngle;if(a){sm(e,t,n,r,c,i);for(let t=0;t=$&&p===0&&u!==`miter`&&nm(e,t,h),a||(sm(e,t,n,r,h,i),e.stroke())}var um=class extends Kf{constructor(e){super(),I(this,`circumference`,void 0),I(this,`endAngle`,void 0),I(this,`fullCircles`,void 0),I(this,`innerRadius`,void 0),I(this,`outerRadius`,void 0),I(this,`pixelMargin`,void 0),I(this,`startAngle`,void 0),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,e&&Object.assign(this,e)}inRange(e,t,n){let{angle:r,distance:i}=hc(this.getProps([`x`,`y`],n),{x:e,y:t}),{startAngle:a,endAngle:o,innerRadius:s,outerRadius:c,circumference:l}=this.getProps([`startAngle`,`endAngle`,`innerRadius`,`outerRadius`,`circumference`],n),u=(this.options.spacing+this.options.borderWidth)/2,d=Z(l,o-a),f=yc(r,a,o)&&a!==o,p=d>=Xs||f,m=Sc(i,s+u,c+u);return p&&m}getCenterPoint(e){let{x:t,y:n,startAngle:r,endAngle:i,innerRadius:a,outerRadius:o}=this.getProps([`x`,`y`,`startAngle`,`endAngle`,`innerRadius`,`outerRadius`],e),{offset:s,spacing:c}=this.options,l=(r+i)/2,u=(a+o+c+s)/2;return{x:t+Math.cos(l)*u,y:n+Math.sin(l)*u}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){let{options:t,circumference:n}=this,r=(t.offset||0)/4,i=(t.spacing||0)/2,a=t.circular;if(this.pixelMargin=t.borderAlign===`inner`?.33:0,this.fullCircles=n>Xs?Math.floor(n/Xs):0,n===0||this.innerRadius<0||this.outerRadius<0)return;e.save();let o=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(o)*r,Math.sin(o)*r);let s=r*(1-Math.sin(Math.min($,n||0)));e.fillStyle=t.backgroundColor,e.strokeStyle=t.borderColor,cm(e,this,s,i,a),lm(e,this,s,i,a),e.restore()}};I(um,`id`,`arc`),I(um,`defaults`,{borderAlign:`center`,borderColor:`#fff`,borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),I(um,`defaultRoutes`,{backgroundColor:`backgroundColor`}),I(um,`descriptors`,{_scriptable:!0,_indexable:e=>e!==`borderDash`});function dm(e,t,n=t){e.lineCap=Z(n.borderCapStyle,t.borderCapStyle),e.setLineDash(Z(n.borderDash,t.borderDash)),e.lineDashOffset=Z(n.borderDashOffset,t.borderDashOffset),e.lineJoin=Z(n.borderJoinStyle,t.borderJoinStyle),e.lineWidth=Z(n.borderWidth,t.borderWidth),e.strokeStyle=Z(n.borderColor,t.borderColor)}function fm(e,t,n){e.lineTo(n.x,n.y)}function pm(e){return e.stepped?_l:e.tension||e.cubicInterpolationMode===`monotone`?vl:fm}function mm(e,t,n={}){let r=e.length,{start:i=0,end:a=r-1}=n,{start:o,end:s}=t,c=Math.max(i,o),l=Math.min(a,s),u=is&&a>s;return{count:r,start:c,loop:t.loop,ilen:l(o+(l?s-e:e))%a,y=()=>{h!==g&&(e.lineTo(u,g),e.lineTo(u,h),e.lineTo(u,_))};for(c&&(p=i[v(0)],e.moveTo(p.x,p.y)),f=0;f<=s;++f){if(p=i[v(f)],p.skip)continue;let t=p.x,n=p.y,r=t|0;r===m?(ng&&(g=n),u=(d*u+t)/++d):(y(),e.lineTo(t,n),m=r,d=0,h=g=n),_=n}y()}function _m(e){let t=e.options,n=t.borderDash&&t.borderDash.length;return!e._decimated&&!e._loop&&!t.tension&&t.cubicInterpolationMode!==`monotone`&&!t.stepped&&!n?gm:hm}function vm(e){return e.stepped?ku:e.tension||e.cubicInterpolationMode===`monotone`?Au:Ou}function ym(e,t,n,r){let i=t._path;i||(i=t._path=new Path2D,t.path(i,n,r)&&i.closePath()),dm(e,t.options),e.stroke(i)}function bm(e,t,n,r){let{segments:i,options:a}=t,o=_m(t);for(let s of i)dm(e,a,s.style),e.beginPath(),o(e,t,s,{start:n,end:n+r-1})&&e.closePath(),e.stroke()}var xm=typeof Path2D==`function`;function Sm(e,t,n,r){xm&&!t.options.segment?ym(e,t,n,r):bm(e,t,n,r)}var Cm=class extends Kf{constructor(e){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,e&&Object.assign(this,e)}updateControlPoints(e,t){let n=this.options;if((n.tension||n.cubicInterpolationMode===`monotone`)&&!n.stepped&&!this._pointsUpdated){let r=n.spanGaps?this._loop:this._fullLoop;du(this._points,n,e,r,t),this._pointsUpdated=!0}}set points(e){this._points=e,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Uu(this,this.options.segment))}first(){let e=this.segments,t=this.points;return e.length&&t[e[0].start]}last(){let e=this.segments,t=this.points,n=e.length;return n&&t[e[n-1].end]}interpolate(e,t){let n=this.options,r=e[t],i=this.points,a=Bu(this,{property:t,start:r,end:r});if(!a.length)return;let o=[],s=vm(n),c,l;for(c=0,l=a.length;ce!==`borderDash`&&e!==`fill`});function wm(e,t,n,r){let i=e.options,{[n]:a}=e.getProps([n],r);return Math.abs(t-a)e+t)/r.size,y:i/a}},nearest(e,t){if(!e.length)return!1;let n=t.x,r=t.y,i=1/0,a,o,s;for(a=0,o=e.length;a2&&(o.children=s>3?h.call(arguments,2):n),y(e,o,r,i,null)}function y(n,r,i,a,o){var s={type:n,props:r,key:i,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:u,__v:o||++t,__i:-1,__u:0};return!o&&e.vnode&&e.vnode(s),s}function b(e){return e.children}function x(e,t){this.props=e,this.context=t,this.__g=0}function S(e,t){if(t==null)return e.__&&S(e.__,e.__i+1);for(var n;to&&n.sort(a),t=n.shift(),o=n.length,8&t.__g&&(c=void 0,l=void 0,d=(l=(s=t).__v).__e,f=[],p=[],(m=s.__P)&&((c=g({constructor:u},l)).__v=l.__v+1,e.vnode&&e.vnode(c),P(m,c,l,s.__n,m.namespaceURI,32&l.__u?[d]:null,f,d||S(l),32&l.__u,p),c.__v=l.__v,c.__.__k[c.__i]=c,ne(f,c,p),l.__=l.__e=null,c.__e!=d&&C(c)))}finally{(i=n.length)&&(r||queueMicrotask)(T)}}function E(e,t,n,r,i,a,o,s,c,l,u){var p,m,h,g,_,v,y=r.__k||f,b=t.length;for(c=D(n,t,y,c,b),p=0;pc?v--:v++,x=1)):(~l||(i>g?v--:i>1]+!!c){for(i=n-1;i>=0;i--)if((s=t[i])&&!(2&s.__u)&&a==s.key&&o==s.type)return i;for(i=n+1;i=0?e.slice(0,t+13):he}function _e(){let e=ge();return e.endsWith(`/luci`)?e.slice(0,-5):me}function ve(e){let t=e.startsWith(`/`)?e:`/${e}`;return`${_e()}${t}`}function ye(e){let t=e.startsWith(`/`)?e:`/${e}`;return`${ge()}${t}`}function be(e){return ye(e)}function xe(e=``){return`/${e?e.startsWith(`#`)?e:`#${e}`:``}`}var Se=/^[0-9a-f]{32}$/i;function Ce(){return ye(`/smartsafehub/session`)}function we(e){return e.headers.get(`X-LuCI-Login-Required`)===`yes`}async function Te(e){if(e.status===401||e.status===403||we(e))return null;if(!e.ok)throw Error(`LuCI session endpoint returned HTTP ${e.status}`);let t=(await e.text()).trim();if(Se.test(t))return t;if(e.redirected||/^(?:access|permission)\s+denied\.?$/i.test(t)||/^)/i.test(t))return null;throw Error(`LuCI session endpoint returned an invalid session id`)}async function Ee(e={}){return Te(await fetch(Ce(),{cache:`no-store`,credentials:`same-origin`,redirect:`follow`,...e}))}function De(){return Ee()}async function Oe(){await fetch(ye(`/admin/logout`),{cache:`no-store`,credentials:`same-origin`,redirect:`manual`})}function ke(e,t){let n=new URLSearchParams;return n.set(`luci_username`,e),n.set(`luci_password`,t),Ee({method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded;charset=UTF-8`},body:n})}var Ae=`smartsafehub:session-expired`,je=`로그인 세션이 만료되었습니다. 계속하려면 다시 로그인해 주세요.`,Me=null;function Ne(){Me=null}function Pe(e){Me!==e&&(Me=e,window.dispatchEvent(new CustomEvent(Ae)))}var Fe,Ie,Le,Re,ze=Object.is,Be=0,Ve=[],He=[],Ue=e,We=Ue.__b,Ge=Ue.__r,Ke=Ue.diffed,qe=Ue.__c,Je=Ue.unmount,Ye=Ue.__;function Xe(e,t){Ue.__h&&Ue.__h(Ie,e,Be||t),Be=0;var n=Ie.__H||(Ie.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function F(e){return Be=1,Ze(st,e)}function Ze(e,t,n){var r=Xe(Fe++,2);if(r.t=e,!r.__c&&(r.__=[n?n(t):st(void 0,t),function(e){var t=r.__N?r.__N[0]:r.__[0],n=r.t(t,e);ze(t,n)||(r.__N=[n,r.__[1]],r.__c.setState({}))}],r.__c=Ie,!Ie.__f)){Ie.__f=!0;var i=Ie.shouldComponentUpdate;Ie.shouldComponentUpdate=function(e,t,n){var r=this.__H;if(!r)return!0;var a=!1,o=this.props!=e;if(r.__.some(function(e){e.__N&&(a=!0,ze(e.__[0],e.__N[0])||(o=!0))}),i){var s=i.call(this,e,t,n);return a?s||o:s}return!a||o}}return r.__}function I(e,t){var n=Xe(Fe++,3);!Ue.__s&&ot(n.__H,t)&&(n.__P=!0,n.__=e,n.u=t,Ie.__H.__h.push(n))}function L(e){return Be=5,Qe(function(){return{current:e}},[])}function Qe(e,t){var n=Xe(Fe++,7);return ot(n.__H,t)&&(n.__=e(),n.__H=t),n.__}function R(e,t){return Be=8,Qe(function(){return e},t)}function $e(){var e=Xe(Fe++,11);if(!e.__){for(var t=Ie.__v;!t.__m&&t.__;)t=t.__;var n=t.__m||(t.__m=[0,0]);e.__=`P`+n[0]+`-`+n[1]++}return e.__}function et(){var e;do{for(;e=He.shift();)try{it(e)}catch(t){Ue.__e(t,{__:(e=e.__P)&&e.__v})}for(;e=Ve.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(it),t.__h.some(at),t.__h=[]}catch(n){t.__h=[],Ue.__e(n,e.__v)}}}while(He.length)}Ue.__b=function(e){Ie=null,We&&We(e)},Ue.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),Ye&&Ye(e,t)},Ue.__r=function(e){Ge&&Ge(e),Fe=0;var t=(Ie=e.__c).__H;t&&(Le==Ie?Ie.__h=[]:(t.__h.some(it),t.__h.some(at),Fe=0),t.__h=[],t.__.some(function(e){e.__N&&(e.__=e.__N),e.u=e.__N=void 0})),Le=Ie},Ue.diffed=function(e){Ke&&Ke(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&rt(Ve.push(t)),t.__H.__.some(function(e){e.u&&(e.__H=e.u)})),Le=Ie=null},Ue.__c=function(e,t){t.some(function(e){try{e.__h.some(it),e.__h=e.__h.filter(function(e){return!e.__||at(e)})}catch(t){e.__h=[function(){throw t}]}}),qe&&qe(e,t)},Ue.unmount=function(e){Je&&Je(e);var t,n,r=e.__c;r&&r.__H&&(r.__H.__.some(function(r){try{if(r.__P&&r.__c){if(n===void 0){for(n=e.__;n&&(!n.__c||!n.__c.__P);)n=n.__;n=n&&n.__c}r.__P=n,rt(He.push(r))}else it(r)}catch(e){t=e}}),r.__H=void 0,t&&Ue.__e(t,r.__v))};var tt=typeof requestAnimationFrame==`function`;function nt(e){var t,n=function(){clearTimeout(r),tt&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,35);tt&&(t=requestAnimationFrame(n))}function rt(e){e!=1&&Re==Ue.requestAnimationFrame||((Re=Ue.requestAnimationFrame)||nt)(et)}function it(e){var t=Ie,n=e.__c;typeof n==`function`&&(e.__c=void 0,n()),Ie=t}function at(e){var t=Ie;e.__c=e.__(),Ie=t}function ot(e,t){return!e||e.length!=t.length||t.some(function(t,n){return!ze(t,e[n])})}function st(e,t){return typeof t==`function`?t(e):t}var ct=1500,lt=60,ut=64,dt=new Map,ft=[];function pt(e){return e===null?null:Math.max(0,Math.round(e))}function mt(e){let t=`${e.object}.${e.method}`,n=pt(e.elapsedMs)??0,r=n>=ct,i=e.result!==`ok`,a=dt.get(t);return!a&&dt.sizelt&&ft.shift()),r}function ht(){return{slowThresholdMs:ct,summary:[...dt.values()].map(({totalMs:e,...t})=>({...t})),recent:ft.map(e=>({...e}))}}function gt(){dt.clear(),ft.length=0}var _t={snapshot:ht,reset:gt};function vt(){var e;(e=window).__SMARTHUB_RPC_DIAGNOSTICS__??(e.__SMARTHUB_RPC_DIAGNOSTICS__=_t)}var yt=4,bt=3,xt=0,St=0,Ct=[];function wt(){for(;xte.priority!==`low`||St{--xt,t.priority===`low`&&--St,wt()}))}}function Tt(e,t){return t?.aborted?Promise.reject(new DOMException(`Cancelled`,`AbortError`)):new Promise((n,r)=>{let i={priority:e,start:e=>{t?.removeEventListener(`abort`,i.abort),n(e)},abort:()=>{let e=Ct.indexOf(i);e!==-1&&Ct.splice(e,1),t?.removeEventListener(`abort`,i.abort),r(new DOMException(`Cancelled`,`AbortError`))}};t?.addEventListener(`abort`,i.abort,{once:!0});let a=Ct.findIndex(t=>e===`high`&&t.priority!==`high`||e===`normal`&&t.priority===`low`);a===-1?Ct.push(i):Ct.splice(a,0,i),wt()})}function Et(e){"@babel/helpers - typeof";return Et=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},Et(e)}function Dt(e,t){if(Et(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(Et(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function Ot(e){var t=Dt(e,`string`);return Et(t)==`symbol`?t:t+``}function z(e,t,n){return(t=Ot(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var kt={1:`잘못된 명령입니다.`,2:`요청 인자가 올바르지 않습니다.`,3:`요청한 메서드를 찾을 수 없습니다.`,4:`요청한 리소스를 찾을 수 없습니다.`,5:`응답 데이터가 없습니다.`,6:`접근 권한이 없습니다.`,7:`요청 시간이 초과되었습니다.`,8:`지원하지 않는 기능입니다.`,9:`장치에서 알 수 없는 오류가 발생했습니다.`,10:`장치 연결이 끊어졌습니다.`},At=2e4,jt=3e3,Mt=1e3,Nt=6e4,Pt=1,B=class extends Error{constructor(e,t){super(t),z(this,`code`,void 0),this.name=`RpcError`,this.code=e}};function Ft(){let e=window.__SMARTHUB_BOOTSTRAP__;if(!e?.sessionId||!e.rpcUrl)throw new B(`BOOTSTRAP_MISSING`,`LuCI 세션 정보를 찾을 수 없습니다. 페이지를 새로고침해 주세요.`);return e}function It(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Lt(){return new B(`INVALID_RESPONSE`,`장치 API가 올바르지 않은 응답을 반환했습니다.`)}function Rt(e){return typeof e!=`number`||!Number.isFinite(e)?At:Math.min(Nt,Math.max(Mt,Math.trunc(e)))}function zt(e){let t=e.message.trim().toLowerCase();return e.code===`UBUS_6`||e.code===`JSON_RPC_-32002`||e.code===`HTTP_ERROR`&&/HTTP (401|403)\b/.test(e.message)||t.includes(`access denied`)||t.includes(`permission denied`)||t.includes(`접근 권한`)}function Bt(e){return window.__SMARTHUB_BOOTSTRAP__?.sessionId===e}async function Vt(e){let t=Pt++,n=new AbortController,r=window.setTimeout(()=>n.abort(),jt);try{let r=await fetch(e.rpcUrl,{method:`POST`,credentials:`same-origin`,headers:{"Content-Type":`application/json`},body:JSON.stringify({jsonrpc:`2.0`,id:t,method:`call`,params:[e.sessionId,`smartsafehub`,`system_root_password_status`,{}]}),signal:n.signal});if(r.status===401||r.status===403)return`expired`;if(!r.ok)return`unknown`;let i=await r.json();if(!It(i)||i.jsonrpc!==`2.0`||i.id!==t)return`unknown`;if(`error`in i){let e=i.error;return It(e)&&typeof e.code==`number`&&e.code===-32002?`expired`:`unknown`}let a=i.result;return!Array.isArray(a)||a.length<1?`unknown`:a[0]===0?`active`:a[0]===6?`expired`:`unknown`}catch{return`unknown`}finally{window.clearTimeout(r)}}async function Ht(e,t){if(!zt(e)||!Bt(t.sessionId))return e;let n=await Vt(t);return Bt(t.sessionId)?n===`active`?new B(`RPC_PERMISSION_DENIED`,`현재 로그인 세션에 이 기능 권한이 없습니다. SmartSafeHub 업데이트 직후라면 로그아웃 후 다시 로그인해 주세요.`):n===`expired`?(Pe(t.sessionId),new B(`SESSION_EXPIRED`,je)):e:e}function Ut(e,t){if(!It(e)||e.jsonrpc!==`2.0`||e.id!==t)throw Lt();if(`error`in e){let t=e.error;throw!It(t)||typeof t.code!=`number`?Lt():new B(`JSON_RPC_${t.code}`,typeof t.message==`string`&&t.message.length>0?t.message:`JSON-RPC 요청에 실패했습니다.`)}let n=e.result;if(!Array.isArray(n)||n.length<1||n.length>2)throw Lt();let r=n[0];if(typeof r!=`number`||!Number.isInteger(r))throw Lt();if(r!==0)throw new B(`UBUS_${r}`,kt[r]??`ubus 오류 코드 ${r}가 반환되었습니다.`);if(n.length<2||n[1]===void 0)throw new B(`EMPTY_RESPONSE`,`장치 API 응답이 비어 있습니다.`);return n[1]}async function Wt(e,t,n={},r={}){let i=Ft();vt();let a=performance.now(),o=null,s=null,c=`ok`,l=Pt++,u=null,d=null,f=new AbortController,p=!1,m=()=>{p=!0,f.abort()};r.signal?.addEventListener(`abort`,m,{once:!0});try{if(u=await Tt(r.priority??`normal`,r.signal),p||r.signal?.aborted)throw new B(`RPC_CANCELLED`,`요청이 취소되었습니다.`);d=window.setTimeout(()=>f.abort(),Rt(r.timeoutMs));let c=await fetch(i.rpcUrl,{method:`POST`,credentials:`same-origin`,headers:{"Content-Type":`application/json`},body:JSON.stringify({jsonrpc:`2.0`,id:l,method:`call`,params:[i.sessionId,e,t,n]}),signal:f.signal});if(o=performance.now()-a,!c.ok)throw new B(`HTTP_ERROR`,`장치 API가 HTTP ${c.status} 오류를 반환했습니다.`);let m;try{m=await c.json(),s=performance.now()-a-(o??0)}catch{throw Lt()}return Ut(m,l)}catch(e){if(p||r.signal?.aborted)throw c=`RPC_CANCELLED`,new B(`RPC_CANCELLED`,`요청이 취소되었습니다.`);if(f.signal.aborted)throw c=`RPC_TIMEOUT`,new B(`RPC_TIMEOUT`,`장치 응답 시간이 초과되었습니다. 잠시 후 다시 시도해 주세요.`);if(e instanceof DOMException&&e.name===`AbortError`)throw c=`RPC_CANCELLED`,new B(`RPC_CANCELLED`,`요청이 취소되었습니다.`);if(e instanceof B){let t=await Ht(e,i);throw c=t.code,t}throw c=`NETWORK_ERROR`,new B(`NETWORK_ERROR`,`공유기와 통신할 수 없습니다. 네트워크 연결을 확인해 주세요.`)}finally{d!==null&&window.clearTimeout(d),r.signal?.removeEventListener(`abort`,m),u?.();let n=Math.round(performance.now()-a);(mt({object:e,method:t,elapsedMs:n,responseMs:o,decodeMs:s,result:c})||c===`RPC_TIMEOUT`)&&console.warn(`[SmartSafeHub RPC] ${e}.${t}: ${n}ms (${c})`)}}async function V(e,t,n={},r={}){let i=await Wt(e,t,n,r);if(!i.ok)throw new B(i.error.code,i.error.message);return i.data}function Gt(){return V(`smartsafehub`,`system_root_password_status`)}function Kt(e){return V(`smartsafehub`,`system_root_password_set`,{password:e})}var qt=Symbol.for(`pv`),Jt=0;Array.isArray;function H(t,n,r,i,a,o){n||(n={});var s,c,l=n;if(`ref`in l&&typeof t!=`function`)for(c in l={},n)c==`ref`?s=n[c]:l[c]=n[c];var u={type:t,props:l,key:r,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:qt,__v:--Jt,__i:-1,__u:0};return(a||o)&&(u.__source=a,u.__self=o),e.vnode&&e.vnode(u),u}function U({children:e,title:t,...n}){return H(`svg`,{"aria-hidden":!t||void 0,fill:`none`,role:t?`img`:void 0,stroke:`currentColor`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`1.8`,viewBox:`0 0 24 24`,...n,children:[t?H(`title`,{children:t}):null,e]})}function Yt(e){return H(U,{...e,children:[H(`path`,{d:`M12 3 5 6v5c0 4.6 2.8 8.1 7 10 4.2-1.9 7-5.4 7-10V6l-7-3Z`}),H(`path`,{d:`m9 12 2 2 4-4`})]})}function Xt(e){return H(U,{...e,children:[H(`rect`,{height:`7`,rx:`2`,width:`18`,x:`3`,y:`13`}),H(`path`,{d:`M7 16.5h.01M11 16.5h.01M7 10a7 7 0 0 1 10 0M9.5 7.5a3.5 3.5 0 0 1 5 0`})]})}function Zt(e){return H(U,{...e,children:[H(`rect`,{height:`11`,rx:`2`,width:`16`,x:`4`,y:`3`}),H(`path`,{d:`M8 21h8M12 14v7`})]})}function Qt(e){return H(U,{...e,children:[H(`path`,{d:`m3 11 9-8 9 8`}),H(`path`,{d:`M5 10v10h14V10M9 20v-6h6v6`})]})}function $t(e){return H(U,{...e,children:[H(`circle`,{cx:`12`,cy:`8`,r:`4`}),H(`path`,{d:`M4.5 21a7.5 7.5 0 0 1 15 0`})]})}function en(e){return H(U,{...e,children:[H(`rect`,{x:`3`,y:`3`,width:`7`,height:`7`,rx:`1.5`}),H(`rect`,{x:`14`,y:`3`,width:`7`,height:`7`,rx:`1.5`}),H(`rect`,{x:`3`,y:`14`,width:`7`,height:`7`,rx:`1.5`}),H(`path`,{d:`M17.5 14v7M14 17.5h7`})]})}function tn(e){return H(U,{...e,children:[H(`rect`,{x:`2.5`,y:`3.5`,width:`7`,height:`6`,rx:`1.5`}),H(`rect`,{x:`14.5`,y:`3.5`,width:`7`,height:`6`,rx:`1.5`}),H(`rect`,{x:`8.5`,y:`15`,width:`7`,height:`6`,rx:`1.5`}),H(`path`,{d:`M6 9.5v2.5h12V9.5M12 12v3`})]})}function nn(e){return H(U,{...e,children:[H(`path`,{d:`M7.5 7h9a5 5 0 0 1 4.9 4l.8 5a2.5 2.5 0 0 1-4 2.3L15.5 16h-7l-2.7 2.3a2.5 2.5 0 0 1-4-2.3l.8-5A5 5 0 0 1 7.5 7Z`}),H(`path`,{d:`M6.5 11v4M4.5 13h4M16 11.5h.01M18.5 13.5h.01`})]})}function rn(e){return H(U,{...e,children:H(`path`,{d:`M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.287l-7.91 7.91a2.121 2.121 0 0 1-3-3l7.91-7.91a6 6 0 0 1 7.287-8.259c.438.12.54.662.218.984z`})})}function an(e){return H(U,{...e,children:[H(`circle`,{cx:`12`,cy:`12`,r:`10`}),H(`path`,{d:`M8 12h.01M12 12h.01M16 12h.01`})]})}function on(e){return H(U,{...e,children:[H(`path`,{d:`M12 16V4`}),H(`path`,{d:`m7 9 5-5 5 5`}),H(`path`,{d:`M5 14v5h14v-5`})]})}function sn(e){return H(U,{...e,children:[H(`circle`,{cx:`12`,cy:`12`,r:`3`}),H(`path`,{d:`M19.4 15a1.7 1.7 0 0 0 .3 1.9l.1.1-2.8 2.8-.1-.1a1.7 1.7 0 0 0-1.9-.3 1.7 1.7 0 0 0-1 1.6v.2h-4V21a1.7 1.7 0 0 0-1-1.6 1.7 1.7 0 0 0-1.9.3l-.1.1L4.2 17l.1-.1a1.7 1.7 0 0 0 .3-1.9A1.7 1.7 0 0 0 3 14H2.8v-4H3a1.7 1.7 0 0 0 1.6-1 1.7 1.7 0 0 0-.3-1.9L4.2 7 7 4.2l.1.1a1.7 1.7 0 0 0 1.9.3A1.7 1.7 0 0 0 10 3V2.8h4V3a1.7 1.7 0 0 0 1 1.6 1.7 1.7 0 0 0 1.9-.3l.1-.1L19.8 7l-.1.1a1.7 1.7 0 0 0-.3 1.9 1.7 1.7 0 0 0 1.6 1h.2v4H21a1.7 1.7 0 0 0-1.6 1Z`})]})}function cn(e){return H(U,{...e,children:[H(`path`,{d:`M5 9.5a10 10 0 0 1 14 0M8 13a6 6 0 0 1 8 0M11 16.5a2 2 0 0 1 2 0`}),H(`path`,{d:`M12 20h.01`})]})}function ln(e){return H(U,{...e,children:[H(`path`,{d:`M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4z`}),H(`path`,{d:`M6.5 6.5h1M16.5 6.5h1M6.5 16.5h1`}),H(`path`,{d:`M14 14h2v2h-2zM18 14h2v2h-2zM16 16h2v2h-2zM18 18h2v2h-2zM14 18h1`})]})}function un(e){return H(U,{...e,children:[H(`path`,{d:`M7 3v4M17 3v4M5 7h14v4a7 7 0 0 1-14 0V7Z`}),H(`path`,{d:`M12 18v3`})]})}function dn(e){return H(U,{...e,children:[H(`circle`,{cx:`12`,cy:`12`,r:`9`}),H(`path`,{d:`M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18`})]})}function fn(e){return H(U,{...e,children:[H(`rect`,{height:`13`,rx:`2`,width:`18`,x:`3`,y:`6`}),H(`path`,{d:`m8 2 4 4 4-4M8 22h8`})]})}function pn(e){return H(U,{...e,children:[H(`circle`,{cx:`12`,cy:`12`,r:`9`}),H(`path`,{d:`M12 7v5l3 2`})]})}function mn(e){return H(U,{...e,children:[H(`rect`,{height:`14`,rx:`2`,width:`14`,x:`5`,y:`5`}),H(`path`,{d:`M9 9h6v6H9zM9 2v3M15 2v3M9 19v3M15 19v3M2 9h3M2 15h3M19 9h3M19 15h3`})]})}function hn(e){return H(U,{...e,children:[H(`path`,{d:`M20 11a8 8 0 1 0-2.3 5.7`}),H(`path`,{d:`M20 4v7h-7`})]})}function gn(e){return H(U,{...e,children:[H(`path`,{d:`M12 2v10`}),H(`path`,{d:`M18.4 6.6a8 8 0 1 1-12.8 0`})]})}function _n(e){return H(U,{...e,children:[H(`path`,{d:`M12 3v12`}),H(`path`,{d:`m7 10 5 5 5-5`}),H(`path`,{d:`M5 21h14`})]})}function vn(e){return H(U,{...e,children:[H(`ellipse`,{cx:`12`,cy:`5`,rx:`8`,ry:`3`}),H(`path`,{d:`M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6`})]})}function yn(e){return H(U,{...e,children:[H(`circle`,{cx:`8`,cy:`15`,r:`4`}),H(`path`,{d:`m11 12 8-8M15 8l2 2M17 6l2 2`})]})}function bn(e){return H(U,{...e,children:[H(`rect`,{height:`13`,rx:`2`,width:`13`,x:`8`,y:`8`}),H(`path`,{d:`M16 8V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h3`})]})}function xn(e){return H(U,{...e,children:[H(`path`,{d:`M2.5 12s3.5-6 9.5-6 9.5 6 9.5 6-3.5 6-9.5 6-9.5-6-9.5-6Z`}),H(`circle`,{cx:`12`,cy:`12`,r:`2.5`})]})}function Sn(e){return H(U,{...e,children:[H(`path`,{d:`m3 3 18 18`}),H(`path`,{d:`M10.6 6.2A8.8 8.8 0 0 1 12 6c6 0 9.5 6 9.5 6a15.5 15.5 0 0 1-2.6 3.2`}),H(`path`,{d:`M6.2 6.3C3.8 8 2.5 12 2.5 12s3.5 6 9.5 6a9.8 9.8 0 0 0 3.1-.5`}),H(`path`,{d:`M10.3 10.3a2.5 2.5 0 0 0 3.4 3.4`})]})}function Cn(e){return H(U,{...e,children:[H(`rect`,{height:`17`,rx:`2`,width:`18`,x:`3`,y:`4`}),H(`path`,{d:`M8 2v4M16 2v4M3 9h18`})]})}function wn(e){return H(U,{...e,children:[H(`circle`,{cx:`12`,cy:`12`,r:`9`}),H(`path`,{d:`m8 12 2.5 2.5L16 9`})]})}function W(e){return H(U,{...e,children:[H(`path`,{d:`M10.3 4.2 2.7 17.5A2 2 0 0 0 4.4 20h15.2a2 2 0 0 0 1.7-2.5L13.7 4.2a2 2 0 0 0-3.4 0Z`}),H(`path`,{d:`M12 9v4M12 17h.01`})]})}function Tn(e){return H(U,{...e,children:H(`path`,{d:`M12 5v14M5 12h14`})})}function En(e){return H(U,{...e,children:H(`path`,{d:`M4 7h16M9 7V4h6v3M7 7l1 13h8l1-13M10 11v5M14 11v5`})})}function Dn(e){return H(U,{...e,children:[H(`circle`,{cx:`11`,cy:`11`,r:`7`}),H(`path`,{d:`m20 20-4-4`})]})}function On(e){return H(U,{...e,children:[H(`path`,{d:`M8 6h12M8 12h12M8 18h12`}),H(`path`,{d:`M4 6h.01M4 12h.01M4 18h.01`})]})}function kn(e){return H(U,{...e,children:[H(`path`,{d:`M10 5H6a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h4`}),H(`path`,{d:`M14 8l4 4-4 4M8 12h10`})]})}function An(e){return H(U,{...e,children:H(`path`,{d:`M4 7h16M4 12h16M4 17h16`})})}function jn(e){return H(U,{...e,children:H(`path`,{d:`m6 9 6 6 6-6`})})}function Mn(e){return H(U,{...e,children:H(`path`,{d:`m6 6 12 12M18 6 6 18`})})}function Nn(e){return H(U,{...e,children:H(`path`,{d:`m15 18-6-6 6-6`})})}function Pn(e){return H(U,{...e,children:H(`path`,{d:`m9 18 6-6-6-6`})})}function Fn(e){return H(U,{...e,children:H(`path`,{d:`M20.7 13.2A8.5 8.5 0 1 1 10.8 3.3 6.7 6.7 0 0 0 20.7 13.2Z`})})}function In(e){return H(U,{...e,children:[H(`circle`,{cx:`12`,cy:`12`,r:`4`}),H(`path`,{d:`M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41`})]})}var Ln=`smartsafehub.theme`;function Rn(){if(typeof window>`u`)return`light`;try{let e=window.localStorage.getItem(Ln);if(e===`dark`||e===`light`)return e}catch{}return window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}function zn(e){try{window.localStorage.setItem(Ln,e)}catch{}}function Bn(e){let t=document.querySelector(`meta[name="theme-color"]`);t&&(t.content=e===`dark`?`#0f172a`:`#f8fafc`),document.documentElement.style.colorScheme=e,document.body.style.backgroundColor=e===`dark`?`#020617`:`#f8fafc`}function Vn(e){return{length:e.length>=8,letter:/[A-Za-z]/.test(e),number:/[0-9]/.test(e)}}function Hn(e){return e.length&&e.letter&&e.number}function Un({theme:e}){return H(e===`dark`?In:Fn,{})}function Wn({met:e,children:t}){return H(`li`,{class:e?`ssh-password-requirement is-met`:`ssh-password-requirement`,children:[H(wn,{"aria-hidden":`true`}),H(`span`,{children:t})]})}function Gn({onCompleted:e,recovery:t}){let n=L(null),r=L(null),[i,a]=F(``),[o,s]=F(``),[c,l]=F(!1),[u,d]=F(!1),[f,p]=F(!1),[m,h]=F(null),[g,_]=F(Rn),v=Vn(i),y=Hn(v),b=o.length>0&&i===o,x=g===`dark`?`라이트 모드로 전환`:`다크 모드로 전환`;I(()=>{zn(g),Bn(g)},[g]),I(()=>{let e=window.requestAnimationFrame(()=>n.current?.focus());return()=>window.cancelAnimationFrame(e)},[]);let S=e=>{d(e.getModifierState?.(`CapsLock`)??!1)};return H(`main`,{class:`ssh-login-page`,"data-theme":g,children:[H(`section`,{class:`ssh-login-brand`,"aria-labelledby":`ssh-password-setup-brand-title`,children:[H(`div`,{class:`ssh-login-brand-orb ssh-login-brand-orb-one`,"aria-hidden":`true`}),H(`div`,{class:`ssh-login-brand-orb ssh-login-brand-orb-two`,"aria-hidden":`true`}),H(`div`,{class:`ssh-login-brand-content`,children:[H(`span`,{class:`ssh-login-brand-mark`,"aria-hidden":`true`,children:H(Yt,{})}),H(`p`,{class:`ssh-login-eyebrow`,children:t?`PASSWORD RECOVERY`:`FIRST SECURITY SETUP`}),H(`h1`,{id:`ssh-password-setup-brand-title`,children:[H(`span`,{class:`ssh-password-setup-brand-title-line`,children:`SmartSafeHub`}),H(`span`,{class:`ssh-password-setup-brand-title-line`,children:t?`비밀번호 복구`:`보호 시작`})]}),H(`p`,{class:`ssh-login-brand-description`,children:t?`물리 Reset 버튼으로 관리자 비밀번호 복구가 요청되었습니다. 네트워크, Wi-Fi, SafeShield 등 기존 설정은 그대로 유지됩니다.`:`관리자 비밀번호가 없는 상태에서는 SmartSafeHub 관리 기능을 사용할 수 없습니다. 먼저 이 공유기의 root 관리자 비밀번호를 설정해 주세요.`}),H(`div`,{class:`ssh-password-setup-summary`,children:[H(Yt,{"aria-hidden":`true`}),H(`div`,{children:[H(`strong`,{children:t?`새 관리자 비밀번호를 설정해 주세요`:`초기 보안 설정이 필요합니다`}),H(`span`,{children:t?`새 비밀번호를 설정하기 전까지 SSH 접근은 비활성화되고 다른 관리 기능도 잠겨 있습니다.`:`설정이 완료되기 전까지 다른 SmartSafeHub 기능은 잠겨 있습니다.`})]})]})]})]}),H(`section`,{class:`ssh-login-panel`,"aria-labelledby":`ssh-password-setup-title`,children:[H(`button`,{"aria-label":x,class:`ssh-login-theme-toggle`,onClick:()=>_(e=>e===`dark`?`light`:`dark`),title:x,type:`button`,children:H(Un,{theme:g})}),H(`div`,{class:`ssh-login-panel-inner`,children:[H(`div`,{class:`ssh-login-card`,children:[H(`div`,{class:`ssh-login-card-heading`,children:[H(`span`,{class:`ssh-login-mobile-mark`,"aria-hidden":`true`,children:H(yn,{})}),H(`div`,{children:[H(`p`,{class:`ssh-login-kicker`,children:`ADMIN PASSWORD`}),H(`h2`,{id:`ssh-password-setup-title`,children:t?`관리자 비밀번호 복구`:`관리자 비밀번호 설정`}),H(`p`,{class:`ssh-login-subtitle`,children:`비밀번호 설정 후 새 비밀번호로 다시 로그인해야 합니다.`})]})]}),m?H(`div`,{class:`ssh-login-alert`,role:`alert`,"aria-live":`polite`,children:m}):null,H(`form`,{class:`ssh-login-form`,onSubmit:async t=>{if(t.preventDefault(),h(null),!y)h(`비밀번호는 8자 이상이며 영문과 숫자를 각각 하나 이상 포함해야 합니다.`),window.requestAnimationFrame(()=>n.current?.focus());else if(i!==o)h(`비밀번호 확인 값이 일치하지 않습니다.`),window.requestAnimationFrame(()=>r.current?.focus());else{p(!0);try{await Kt(i),a(``),s(``);try{await Oe()}catch{}e()}catch(e){h(e instanceof B?e.message:`관리자 비밀번호를 설정하지 못했습니다. 잠시 후 다시 시도해 주세요.`)}finally{p(!1)}}},noValidate:!0,children:[H(`label`,{class:`ssh-login-field`,for:`smartsafehub-new-root-password`,children:[H(`span`,{class:`ssh-login-label`,children:`새 비밀번호`}),H(`span`,{class:`ssh-login-input-wrap`,children:[H(`span`,{class:`ssh-login-field-icon`,"aria-hidden":`true`,children:H(yn,{})}),H(`input`,{autoComplete:`new-password`,disabled:f,id:`smartsafehub-new-root-password`,name:`new-password`,onBlur:()=>d(!1),onInput:e=>a(e.currentTarget.value),onKeyDown:S,onKeyUp:S,placeholder:`새 관리자 비밀번호`,ref:n,...c?{type:`text`}:{type:`password`},value:i}),H(`button`,{"aria-label":c?`비밀번호 숨기기`:`비밀번호 표시`,"aria-pressed":c,class:`ssh-login-password-toggle`,disabled:f,onClick:()=>l(e=>!e),title:c?`비밀번호 숨기기`:`비밀번호 표시`,type:`button`,children:H(c?Sn:xn,{})})]})]}),H(`ul`,{class:`ssh-password-requirements`,"aria-label":`비밀번호 요구 사항`,children:[H(Wn,{met:v.length,children:`8자 이상`}),H(Wn,{met:v.letter,children:`영문자 1자 이상 포함`}),H(Wn,{met:v.number,children:`숫자 1자 이상 포함`})]}),H(`label`,{class:`ssh-login-field`,for:`smartsafehub-confirm-root-password`,children:[H(`span`,{class:`ssh-login-label`,children:`비밀번호 확인`}),H(`span`,{class:`ssh-login-input-wrap`,children:[H(`span`,{class:`ssh-login-field-icon`,"aria-hidden":`true`,children:H(yn,{})}),H(`input`,{autoComplete:`new-password`,disabled:f,id:`smartsafehub-confirm-root-password`,name:`confirm-password`,onBlur:()=>d(!1),onInput:e=>s(e.currentTarget.value),onKeyDown:S,onKeyUp:S,placeholder:`새 관리자 비밀번호 다시 입력`,ref:r,...c?{type:`text`}:{type:`password`},value:o})]})]}),o.length>0?H(`p`,{class:b?`ssh-password-match is-met`:`ssh-password-match`,role:`status`,children:b?`비밀번호가 일치합니다.`:`비밀번호가 일치하지 않습니다.`}):null,u?H(`p`,{class:`ssh-login-caps`,role:`status`,children:`Caps Lock이 켜져 있습니다.`}):null,H(`button`,{class:`ssh-login-submit`,disabled:f,type:`submit`,children:[f?H(hn,{class:`ssh-login-submit-spinner`,"aria-hidden":`true`}):null,H(`span`,{children:f?`설정 중…`:`비밀번호 설정`})]})]}),H(`div`,{class:`ssh-login-security-note`,children:[H(Yt,{"aria-hidden":`true`}),H(`span`,{children:`비밀번호는 현재 공유기에 직접 설정되며 외부 서버로 전송되지 않습니다.`})]})]}),H(`footer`,{class:`ssh-login-footer`,children:[H(`span`,{children:`SmartSafeHub`}),H(`span`,{"aria-hidden":`true`,children:`·`}),H(`span`,{children:window.location.host})]})]})]})]})}var G=`smartsafehub`,Kn=`smartsafehub_guest`,qn=`smartsafehub_network`;function Jn(){return V(G,`connected_devices`)}async function Yn(){let e=await V(G,`activity_history`);return{...e,cloud:{...e.cloud,enabled:e.cloud.enabled??!1}}}function Xn(e){return V(G,`activity_cloud_sync_update`,{enabled:e})}function Zn(){return V(G,`status`)}function Qn(e){return V(G,`device_recommended_rules_status`,{},{...e?{signal:e}:{},priority:`low`,timeoutMs:5e3})}function $n(){return V(G,`device_recommended_rules_refresh`,{},{priority:`high`,timeoutMs:6e3})}function er(e){return V(G,`device_recommended_rules_revoke`,{rule_id:e},{priority:`high`,timeoutMs:6e3})}function tr(e){return V(G,`device_registration_status`,{},{...e?{signal:e}:{},priority:`low`,timeoutMs:5e3})}function nr(){return V(G,`device_registration_refresh`,{},{priority:`high`,timeoutMs:6e3})}function rr(){return V(G,`device_pairing_refresh`,{},{priority:`high`,timeoutMs:6e3})}function ir(){return V(G,`health_status`)}function ar(){return V(G,`health_run`)}function or(e){return V(G,`health_reporter_update`,{enabled:e})}function sr(e){return V(G,`apps_catalog`,{},{...e?{signal:e}:{},priority:`low`,timeoutMs:6e3})}function cr(){return V(G,`apps_catalog`,{refresh:!0},{priority:`high`,timeoutMs:6e3})}function lr(e){return V(G,`apps_status`,{},{...e?{signal:e}:{},priority:`low`,timeoutMs:6e3})}function ur(){return V(G,`apps_status`,{refresh:!0},{priority:`high`,timeoutMs:6e3})}function dr(e){return V(G,`apps_metrics`,{},{...e?{signal:e}:{},priority:`low`,timeoutMs:6e3})}function fr(){return V(G,`apps_metrics`,{refresh:!0},{priority:`high`,timeoutMs:6e3})}function pr(e){return V(G,`apps_install`,{app_id:e},{timeoutMs:8e3})}function mr(e){return V(G,`apps_update`,{app_id:e},{timeoutMs:8e3})}function hr(e){return V(G,`apps_remove`,{app_id:e},{timeoutMs:8e3})}function gr(){return V(G,`updates_status`)}function _r(){return V(G,`firmware_status`)}function vr(){return V(G,`firmware_check`)}function yr(){return V(G,`firmware_prepare`)}function br(e){return V(G,`firmware_validate_upload`,{filename:e})}function xr(e){return V(G,`firmware_install`,{confirm:`install`,keep_settings:e})}function Sr(){return V(G,`firmware_discard`)}function Cr(){return V(G,`updates_check`)}function wr(){return V(G,`updates_install`,{confirm:`install`})}function Tr(e){return V(G,`updates_settings_update`,{check_enabled:e.checkEnabled,check_interval_s:e.checkIntervalSeconds,auto_install:e.autoInstall,auto_install_time:e.autoInstallTime})}function Er(){return V(G,`system_time_settings`)}function Dr(e){return V(G,`system_timezone_initialize`,{zonename:e})}function Or(e){return V(G,`system_timezone_update`,{zonename:e})}function kr(){return V(G,`system_time_sync`)}function Ar(){return V(G,`system_scheduled_reboot_settings`)}function jr(e){return V(G,`system_scheduled_reboot_update`,{enabled:e.enabled,frequency:e.frequency,day_of_week:e.dayOfWeek,time:e.time})}function Mr(e){return V(G,`system_backup_validate`,{filename:e})}function Nr(){return V(G,`system_backup_restore`,{confirm:`restore`},{timeoutMs:35e3})}function Pr(){return V(G,`system_backup_discard`)}function Fr(){return V(G,`system_reboot`,{confirm:`reboot`})}function Ir(){return V(qn,`wan_settings`)}function Lr(e){return V(qn,`wan_update`,{protocol:e.protocol,pppoe_username:e.pppoeUsername,pppoe_password:e.pppoePassword,pppoe_password_changed:e.pppoePasswordChanged,static_address:e.staticAddress,static_prefix_length:e.staticPrefixLength,static_gateway:e.staticGateway,dns_primary:e.dnsPrimary,dns_secondary:e.dnsSecondary,confirm:`apply`},{timeoutMs:1e4})}function Rr(){return V(qn,`wan_reconnect`,{confirm:`reconnect`},{timeoutMs:1e4})}function zr(){return V(qn,`lan_settings`)}function Br(e){return V(qn,`lan_update`,{ip_address:e.ipAddress,prefix_length:e.prefixLength,dhcp_enabled:e.dhcpEnabled,dhcp_start:e.dhcpStart,dhcp_end:e.dhcpEnd,lease_time:e.leaseTime,confirm:`apply`},{timeoutMs:1e4})}function Vr(){return V(qn,`lan_auto_subnet`,{confirm:`apply`},{timeoutMs:1e4})}function Hr(){return V(qn,`iptv_settings`)}function Ur(e){return V(qn,`iptv_update`,{enabled:e.enabled,provider:e.provider,confirm:`apply`},{timeoutMs:2e4})}function Wr(e){return V(G,`wifi_qr`,{section:e},{timeoutMs:8e3})}function Gr(){return V(Kn,`wifi_guest_qr`,{},{timeoutMs:8e3})}async function Kr(){let e=await V(G,`wifi_summary`);try{let t=await V(Kn,`wifi_guest_summary`);return{...e,guest:t,guestError:!1}}catch{return{...e,guest:null,guestError:!0}}}function qr(e){return V(G,`wifi_update`,{...e},{timeoutMs:35e3})}function Jr(e){return V(Kn,`wifi_guest_update`,{...e},{timeoutMs:95e3})}var Yr=Object.fromEntries([{route:`home`,hash:`#home`,label:`대시보드`,title:`대시보드`,description:`네트워크, 장치와 시스템 상태를 한눈에 확인합니다.`},{route:`activity`,hash:`#activity`,label:`최근 활동`,title:`최근 활동`,description:`현재 부팅 이후 인터넷, 보호, 업데이트와 진단 상태 변화를 확인합니다.`},{route:`network`,hash:`#network`,label:`네트워크`,title:`네트워크`,description:`인터넷 연결과 내부 네트워크 주소, DHCP 및 네트워크 충돌을 한 곳에서 관리합니다.`},{route:`wifi`,hash:`#wifi`,label:`Wi-Fi`,title:`Wi-Fi`,description:`기본 무선 네트워크의 이름, 보안과 사용 상태를 관리합니다.`},{route:`iptv`,hash:`#iptv`,label:`IPTV`,title:`IPTV`,description:`SK Broadband와 LG U+ 멀티캐스트 IPTV를 설정합니다.`},{route:`devices`,hash:`#devices`,label:`연결된 기기`,title:`연결된 기기`,description:`네트워크에서 확인된 기기와 연결 방식을 살펴봅니다.`},{route:`safeshield`,hash:`#safeshield`,label:`SafeShield`,title:`SafeShield`,description:`DNS 보호 상태를 확인하고 차단 목록을 관리합니다.`},{route:`rules`,hash:`#rules`,label:`사용자 규칙`,title:`사용자 규칙`,description:`직접 허용하거나 차단할 도메인을 관리합니다.`},{route:`account`,hash:`#account`,label:`SmartSafeHub 계정`,title:`SmartSafeHub 계정`,description:`이 기기의 SmartSafeHub 계정 연결 상태와 구독 플랜을 확인합니다.`},{route:`apps`,hash:`#apps`,label:`Apps`,title:`SmartSafeHub Apps`,description:`SmartSafeHub에서 검증한 앱과 확장 기능을 살펴봅니다.`},{route:`system`,hash:`#system`,label:`업데이트`,title:`업데이트`,description:`기기의 펌웨어와 관리 소프트웨어 업데이트를 관리합니다.`},{route:`settings`,hash:`#settings`,label:`설정`,title:`설정`,description:`시스템 상태와 시간대를 확인하고 장치 관리 및 진단 기능을 설정합니다.`}].map(e=>[e.route,e])),Xr=[`home`,`activity`,`network`,`wifi`,`devices`,`safeshield`,`rules`,`account`,`apps`,`system`];function Zr({description:e,loading:t,onRefresh:n,onToggleTheme:r,refreshing:i,theme:a,title:o}){return H(`header`,{class:`ssh-product-hero border-b border-slate-200 bg-white px-4 py-4 sm:px-6 md:h-[4.5rem] md:py-0 lg:px-8 xl:px-10`,children:H(`div`,{class:`flex w-full items-center justify-between gap-4 md:h-full`,children:[H(`div`,{class:`min-w-0`,children:[H(`p`,{class:`m-0 text-[0.68rem] font-extrabold uppercase tracking-[0.18em] text-teal-700`,children:`SmartSafeHub`}),H(`div`,{class:`mt-1 flex min-w-0 items-baseline gap-3`,children:[H(`h1`,{class:`m-0 truncate text-xl font-black tracking-tight text-slate-950 sm:text-2xl`,children:o}),H(`p`,{class:`m-0 hidden truncate text-sm text-slate-500 lg:block`,children:e})]})]}),H(`div`,{class:`flex shrink-0 items-center gap-2`,children:[H(`button`,{"aria-label":a===`dark`?`라이트 모드로 전환`:`다크 모드로 전환`,class:`ssh-product-header-action hidden h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white text-slate-600 shadow-sm transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 md:inline-flex`,onClick:r,title:a===`dark`?`라이트 모드`:`다크 모드`,type:`button`,children:H(a===`dark`?In:Fn,{class:`size-5`})}),H(`button`,{"aria-busy":i,"aria-label":i?`새로고침 중`:`현재 화면 새로고침`,class:`ssh-product-header-action hidden h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white shadow-sm transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-wait disabled:opacity-60 md:inline-flex ${i?`text-teal-700`:`text-slate-600`}`,disabled:t||i,onClick:n,title:i?`새로고침 중`:`새로고침`,type:`button`,children:i?H(hn,{class:`size-5 animate-spin`}):H(hn,{class:`size-5`})})]})]})})}var Qr=[{label:`Overview`,routes:[`home`,`activity`]},{label:`Network`,routes:[`network`,`wifi`,`iptv`,`devices`]},{label:`Security`,routes:[`safeshield`,`rules`]},{label:`Explore`,routes:[`apps`]},{label:`System`,routes:[`account`,`system`,`settings`]}];function $r({route:e}){switch(e){case`home`:return H(Qt,{class:`size-5`});case`activity`:return H(pn,{class:`size-5`});case`network`:return H(dn,{class:`size-5`});case`wifi`:return H(cn,{class:`size-5`});case`iptv`:return H(fn,{class:`size-5`});case`devices`:return H(Zt,{class:`size-5`});case`safeshield`:return H(Yt,{class:`size-5`});case`rules`:return H($t,{class:`size-5`});case`account`:return H(yn,{class:`size-5`});case`apps`:return H(en,{class:`size-5`});case`system`:return H(on,{class:`size-5`});case`settings`:return H(sn,{class:`size-5`})}}function ei({theme:e}){return H(e===`dark`?In:Fn,{class:`size-5`})}function ti(e){return e===`dark`?`라이트 모드`:`다크 모드`}function ni(e,t=!1,n){let r=t?`justify-center px-2`:`gap-3 px-3`;return e?`relative flex min-h-11 min-w-0 items-center rounded-xl py-2.5 text-sm font-extrabold no-underline transition ${r} bg-teal-50 text-teal-800 ring-1 ring-inset ring-teal-200`:n===`apps`?`ssh-apps-nav-link relative flex min-h-11 min-w-0 items-center rounded-xl py-2.5 text-sm font-extrabold no-underline transition ${r}`:`relative flex min-h-11 min-w-0 items-center rounded-xl py-2.5 text-sm font-extrabold text-slate-600 no-underline transition ${r} hover:bg-slate-50 hover:text-slate-950`}function ri(e){return e===`apps`?`앱으로 확장하기`:null}function ii({accountRegistered:e,collapsed:t=!1,route:n,updateCount:r,demo:i=!1}){return H(`div`,{class:t?`space-y-3`:`space-y-5`,children:Qr.filter(e=>!i||e.routes.some(e=>Xr.includes(e))).map((a,o)=>H(`section`,{"aria-label":a.label,class:t&&o>0?`border-t border-slate-100 pt-3`:void 0,children:[t?null:H(`p`,{class:`mb-2 px-3 text-[0.65rem] font-black uppercase tracking-[0.18em] text-slate-400`,children:a.label}),H(`div`,{class:`space-y-1`,children:a.routes.filter(e=>!i||Xr.includes(e)).map(i=>{let a=Yr[i],o=n===i;return H(`a`,{"aria-current":o?`page`:void 0,"aria-label":i===`account`&&e===!1?`${a.label} (계정 연결 필요)`:t?a.label:void 0,class:ni(o,t,i),href:a.hash,title:i===`account`&&e===!1?`SmartSafeHub 계정 연결 필요`:t?a.label:void 0,children:[H(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg ${o?`bg-teal-700 text-white`:`bg-slate-100 text-slate-500`}`,children:H($r,{route:i})}),t?null:H(`span`,{class:`flex min-w-0 flex-1 items-center gap-2`,children:[H(`span`,{class:`min-w-0 flex-1`,children:[H(`span`,{class:`block truncate`,children:a.label}),ri(i)?H(`span`,{class:`ssh-apps-nav-description mt-0.5 block truncate text-[11px] font-semibold tracking-normal`,children:ri(i)}):null]}),i===`iptv`?H(`span`,{class:`rounded-full border border-amber-300 bg-amber-100 px-1.5 py-0.5 text-[9px] font-black uppercase tracking-[0.08em] text-amber-800`,children:`Beta`}):null]}),t&&i===`iptv`?H(`span`,{"aria-label":`Beta 기능`,class:`absolute right-0.5 top-0.5 inline-flex size-5 items-center justify-center rounded-full border border-amber-300 bg-amber-100 text-[13px] font-extrabold leading-none text-amber-900 shadow-sm ring-2 ring-white`,children:`β`}):null,i===`account`&&e===!1?H(`span`,{"aria-label":`계정 연결 필요`,class:`ssh-account-nav-dot ${t?`ssh-account-nav-dot-collapsed`:``}`,"aria-hidden":`true`,title:`계정 연결 필요`}):null,i===`system`&&r>0?t?H(`span`,{"aria-label":`${r}개의 업데이트 유형`,class:`ssh-update-nav-badge`,"data-collapsed":`true`,children:r}):H(`span`,{class:`ssh-update-nav-badge`,"data-collapsed":`false`,children:r}):null]},i)})})]},a.label))})}function ai({accountRegistered:e,collapsed:t,loading:n,onRefresh:r,onToggleCollapsed:i,onToggleTheme:a,refreshing:o,route:s,theme:c,title:l,updateCount:u,demo:d=!1}){let[f,p]=F(!1),m=ti(c);return I(()=>{p(!1)},[s]),I(()=>{if(!f)return;let e=e=>{e.key===`Escape`&&p(!1)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[f]),H(b,{children:[H(`nav`,{"aria-label":`SmartSafeHub 모바일 메뉴`,class:`ssh-mobile-navigation sticky top-0 z-40 border-b border-slate-200 bg-white/95 px-4 shadow-sm shadow-slate-900/5 backdrop-blur md:hidden`,children:[H(`div`,{class:`flex min-h-16 items-center justify-between gap-3`,children:[H(`a`,{class:`flex min-w-0 items-center gap-3 no-underline`,href:`#home`,children:[H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-950 text-teal-300`,children:H(Yt,{class:`size-5`})}),H(`span`,{class:`min-w-0`,children:[H(`strong`,{class:`block truncate text-sm font-black text-slate-950`,children:`SmartSafeHub`}),H(`span`,{class:`block truncate text-xs font-semibold text-slate-500`,children:l})]})]}),H(`div`,{class:`flex shrink-0 items-center gap-2`,children:[H(`button`,{"aria-label":`${m}로 전환`,class:`inline-flex size-11 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white text-slate-600 transition hover:border-slate-300 hover:bg-slate-50 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:a,title:m,type:`button`,children:H(ei,{theme:c})}),H(`button`,{"aria-busy":o,"aria-label":o?`새로고침 중`:`현재 화면 새로고침`,class:`inline-flex size-11 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white transition hover:border-slate-300 hover:bg-slate-50 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-wait disabled:opacity-60 ${o?`text-teal-700`:`text-slate-600`}`,disabled:n||o,onClick:r,title:o?`새로고침 중`:`새로고침`,type:`button`,children:o?H(hn,{class:`size-5 animate-spin`}):H(hn,{class:`size-5`})}),H(`button`,{"aria-controls":`smartsafehub-mobile-menu`,"aria-expanded":f,"aria-label":f?`모바일 메뉴 닫기`:`모바일 메뉴 열기`,class:`inline-flex size-11 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white text-slate-700 transition hover:bg-slate-50 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:()=>p(e=>!e),type:`button`,children:H(f?Mn:An,{class:`size-5`})})]})]}),f?H(`div`,{class:`ssh-mobile-menu border-t border-slate-100 py-4`,id:`smartsafehub-mobile-menu`,children:[H(ii,{accountRegistered:e,demo:d,route:s,updateCount:u}),d?null:H(`div`,{class:`mt-5 space-y-1 border-t border-slate-100 pt-4`,children:H(`a`,{class:`${ni(!1)} text-rose-700 hover:bg-rose-50 hover:text-rose-800`,href:be(`/admin/logout`),children:[H(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg bg-rose-50 text-rose-600`,children:H(kn,{class:`size-5`})}),`로그아웃`]})})]}):null]}),H(`aside`,{class:`hidden min-h-screen border-r border-slate-200 bg-white md:flex md:flex-col`,"data-collapsed":t?`true`:`false`,children:H(`div`,{class:`sticky top-0 flex h-screen flex-col`,children:[H(`div`,{class:`flex h-[4.5rem] min-h-[4.5rem] shrink-0 items-center border-b border-slate-100 ${t?`justify-center px-2`:`gap-3 px-4`}`,children:[H(`a`,{"aria-label":`SmartSafeHub Dashboard`,class:`flex items-center no-underline ${t?`justify-center`:`min-w-0 flex-1 gap-3`}`,href:`#home`,title:t?`SmartSafeHub`:void 0,children:[H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-950 text-teal-300 shadow-sm shadow-slate-950/10`,children:H(Yt,{class:`size-5`})}),t?null:H(`div`,{class:`min-w-0`,children:[H(`strong`,{class:`block truncate text-sm font-black tracking-tight text-slate-950`,children:`SmartSafeHub`}),H(`span`,{class:`block text-[0.68rem] font-bold uppercase tracking-[0.14em] text-slate-400`,children:`Home Gateway`})]})]}),H(`button`,{"aria-controls":`smartsafehub-desktop-navigation`,"aria-expanded":!t,"aria-label":t?`사이드바 펼치기`:`사이드바 접기`,class:`ssh-sidebar-toggle absolute right-0 top-[4.5rem] z-20 inline-flex size-7 translate-x-1/2 -translate-y-1/2 shrink-0 items-center justify-center rounded-full transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:i,title:t?`사이드바 펼치기`:`사이드바 접기`,type:`button`,children:H(t?Pn:Nn,{class:`size-4`})})]}),H(`nav`,{"aria-label":`SmartSafeHub 메뉴`,class:`flex-1 overflow-y-auto py-5 ${t?`px-2`:`px-3`}`,id:`smartsafehub-desktop-navigation`,children:H(ii,{accountRegistered:e,collapsed:t,demo:d,route:s,updateCount:u})}),d?null:H(`div`,{class:`border-t border-slate-100 ${t?`p-2`:`p-3`}`,children:H(`a`,{"aria-label":`SmartSafeHub에서 로그아웃`,class:`${ni(!1,t)} mt-1 text-rose-700 hover:bg-rose-50 hover:text-rose-800`,href:be(`/admin/logout`),title:t?`로그아웃`:void 0,children:[H(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg bg-rose-50 text-rose-600`,children:H(kn,{class:`size-5`})}),t?null:`로그아웃`]})})]})})]})}var oi=`smartsafehub.sidebar.collapsed`;function si(){if(typeof window>`u`)return!1;try{return window.localStorage.getItem(oi)===`1`}catch{return!1}}function ci({accountRegistered:e,children:t,loading:n,onRefresh:r,refreshing:i,route:a,updateCount:o,demo:s=!1}){let c=Yr[a],[l,u]=F(si),[d,f]=F(Rn);return I(()=>{try{window.localStorage.setItem(oi,l?`1`:`0`)}catch{}},[l]),I(()=>{zn(d),Bn(d)},[d]),H(`div`,{class:`ssh-app min-h-screen bg-slate-50 text-slate-950 md:grid md:transition-[grid-template-columns] md:duration-200 md:ease-out ${l?`md:grid-cols-[5rem_minmax(0,1fr)]`:`md:grid-cols-[16rem_minmax(0,1fr)]`}`,"data-theme":d,children:[H(ai,{accountRegistered:e,demo:s,collapsed:l,loading:n,onRefresh:r,onToggleCollapsed:()=>u(e=>!e),onToggleTheme:()=>f(e=>e===`dark`?`light`:`dark`),refreshing:i,route:a,theme:d,title:c.title,updateCount:o}),H(`div`,{class:`min-w-0 md:min-h-screen`,children:[H(Zr,{description:c.description,loading:n,onRefresh:r,onToggleTheme:()=>f(e=>e===`dark`?`light`:`dark`),refreshing:i,theme:d,title:c.title}),H(`main`,{class:`ssh-product-main w-full max-w-[1600px] bg-slate-50 px-4 pb-8 sm:px-6 sm:pb-10 lg:px-8 lg:pb-12 xl:px-10 ${n?`pt-2 sm:pt-2 lg:pt-3`:`pt-5 sm:pt-6 lg:pt-8`}`,children:t})]})]})}function li({active:e,label:t,tabs:n}){return H(`nav`,{"aria-label":t,class:`mb-5 min-w-0`,role:`tablist`,children:H(`div`,{class:`grid w-full min-w-0 gap-2 ${n.length===3?`grid-cols-3 sm:max-w-[592px]`:`grid-cols-2 sm:max-w-[392px]`}`,children:n.map(t=>{let r=t.id===e;return H(`a`,{"aria-controls":`${t.id}-panel`,"aria-selected":r,class:`flex min-h-11 min-w-0 items-center justify-center rounded-xl border px-2 py-2.5 text-center text-[11px] font-extrabold leading-5 transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-teal-500 sm:px-4 sm:text-sm ${r?`border-teal-200 bg-teal-50 text-teal-800`:`border-slate-200 bg-white text-slate-600 hover:border-teal-200 hover:text-teal-700`}`,href:t.href,id:`${t.id}-tab`,role:`tab`,tabIndex:r?0:-1,onKeyDown:e=>{if(![`ArrowLeft`,`ArrowRight`,`Home`,`End`].includes(e.key))return;e.preventDefault();let r=n.findIndex(e=>e.id===t.id),i=e.key===`Home`?0:e.key===`End`?n.length-1:(r+(e.key===`ArrowRight`?1:-1)+n.length)%n.length,a=e.currentTarget.parentElement?.children[i];a?.focus(),a?.click()},children:t.label},t.id)})})})}function K(e,t){return e instanceof Error?e.message:t}function ui({active:e=!0,fallbackError:t,loader:n,pollInterval:r,refreshOnFocus:i=!1,refreshOnVisible:a=!1,staleTimeMs:o=3e4}){let[s,c]=F({data:null,error:null,loading:e,refreshing:!1}),l=L(!1),u=L(!0),d=L(null),f=L(null),p=L(0),m=L(null),h=L(null),g=L(0);I(()=>(u.current=!0,()=>{u.current=!1,p.current+=1,f.current?.abort()}),[]);let _=R((e=!1)=>{if(d.current)return d.current;u.current&&c(t=>({...t,error:null,loading:t.data===null,refreshing:e}));let r,i=++p.current,a=new AbortController;return f.current=a,m.current=Date.now(),r=n(a.signal).then(e=>{i!==p.current||a.signal.aborted||(h.current=Date.now(),g.current=0,u.current&&c({data:e,error:null,loading:!1,refreshing:!1}))}).catch(e=>{i!==p.current||a.signal.aborted||(g.current+=1,u.current&&c(n=>({...n,error:K(e,t),loading:!1,refreshing:!1})))}).finally(()=>{d.current===r&&(d.current=null),f.current===a&&(f.current=null)}),d.current=r,r},[t,n]);I(()=>{e?l.current||(l.current=!0,s.data!==null&&h.current!==null&&Date.now()-h.current{if(!e||v==null||v<=0)return;let t=!1,n=null,r=()=>{n!==null&&(window.clearTimeout(n),n=null)},o=()=>{let e=Date.now();if(g.current>0&&m.current!==null){let t=Math.min(3e4,3e3*2**Math.min(g.current-1,4));return Math.max(0,m.current+t-e)}return h.current===null?0:Math.max(0,h.current+v-e)},s=()=>{r(),!(t||document.visibilityState===`hidden`)&&(n=window.setTimeout(()=>{n=null,!(t||document.visibilityState===`hidden`)&&(o()>0?s():_(!1).finally(s))},o()))},c=()=>{r(),!(t||document.visibilityState===`hidden`)&&(o()>0?s():_(!1).finally(s))},l=()=>{document.visibilityState===`hidden`?r():a?_(!1).finally(s):c()},u=()=>{c()};return document.addEventListener(`visibilitychange`,l),i&&window.addEventListener(`focus`,u),s(),()=>{t=!0,r(),document.removeEventListener(`visibilitychange`,l),i&&window.removeEventListener(`focus`,u)}},[e,v,_,i,a]);let y=R(()=>_(!0),[_]),b=R(e=>{u.current&&(h.current=Date.now(),g.current=0,c(t=>({...t,data:e,error:null,loading:!1,refreshing:!1})))},[]);return{...s,refresh:y,replaceData:b}}var di=6e4;function fi(e){let t=ui({active:e,fallbackError:`최근 활동을 불러오지 못했습니다.`,loader:()=>Yn(),pollInterval:di,refreshOnFocus:!0}),[n,r]=F({savingCloudSync:!1,actionError:null,actionMessage:null}),i=R(async e=>{r({savingCloudSync:!0,actionError:null,actionMessage:null});try{let n=await Xn(e);return t.replaceData(n),r({savingCloudSync:!1,actionError:null,actionMessage:e?`Cloud 활동 기록 전송을 켰습니다. 지금부터 발생하는 활동을 Cloud에 전송합니다.`:`Cloud 활동 기록 전송을 껐습니다. 로컬 최근 활동은 계속 기록됩니다.`}),!0}catch(e){return r({savingCloudSync:!1,actionError:K(e,`Cloud 활동 기록 설정을 변경하지 못했습니다.`),actionMessage:null}),!1}},[t.replaceData]),a=R(()=>{r(e=>({...e,actionError:null,actionMessage:null}))},[]);return{...t,...n,dismissActionFeedback:a,setCloudSyncEnabled:i}}var pi=`/tmp/smartsafehub/config-backup.tar.gz`,mi=`/cgi-backup`,hi=`/cgi-upload`;function gi(){let e=window.__SMARTHUB_BOOTSTRAP__?.sessionId;if(!e)throw new B(`BOOTSTRAP_MISSING`,`LuCI 세션 정보를 찾을 수 없습니다.`);return e}function _i(e){return(e?.match(/filename="?([^";]+)"?/i))?.[1]?.trim()||`backup-openwrt.tar.gz`}function vi(e,t){let n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=e,r.style.display=`none`,(document.body??document.documentElement).appendChild(r),r.click(),r.remove(),window.setTimeout(()=>URL.revokeObjectURL(n),1e3)}async function yi(){let e=ve(mi),t=await fetch(e,{method:`POST`,credentials:`same-origin`,headers:{"Content-Type":`application/x-www-form-urlencoded;charset=UTF-8`},body:new URLSearchParams({sessionid:gi()}).toString()});if(!t.ok)throw new B(`SYSTEM_BACKUP_DOWNLOAD_FAILED`,`설정 백업 생성에 실패했습니다. (HTTP ${t.status})`);let n=await t.blob();if(n.size<=0)throw new B(`SYSTEM_BACKUP_DOWNLOAD_EMPTY`,`설정 백업 파일이 비어 있습니다.`);vi(_i(t.headers.get(`Content-Disposition`)),n)}function bi(e,t){let n;try{n=gi()}catch(e){return Promise.reject(e)}return new Promise((r,i)=>{let a=new XMLHttpRequest,o=new FormData;o.append(`sessionid`,n),o.append(`filename`,pi),o.append(`filedata`,e),a.open(`POST`,ve(hi)),a.timeout=0,a.upload.addEventListener(`progress`,e=>{!e.lengthComputable||e.total<=0||t?.(Math.min(100,Math.max(0,e.loaded/e.total*100)))}),a.addEventListener(`error`,()=>{i(new B(`SYSTEM_BACKUP_UPLOAD_FAILED`,`설정 백업 파일을 공유기에 업로드하지 못했습니다.`))}),a.addEventListener(`load`,()=>{if(a.status<200||a.status>=300){i(new B(`SYSTEM_BACKUP_UPLOAD_HTTP_ERROR`,`설정 백업 업로드가 HTTP ${a.status} 오류를 반환했습니다.`));return}let n;try{n=JSON.parse(a.responseText)}catch{i(new B(`SYSTEM_BACKUP_UPLOAD_INVALID_RESPONSE`,`설정 백업 업로드 응답을 확인하지 못했습니다.`));return}n.failure?i(new B(n.failure,n.message||`설정 백업 파일 업로드가 거부되었습니다.`)):(t?.(100),r({...n,name:e.name}))}),a.send(o)})}var xi=16777216;function Si(){let[e,t]=F(null),[n,r]=F(null),[i,a]=F(null),[o,s]=F(null),[c,l]=F(null),[u,d]=F(!1),f=R(async()=>{t(`download`),r(null),a(null);try{await yi(),a(`현재 설정 백업을 다운로드했습니다.`)}catch(e){r(K(e,`설정 백업을 다운로드하지 못했습니다.`))}finally{t(null)}},[]),p=R(async e=>{if(r(null),a(null),s(null),d(!1),e.size<=0||e.size>xi)return r(`설정 백업 파일은 16MB 이하여야 합니다.`),!1;try{t(`upload`),l(0),await bi(e,l),t(`validate`);let n=await Mr(e.name);return s(n),a(`백업 파일 검증이 완료되었습니다. 복원 내용을 확인해 주세요.`),!0}catch(e){return r(K(e,`설정 백업 파일을 검증하지 못했습니다.`)),!1}finally{t(null),l(null)}},[]),m=R(async()=>{t(`discard`),r(null),a(null);try{return await Pr(),s(null),d(!1),a(`업로드한 백업 파일을 삭제했습니다.`),!0}catch(e){return r(K(e,`업로드한 백업 파일을 삭제하지 못했습니다.`)),!1}finally{t(null)}},[]),h=R(async()=>{if(!o)return r(`먼저 복원할 백업 파일을 업로드하고 검증해 주세요.`),!1;t(`restore`),r(null),a(null);try{let e=await Nr();return d(e.accepted&&e.rebooting),s(null),a(e.accepted?`설정을 복원했습니다. 공유기가 재부팅되며 네트워크 설정에 따라 다시 연결해야 할 수 있습니다.`:`설정 복원 요청이 접수되지 않았습니다.`),e.accepted}catch(e){return r(K(e,`설정 백업을 복원하지 못했습니다.`)),!1}finally{t(null)}},[o]);return{action:e,discard:m,dismissFeedback:R(()=>{r(null),a(null)},[]),download:f,error:n,message:i,restore:h,restoreAccepted:u,upload:p,uploadProgress:c,validated:o}}var Ci=15e3;function wi(e,t=!0){return ui({active:e,fallbackError:`연결된 기기 목록을 불러오지 못했습니다.`,loader:Jn,...t?{pollInterval:Ci}:{}})}var Ti=`/tmp/smartsafehub/firmware.bin`,Ei=`/cgi-upload`;function Di(e,t){let n=window.__SMARTHUB_BOOTSTRAP__;return n?.sessionId?new Promise((r,i)=>{let a=new XMLHttpRequest,o=new FormData;o.append(`sessionid`,n.sessionId),o.append(`filename`,Ti),o.append(`filedata`,e);let s=ve(Ei);a.open(`POST`,s),a.timeout=0,a.upload.addEventListener(`progress`,e=>{!e.lengthComputable||e.total<=0||t?.(Math.min(100,Math.max(0,e.loaded/e.total*100)))}),a.addEventListener(`error`,()=>{console.error(`[SmartSafeHub] firmware upload network error`,{endpoint:s,destination:Ti,fileName:e.name,fileSize:e.size,readyState:a.readyState,status:a.status}),i(new B(`FIRMWARE_UPLOAD_FAILED`,`펌웨어 파일 업로드에 실패했습니다. (${s}, 네트워크 오류)`))}),a.addEventListener(`load`,()=>{if(a.status<200||a.status>=300){console.error(`[SmartSafeHub] firmware upload HTTP error`,{endpoint:s,destination:Ti,fileName:e.name,fileSize:e.size,readyState:a.readyState,status:a.status,response:a.responseText}),i(new B(`FIRMWARE_UPLOAD_HTTP_ERROR`,`펌웨어 업로드가 HTTP ${a.status} 오류를 반환했습니다. (${s})`));return}let n;try{n=JSON.parse(a.responseText)}catch{console.error(`[SmartSafeHub] firmware upload returned invalid JSON`,{endpoint:s,destination:Ti,fileName:e.name,fileSize:e.size,readyState:a.readyState,status:a.status,response:a.responseText}),i(new B(`FIRMWARE_UPLOAD_INVALID_RESPONSE`,`펌웨어 업로드 응답을 확인하지 못했습니다. (${s})`));return}n.failure?i(new B(n.failure,n.message||`펌웨어 파일 업로드가 거부되었습니다.`)):(t?.(100),r({...n,name:e.name}))}),a.send(o)}):Promise.reject(new B(`BOOTSTRAP_MISSING`,`LuCI 세션 정보를 찾을 수 없습니다.`))}var Oi=3e5,ki=1e3,Ai=500,ji=3e3,Mi=3e4,Ni=15e3,Pi=5e3;function Fi(e){return new Promise(t=>window.setTimeout(t,e))}function Ii(e){return e===`checking`||e===`downloading`||e===`verifying`}function Li(e=!0){let[t,n]=F(null),r=ui({active:e||Ii(t??void 0),fallbackError:`펌웨어 업데이트 상태를 불러오지 못했습니다.`,loader:_r,pollInterval:e=>Ii(e?.phase)?ki:Oi,refreshOnFocus:!0,refreshOnVisible:Ii(t??void 0)});I(()=>{n(r.data?.phase??null)},[r.data?.phase]);let[i,a]=F(null),[o,s]=F(null),[c,l]=F(null),[u,d]=F(null),[f,p]=F(!1),m=L(null);I(()=>()=>{m.current!==null&&window.clearTimeout(m.current)},[]);let h=R(e=>{n(e),r.data&&r.replaceData({...r.data,phase:e,lastError:null})},[r]),g=R(async(e,t,n,i)=>{a(e),s(null),l(null);try{if(!(await n()).accepted)throw Error(`펌웨어 작업 요청이 접수되지 않았습니다.`);h(t),a(null),window.setTimeout(()=>void r.refresh(),400)}catch(e){a(null),s(K(e,i))}},[h,r]),_=R(()=>g(`check`,`checking`,vr,`펌웨어 업데이트 확인을 시작하지 못했습니다.`),[g]),v=R(()=>g(`prepare`,`downloading`,yr,`펌웨어 다운로드를 시작하지 못했습니다.`),[g]),y=R(async()=>{let e=Date.now(),t=null;for(;Date.now()-e{a(`upload`),s(null),l(null),d(0);try{if(await Di(e,d),a(`validate-upload`),!(await br(e.name)).accepted)throw Error(`업로드한 펌웨어 검증 요청이 접수되지 않았습니다.`);h(`verifying`),d(null);let t=await y();if(a(null),t.phase===`error`)return!1;if(!t.prepared)throw Error(`검증된 펌웨어의 설치 준비 정보를 확인하지 못했습니다. 다시 시도해 주세요.`);return l(`펌웨어 검증이 완료되었습니다. 설치 옵션을 확인해 주세요.`),!0}catch(e){return a(null),d(null),s(K(e,`펌웨어 파일을 업로드하지 못했습니다.`)),!1}},[h,y]),x=R(()=>{p(!0);let e=async()=>{try{if((await fetch(window.location.pathname,{cache:`no-store`,credentials:`same-origin`})).ok){window.location.reload();return}}catch{}m.current=window.setTimeout(e,Pi)};m.current=window.setTimeout(e,Ni)},[]),S=R(async e=>{a(`install`),s(null),l(null);try{if(!(await xr(e)).accepted)throw Error(`펌웨어 설치 요청이 접수되지 않았습니다.`);return h(`flashing`),a(null),x(),!0}catch(e){return a(null),s(K(e,`펌웨어 설치를 시작하지 못했습니다.`)),!1}},[h,x]),C=R(async()=>{a(`discard`),s(null),l(null);try{if(!(await Sr()).accepted)throw Error(`준비된 펌웨어 정리 요청이 접수되지 않았습니다.`);return a(null),l(`준비된 펌웨어 파일을 삭제했습니다.`),await r.refresh(),!0}catch(e){return a(null),s(K(e,`준비된 펌웨어를 정리하지 못했습니다.`)),!1}},[r]),w=R(()=>{s(null),l(null)},[]);return{...r,action:i,actionError:o,message:c,uploadProgress:u,reconnecting:f,check:_,prepare:v,upload:b,install:S,discard:C,dismissFeedback:w}}var Ri={"#home":`home`,"#activity":`activity`,"#network":`network`,"#network/internet":`network`,"#network/lan":`network`,"#wan":`network`,"#lan":`network`,"#wifi":`wifi`,"#iptv":`iptv`,"#devices":`devices`,"#safeshield":`safeshield`,"#rules":`rules`,"#account":`account`,"#apps":`apps`,"#system":`system`,"#settings":`settings`,"#settings/diagnostics":`settings`,"#settings/time":`settings`,"#settings/management":`settings`};function zi(){return Ri[window.location.hash]??`home`}function Bi(){let[e,t]=F(zi);return I(()=>{let e=()=>t(zi());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),e}function Vi(e){return e===`#lan`||e===`#network/lan`?`lan`:`internet`}function Hi(e){return e===`#settings/time`?`time`:e===`#settings/management`?`management`:`diagnostics`}function Ui(){let e=window.location.hash;return{network:Vi(e),settings:Hi(e)}}function Wi(){let[e,t]=F(Ui);return I(()=>{let e=()=>t(Ui());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),e}var Gi=6e4,Ki=1e3,qi=[400,800,1200,1600],Ji=[400,800,1200,2e3,4e3];function Yi(e){return new Promise(t=>window.setTimeout(t,e))}function Xi(e){let t=ui({active:e,fallbackError:`장치 진단 상태를 불러오지 못했습니다.`,loader:ir,pollInterval:e=>e?.generatedAt?Gi:Ki,refreshOnFocus:!0}),n=L(0),[r,i]=F({running:!1,savingReporter:!1,actionError:null,actionMessage:null}),a=R(async()=>{i({running:!0,savingReporter:!1,actionError:null,actionMessage:null});try{let e=t.data?.generatedAt??0;if(!(await ar()).accepted)throw Error(`장치가 진단 요청을 접수하지 않았습니다.`);let n=t.data;for(let t of qi)if(await Yi(t),n=await ir(),n.generatedAt>0&&n.generatedAt!==e)break;return n&&t.replaceData(n),i({running:!1,savingReporter:!1,actionError:null,actionMessage:`장치 상태를 다시 진단했습니다.`}),!0}catch(e){return i({running:!1,savingReporter:!1,actionError:K(e,`장치 상태 진단을 실행하지 못했습니다.`),actionMessage:null}),!1}},[t.data,t.replaceData]),o=R(async(e,r)=>{for(let i of Ji){if(await Yi(i),n.current!==r)return;try{let i=await ir();if(n.current!==r)return;if(t.replaceData(i),i.reporter.enabled!==e)continue;if(!e||![`disabled`,`never`,`initializing`].includes(i.reporter.lastResult))return}catch{}}},[t.replaceData]),s=R(async e=>{let r=n.current+1;n.current=r;let a=t.data;a&&t.replaceData({...a,reporter:{...a.reporter,enabled:e,lastResult:e?`initializing`:`disabled`,lastErrorCode:null,nextReportAt:e?a.reporter.nextReportAt:0}}),i({running:!1,savingReporter:!0,actionError:null,actionMessage:null});try{let a=await or(e);return n.current===r&&(t.replaceData(a),i({running:!1,savingReporter:!1,actionError:null,actionMessage:e?`원격 상태 보고를 켰습니다. 첫 서버 보고를 준비합니다.`:`원격 상태 보고를 껐습니다. 로컬 진단은 계속 동작합니다.`}),o(e,r)),!0}catch(e){return n.current===r&&(a&&t.replaceData(a),i({running:!1,savingReporter:!1,actionError:K(e,`원격 상태 보고 설정을 변경하지 못했습니다.`),actionMessage:null})),!1}},[o,t.data,t.replaceData]),c=R(()=>{i(e=>({...e,actionError:null,actionMessage:null}))},[]);return{...t,...r,dismissActionFeedback:c,runDiagnostic:a,setReporterEnabled:s}}function Zi(e){let t=ui({active:e,fallbackError:`IPTV 설정을 불러오지 못했습니다.`,loader:Hr,refreshOnFocus:!0}),[n,r]=F(!1),[i,a]=F(null),o=R(async e=>{r(!0),a(null);try{let n=await Ur(e);return t.replaceData(n.settings),r(!1),a({kind:`success`,message:e.enabled?n.changed?`IPTV 설정을 적용했습니다.`:`IPTV 설정을 다시 적용했습니다.`:`IPTV 기능을 껐습니다.`}),!0}catch(e){return r(!1),a({kind:`error`,message:K(e,`IPTV 설정을 적용하지 못했습니다.`)}),!1}},[t.replaceData]),s=R(()=>a(null),[]);return{...t,saving:n,feedback:i,save:o,dismissFeedback:s}}var Qi=4e3;function $i(e){let t=ui({active:e,fallbackError:`내부 네트워크 설정을 불러오지 못했습니다.`,loader:zr}),n=L(e),[r,i]=F({action:null,feedback:null});I(()=>{n.current=e},[e]);let a=R((e,r)=>{t.replaceData(e.settings),e.changed?e.addressChanged?i({action:null,feedback:{kind:`warning`,message:r?`추천 대역 ${e.settings.lan.subnet}을 저장했습니다. 네트워크가 다시 적용되면 새 공유기 주소로 다시 연결해 주세요.`:`내부 네트워크 주소를 저장했습니다. 네트워크가 다시 적용되면 새 공유기 주소로 다시 연결해 주세요.`,newAddress:e.newAddress??e.settings.lan.address}}):(i({action:null,feedback:{kind:`success`,message:r?`추천 내부 네트워크 설정을 적용했습니다.`:`내부 네트워크 설정을 저장했습니다.`}}),e.reloadScheduled&&window.setTimeout(()=>{n.current&&t.refresh()},Qi)):i({action:null,feedback:{kind:`success`,message:`변경된 내부 네트워크 설정이 없습니다.`}})},[t.refresh,t.replaceData]),o=R(async e=>{i({action:`saving`,feedback:null});try{let t=await Br(e);return a(t,!1),!0}catch(e){return i({action:null,feedback:{kind:`error`,message:K(e,`내부 네트워크 설정을 저장하지 못했습니다.`)}}),!1}},[a]),s=R(async()=>{i({action:`auto`,feedback:null});try{let e=await Vr();return a(e,!0),!0}catch(e){return i({action:null,feedback:{kind:`error`,message:K(e,`추천 내부 네트워크를 적용하지 못했습니다.`)}}),!1}},[a]),c=R(()=>{i(e=>({...e,feedback:null}))},[]);return{...t,...r,save:o,applyRecommendation:s,dismissFeedback:c}}var ea=5e3;function ta(e){let t=ui({active:e,fallbackError:`인터넷 연결 설정을 불러오지 못했습니다.`,loader:Ir}),n=L(e),[r,i]=F({action:null,feedback:null});I(()=>{n.current=e},[e]);let a=R(()=>{window.setTimeout(()=>{n.current&&t.refresh()},ea)},[t.refresh]),o=R(async e=>{i({action:`saving`,feedback:null});try{let n=await Lr(e);return t.replaceData(n.settings),i({action:null,feedback:{kind:n.changed?`warning`:`success`,message:n.changed?`인터넷 연결 설정을 저장했습니다. WAN을 다시 연결하는 동안 잠시 인터넷이 끊길 수 있습니다.`:`변경된 인터넷 연결 설정이 없습니다.`}}),n.reconnectScheduled&&a(),!0}catch(e){return i({action:null,feedback:{kind:`error`,message:K(e,`인터넷 연결 설정을 저장하지 못했습니다.`)}}),!1}},[t.replaceData,a]),s=R(async()=>{i({action:`reconnecting`,feedback:null});try{let e=await Rr();t.replaceData(e.settings),i({action:null,feedback:{kind:`warning`,message:`WAN 재연결을 시작했습니다. 인터넷 연결이 다시 올라오면 상태를 자동으로 새로고침합니다.`}}),e.reconnectScheduled&&a()}catch(e){i({action:null,feedback:{kind:`error`,message:K(e,`WAN 재연결을 시작하지 못했습니다.`)}})}},[t.replaceData,a]),c=R(()=>{i(e=>({...e,feedback:null}))},[]);return{...t,...r,save:o,reconnect:s,dismissFeedback:c}}var na=`safeshield`,ra=`smartsafehub`;function ia(e,t){return typeof e==`string`&&e.length>0?e:t}function aa(e){return typeof e==`string`?e:``}function oa(e){return typeof e==`number`&&Number.isFinite(e)?e:0}function sa(e){return e===!0}function ca(e){return Array.isArray(e)?e.length:0}function la(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function ua(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:{}}function da(e){let t=ua(e.error),n=aa(t.code)||`UNKNOWN_ERROR`,r=aa(t.message)||`SafeShield API 요청을 처리하지 못했습니다.`;return new B(`SAFESHIELD_${n.toUpperCase()}`,r)}async function fa(e,t={},n){let r=await Wt(na,e,t,{...n?{signal:n}:{},priority:n?`low`:`normal`}),i=ua(r);if(i.ok===!1)throw da(i);return r}async function pa(e,t,n,r=t){try{return await V(ra,e,t)}catch(e){if(e instanceof B&&[`RPC_PERMISSION_DENIED`,`UBUS_3`,`UBUS_6`].includes(e.code))return fa(n,r);throw e}}function ma(){return{enabled:!1,collectorRunning:!1,available:!1,schemaVersion:0,volatile:!0,startedAt:0,updatedAt:0,retentionHours:0,totals:{queries:0,blocked:0},hourly:[],deviceLimit:0,devicesTruncated:!1,devices:[]}}function ha(e){let t=ua(e);if(Object.keys(t).length===0)return ma();let n=ua(t.schema),r=ua(t.totals),i=Array.isArray(t.hourly)?t.hourly.map(e=>ua(e)).map(e=>({bucketStart:oa(e.bucket_start),queries:oa(e.queries),blocked:oa(e.blocked)})).filter(e=>e.bucketStart>0).sort((e,t)=>e.bucketStart-t.bucketStart):[],a=Array.isArray(t.devices)?t.devices.map(e=>ua(e)).map(e=>{let t=aa(e.ip),n=aa(e.mac);return{id:aa(e.id)||n||(t?`ip:${t}`:``),mac:n,ip:t,hostname:aa(e.hostname),identified:sa(e.identified),queries:oa(e.queries),blocked:oa(e.blocked)}}).filter(e=>e.id.length>0):[];return{enabled:sa(t.enabled),collectorRunning:sa(t.collector_running),available:t.available!==!1,schemaVersion:oa(n.version),volatile:t.volatile!==!1,startedAt:oa(t.started_at),updatedAt:oa(t.updated_at),retentionHours:oa(t.retention_hours),totals:{queries:oa(r.queries),blocked:oa(r.blocked)},hourly:i,deviceLimit:oa(t.device_limit),devicesTruncated:sa(t.devices_truncated),devices:a}}function ga(){return{available:!1,version:null,enabled:!1,active:!1,status:`unavailable`,stage:null,summary:{label:`Unavailable`,message:`SafeShield status API is unavailable`,severity:`warning`},runtime:{refreshdRunning:!1,dnsmasqRunning:!1,dnsRuntimeOk:!1,lastResult:null,lastErrorCode:null},entitlement:{plan:null,status:null},artifact:{resolved:!1,tier:null,version:null,uniqueDomains:0,rules:0},localOverrides:{enabled:!1,allowlistPath:null,blocklistPath:null},blocklist:{installed:!1,validLineCount:0,fileSizeKb:0,verificationOk:!1},health:{overall:`unavailable`},issueCounts:{warnings:0,errors:0},timestamps:{lastAttempt:0,lastSuccess:0,lastFailure:0,lastLocalApply:0,lastLocalApplyFailure:0,nextRefreshAt:0,refreshIntervalS:0}}}function _a(e){let t=ua(e);if(Object.keys(t).length===0)return ga();let n=ua(t.summary),r=ua(t.runtime),i=ua(t.entitlement),a=ua(t.artifact),o=ua(t.local_overrides),s=ua(t.blocklist),c=ua(t.health),l=ua(t.timestamps);return{available:!0,version:ia(t.version,null),enabled:sa(t.enabled),active:sa(t.active),status:ia(t.status,`unknown`)??`unknown`,stage:ia(t.stage,null),summary:{label:ia(n.label,`Unknown`)??`Unknown`,message:ia(n.message,`SafeShield status is unknown`)??`SafeShield status is unknown`,severity:ia(n.severity,`warning`)??`warning`},runtime:{refreshdRunning:sa(r.refreshd_running),dnsmasqRunning:sa(r.dnsmasq_running),dnsRuntimeOk:sa(r.dns_runtime_ok),lastResult:ia(r.last_result,null),lastErrorCode:ia(r.last_error_code,null)},entitlement:{plan:ia(i.plan,null),status:ia(i.status,null)},artifact:{resolved:sa(a.resolved),tier:ia(a.tier,null),version:ia(a.version,null),uniqueDomains:oa(a.unique_domains),rules:oa(a.rules)},localOverrides:{enabled:sa(o.enabled),allowlistPath:ia(o.allowlist_path,null),blocklistPath:ia(o.blocklist_path,null)},blocklist:{installed:sa(s.installed),validLineCount:oa(s.valid_line_count),fileSizeKb:oa(s.file_size_kb),verificationOk:sa(s.verification_ok)},health:{overall:ia(c.overall,`unknown`)??`unknown`},issueCounts:{warnings:ca(t.warnings),errors:ca(t.errors)},timestamps:{lastAttempt:oa(l.last_attempt),lastSuccess:oa(l.last_success),lastFailure:oa(l.last_failure),lastLocalApply:oa(l.last_local_apply),lastLocalApplyFailure:oa(l.last_local_apply_failure),nextRefreshAt:oa(l.next_refresh_at),refreshIntervalS:oa(l.refresh_interval_s)}}}function va(e){let t=ua(ua(e).values);return{enabled:sa(t.enabled),applyLocalOverrides:sa(t.apply_local_overrides)}}function ya(e){let t=ua(e);return{requested:sa(t.requested),accepted:sa(t.accepted),reason:aa(t.reason)}}async function ba(){try{return ha(await fa(`statistics`))}catch(e){if(e instanceof B&&[`UBUS_3`,`UBUS_4`,`UBUS_5`].includes(e.code))return ma();throw e}}async function xa(e){let t=await pa(`safeshield_statistics_update`,{enabled:e},`config_update`,{values:{statistics_enabled:e}});return{changed:Array.isArray(t.changed)?t.changed.some(e=>e===`statistics_enabled`):!1,enabled:e,restarted:sa(t.restarted),reconciled:sa(t.reconciled)}}async function Sa(){try{return _a(await fa(`status`))}catch(e){if(e instanceof B&&[`UBUS_3`,`UBUS_4`,`UBUS_5`].includes(e.code))return ga();throw e}}async function Ca(e){return va(await fa(`config`,{},e))}async function wa(e){let t=await pa(`safeshield_set_enabled`,{enabled:e},`set_enabled`);return{changed:sa(t.changed),accepted:sa(t.accepted),targetEnabled:sa(t.target_enabled),reconciled:sa(t.reconciled)}}async function Ta(){let e=await pa(`safeshield_refresh`,{},`refresh`);return{accepted:sa(e.accepted),reason:aa(e.reason),status:_a(e.status)}}async function Ea(e){let[t,n]=await Promise.all([fa(`rules_list`,{},e),Ca(e)]),r=la(t.allow),i=la(t.block);return{allow:r,block:i,counts:{allow:r.length,block:i.length,total:r.length+i.length},safeshieldEnabled:n.enabled,applyLocalOverrides:n.applyLocalOverrides}}async function Da(e,t,n,r=!0){let i=await pa(e===`rule_add`?`safeshield_rule_add`:`safeshield_rule_delete`,{action:t,domain:n,refresh:r},e),a=sa(e===`rule_add`?i.added:i.deleted);return{action:t,domain:aa(i.domain)||n,changed:a,refresh:ya(i.refresh),rules:await Ea()}}function Oa(e,t,n=!0){return Da(`rule_add`,e,t,n)}function ka(e,t,n=!0){return Da(`rule_delete`,e,t,n)}var Aa=4500;function ja(e,t){let[n,r]=F({action:null,error:null,message:null}),i=L([]),a=L([]),o=L(null),s=R(()=>{for(let e of i.current)window.clearTimeout(e);i.current=[]},[]),c=R(()=>{for(let e of a.current)window.clearTimeout(e);a.current=[]},[]),l=R(()=>{o.current!==null&&(window.clearTimeout(o.current),o.current=null)},[]),u=R(e=>{l(),r({action:e,error:null,message:null})},[l]),d=R(e=>{l(),r({action:null,error:null,message:e}),o.current=window.setTimeout(()=>{o.current=null,r(e=>e.error!==null||e.action!==null?e:{...e,message:null})},Aa)},[l]),f=R(t=>{s(),i.current=t.map(t=>window.setTimeout(()=>{e()},t))},[s,e]),p=R(e=>{c(),a.current=e.map(e=>window.setTimeout(()=>{t()},e))},[c,t]);I(()=>()=>{s(),c(),l()},[l,c,s]);let m=R(async t=>{u(t?`enable`:`disable`);try{let n=await wa(t);d(n.changed?t?`SafeShield 보호 활성화 요청을 적용했습니다.`:`SafeShield 보호 비활성화 요청을 적용했습니다.`:t?`SafeShield 보호가 이미 활성화 상태입니다.`:`SafeShield 보호가 이미 비활성화 상태입니다.`),await e(),f([800,2e3,5e3])}catch(e){r({action:null,error:K(e,`SafeShield 작업을 수행하지 못했습니다.`),message:null})}},[u,e,f,d]),h=R(async e=>{u(e?`statistics-enable`:`statistics-disable`);try{let n=await xa(e);await t(),d(n.changed?n.reconciled?e?`차단 통계 수집을 활성화했습니다.`:`차단 통계 수집을 비활성화했습니다.`:`차단 통계 설정을 저장했습니다.`:e?`차단 통계 수집이 이미 활성화되어 있습니다.`:`차단 통계 수집이 이미 비활성화되어 있습니다.`),n.changed&&p([500,1500])}catch(e){r({action:null,error:K(e,`차단 통계 설정을 변경하지 못했습니다.`),message:null})}},[u,t,p,d]),g=R(async()=>{u(`refresh`);try{await Ta(),r({action:null,error:null,message:null}),f([700,2500,6e3,12e3])}catch(e){r({action:null,error:K(e,`SafeShield 작업을 수행하지 못했습니다.`),message:null})}},[u,f]),_=R(()=>{l(),r(e=>({...e,error:null,message:null}))},[l]);return{...n,dismissFeedback:_,refreshBlocklist:g,setEnabled:m,setStatisticsEnabled:h}}var Ma=500,Na=45e3;function Pa(e){return new Promise(t=>window.setTimeout(t,e))}function Fa(e){return e===`allow`?`허용`:`차단`}function Ia(e,t){if(!t.changed)return e===`add`?t.action===`allow`?`이미 허용 목록에 있는 도메인입니다.`:`이미 차단 목록에 있는 도메인입니다.`:`이미 삭제된 규칙입니다.`;let n=Fa(t.action),r=e===`add`?`저장`:`삭제`;return t.rules.safeshieldEnabled?t.rules.applyLocalOverrides?`${t.domain} ${n} 규칙을 ${r}했습니다.`:`${t.domain} ${n} 규칙을 ${r}했습니다. 로컬 규칙 적용 설정이 꺼져 있어 아직 DNS에는 반영되지 않습니다.`:`${t.domain} ${n} 규칙을 ${r}했습니다. SafeShield를 켜면 다음 갱신에서 적용됩니다.`}function La(e,t){let n=e===`add`?`추가`:`삭제`;return`${t.domain} ${Fa(t.action)} 규칙 ${n}를 저장했습니다. 로컬 규칙을 DNS에 적용하고 있습니다…`}function Ra(e,t){let n=e===`add`?`추가`:`삭제`;return`${t.domain} ${Fa(t.action)} 규칙 ${n}와 DNS 적용이 완료되었습니다.`}async function za(e){let t=Date.now()+Na,n=null;for(;Date.now()e.timestamps.lastLocalApply)return{kind:`success`,status:n};if(n.timestamps.lastLocalApplyFailure>e.timestamps.lastLocalApplyFailure)return{kind:`failure`,status:n};await Pa(Ma)}return{kind:`timeout`,status:n}}function Ba(e){let t=ui({active:e,fallbackError:`사용자 규칙을 불러오지 못했습니다.`,loader:Ea}),[n,r]=F({action:null,error:null,feedback:null}),i=L(0),a=R(async(e,n,a,o)=>{let s=++i.current,c=e=>{i.current===s&&r(e)};c({action:{operation:e,action:n,domain:a},error:null,feedback:null});try{let r=await Sa(),i=e===`add`?await Oa(n,a,!0):await ka(n,a,!0);if(t.replaceData(i.rules),o?.(),!(i.changed&&i.rules.safeshieldEnabled&&i.rules.applyLocalOverrides))return c({action:null,error:null,feedback:Ia(e,i)}),!0;if(!i.refresh.accepted)return c({action:null,error:`규칙은 저장되었지만 로컬 DNS 적용 요청을 시작하지 못했습니다${i.refresh.reason?` (${i.refresh.reason})`:``}.`,feedback:null}),!0;c({action:null,error:null,feedback:La(e,i)});let s;try{s=await za(r)}catch{return c({action:null,error:`규칙은 저장되었지만 DNS 적용 상태를 확인하지 못했습니다. SafeShield 상태를 확인해 주세요.`,feedback:null}),!0}return s.kind===`success`?(c({action:null,error:null,feedback:Ra(e,i)}),!0):s.kind===`disabled`?(c({action:null,error:null,feedback:`규칙은 저장되었지만 SafeShield가 꺼져 있어 DNS 적용을 대기하고 있습니다.`}),!0):s.kind===`failure`?(c({action:null,error:`규칙은 저장되었지만 로컬 DNS 적용이 실패했습니다. SafeShield 상태를 확인해 주세요.`,feedback:null}),!0):(c({action:null,error:`규칙은 저장되었지만 제한 시간 안에 로컬 DNS 적용 완료를 확인하지 못했습니다.`,feedback:null}),!0)}catch(e){return c({action:null,error:K(e,`사용자 규칙을 변경하지 못했습니다.`),feedback:null}),!1}},[t.replaceData]),o=R((e,t,n)=>a(`add`,e,t,n),[a]),s=R((e,t)=>a(`delete`,e,t),[a]),c=R(async()=>{r(e=>({...e,error:null})),await t.refresh()},[t.refresh]),l=R(()=>{r(e=>({...e,feedback:null}))},[]);return{...t,...n,error:n.error??t.error,addRule:o,deleteRule:s,dismissFeedback:l,refresh:c}}var Va=6e4;function Ha(e,t=!0){return ui({active:e,fallbackError:`SafeShield 통계를 불러오지 못했습니다.`,loader:ba,...t?{pollInterval:Va}:{}})}var Ua=[{label:`갱신 준비`,description:`차단 목록 갱신을 준비하고 있습니다.`,stages:[`starting`,`boot_delay`,`boot_refresh`,`boot_refresh_skipped`,`scheduled_refresh`,`init`]},{label:`최신 차단 목록 확인`,description:`서버에서 최신 차단 목록 정보를 확인하고 있습니다.`,stages:[`resolve_api`]},{label:`차단 목록 다운로드`,description:`최신 차단 목록을 안전하게 다운로드하고 있습니다.`,stages:[`download_artifact`]},{label:`사용자 규칙 적용`,description:`허용·차단 사용자 규칙을 새 차단 목록에 반영하고 있습니다.`,stages:[`local_overrides`,`merge`]},{label:`보호 규칙 적용`,description:`새 차단 규칙을 설치하고 DNS 보호 서비스를 갱신하고 있습니다.`,stages:[`install`,`restart_dnsmasq`]},{label:`보호 상태 확인`,description:`새 차단 목록과 DNS 보호가 정상적으로 동작하는지 확인하고 있습니다.`,stages:[`runtime_check`,`blocklist_verify`]}],Wa=new Map;Ua.forEach((e,t)=>{e.stages.forEach(e=>Wa.set(e,t))});function Ga(e,t){return e===`running`||t!==null&&Wa.has(t)}function Ka(e){let t=e===null?0:Wa.get(e)??0,n=Ua[t];return{description:n.description,label:n.label,number:t+1,total:Ua.length}}function qa(e){return(e??``).trim().toLowerCase()}function Ja(e,t){let n=qa(e);if(n.includes(`upgrade`)||n.includes(`version`))return`현재 SafeShield 버전으로는 갱신을 계속할 수 없습니다. 시스템 업데이트에서 SafeShield를 최신 버전으로 업데이트해 주세요.`;if(n.includes(`entitlement`)||n.includes(`license`)||n.includes(`unauthorized`)||n.includes(`forbidden`))return`차단 목록을 사용할 권한을 확인하지 못했습니다. SmartSafeHub 계정과 요금제 상태를 확인해 주세요.`;if(n.includes(`dnsmasq`)||n.includes(`restart`)||n.includes(`runtime`))return`DNS 보호 서비스를 정상적으로 갱신하지 못했습니다. 잠시 후 다시 갱신해 보고 문제가 계속되면 상태 점검 정보를 확인해 주세요.`;if(n.includes(`verify`)||n.includes(`sanity`))return`새 차단 목록을 적용한 뒤 보호 상태 확인을 완료하지 못했습니다. 다시 갱신해 주세요.`;if(n.includes(`download`)||n.includes(`fetch`)||n.includes(`timeout`)||n.includes(`network`)||n.includes(`wan`))return`차단 목록을 다운로드하지 못했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`;if(n.includes(`resolve`)||n.includes(`manifest`)||n.includes(`artifact`)||n.includes(`api`))return`최신 차단 목록 정보를 확인하지 못했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`;if(n.includes(`override`)||n.includes(`allowlist`)||n.includes(`merge`)||n.includes(`rule`))return`사용자 허용·차단 규칙을 새 차단 목록에 반영하지 못했습니다. 사용자 규칙을 확인한 뒤 다시 갱신해 주세요.`;if(n.includes(`install`)||n.includes(`write`)||n.includes(`space`))return`새 차단 규칙을 장치에 적용하지 못했습니다. 저장 공간과 SafeShield 상태를 확인한 뒤 다시 갱신해 주세요.`;let r=Ka(t);return r.number===2?`최신 차단 목록 정보를 확인하는 중 문제가 발생했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`:r.number===3?`차단 목록을 다운로드하는 중 문제가 발생했습니다. 인터넷 연결을 확인한 뒤 다시 갱신해 주세요.`:r.number===4?`사용자 규칙을 적용하는 중 문제가 발생했습니다. 사용자 규칙을 확인한 뒤 다시 갱신해 주세요.`:r.number===5?`새 보호 규칙을 적용하는 중 문제가 발생했습니다. 잠시 후 다시 갱신해 주세요.`:r.number===6?`새 차단 목록의 보호 상태를 확인하지 못했습니다. 다시 갱신해 주세요.`:`차단 목록 갱신을 완료하지 못했습니다. 잠시 후 다시 갱신해 주세요.`}var Ya=3e3;function Xa(e){return e?Ga(e.status,e.stage):!1}function Za(e){return ui({active:e,fallbackError:`SafeShield 상태를 불러오지 못했습니다.`,loader:Sa,pollInterval:e=>Xa(e)?Ya:null})}var Qa=3e5,$a=1e3,eo=3e3,to=`luci-app-smartsafehub`;function no(e=!0){let[t,n]=F(null),r=ui({active:e||t===`checking`||t===`installing`,fallbackError:`소프트웨어 업데이트 상태를 불러오지 못했습니다.`,loader:gr,pollInterval:e=>e?.phase===`checking`?$a:e?.phase===`installing`?eo:Qa,refreshOnFocus:!0,refreshOnVisible:t===`checking`||t===`installing`});I(()=>{n(r.data?.phase??null)},[r.data?.phase]);let[i,a]=F(null),[o,s]=F(null),[c,l]=F(null),u=L(!1),d=L(void 0);I(()=>{if(u.current||!r.data)return;let e=r.data.lastInstallAt??null,t=d.current;if(t===void 0){d.current=e;return}if(d.current=e,e===null||e===t||r.data.phase!==`idle`)return;let n=r.data.packages.find(e=>e.name===to)?.installedVersion,i=window.__SMARTHUB_BOOTSTRAP__?.assetVersion;n&&i&&n!==i&&(u.current=!0,window.location.reload())},[r.data]);let f=R(e=>{n(e),r.data&&r.replaceData({...r.data,phase:e,lastError:null})},[r]),p=R(async()=>{a(`check`),s(null),l(null);try{if(!(await Cr()).accepted)throw Error(`업데이트 확인 요청이 접수되지 않았습니다.`);f(`checking`),a(null),window.setTimeout(()=>void r.refresh(),500)}catch(e){a(null),s(K(e,`업데이트 확인을 시작하지 못했습니다.`))}},[f,r]),m=R(async()=>{a(`install`),s(null),l(null);try{if(!(await wr()).accepted)throw Error(`업데이트 설치 요청이 접수되지 않았습니다.`);f(`installing`),a(null),window.setTimeout(()=>void r.refresh(),750)}catch(e){a(null),s(K(e,`업데이트 설치를 시작하지 못했습니다.`))}},[f,r]),h=R(async e=>{a(`settings`),s(null),l(null);try{let t=await Tr(e);return r.data&&r.replaceData({...r.data,settings:t}),a(null),l(`자동 업데이트 설정을 저장했습니다.`),!0}catch(e){return a(null),s(K(e,`자동 업데이트 설정을 저장하지 못했습니다.`)),!1}},[r]),g=R(()=>{s(null),l(null)},[]);return{...r,action:i,actionError:o,message:c,check:p,dismissFeedback:g,install:m,saveSettings:h}}var ro=6e4;function io(e){return ui({active:e,fallbackError:`장치 상태를 불러오지 못했습니다.`,loader:Zn,pollInterval:ro})}function ao(e){let t=ui({active:e,fallbackError:`예약 재부팅 설정을 불러오지 못했습니다.`,loader:Ar,refreshOnFocus:!0}),[n,r]=F({saving:!1,saveError:null,saveMessage:null}),i=R(async e=>{r({saving:!0,saveError:null,saveMessage:null});try{let n=await jr(e);return t.replaceData(n),r({saving:!1,saveError:null,saveMessage:e.enabled?`예약 재부팅 일정을 저장했습니다.`:`예약 재부팅을 껐습니다.`}),!0}catch(e){return r({saving:!1,saveError:K(e,`예약 재부팅 설정을 저장하지 못했습니다.`),saveMessage:null}),!1}},[t.replaceData]),a=R(()=>{r(e=>({...e,saveError:null,saveMessage:null}))},[]);return{...t,...n,dismissSaveFeedback:a,saveSettings:i}}function oo(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,`-`)||`openwrt`}function so(e,t){let n=new Date(t*1e3).toISOString().replace(/[:.]/g,`-`);return`smartsafehub-diagnostics-${oo(e)}-${n}.json`}function co(e,t){let n=new Blob([`${JSON.stringify(t,null,2)}\n`],{type:`application/json;charset=utf-8`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,i.style.display=`none`,(document.body??document.documentElement).appendChild(i),i.click(),i.remove(),window.setTimeout(()=>URL.revokeObjectURL(r),1e3)}function lo(e){return{enabled:e.available?e.enabled:null,status:e.status,lastResult:e.runtime.lastResult,validLineCount:e.blocklist.validLineCount,blocklistInstalled:e.blocklist.installed,dnsmasqOk:e.runtime.dnsRuntimeOk}}function uo(){return{networks:[],totalClients:0,guest:null}}function fo(){return{enabled:null,status:`unavailable`,lastResult:null,validLineCount:0,blocklistInstalled:!1,dnsmasqOk:!1}}async function po(e){if(!e)throw Error(`시스템 상태가 준비되지 않았습니다. 새로고침한 뒤 다시 시도해 주세요.`);let[t,n,r]=await Promise.allSettled([Kr(),Sa(),ir()]);return{generatedAt:Math.floor(Date.now()/1e3),health:r.status===`fulfilled`?r.value:null,system:e,wifi:t.status===`fulfilled`?t.value:uo(),safeshield:n.status===`fulfilled`?lo(n.value):fo()}}function mo(e){let[t,n]=F({action:null,error:null,message:null,rebootAccepted:!1}),r=R(async()=>{n(e=>({...e,action:`diagnostics`,error:null,message:null}));try{let t=await po(e);co(so(t.system.device.hostname,t.generatedAt),t),n(e=>({...e,action:null,message:`진단 정보 파일을 만들었습니다.`}))}catch(e){n(t=>({...t,action:null,error:K(e,`시스템 작업을 완료하지 못했습니다.`)}))}},[e]),i=R(async()=>{n(e=>({...e,action:`reboot`,error:null,message:null}));try{let e=await Fr();n({action:null,error:null,message:e.accepted?`재부팅을 시작했습니다. 잠시 후 공유기에 다시 연결해 주세요.`:`재부팅 요청이 접수되지 않았습니다.`,rebootAccepted:e.accepted})}catch(e){n(t=>({...t,action:null,error:K(e,`시스템 작업을 완료하지 못했습니다.`)}))}},[]),a=R(()=>{n(e=>({...e,error:null,message:null}))},[]);return{...t,dismissFeedback:a,downloadDiagnostics:r,reboot:i}}function ho(e){let t=ui({active:e,fallbackError:`시간대 설정을 불러오지 못했습니다.`,loader:Er,refreshOnFocus:!0}),[n,r]=F({saving:!1,syncing:!1,saveError:null,saveMessage:null}),i=R(async e=>{r({saving:!0,syncing:!1,saveError:null,saveMessage:null});try{let n=await Or(e);return t.replaceData(n),r({saving:!1,syncing:!1,saveError:null,saveMessage:`시간대를 저장하고 시스템 시간 설정에 적용했습니다.`}),!0}catch(e){return r({saving:!1,syncing:!1,saveError:K(e,`시간대 설정을 저장하지 못했습니다.`),saveMessage:null}),!1}},[t.replaceData]),a=R(async()=>{r({saving:!1,syncing:!0,saveError:null,saveMessage:null});try{await kr(),await new Promise(e=>{window.setTimeout(e,1500)});let e=await Er();return t.replaceData(e),r({saving:!1,syncing:!1,saveError:null,saveMessage:`NTP 시간 동기화를 요청하고 장치 시간을 다시 확인했습니다.`}),!0}catch(e){return r({saving:!1,syncing:!1,saveError:K(e,`시간을 동기화하지 못했습니다.`),saveMessage:null}),!1}},[t.replaceData]),o=R(()=>{r(e=>({...e,saveError:null,saveMessage:null}))},[]);return{...t,...n,dismissSaveFeedback:o,saveTimezone:i,syncTime:a}}var go=5e3,_o=5e3;function vo(e){if(!e?.pairingCode||e.accountRegistered===!0)return!1;if(!e.pairingExpiresAt)return!0;let t=Date.parse(e.pairingExpiresAt);return!Number.isFinite(t)||t>Date.now()}function yo(e){let[t,n]=F(null),[r,i]=F(null),[a,o]=F(null),[s,c]=F(e),[l,u]=F(!1),[d,f]=F(!1),p=L(null),m=L(0),h=L(!0),g=R((e,t)=>!h.current||t!==m.current?!1:(n(e),i(null),c(!1),!0),[]),_=R(()=>{if(!e)return Promise.resolve(null);if(p.current)return p.current;let t=++m.current;o(null),u(!0);let n=(async()=>{try{let e=await nr();return g(e,t)&&o(null),e}catch{let e=await tr().catch(()=>null);return e&&g(e,t),h.current&&t===m.current&&o(`SmartSafeHub 서버의 최신 상태 확인이 지연되고 있습니다.`),e}finally{h.current&&u(!1),p.current=null}})();return p.current=n,n},[e,g]),v=R(async()=>{let e=++m.current;f(!0);try{let t=await rr();return g(t,e)&&o(null),t}finally{f(!1)}},[g]);I(()=>{if(!e)return;let t=!0;h.current=!0;let n=++m.current;return c(!0),i(null),o(null),tr().then(e=>{t&&(g(e,n)&&c(!1),_())}).catch(()=>{t&&(n===m.current&&(i(`기기 등록 상태를 확인하지 못했습니다.`),c(!1)),_())}),()=>{t=!1,m.current+=1}},[e,_,g]),I(()=>{if(!e)return;let t=!0,n=window.setInterval(()=>{if(document.visibilityState===`hidden`||p.current)return;let e=++m.current;tr().then(n=>{t&&g(n,e)&&o(null)}).catch(()=>{})},_o);return()=>{t=!1,window.clearInterval(n)}},[e,g]),I(()=>()=>{h.current=!1},[]);let y=Qe(()=>vo(t)||t?.pairingOperation?.phase===`starting`||t?.pairingOperation?.phase===`running`,[t]);return I(()=>{if(!e||!y)return;let t=!0,n=0,r=async()=>{let e=++m.current,i=await tr().catch(()=>null);t&&i&&g(i,e),t&&(n=window.setTimeout(()=>void r(),go))};return n=window.setTimeout(()=>void r(),go),()=>{t=!1,window.clearTimeout(n)}},[e,g,y]),{data:t,error:r,loading:s,pairingBusy:d,refresh:_,refreshing:l,requestPairing:v,syncError:a}}var bo=6e4;function xo(e,t){let[n,r]=F(null),i=L(0);return I(()=>{e&&t!==null&&(i.current+=1,r(t))},[e,t]),I(()=>{if(e)return;let t=!1,n=null,a=!1,o=0,s=async(e=!1)=>{if(t||document.visibilityState===`hidden`||a||!e&&Date.now()-oe??null)}finally{a=!1}},c=()=>{document.visibilityState===`visible`&&s()},l=()=>void s();return s(!0),n=window.setInterval(()=>void s(),bo),document.addEventListener(`visibilitychange`,c),window.addEventListener(`focus`,l),()=>{t=!0,i.current+=1,n!==null&&window.clearInterval(n),document.removeEventListener(`visibilitychange`,c),window.removeEventListener(`focus`,l)}},[e]),n}var So=[2e3,3e3];function Co(e){return new Promise(t=>window.setTimeout(t,e))}function wo(e){let t=ui({active:e,fallbackError:`Wi-Fi 설정을 처리하지 못했습니다.`,loader:Kr}),n=L(!0),r=L(e),[i,a]=F({updatingSection:null,feedback:null});I(()=>(n.current=!0,()=>{n.current=!1}),[]),I(()=>{r.current=e},[e]);let o=R(async()=>{for(let e of So){if(await Co(e),!n.current||!r.current)return;await t.refresh()}},[t.refresh]),s=R(async e=>{a({updatingSection:e.section,feedback:null});try{let n=await qr(e);return t.replaceData({...n.summary,guest:t.data?.guest??null,guestError:t.data?.guestError??!1}),a({updatingSection:null,feedback:{kind:`success`,message:n.changed?`Wi-Fi 설정을 저장하고 무선 네트워크를 다시 불러왔습니다.`:`변경된 Wi-Fi 설정이 없습니다.`}}),n.reloaded&&o(),!0}catch(e){let t=e instanceof B&&[`NETWORK_ERROR`,`RPC_TIMEOUT`].includes(e.code);return a({updatingSection:null,feedback:{kind:t?`warning`:`error`,message:t?`Wi-Fi가 다시 시작되면서 연결이 끊어졌을 수 있습니다. 변경한 SSID로 다시 연결한 뒤 화면을 새로고침해 주세요.`:K(e,`Wi-Fi 설정을 처리하지 못했습니다.`)}}),!1}},[o,t.replaceData,t.data]),c=R(async e=>{a({updatingSection:`ssh_guest`,feedback:null});try{let n=await Jr(e);return await t.refresh(),a({updatingSection:null,feedback:{kind:`success`,message:n.changed?`게스트 Wi-Fi 설정이 저장되었습니다.`:`변경된 게스트 Wi-Fi 설정이 없습니다.`}}),n.reloaded&&o(),!0}catch(e){let t=e instanceof B&&[`NETWORK_ERROR`,`RPC_TIMEOUT`].includes(e.code);return a({updatingSection:null,feedback:{kind:t?`warning`:`error`,message:t?`무선 네트워크가 다시 시작되어 연결이 끊어졌을 수 있습니다. 다시 연결한 뒤 확인해 주세요.`:K(e,`게스트 Wi-Fi 설정을 처리하지 못했습니다.`)}}),!1}},[t.refresh,o]),l=R(()=>{a(e=>({...e,feedback:null}))},[]);return{...t,...i,update:s,updateGuest:c,dismissFeedback:l}}function q({action:e,description:t,eyebrow:n,id:r,title:i}){return H(`div`,{class:`ssh-section-heading mb-4 min-w-0`,children:[H(`p`,{class:`m-0 text-[0.68rem] font-black uppercase tracking-[0.18em] text-teal-700`,children:n}),H(`div`,{class:`mt-2 flex min-w-0 flex-wrap items-center justify-between gap-3`,children:[H(`h2`,{class:`m-0 min-w-0 text-xl font-black tracking-tight text-slate-950`,id:r,children:i}),e?H(`div`,{class:`shrink-0`,children:e}):null]}),H(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500`,children:t})]})}var To=new Intl.NumberFormat(`ko-KR`),Eo=new Intl.DateTimeFormat(`ko-KR`,{dateStyle:`medium`,timeStyle:`short`});function Do(e){if(!Number.isFinite(e)||e<0)return`확인 불가`;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}일 ${n}시간`:n>0?`${n}시간 ${r}분`:`${Math.max(r,1)}분`}function Oo(e){if(!Number.isFinite(e)||e<0)return`확인 불가`;let t=[`B`,`KB`,`MB`,`GB`],n=e,r=0;for(;n>=1024&&r864e10?`기록 없음`:!Number.isFinite(t)||e>t+300||t-e>=604800?jo(e):Mo(e,t)}function Po(e){let t=/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z$/.exec(e??``);if(!t)return null;let[,n,r,i,a,o,s]=t,c=Date.UTC(Number(n),Number(r)-1,Number(i),Number(a),Number(o),Number(s)),l=new Date(c);return l.getUTCFullYear()!==Number(n)||l.getUTCMonth()+1!==Number(r)||l.getUTCDate()!==Number(i)||l.getUTCHours()!==Number(a)||l.getUTCMinutes()!==Number(o)||l.getUTCSeconds()!==Number(s)||c<=0?null:c/1e3}function Fo(e,t){if(!Number.isFinite(e)||e<=0)return`확인 불가`;let n=t.replaceAll(` `,`_`);try{return new Intl.DateTimeFormat(`ko-KR`,{dateStyle:`medium`,timeStyle:`medium`,timeZone:n}).format(new Date(e*1e3))}catch{return Eo.format(new Date(e*1e3))}}function Io(e){if(!Number.isFinite(e)||e<=0)return`확인 불가`;let t=Math.floor(e/3600),n=Math.floor(e%3600/60);return t>0?n>0?`${t}시간 ${n}분`:`${t}시간`:`${n}분`}function Lo(e){let t=Math.max(0,e.total),n=e.free+e.buffered+e.cached,r=Math.min(t,Math.max(0,e.available>0?e.available:n)),i=Math.max(0,t-r);return{used:i,percent:t>0?i/t*100:0}}function Ro(e,t){let n=e.metadata[t];return typeof n==`string`&&n.trim().length>0?n.trim():null}function zo(e,t){let n=e.metadata[t];return typeof n==`number`&&Number.isFinite(n)?n:null}function Bo(e,t){let n=e.metadata[t];return typeof n==`boolean`?n:null}function Vo(e,t){let n=Ro(e,`error_code`);return n?`${t} (오류 코드: ${n})`:t}function Ho(e){let t=Math.max(0,Math.floor(e));if(t<60)return`${t}초`;let n=Math.floor(t/60),r=t%60;if(n<60)return r>0?`${n}분 ${r}초`:`${n}분`;let i=Math.floor(n/60),a=n%60;return a>0?`${i}시간 ${a}분`:`${i}시간`}function Uo(e){let t=Ro(e,`from_version`),n=Ro(e,`to_version`);return t&&n?`${t} → ${n}`:n?`${n} 버전이 적용되었습니다.`:null}function Wo(e){return e?e.toUpperCase():null}function Go(e){switch(e){case`dhcp`:return`자동 IP(DHCP)`;case`pppoe`:return`PPPoE`;case`static`:return`고정 IPv4`;default:return e.toUpperCase()}}function Ko(e){switch(e.eventType){case`system.booted`:return{title:`공유기 부팅 감지`,description:`공유기가 켜지거나 재시작된 것을 확인했습니다.`};case`network.internet.disconnected`:return{title:`인터넷 연결 끊김 감지`,description:`공유기에서 인터넷 연결을 확인할 수 없었습니다.`};case`network.internet.recovered`:{let t=zo(e,`downtime_seconds`);return{title:`인터넷 연결 복구`,description:t!==null&&t>0?`약 ${Ho(t)} 동안 인터넷 연결이 확인되지 않았습니다.`:`공유기에서 인터넷 연결을 다시 확인했습니다.`}}case`safeshield.protection.enabled`:return{title:`SafeShield 보호 활성화`,description:`DNS 보호 기능이 활성화되었습니다.`};case`safeshield.protection.disabled`:return{title:`SafeShield 보호 비활성화`,description:`DNS 보호 기능이 비활성화되었습니다.`};case`safeshield.blocklist.updated`:{let t=zo(e,`domain_count`),n=Ro(e,`artifact_version`),r=[];return t!==null&&t>0&&r.push(`${J(t)}개 도메인 적용`),n&&r.push(`목록 ${n}`),{title:`SafeShield 차단 목록 업데이트 완료`,description:r.length>0?r.join(` · `):`최신 차단 목록을 적용했습니다.`}}case`safeshield.blocklist.update_failed`:return{title:`SafeShield 차단 목록 업데이트 실패`,description:Vo(e,`차단 목록을 업데이트하지 못했습니다.`)};case`safeshield.statistics.enabled`:return{title:`SafeShield 차단 통계 수집 활성화`,description:`기기별 차단 통계 수집을 활성화했습니다.`};case`safeshield.statistics.disabled`:return{title:`SafeShield 차단 통계 수집 비활성화`,description:`기기별 차단 통계 수집을 비활성화했습니다.`};case`safeshield.rule.added`:return{title:Ro(e,`rule_action`)===`allow`?`사용자 허용 규칙 추가`:`사용자 차단 규칙 추가`,description:`SafeShield 사용자 규칙이 변경되었습니다.`};case`safeshield.rule.removed`:return{title:Ro(e,`rule_action`)===`allow`?`사용자 허용 규칙 삭제`:`사용자 차단 규칙 삭제`,description:`SafeShield 사용자 규칙이 변경되었습니다.`};case`settings.scheduled_reboot.updated`:{let t=Bo(e,`enabled`);return{title:`예약 재부팅 설정 변경`,description:t===!0?`예약 재부팅 설정을 저장하고 새 일정에 적용했습니다.`:t===!1?`예약 재부팅을 비활성화했습니다.`:`예약 재부팅 설정을 변경했습니다.`}}case`settings.software_updates.updated`:return{title:`관리 소프트웨어 업데이트 설정 변경`,description:Bo(e,`auto_install`)===!0?`자동 설치를 포함한 업데이트 설정을 저장했습니다.`:`관리 소프트웨어 업데이트 설정을 저장했습니다.`};case`settings.health_reporter.enabled`:return{title:`원격 상태 보고 활성화`,description:`장치 상태를 SmartSafeHub Cloud에 보고하도록 설정했습니다.`};case`settings.health_reporter.disabled`:return{title:`원격 상태 보고 비활성화`,description:`SmartSafeHub Cloud로의 장치 상태 보고를 중지했습니다.`};case`settings.activity_cloud_sync.enabled`:return{title:`Cloud 활동 기록 전송 활성화`,description:`이후 발생하는 활동을 SmartSafeHub Cloud에 전송하도록 설정했습니다.`};case`settings.activity_cloud_sync.disabled`:return{title:`Cloud 활동 기록 전송 비활성화`,description:`Cloud 전송을 중지했습니다. 로컬 최근 활동은 계속 기록됩니다.`};case`settings.timezone.updated`:{let t=Ro(e,`zonename`);return{title:`시간대 설정 변경`,description:t?`공유기 시간대를 ${t}(으)로 변경했습니다.`:`공유기 시간대를 변경했습니다.`}}case`settings.wifi.updated`:return{title:`Wi-Fi 설정 변경`,description:`Wi-Fi 설정을 저장하고 무선 네트워크에 적용했습니다.`};case`settings.wan.updated`:{let t=Ro(e,`protocol`);return{title:`인터넷 설정 변경`,description:t?`${Go(t)} 방식으로 WAN 설정을 변경했습니다.`:`WAN 인터넷 연결 설정을 변경했습니다.`}}case`settings.lan.updated`:return{title:`LAN 설정 변경`,description:`내부 네트워크 및 DHCP 설정을 변경했습니다.`};case`settings.iptv.updated`:{let t=Bo(e,`enabled`),n=Ro(e,`provider`),r=n===`skb`?`SK Broadband`:n===`lgu`?`LG U+`:null;return{title:`IPTV 설정 변경`,description:t===!1?`IPTV 기능을 비활성화했습니다.`:r?`${r} IPTV 설정을 적용했습니다.`:`IPTV 설정을 적용했습니다.`}}case`software.update.completed`:return{title:`관리 소프트웨어 업데이트 완료`,description:Uo(e)};case`software.update.failed`:return{title:`관리 소프트웨어 업데이트 실패`,description:Vo(e,`관리 소프트웨어를 업데이트하지 못했습니다.`)};case`firmware.update.started`:return{title:`펌웨어 업데이트 시작`,description:`펌웨어 설치를 시작했습니다. 완료 과정에서 공유기가 재부팅됩니다.`};case`firmware.update.failed`:return{title:`펌웨어 업데이트 실패`,description:Vo(e,`펌웨어 설치 준비 또는 검증에 실패했습니다.`)};case`license.activated`:{let t=Wo(Ro(e,`to_plan`));return{title:`요금제 활성화`,description:t?`${t} 요금제가 활성화되었습니다.`:`요금제가 활성화되었습니다.`}}case`license.changed`:{let t=Wo(Ro(e,`from_plan`)),n=Wo(Ro(e,`to_plan`));return{title:`요금제 변경`,description:t&&n?`${t} → ${n}`:n?`${n} 요금제로 변경되었습니다.`:`요금제 상태가 변경되었습니다.`}}case`license.cleared`:return{title:`계정 권한 해제`,description:Ro(e,`reason`)===`manual`?`이 공유기에서 계정 권한 연결을 해제했습니다.`:`서버의 계정 권한 상태가 반영되어 이 공유기의 권한 연결이 해제되었습니다.`};case`health.issue.started`:{let t=zo(e,`warning_count`)??0,n=zo(e,`critical_count`)??0,r=[];return n>0&&r.push(`이상 ${J(n)}건`),t>0&&r.push(`주의 ${J(t)}건`),{title:`확인이 필요한 장치 상태 발견`,description:r.length>0?r.join(` · `):`장치 상태에서 확인이 필요한 항목이 발견되었습니다.`}}case`health.issue.changed`:{let t=zo(e,`warning_count`)??0,n=zo(e,`critical_count`)??0,r=[];return n>0&&r.push(`이상 ${J(n)}건`),t>0&&r.push(`주의 ${J(t)}건`),{title:`확인이 필요한 장치 상태 변경`,description:r.length>0?r.join(` · `):`확인이 필요한 장치 상태 항목이 변경되었습니다.`}}case`health.issue.resolved`:return{title:`장치 상태 정상으로 복구`,description:`이전에 확인이 필요했던 장치 상태가 정상으로 돌아왔습니다.`};default:return{title:`SmartSafeHub 활동`,description:`장치에서 새로운 활동이 기록되었습니다.`}}}function qo(e){return e===`error`?{icon:H(W,{class:`size-4`}),surface:`bg-rose-50 text-rose-700 ring-rose-200`}:e===`warning`?{icon:H(W,{class:`size-4`}),surface:`bg-amber-50 text-amber-800 ring-amber-200`}:e===`success`?{icon:H(wn,{class:`size-4`}),surface:`bg-emerald-50 text-emerald-700 ring-emerald-200`}:{icon:H(pn,{class:`size-4`}),surface:`bg-slate-100 text-slate-600 ring-slate-200`}}function Jo(e){let t=new Date(e*1e3);return new Intl.DateTimeFormat(`ko-KR`,{hour:`2-digit`,minute:`2-digit`,hour12:!1}).format(t)}function Yo(e){let t=new Date(e*1e3);return`${t.getFullYear()}-${t.getMonth()+1}-${t.getDate()}`}function Xo(e){let t=new Date(e*1e3),n=new Date,r=new Date(n.getFullYear(),n.getMonth(),n.getDate()),i=new Date(t.getFullYear(),t.getMonth(),t.getDate()),a=Math.round((r.getTime()-i.getTime())/864e5);return a===0?`오늘`:a===1?`어제`:new Intl.DateTimeFormat(`ko-KR`,{month:`long`,day:`numeric`,weekday:`short`}).format(t)}function Zo({compact:e=!1,events:t}){if(t.length===0)return H(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 px-4 py-5 text-center`,children:[H(pn,{class:`mx-auto size-5 text-slate-400`}),H(`p`,{class:`mt-2 mb-0 text-sm font-extrabold text-slate-700`,children:`아직 기록된 활동이 없습니다.`}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`상태가 실제로 변경되면 이곳에 시간순으로 기록됩니다.`})]});let n=``;return H(`div`,{class:e?`space-y-2`:`space-y-1`,children:t.map(t=>{let r=Ko(t),i=qo(t.severity),a=Yo(t.occurredAt),o=!e&&a!==n;return n=a,H(`div`,{children:[o?H(`p`,{class:`mt-5 mb-2 first:mt-0 text-xs font-black text-slate-500`,children:Xo(t.occurredAt)}):null,H(`article`,{class:`relative flex min-w-0 gap-3 ${e?`border-b border-slate-100 py-3 first:pt-0 last:border-b-0 last:pb-0`:`rounded-xl px-2 py-3 hover:bg-slate-50`}`,children:[H(`div`,{class:`w-12 shrink-0 pt-1 text-xs font-bold tabular-nums text-slate-400`,children:H(`time`,{dateTime:new Date(t.occurredAt*1e3).toISOString(),title:jo(t.occurredAt),children:Jo(t.occurredAt)})}),H(`span`,{class:`mt-0.5 grid size-8 shrink-0 place-items-center rounded-full ring-1 ring-inset ${i.surface}`,children:i.icon}),H(`div`,{class:`min-w-0 flex-1`,children:[H(`p`,{class:`m-0 text-sm font-black leading-5 text-slate-950`,children:r.title}),r.description?H(`p`,{class:`mt-1 mb-0 break-words text-xs font-medium leading-5 text-slate-500`,children:r.description}):null]})]})]},t.eventId)})})}function Qo({error:e,loading:t,onRetry:n}){return t?H(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 px-4 py-5 text-center`,children:[H(hn,{class:`mx-auto size-5 animate-spin text-teal-700`}),H(`p`,{class:`mt-2 mb-0 text-sm font-bold text-slate-500`,children:`최근 활동을 불러오는 중입니다.`})]}):e?H(`div`,{class:`rounded-xl border border-amber-200 bg-amber-50/70 px-4 py-4`,children:H(`div`,{class:`flex items-start gap-3`,children:[H(W,{class:`mt-0.5 size-5 shrink-0 text-amber-700`}),H(`div`,{class:`min-w-0 flex-1`,children:[H(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:`최근 활동을 불러오지 못했습니다.`}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:e}),n?H(`button`,{class:`mt-3 inline-flex min-h-9 items-center justify-center rounded-lg border border-amber-300 bg-white px-3 text-xs font-extrabold text-amber-800 transition hover:bg-amber-50`,onClick:n,type:`button`,children:`다시 시도`}):null]})]})}):null}function $o(e){return e.enabled?e.eligible===!1||e.phase===`ineligible`?{label:`계정 연결 필요`,description:`SmartSafeHub 계정을 연결하면 이후 발생하는 활동을 Cloud에 자동으로 동기화할 수 있습니다.`,tone:`bg-slate-100 text-slate-600 ring-slate-200`}:e.phase===`error`?{label:`동기화 확인 필요`,description:`최근 Cloud 전송을 완료하지 못했습니다. 로컬 활동 기록은 계속 보관됩니다.`,tone:`bg-amber-50 text-amber-800 ring-amber-200`}:e.phase===`syncing`?{label:`동기화 중`,description:`새 활동을 SmartSafeHub Cloud에 전송하고 있습니다.`,tone:`bg-teal-50 text-teal-800 ring-teal-200`}:e.eligible===!0?{label:`자동 동기화`,description:`새 활동이 생기면 SmartSafeHub Cloud에 자동으로 안전하게 전송합니다.`,tone:`bg-emerald-50 text-emerald-800 ring-emerald-200`}:{label:`확인 중`,description:`Cloud 활동 기록 사용 가능 여부를 확인하고 있습니다.`,tone:`bg-slate-100 text-slate-600 ring-slate-200`}:e.eligible===!1?{label:`계정 연결 필요`,description:`SmartSafeHub 계정을 연결하면 Free에서도 Cloud 활동 기록을 사용할 수 있습니다.`,tone:`bg-slate-100 text-slate-600 ring-slate-200`}:{label:`Cloud 전송 꺼짐`,description:`활동 기록은 이 공유기에만 저장됩니다. Cloud에는 새로운 활동을 전송하지 않습니다.`,tone:`bg-slate-100 text-slate-700 ring-slate-200`}}function es(e){if(e.eligible!==!0)return`—`;if(e.retentionDays>0)return`${e.retentionDays}일`;switch(e.plan?.toLowerCase()){case`free`:return`7일`;case`pro`:case`ultimate`:return`90일`;default:return`확인 중`}}function ts({actionError:e,actionMessage:t,cloud:n,onDismissFeedback:r,onSetEnabled:i,saving:a}){let o=$o(n),s=n.plan?.toUpperCase()??null,c=n.eligible===!0,l=n.enabled||c;return H(`section`,{"aria-label":`Cloud 활동 기록 설정`,class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:[H(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[H(`div`,{class:`min-w-0 flex-1`,children:[H(`div`,{class:`flex flex-wrap items-center gap-2`,children:H(`span`,{class:`rounded-full px-2.5 py-1 text-xs font-extrabold ring-1 ring-inset ${o.tone}`,children:a?`설정 중`:o.label})}),H(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:o.description})]}),H(`div`,{class:`flex shrink-0 items-center justify-end gap-3 sm:justify-start`,children:[H(`span`,{class:`text-xs font-bold text-slate-600`,children:[`Cloud 전송 `,n.enabled?`켜짐`:`꺼짐`]}),H(`button`,{"aria-checked":n.enabled,"aria-label":`Cloud 활동 기록 전송 사용`,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${n.enabled?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:a||!l,onClick:()=>i(!n.enabled),role:`switch`,type:`button`,children:H(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${n.enabled?`left-6`:`left-1`}`})})]})]}),(e||t)&&H(`div`,{class:`mt-4 flex min-w-0 items-start justify-between gap-3 rounded-xl border px-4 py-3 text-sm font-bold ${e?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,role:e?`alert`:`status`,children:[H(`span`,{class:`min-w-0`,children:e||t}),H(`button`,{class:`shrink-0 rounded-lg px-2 py-1 text-xs font-extrabold hover:bg-black/5`,onClick:r,type:`button`,children:`닫기`})]}),n.enabled?H(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`Cloud 전송을 끄면 아직 전송하지 않은 대기 기록이 삭제됩니다. 공유기의 로컬 기록은 유지됩니다.`}):null,H(`div`,{class:`mt-4 flex flex-wrap items-center gap-x-5 gap-y-1 border-t border-slate-200 pt-3 text-xs font-semibold text-slate-500`,children:[H(`span`,{children:[`마지막 동기화: `,n.lastSuccessAt>0?Mo(n.lastSuccessAt):`아직 없음`]}),H(`span`,{children:[`Cloud 보관: `,es(n)]}),n.pendingEvents>0?H(`span`,{children:[`전송 대기: `,J(n.pendingEvents),`건`]}):null]}),n.enabled&&n.phase===`error`&&n.lastErrorCode?H(`p`,{class:`mt-3 mb-0 text-xs font-semibold text-amber-700`,children:[`오류 코드: `,H(`code`,{children:n.lastErrorCode})]}):null,H(`details`,{class:`mt-3 border-t border-slate-200 pt-3`,children:[H(`summary`,{class:`cursor-pointer text-xs font-extrabold text-teal-700 hover:text-teal-800 focus-visible:rounded focus-visible:outline focus-visible:outline-2 focus-visible:outline-teal-500`,children:`Cloud 동기화 상세 정보`}),H(`dl`,{class:`mt-3 grid gap-3 sm:grid-cols-4`,children:[H(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[H(`dt`,{class:`text-xs font-bold text-slate-500`,children:`멤버십`}),H(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:s??(n.eligible===!1?`Free`:`확인 중`)})]}),H(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[H(`dt`,{class:`text-xs font-bold text-slate-500`,children:`전송 대기`}),H(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:[J(n.pendingEvents),`건`]})]}),H(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[H(`dt`,{class:`text-xs font-bold text-slate-500`,children:`마지막 동기화`}),H(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:n.lastSuccessAt>0?Mo(n.lastSuccessAt):`아직 없음`})]}),H(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3 ring-1 ring-inset ring-slate-200`,children:[H(`dt`,{class:`text-xs font-bold text-slate-500`,children:`Cloud 보관`}),H(`dd`,{class:`mt-1 text-sm font-black text-slate-900`,children:es(n)})]})]}),H(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`SmartSafeHub 계정에 연결된 Free는 최근 7일, Pro와 Ultimate는 최근 90일 동안 Cloud 활동 기록을 보관합니다. 끄면 전송 대기 데이터와 임시 인증 정보를 삭제하며, 다시 켠 뒤 새로 발생한 활동부터 Cloud에 전송합니다. 로컬 최근 활동은 항상 유지됩니다.`})]})]})}function ns({actionError:e,actionMessage:t,data:n,error:r,loading:i,onDismissActionFeedback:a,onRetry:o,onSetCloudSync:s,savingCloudSync:c}){let[l,u]=F(20),d=n?.events??[],f=d.slice(0,l),p=d.length-f.length;return H(`div`,{class:`min-w-0 space-y-6`,children:[H(`section`,{"aria-labelledby":`activity-cloud-title`,class:`min-w-0`,children:[H(q,{id:`activity-cloud-title`,eyebrow:`Cloud history`,title:`Cloud 활동 기록`,description:`활동 기록을 Cloud에 자동으로 전송할지 설정합니다. 공유기 내 최근 활동은 항상 기록됩니다.`}),H(ts,{actionError:e,actionMessage:t,cloud:n?.cloud??{enabled:!1,phase:`preparing`,eligible:null,plan:null,retentionDays:0,pendingEvents:0,lastAttemptAt:0,lastSuccessAt:0,lastUploadedCount:0,lastErrorCode:null,nextSyncAt:0},onDismissFeedback:a,onSetEnabled:s,saving:c})]}),H(`section`,{"aria-labelledby":`activity-history-title`,class:`min-w-0`,children:[H(q,{id:`activity-history-title`,eyebrow:`Local history`,title:`현재 부팅 이후의 최근 활동`,description:`인터넷, SafeShield, 업데이트, 계정 권한과 주요 설정에서 실제 상태가 변경된 시점만 기록합니다.`,action:H(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5 text-xs font-extrabold text-slate-600 ring-1 ring-inset ring-slate-200`,children:[`최대 `,n?.maxEvents??128,`건`]})}),H(`div`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:i||r&&!n?H(Qo,{error:r,loading:i,onRetry:o}):H(b,{children:[H(Zo,{events:f}),d.length>20?H(`div`,{class:`mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-slate-200 pt-4`,children:[H(`p`,{class:`m-0 text-xs font-semibold text-slate-500`,children:[J(f.length),` / `,J(d.length),`건 표시 중`]}),H(`div`,{class:`flex flex-wrap items-center gap-2`,children:[l>20?H(`button`,{class:`inline-flex min-h-10 items-center justify-center rounded-xl border border-slate-200 bg-white px-4 py-2 text-xs font-extrabold text-slate-700 transition hover:bg-slate-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>u(20),type:`button`,children:`최신 20건만 보기`}):null,p>0?H(`button`,{class:`inline-flex min-h-10 items-center justify-center rounded-xl border border-teal-200 bg-teal-50 px-4 py-2 text-xs font-extrabold text-teal-800 transition hover:bg-teal-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>u(e=>Math.min(e+20,d.length)),type:`button`,children:[`이전 활동 더 보기 (`,J(Math.min(20,p)),`건)`]}):null]})]}):null]})})]}),H(`aside`,{class:`rounded-2xl border border-slate-200 bg-slate-50 px-5 py-4`,children:[H(`p`,{class:`m-0 text-sm font-extrabold text-slate-800`,children:`로컬 활동 기록 안내`}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`이 기록은 공유기의 메모리 영역에만 보관되어 재부팅하면 초기화됩니다. 직접 설정을 변경한 작업은 성공 시점에 즉시 기록하고, 인터넷 및 장치 진단처럼 외부 상태를 확인해야 하는 항목은 실제 상태 변화가 관찰된 경우에만 추가합니다.`})]})]})}function rs(e){return!Number.isFinite(e)||e<0?`—`:e<1024?`${Math.round(e)} B`:e<1024**2?`${(e/1024).toFixed(1)} KB`:e<1024**3?`${(e/1024**2).toFixed(1)} MB`:`${(e/1024**3).toFixed(1)} GB`}function is(e){if(!e||!Number.isSafeInteger(e.totalBytes)||!Number.isSafeInteger(e.availableBytes)||e.totalBytes<=0||e.availableBytes<0||e.availableBytes>e.totalBytes||e.mount!==`/overlay`&&e.mount!==`/`)return null;let t=e.availableBytes/e.totalBytes;return{availablePercent:Math.round(t*100),availableRatio:t,availableText:rs(e.availableBytes),usedText:rs(e.totalBytes-e.availableBytes),totalText:rs(e.totalBytes),level:t<=.1?`critical`:t<=.2?`warning`:`normal`}}var as=2*Math.PI*39;function os({storage:e}){let t=is(e),n=t?(t.availableRatio*as).toFixed(2):`0`;return H(`aside`,{"aria-label":`앱 설치 저장 공간`,"data-level":t?.level??`unavailable`,class:`ssh-apps-storage-card flex min-w-0 items-center gap-3 rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5`,children:[H(`div`,{class:`ssh-apps-storage-ring relative grid size-24 shrink-0 place-items-center`,"data-level":t?.level??`unavailable`,children:[H(`svg`,{"aria-hidden":`true`,class:`size-24`,viewBox:`0 0 96 96`,children:[H(`circle`,{class:`ssh-apps-storage-track`,cx:`48`,cy:`48`,r:`39`}),t&&t.availableRatio>0?H(`circle`,{class:`ssh-apps-storage-free`,cx:`48`,cy:`48`,r:`39`,"stroke-dasharray":`${n} ${as.toFixed(2)}`}):null]}),H(`div`,{class:`absolute inset-0 flex flex-col items-center justify-center text-center`,children:[H(`strong`,{class:`text-lg leading-6 font-black text-slate-950`,children:t?`${t.availablePercent}%`:`—`}),H(`span`,{class:`text-[10px] font-bold text-slate-500`,children:`여유`})]})]}),H(`div`,{"aria-live":`polite`,class:`min-w-0 flex-1`,children:[H(`h3`,{class:`m-0 text-sm font-black text-slate-950`,children:`저장 공간`}),t?H(b,{children:[H(`p`,{class:`ssh-apps-storage-available mb-0 mt-1 text-base font-extrabold text-teal-700`,children:[t.availableText,` 남음`]}),H(`p`,{class:`mb-0 mt-1 text-[11px] leading-4 text-slate-500`,title:`앱 설치 가능 용량을 기준으로 계산하며, 파일시스템 예약 공간이 사용량에 포함될 수 있습니다.`,children:[`사용 `,t.usedText,` / 전체 `,t.totalText]})]}):H(`p`,{class:`mb-0 mt-1 text-xs leading-5 text-slate-500`,children:`용량 정보를 확인할 수 없습니다.`})]})]})}function ss(e){switch(e){case`network`:return`network`;case`security`:return`security`;case`entertainment`:return`entertainment`;case`utilities`:return`utilities`;case`other`:return`other`;case`smart_home`:case`iot`:return`smart_home`;default:return`other`}}function cs({category:e,class:t}){switch(e){case`all`:return H(en,{class:t});case`network`:return H(tn,{class:t});case`security`:return H(Yt,{class:t});case`smart_home`:return H(Qt,{class:t});case`entertainment`:return H(nn,{class:t});case`utilities`:return H(rn,{class:t});case`other`:return H(an,{class:t});default:return H(an,{class:t})}}function ls(e){return!e||typeof e.path!=`string`||e.path.length>160?null:e.type===`static`?e.path===`/retro-arcade/`?e.path:null:e.type===`luci`&&/^\/cgi-bin\/luci\/admin\/[a-z0-9_-]+(?:\/[a-z0-9_-]+)*$/.test(e.path)?e.path:null}var us=`smartsafehub:apps:dismissed-operation:v1`;function ds(e){return!e||e.phase===`idle`?``:e.operationId?`operation:${e.operationId}`:`legacy:${e.phase}:${e.action}:${e.appId}:${e.code}`}function fs(){try{return typeof window>`u`?null:window.localStorage.getItem(us)}catch{return null}}function ps(e){if(e)try{typeof window<`u`&&window.localStorage.setItem(us,e)}catch{}}var ms={E21:`서버에서 승인 정보를 확인하지 못했습니다. 인터넷 연결을 확인해 주세요.`,E22:`이 펌웨어에서 승인되지 않은 앱입니다.`,E24:`공유기의 패키지 아키텍처와 앱이 일치하지 않습니다.`,E25:`배포 저장소가 승인 당시와 달라졌거나 접근할 수 없습니다. 관리자 확인 후 다시 시도해 주세요.`,E26:`앱 설치에 필요한 메모리 또는 저장 공간이 부족합니다.`,E27:`승인된 패키지 정보가 올바르지 않습니다.`,E28:`이전에 설치한 앱의 구성이 현재 승인 정보와 다릅니다.`,E29:`동일한 패키지가 이미 다른 방법으로 설치되어 있습니다.`,E31:`앱 파일을 다운로드하지 못했습니다.`,E32:`다운로드된 앱 파일이 올바르지 않습니다.`,E33:`앱 파일의 검증 값이 일치하지 않습니다.`,E34:`패키지 설치 사전 확인에 실패했습니다.`,E35:`패키지를 설치하지 못했습니다.`,E37:`공식 OpenWrt LuCI 저장소가 승인 당시와 다릅니다. 관리자에게 확인해 주세요.`,E38:`기존 공유 라이브러리의 버전이 승인된 버전과 달라 설치할 수 없습니다.`,E51:`SmartSafeHub Apps에서 관리하는 앱만 업데이트할 수 있습니다.`,E52:`현재 설치 버전과 승인된 업데이트가 일치하지 않습니다. 앱 구성과 업데이트 버전을 확인해 주세요.`,E53:`다른 시스템 패키지 변경이 필요하여 앱 업데이트를 중단했습니다.`,E54:`앱 업데이트에 실패했습니다. 일부 패키지가 변경되었을 수 있으니 관리자에게 확인해 주세요.`,E55:`업데이트 후 설치 기록을 저장하지 못했습니다. 관리자에게 확인해 주세요.`,E41:`SmartSafeHub Apps에서 설치한 앱만 여기서 제거할 수 있습니다.`,E44:`기존 시스템에 영향을 줄 수 있어 앱 제거가 차단됐습니다.`,E45:`앱 제거에 실패했습니다.`},hs=[{id:`all`,label:`전체`},{id:`network`,label:`네트워크`},{id:`security`,label:`보안`},{id:`smart_home`,label:`스마트홈`},{id:`entertainment`,label:`엔터테인먼트`},{id:`utilities`,label:`도구`},{id:`other`,label:`기타`}];function gs({action:e}){let t=e===`remove`;return H(`span`,{"aria-live":`polite`,class:`inline-flex items-center gap-1.5 text-xs font-bold ${t?`text-red-700`:`text-teal-700`}`,role:`status`,children:[H(`svg`,{"aria-hidden":`true`,class:`size-4 animate-spin`,fill:`none`,viewBox:`0 0 24 24`,children:[H(`circle`,{cx:`12`,cy:`12`,r:`9`,stroke:`currentColor`,"stroke-width":`3`,opacity:`0.25`}),H(`path`,{d:`M21 12a9 9 0 0 0-9-9`,stroke:`currentColor`,"stroke-width":`3`,"stroke-linecap":`round`})]}),t?`제거 중…`:e===`update`?`업데이트 중…`:`설치 중…`]})}function _s({data:e,error:t,loading:n,refreshing:r,onRetry:i,installStatus:a,metrics:o,statusError:s,onRefreshStatus:c,onInstall:l,onUpdate:u,onRemove:d,demo:f=!1,onDemoAction:p}){let[m,h]=F(`all`),[g,_]=F(``),[v,y]=F(null),[x,S]=F(null),C=L(null),w=L(null),[T,E]=F(null),[D,O]=F(fs),k=e,A=k?.apps??[],j=k&&!t&&!n&&!r&&!s?Object.entries(a?.installed??{}).filter(([e,t])=>t.retired===!0&&t.managed&&!A.some(t=>t.id===e)):[],M=a?.restore,N=a?.job,P=N?.phase===`starting`||N?.phase===`running`,ee=M?.phase===`starting`||M?.phase===`running`,te=ds(N),ne=e=>{O(e),ps(e)},re=N&&N.phase!==`idle`&&te!==D;I(()=>{if(N?.phase!==`success`||!re)return;let e=window.setTimeout(()=>ne(te),7e3);return()=>window.clearTimeout(e)},[te,N?.phase,re]);let ie=N?.action===`install`||N?.action===`update`||N?.action===`remove`?N.action:null,ae=Qe(()=>A.filter(e=>(m===`all`||ss(e.category)===m)&&`${e.name} ${e.summary}`.toLocaleLowerCase().includes(g.trim().toLocaleLowerCase())),[A,m,g]);I(()=>{if(!x)return;C.current?.focus();let e=e=>{e.key===`Escape`&&(e.preventDefault(),S(null),w.current?.focus())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[x]);let oe=()=>{S(null),w.current?.focus()},se=(e,t)=>{!a||s||v!==null||P||ee||(w.current=t,S(e))},ce=async(e,t)=>{if(!(!a||s||v!==null||P||ee)){if(f)t===`remove`&&oe(),p?.();else if((t!==`update`||window.confirm(`${e.name} 앱을 최신 승인 버전으로 업데이트하시겠습니까?\n\n업데이트 중 공유기를 재부팅하지 마세요.`))&&(t!==`install`||window.confirm(`${e.name} 앱을 설치하시겠습니까?\n\n앱을 변경하는 동안 공유기를 재부팅하지 마세요.`))){t===`remove`&&oe(),E(null),y({appId:e.id,action:t});try{t===`install`?await l(e.id):t===`update`?await u(e.id):await d(e.id),c()}catch(t){E(K(t,`${e.name} 앱 작업을 시작하지 못했습니다.`))}finally{y(null)}}}};return H(`section`,{class:`min-w-0 space-y-6`,children:[x?H(`div`,{class:`fixed inset-0 z-50 flex items-center justify-center bg-slate-950/70 p-4`,onClick:e=>{e.target===e.currentTarget&&oe()},role:`presentation`,children:H(`div`,{"aria-describedby":`apps-remove-description`,"aria-labelledby":`apps-remove-title`,"aria-modal":`true`,class:`w-full max-w-md rounded-2xl border border-slate-200 bg-white p-5 shadow-xl`,onKeyDown:e=>{e.key===`Tab`&&(e.shiftKey&&e.target===C.current?(e.preventDefault(),e.currentTarget.querySelector(`[data-confirm-remove]`)?.focus()):!e.shiftKey&&e.target instanceof HTMLButtonElement&&e.target.hasAttribute(`data-confirm-remove`)&&(e.preventDefault(),C.current?.focus()))},role:`dialog`,children:[H(`h2`,{class:`m-0 text-lg font-extrabold text-slate-950`,id:`apps-remove-title`,children:`앱 제거 확인`}),H(`p`,{class:`mt-3 break-words text-sm text-slate-700`,id:`apps-remove-description`,children:[H(`strong`,{children:x.name}),` 앱을 이 공유기에서 제거하시겠습니까?`]}),H(`p`,{class:`mt-2 text-xs leading-5 text-slate-600`,children:`앱에서 제공하던 기능을 더 이상 사용할 수 없습니다. 제거하는 동안 공유기를 재부팅하지 마세요.`}),H(`div`,{class:`mt-5 flex justify-end gap-2`,children:[H(`button`,{class:`min-h-10 rounded-lg border border-slate-200 bg-white px-4 text-sm font-bold text-slate-700 transition hover:bg-slate-50`,onClick:oe,ref:C,type:`button`,children:`취소`}),H(`button`,{class:`min-h-10 rounded-lg bg-red-700 px-4 text-sm font-bold text-white transition hover:bg-red-800 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-100 disabled:opacity-50`,"data-confirm-remove":!0,disabled:!a||!!s||v!==null||P||ee,onClick:()=>void ce(x,`remove`),type:`button`,children:`앱 제거`})]})]})}):null,H(`div`,{class:`min-w-0`,children:[H(q,{eyebrow:`SmartSafeHub Apps`,title:`Apps`,description:`SmartSafeHub에서 직접 검증한 앱으로 공유기의 기능을 확장하세요.`}),H(`div`,{class:`grid min-w-0 gap-3 lg:grid-cols-[minmax(0,1fr)_minmax(0,18.5rem)]`,children:[H(`div`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:[H(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[H(`div`,{class:`flex min-w-0 items-center gap-3`,children:[H(`span`,{class:`grid size-12 shrink-0 place-items-center rounded-2xl bg-teal-50 text-teal-700`,children:H(en,{class:`size-6`})}),H(`div`,{class:`min-w-0`,children:[H(`h3`,{class:`m-0 text-base font-black text-slate-950`,children:`검증된 앱`}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`현재 펌웨어에서 확인된 앱만 표시합니다.`})]})]}),H(`div`,{class:`flex flex-wrap items-center gap-2`,children:[H(`span`,{class:`rounded-full border border-teal-200 bg-teal-50 px-3 py-1 text-xs font-bold text-teal-800`,children:k?`${A.length}개`:`확인 전`}),t&&k?H(`span`,{class:`rounded-full border border-amber-200 bg-amber-50 px-2 py-1 text-[11px] font-semibold text-amber-800`,title:t,role:`status`,children:`이전 목록`}):null,H(`button`,{class:`inline-flex min-h-10 items-center gap-2 rounded-xl border border-slate-200 bg-white px-3 text-xs font-bold text-slate-700 transition hover:border-teal-300 hover:text-teal-700 disabled:opacity-50`,disabled:n||r,onClick:i,type:`button`,children:[H(hn,{class:`size-4 ${r?`animate-spin`:``}`}),r?`확인 중`:`목록 새로고침`]})]})]}),H(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`검증된 APK를 설치·업데이트·제거할 수 있습니다. 작업 중에는 다른 앱 작업을 시작할 수 없습니다.`})]}),H(os,{storage:o?.storage})]})]}),M&&(M.phase===`starting`||M.phase===`running`||M.phase===`failed`)?H(`div`,{"aria-live":`polite`,class:`rounded-2xl border p-4 text-sm ${M.phase===`failed`?`border-amber-300 bg-amber-50 text-amber-900`:`border-teal-200 bg-teal-50 text-teal-900`}`,role:`status`,children:[H(`strong`,{children:M.phase===`failed`?`Apps 자동 복원을 완료하지 못했습니다.`:`펌웨어 업데이트 후 Apps를 복원하는 중입니다.`}),M.appId?H(`span`,{children:[` · `,M.appId]}):null,M.phase===`failed`?H(`p`,{class:`mb-0 mt-1 text-xs`,children:[ms[M.code]??`승인·연결·설치 상태를 확인해 주세요.`,` 필요한 경우 앱 카드에서 설치 마무리를 진행할 수 있습니다.`]}):H(`p`,{class:`mb-0 mt-1 text-xs`,children:`검증된 패키지만 다시 설치합니다. 완료될 때까지 앱 설치·제거를 시작하지 마세요.`})]}):null,re&&N?H(`div`,{"aria-live":`polite`,class:`rounded-2xl border p-4 text-sm ${N.phase===`failed`?`border-rose-200 bg-rose-50 text-rose-800`:P&&N.action===`remove`?`border-red-200 bg-red-50 text-red-800`:`border-teal-200 bg-teal-50 text-teal-900`}`,role:`status`,children:H(`div`,{class:`flex items-start justify-between gap-3`,children:[H(`div`,{class:`min-w-0`,children:[P?N.action===`remove`?`앱 제거 중`:N.action===`update`?`앱 업데이트 중`:`앱 설치 중`:N.phase===`success`?`마지막 앱 작업 완료`:`마지막 앱 작업 실패`,N.appId?` · ${N.appId}`:``,N.code&&N.code!==`NONE`?` · 오류 코드 ${N.code}`:``,N.phase===`failed`&&N.code&&ms[N.code]?H(`p`,{class:`mb-0 mt-1 text-xs`,children:ms[N.code]}):null,P?H(`p`,{class:`mb-0 mt-1 text-xs`,children:[N.action===`remove`?`앱 제거와 패키지 정리가 진행 중입니다.`:N.action===`update`?`승인된 버전으로 앱을 업데이트하고 있습니다.`:`설치 확인과 패키지 처리가 진행 중입니다.`,` 화면을 닫아도 작업은 계속됩니다.`]}):null]}),P?null:H(`button`,{"aria-label":`앱 작업 알림 닫기`,class:`shrink-0 rounded-lg px-2 py-1 text-xs font-bold hover:bg-black/5 focus-visible:outline-none focus-visible:ring-2`,onClick:()=>ne(te),type:`button`,children:`닫기 ×`})]})}):null,T?H(`p`,{class:`rounded-xl border border-rose-200 bg-rose-50 p-4 text-sm text-rose-800`,role:`alert`,children:T}):null,s?H(`div`,{class:`rounded-xl border border-amber-200 bg-amber-50 p-4 text-sm text-amber-900`,role:`alert`,children:[`설치 상태를 확인하지 못했습니다. 설치 및 제거 버튼이 비활성화됩니다. `,H(`button`,{class:`underline`,onClick:c,type:`button`,children:`다시 확인`})]}):null,t&&!k?H(`div`,{class:`rounded-2xl border border-rose-200 bg-rose-50 p-5`,role:`alert`,children:[H(`p`,{class:`m-0 text-sm font-bold text-rose-800`,children:`앱 목록을 불러오지 못했습니다.`}),H(`p`,{class:`mt-2 mb-0 text-sm text-rose-700`,children:t}),H(`button`,{class:`mt-3 rounded-lg border border-rose-300 px-3 py-2 text-xs font-bold text-rose-800`,onClick:i,type:`button`,children:`다시 시도`})]}):null,n&&!k?H(`div`,{"aria-live":`polite`,class:`rounded-2xl border border-slate-200 bg-white p-8 text-center text-sm text-slate-500`,role:`status`,children:`검증된 앱 목록을 확인하는 중입니다.`}):null,k?H(b,{children:[A.length>0?H(`div`,{class:`space-y-4`,children:[H(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[H(`div`,{class:`flex flex-wrap items-center gap-2`,role:`group`,"aria-label":`앱 카테고리`,children:hs.map(e=>H(`button`,{class:`inline-flex min-h-10 items-center gap-1.5 rounded-xl border px-3 text-xs font-bold ${m===e.id?`border-teal-400 bg-teal-50 text-teal-800`:`border-slate-200 bg-white text-slate-600`}`,onClick:()=>h(e.id),type:`button`,children:[H(cs,{category:e.id,class:`size-4 shrink-0`}),e.label]},e.id))}),H(`input`,{"aria-label":`앱 검색`,class:`min-h-10 w-full rounded-xl border border-slate-200 bg-white px-3 text-sm text-slate-900 outline-none focus:border-teal-500 sm:w-52`,onInput:e=>_(e.currentTarget.value),placeholder:`앱 검색`,type:`search`,value:g})]}),H(`div`,{class:`grid min-w-0 gap-3 sm:grid-cols-2 xl:grid-cols-3`,children:ae.map(e=>{let t=a?.installed[e.id],n=t?.installed??!1,r=o?.installedSizes?.[e.id],i=n&&typeof r==`number`&&Number.isSafeInteger(r)&&r>=0?rs(r):null,c=t?.managed??!1,l=!!(n&&c&&t?.updateAvailable),u=n?t?.installedVersion:null,d=!!(n&&u&&(l||u!==e.version)),m=v?.appId===e.id?v.action:P&&N?.appId===e.id?ie:null,h=!a||!!s||v!==null||P||ee,g=c&&(n||!!t?.partial),_=n&&t?.webUiReady?ls(e.webUi):null;return H(`article`,{class:`flex min-w-0 flex-col rounded-2xl border border-slate-200 bg-white p-5 shadow-sm`,children:[H(`div`,{class:`flex min-w-0 items-start gap-3`,children:[H(`span`,{class:`grid size-14 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-600`,children:H(cs,{category:ss(e.category),class:`size-7`})}),H(`div`,{class:`min-w-0 flex-1`,children:[H(`div`,{class:`flex min-w-0 flex-wrap items-start justify-between gap-x-3 gap-y-2`,children:[H(`h3`,{class:`m-0 min-w-0 flex-1 break-words text-sm font-black text-slate-950`,children:e.name}),n&&c?H(`span`,{class:`ssh-apps-installed-badge shrink-0 rounded-full border px-2 py-0.5 text-[11px] font-bold`,children:`✓ 설치됨`}):null]}),H(`div`,{class:`mt-1 flex flex-wrap items-center gap-x-2 gap-y-1`,children:[H(`span`,{class:`text-xs text-slate-500`,title:n?`공유기에 설치된 대표 APK 패키지 버전입니다.`:`현재 제공 중인 승인 버전입니다.`,children:n?u?`설치 v${u}`:`설치 버전 확인 불가`:`v${e.version}`}),l?H(`span`,{class:`ssh-apps-update-badge rounded-full border px-2 py-0.5 text-[11px] font-bold`,children:`업데이트 가능`}):null]}),d||i!==null?H(`p`,{class:`mb-0 mt-1 flex min-w-0 flex-wrap items-center gap-x-1.5 gap-y-0.5 text-[11px] text-slate-500`,children:[d?H(`span`,{title:`현재 서버가 승인한 앱 릴리스 버전입니다. 설치된 APK 패키지의 버전과 다를 수 있습니다.`,children:[`제공 v`,e.version]}):null,d&&i!==null?H(`span`,{"aria-hidden":`true`,children:`·`}):null,i===null?null:H(`span`,{title:`설치된 APK 패키지의 용량 합계입니다. 앱 데이터 및 캐시는 포함되지 않습니다.`,children:[`설치 용량 약 `,i]})]}):null]})]}),H(`p`,{class:`mt-4 mb-4 min-h-10 break-words text-sm leading-5 text-slate-600`,children:e.summary}),H(`div`,{class:`mt-auto flex flex-wrap items-center justify-between gap-2 border-t border-slate-100 pt-3`,children:[H(`span`,{class:`text-xs font-bold text-teal-700`,children:`✓ 검증된 앱`}),m?H(gs,{action:m}):H(`span`,{class:`flex flex-wrap items-center gap-2`,children:[c&&t?.partial&&!n?H(`button`,{class:`min-h-9 rounded-lg border border-teal-300 bg-white px-3 text-xs font-bold text-teal-800 hover:bg-teal-50 disabled:opacity-50`,disabled:h,onClick:()=>void ce(e,`install`),type:`button`,children:`설치 마무리`}):null,l?H(`button`,{class:`ssh-apps-update-button min-h-9 rounded-lg border px-3 text-xs font-bold transition disabled:opacity-50`,disabled:h,onClick:()=>void ce(e,`update`),type:`button`,children:`업데이트`}):null,_?f?H(`button`,{"aria-label":`${e.name} 데모 실행 안내`,class:`inline-flex min-h-9 items-center rounded-lg border border-teal-700 bg-teal-700 px-3 text-xs font-bold text-white transition hover:bg-teal-800`,onClick:p,type:`button`,children:`열기 ↗`}):H(`a`,{"aria-label":`${e.name} 새 탭에서 열기`,class:`inline-flex min-h-9 items-center rounded-lg border border-teal-700 bg-teal-700 px-3 text-xs font-bold text-white transition hover:bg-teal-800`,href:_,rel:`noopener noreferrer`,target:`_blank`,children:`열기 ↗`}):n&&e.webUi?H(`span`,{class:`text-xs text-amber-700`,title:`이 앱의 웹 UI 패키지를 설치해야 열 수 있습니다.`,children:`웹 UI 미설치`}):null,n&&!c?H(`span`,{class:`text-xs text-slate-500`,title:`공유기 소프트웨어 메뉴 또는 SSH로 설치한 앱은 Apps에서 제거하지 않습니다.`,children:`기존에 설치됨`}):t?.partial&&!c?H(`span`,{class:`text-xs text-amber-700`,children:`일부 패키지 설치됨`}):H(`button`,{class:`min-h-9 rounded-lg border bg-white px-3 text-xs font-bold transition focus-visible:outline-none focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-50 ${g?`border-red-300 text-red-700 hover:bg-red-50 focus-visible:ring-red-100`:`border-teal-300 text-teal-800 hover:bg-teal-50 focus-visible:ring-teal-200`}`,disabled:h||!!t?.partial&&!c,onClick:t=>g?se(e,t.currentTarget):void ce(e,`install`),type:`button`,children:g?`제거`:c?`재설치`:`설치`})]})]})]},e.id)})}),ae.length===0?H(`p`,{class:`rounded-xl bg-slate-100 p-5 text-center text-sm text-slate-600`,children:`검색 조건에 맞는 앱이 없습니다.`}):null]}):H(`div`,{class:`rounded-2xl border border-dashed border-slate-300 bg-white px-5 py-12 text-center`,children:[H(en,{class:`mx-auto size-10 text-slate-400`}),H(`h3`,{class:`mt-4 mb-2 text-base font-black text-slate-900`,children:`아직 등록된 앱이 없습니다.`}),H(`p`,{class:`m-0 text-sm leading-6 text-slate-500`,children:`현재 기기와 펌웨어에 대해 승인된 앱이 준비되면 이곳에서 확인할 수 있습니다.`})]}),H(`p`,{class:`text-xs text-slate-400`,children:[`기기 `,k.deviceCode,` · 펌웨어 `,k.firmwareBuildId,` · `,k.channel,` 채널`]})]}):null,j.length>0?H(`div`,{class:`rounded-2xl border border-amber-200 bg-amber-50 p-5`,children:[H(`h3`,{class:`m-0 text-sm font-black text-amber-900`,children:`제공이 중단된 앱`}),H(`p`,{class:`mb-3 mt-1 text-xs text-amber-800`,children:`현재 승인 목록에서 제외되었지만 기기에 남아 있는 앱입니다. 설치는 불가능하며 제거할 수 있습니다.`}),H(`div`,{class:`space-y-2`,children:j.map(([e])=>{let t=v?.appId===e?v.action:P&&N?.appId===e?ie:null;return H(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[H(`span`,{class:`break-all text-sm text-amber-900`,children:e}),t?H(gs,{action:t}):H(`button`,{class:`min-h-9 rounded-lg border border-red-300 bg-white px-3 text-xs font-bold text-red-700 transition hover:bg-red-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!a||P||ee||v!==null||!!s,onClick:t=>se({id:e,name:e,summary:``,description:``,category:``,version:``},t.currentTarget),type:`button`,children:`제거`})]},e)})})]}):null]})}function vs(){return H(`section`,{"aria-busy":`true`,"aria-live":`polite`,class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:H(`div`,{class:`flex items-center gap-4`,children:[H(hn,{class:`size-8 shrink-0 animate-spin text-teal-700`}),H(`div`,{class:`min-w-0 text-left`,children:H(`h2`,{class:`m-0 text-lg font-extrabold text-slate-950`,children:`장치 상태를 확인하고 있습니다`})})]})})}function ys({message:e,onRetry:t}){return H(`section`,{"aria-live":`assertive`,class:`rounded-2xl border border-red-200 bg-red-50 p-5 sm:p-6`,children:[H(`p`,{class:`m-0 text-xs font-bold uppercase tracking-[0.16em] text-red-700`,children:`연결 오류`}),H(`h2`,{class:`mt-2 mb-0 text-lg font-extrabold text-red-950`,children:`장치 상태를 불러오지 못했습니다`}),H(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-red-800`,children:e}),H(`button`,{class:`mt-5 inline-flex min-h-10 items-center justify-center gap-2 rounded-xl border-0 bg-red-700 px-4 py-2 text-sm font-bold text-white shadow-sm transition hover:bg-red-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-red-200`,onClick:t,type:`button`,children:[H(hn,{class:`size-4`}),`다시 시도`]})]})}var bs=[{value:`all`,label:`전체`},{value:`online`,label:`현재 연결`},{value:`wifi`,label:`Wi-Fi`},{value:`ethernet`,label:`유선/기타`},{value:`offline`,label:`최근 기기`}],xs=new Intl.Collator(`ko`),Ss=new Intl.DateTimeFormat(`ko-KR`,{month:`numeric`,day:`numeric`,hour:`2-digit`,minute:`2-digit`});function Cs(e){switch(e){case`wifi`:return`Wi-Fi`;case`ethernet`:return`유선/기타`;default:return`연결 방식 미확인`}}function ws(e){return e.hostname??e.ipv4Address??`이름 없는 기기`}function Ts(e){return e===null?null:e>=-50?`매우 좋음`:e>=-60?`좋음`:e>=-70?`보통`:`약함`}function Es(e){if(e===null||e<0)return null;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}일 ${n}시간`:n>0?`${n}시간 ${r}분`:`${Math.max(r,1)}분`}function Ds(e){return e.leaseActive?e.leaseExpiresAt===null?`DHCP 임대 활성`:`DHCP ${Ss.format(new Date(e.leaseExpiresAt*1e3))}까지`:null}function Os(e,t){switch(t){case`online`:return e.online;case`wifi`:return e.online&&e.connection===`wifi`;case`ethernet`:return e.online&&e.connection===`ethernet`;case`offline`:return!e.online;default:return!0}}function ks({device:e}){return H(`span`,{class:`inline-flex items-center gap-2 rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${e.online?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}`,children:[H(`span`,{class:`size-2 rounded-full ${e.online?`bg-emerald-500`:`bg-slate-400`}`}),e.online?`현재 연결`:`최근 임대`]})}function As({device:e}){let t=Ts(e.signalDbm),n=Es(e.connectedSeconds),r=Ds(e);return H(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:[H(`div`,{class:`flex min-w-0 flex-col items-start gap-4 sm:flex-row sm:justify-between`,children:[H(`div`,{class:`flex min-w-0 items-start gap-3`,children:[H(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl ${e.connection===`wifi`?`bg-teal-50 text-teal-700`:e.connection===`ethernet`?`bg-blue-50 text-blue-700`:`bg-slate-100 text-slate-600`}`,children:e.connection===`wifi`?H(cn,{class:`size-6`}):e.connection===`ethernet`?H(un,{class:`size-6`}):H(Zt,{class:`size-6`})}),H(`div`,{class:`min-w-0`,children:[H(`h3`,{class:`m-0 break-words text-base font-extrabold text-slate-950`,children:ws(e)}),H(`p`,{class:`mt-1 mb-0 break-all font-mono text-xs leading-5 text-slate-500`,children:e.mac})]})]}),H(`span`,{class:`shrink-0 self-start`,children:H(ks,{device:e})})]}),H(`dl`,{class:`mt-5 grid gap-3 text-sm sm:grid-cols-2`,children:[H(`div`,{class:`rounded-xl bg-slate-50 p-3.5`,children:[H(`dt`,{class:`text-xs font-bold text-slate-500`,children:`IP 주소`}),H(`dd`,{class:`mt-1.5 mb-0 ml-0 font-extrabold text-slate-900`,children:e.ipv4Address??`확인되지 않음`})]}),H(`div`,{class:`rounded-xl bg-slate-50 p-3.5`,children:[H(`dt`,{class:`text-xs font-bold text-slate-500`,children:`연결 방식`}),H(`dd`,{class:`mt-1.5 mb-0 ml-0 font-extrabold text-slate-900`,children:Cs(e.connection)})]})]}),H(`div`,{class:`mt-4 flex flex-wrap gap-2 text-xs font-bold text-slate-600`,children:[e.ssid?H(`span`,{class:`rounded-full bg-teal-50 px-3 py-1.5 text-teal-800`,children:[e.ssid,e.bandLabel?` · ${e.bandLabel}`:``]}):null,t?H(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:[`신호 `,t,` · `,e.signalDbm,` dBm`]}):null,n?H(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:[`연결 `,n]}):null,r?H(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:r}):null,e.interface?H(`span`,{class:`rounded-full bg-slate-100 px-3 py-1.5`,children:e.interface}):null]})]})}function js({data:e,error:t,loading:n,onRetry:r}){let[i,a]=F(``),[o,s]=F(`all`),c=Qe(()=>{if(!e)return[];let t=i.trim().toLocaleLowerCase();return[...e.devices].filter(e=>Os(e,o)).filter(e=>!t||[e.hostname,e.ipv4Address,e.mac,e.ssid].filter(e=>!!e).some(e=>e.toLocaleLowerCase().includes(t))).sort((e,t)=>e.online===t.online?e.connection===t.connection?xs.compare(ws(e),ws(t)):e.connection===`wifi`?-1:1:e.online?-1:1)},[e,o,i]);return n?H(vs,{}):t?H(ys,{message:t,onRetry:r}):e?H(b,{children:[H(q,{eyebrow:`Overview`,title:`연결 기기 현황`,description:`네트워크에 연결되었거나 최근 확인된 기기를 요약합니다.`}),H(`section`,{"aria-label":`연결 기기 요약`,class:`grid gap-4 sm:grid-cols-2 xl:grid-cols-4`,children:[H(Ms,{description:`${e.totals.offline}대는 최근 DHCP 임대에서 확인`,icon:H(Zt,{class:`size-6`}),label:`확인된 기기`,value:e.totals.known}),H(Ms,{description:`Wi-Fi 또는 ARP에서 현재 확인됨`,icon:H(pn,{class:`size-6`}),label:`현재 연결`,value:e.totals.online}),H(Ms,{description:`무선 AP에 연결된 기기`,icon:H(cn,{class:`size-6`}),label:`Wi-Fi`,value:e.totals.wireless}),H(Ms,{description:`LAN ARP에서 확인된 비무선 기기`,icon:H(un,{class:`size-6`}),label:`유선/기타`,value:e.totals.ethernet})]}),H(`section`,{class:`mt-7`,"aria-label":`기기 목록 및 필터`,children:[H(q,{eyebrow:`Device inventory`,title:`기기 목록`,description:`연결된 기기를 검색하고 무선·유선 상태별로 확인합니다.`}),H(`div`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:H(`div`,{class:`flex min-w-0 flex-col gap-3 lg:flex-row lg:items-center lg:justify-between`,children:[H(`div`,{class:`ssh-touch-scroll flex min-w-0 gap-2 overflow-x-auto pb-1 lg:flex-1`,role:`group`,"aria-label":`기기 필터`,children:bs.map(e=>H(`button`,{"aria-pressed":o===e.value,class:`min-h-10 shrink-0 rounded-xl border px-4 py-2 text-sm font-extrabold transition ${o===e.value?`border-teal-700 bg-teal-700 text-white`:`border-slate-200 bg-white text-slate-600 hover:bg-slate-50 hover:text-slate-950`}`,onClick:()=>s(e.value),type:`button`,children:e.label},e.value))}),H(`label`,{class:`relative block w-full lg:w-72 lg:shrink-0 xl:w-80`,children:[H(`span`,{class:`sr-only`,children:`기기 검색`}),H(`span`,{class:`pointer-events-none absolute inset-y-0 left-0 flex w-11 items-center justify-center text-slate-400`,children:H(Dn,{class:`size-5`})}),H(`input`,{class:`min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 py-2.5 pr-4 pl-11 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100`,onInput:e=>a(e.currentTarget.value),placeholder:`이름, IP, MAC 또는 SSID 검색`,type:`search`,value:i})]})]})})]}),c.length?H(`section`,{"aria-live":`polite`,class:`mt-5 grid gap-4 lg:grid-cols-2`,children:c.map(e=>H(As,{device:e},e.id))}):H(`section`,{class:`mt-5 rounded-2xl border border-dashed border-slate-300 bg-white p-5 text-center sm:p-8`,children:[H(Zt,{class:`mx-auto size-10 text-slate-400`}),H(`h2`,{class:`mt-4 mb-0 text-lg font-extrabold text-slate-950`,children:`조건에 맞는 기기가 없습니다`}),H(`p`,{class:`mt-2 mb-0 text-sm text-slate-600`,children:`검색어 또는 필터를 변경해 주세요.`})]}),H(`p`,{class:`mt-5 mb-0 rounded-xl bg-slate-100 px-4 py-3 text-xs leading-5 text-slate-600`,children:`유선/기타 상태는 ARP 테이블을 기준으로 하며, 최근 DHCP 임대는 기기가 연결 해제된 뒤에도 일정 시간 남을 수 있습니다.`})]}):null}function Ms({description:e,icon:t,label:n,value:r}){return H(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,children:[H(`div`,{class:`flex items-start justify-between gap-4`,children:[H(`div`,{children:[H(`p`,{class:`m-0 text-xs font-bold uppercase tracking-[0.14em] text-slate-500`,children:n}),H(`p`,{class:`mt-3 mb-0 text-3xl font-black tracking-tight text-slate-950`,children:r})]}),H(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:t})]}),H(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:e})]})}function Ns(e){return e+.5|0}var Ps=(e,t,n)=>Math.max(Math.min(e,n),t);function Fs(e){return Ps(Ns(e*2.55),0,255)}function Is(e){return Ps(Ns(e*255),0,255)}function Ls(e){return Ps(Ns(e/2.55)/100,0,1)}function Rs(e){return Ps(Ns(e*100),0,100)}var zs={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Bs=[...`0123456789ABCDEF`],Vs=e=>Bs[e&15],Hs=e=>Bs[(e&240)>>4]+Bs[e&15],Us=e=>(e&240)>>4==(e&15),Ws=e=>Us(e.r)&&Us(e.g)&&Us(e.b)&&Us(e.a);function Gs(e){var t=e.length,n;return e[0]===`#`&&(t===4||t===5?n={r:255&zs[e[1]]*17,g:255&zs[e[2]]*17,b:255&zs[e[3]]*17,a:t===5?zs[e[4]]*17:255}:(t===7||t===9)&&(n={r:zs[e[1]]<<4|zs[e[2]],g:zs[e[3]]<<4|zs[e[4]],b:zs[e[5]]<<4|zs[e[6]],a:t===9?zs[e[7]]<<4|zs[e[8]]:255})),n}var Ks=(e,t)=>e<255?t(e):``;function qs(e){var t=Ws(e)?Vs:Hs;return e?`#`+t(e.r)+t(e.g)+t(e.b)+Ks(e.a,t):void 0}var Js=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Ys(e,t,n){let r=t*Math.min(n,1-n),i=(t,i=(t+e/30)%12)=>n-r*Math.max(Math.min(i-3,9-i,1),-1);return[i(0),i(8),i(4)]}function Xs(e,t,n){let r=(r,i=(r+e/60)%6)=>n-n*t*Math.max(Math.min(i,4-i,1),0);return[r(5),r(3),r(1)]}function Zs(e,t,n){let r=Ys(e,1,.5),i;for(t+n>1&&(i=1/(t+n),t*=i,n*=i),i=0;i<3;i++)r[i]*=1-t-n,r[i]+=t;return r}function Qs(e,t,n,r,i){return e===i?(t-n)/r+(t.5?l/(2-i-a):l/(i+a),s=Qs(t,n,r,l,i),s=s*60+.5),[s|0,c||0,o]}function ec(e,t,n,r){return(Array.isArray(t)?e(t[0],t[1],t[2]):e(t,n,r)).map(Is)}function tc(e,t,n){return ec(Ys,e,t,n)}function nc(e,t,n){return ec(Zs,e,t,n)}function rc(e,t,n){return ec(Xs,e,t,n)}function ic(e){return(e%360+360)%360}function ac(e){let t=Js.exec(e),n=255,r;if(!t)return;t[5]!==r&&(n=t[6]?Fs(+t[5]):Is(+t[5]));let i=ic(+t[2]),a=t[3]/100,o=t[4]/100;return r=t[1]===`hwb`?nc(i,a,o):t[1]===`hsv`?rc(i,a,o):tc(i,a,o),{r:r[0],g:r[1],b:r[2],a:n}}function oc(e,t){var n=$s(e);n[0]=ic(n[0]+t),n=tc(n),e.r=n[0],e.g=n[1],e.b=n[2]}function sc(e){if(!e)return;let t=$s(e),n=t[0],r=Rs(t[1]),i=Rs(t[2]);return e.a<255?`hsla(${n}, ${r}%, ${i}%, ${Ls(e.a)})`:`hsl(${n}, ${r}%, ${i}%)`}var cc={x:`dark`,Z:`light`,Y:`re`,X:`blu`,W:`gr`,V:`medium`,U:`slate`,A:`ee`,T:`ol`,S:`or`,B:`ra`,C:`lateg`,D:`ights`,R:`in`,Q:`turquois`,E:`hi`,P:`ro`,O:`al`,N:`le`,M:`de`,L:`yello`,F:`en`,K:`ch`,G:`arks`,H:`ea`,I:`ightg`,J:`wh`},lc={OiceXe:`f0f8ff`,antiquewEte:`faebd7`,aqua:`ffff`,aquamarRe:`7fffd4`,azuY:`f0ffff`,beige:`f5f5dc`,bisque:`ffe4c4`,black:`0`,blanKedOmond:`ffebcd`,Xe:`ff`,XeviTet:`8a2be2`,bPwn:`a52a2a`,burlywood:`deb887`,caMtXe:`5f9ea0`,KartYuse:`7fff00`,KocTate:`d2691e`,cSO:`ff7f50`,cSnflowerXe:`6495ed`,cSnsilk:`fff8dc`,crimson:`dc143c`,cyan:`ffff`,xXe:`8b`,xcyan:`8b8b`,xgTMnPd:`b8860b`,xWay:`a9a9a9`,xgYF:`6400`,xgYy:`a9a9a9`,xkhaki:`bdb76b`,xmagFta:`8b008b`,xTivegYF:`556b2f`,xSange:`ff8c00`,xScEd:`9932cc`,xYd:`8b0000`,xsOmon:`e9967a`,xsHgYF:`8fbc8f`,xUXe:`483d8b`,xUWay:`2f4f4f`,xUgYy:`2f4f4f`,xQe:`ced1`,xviTet:`9400d3`,dAppRk:`ff1493`,dApskyXe:`bfff`,dimWay:`696969`,dimgYy:`696969`,dodgerXe:`1e90ff`,fiYbrick:`b22222`,flSOwEte:`fffaf0`,foYstWAn:`228b22`,fuKsia:`ff00ff`,gaRsbSo:`dcdcdc`,ghostwEte:`f8f8ff`,gTd:`ffd700`,gTMnPd:`daa520`,Way:`808080`,gYF:`8000`,gYFLw:`adff2f`,gYy:`808080`,honeyMw:`f0fff0`,hotpRk:`ff69b4`,RdianYd:`cd5c5c`,Rdigo:`4b0082`,ivSy:`fffff0`,khaki:`f0e68c`,lavFMr:`e6e6fa`,lavFMrXsh:`fff0f5`,lawngYF:`7cfc00`,NmoncEffon:`fffacd`,ZXe:`add8e6`,ZcSO:`f08080`,Zcyan:`e0ffff`,ZgTMnPdLw:`fafad2`,ZWay:`d3d3d3`,ZgYF:`90ee90`,ZgYy:`d3d3d3`,ZpRk:`ffb6c1`,ZsOmon:`ffa07a`,ZsHgYF:`20b2aa`,ZskyXe:`87cefa`,ZUWay:`778899`,ZUgYy:`778899`,ZstAlXe:`b0c4de`,ZLw:`ffffe0`,lime:`ff00`,limegYF:`32cd32`,lRF:`faf0e6`,magFta:`ff00ff`,maPon:`800000`,VaquamarRe:`66cdaa`,VXe:`cd`,VScEd:`ba55d3`,VpurpN:`9370db`,VsHgYF:`3cb371`,VUXe:`7b68ee`,VsprRggYF:`fa9a`,VQe:`48d1cc`,VviTetYd:`c71585`,midnightXe:`191970`,mRtcYam:`f5fffa`,mistyPse:`ffe4e1`,moccasR:`ffe4b5`,navajowEte:`ffdead`,navy:`80`,Tdlace:`fdf5e6`,Tive:`808000`,TivedBb:`6b8e23`,Sange:`ffa500`,SangeYd:`ff4500`,ScEd:`da70d6`,pOegTMnPd:`eee8aa`,pOegYF:`98fb98`,pOeQe:`afeeee`,pOeviTetYd:`db7093`,papayawEp:`ffefd5`,pHKpuff:`ffdab9`,peru:`cd853f`,pRk:`ffc0cb`,plum:`dda0dd`,powMrXe:`b0e0e6`,purpN:`800080`,YbeccapurpN:`663399`,Yd:`ff0000`,Psybrown:`bc8f8f`,PyOXe:`4169e1`,saddNbPwn:`8b4513`,sOmon:`fa8072`,sandybPwn:`f4a460`,sHgYF:`2e8b57`,sHshell:`fff5ee`,siFna:`a0522d`,silver:`c0c0c0`,skyXe:`87ceeb`,UXe:`6a5acd`,UWay:`708090`,UgYy:`708090`,snow:`fffafa`,sprRggYF:`ff7f`,stAlXe:`4682b4`,tan:`d2b48c`,teO:`8080`,tEstN:`d8bfd8`,tomato:`ff6347`,Qe:`40e0d0`,viTet:`ee82ee`,JHt:`f5deb3`,wEte:`ffffff`,wEtesmoke:`f5f5f5`,Lw:`ffff00`,LwgYF:`9acd32`};function uc(){let e={},t=Object.keys(lc),n=Object.keys(cc),r,i,a,o,s;for(r=0;r>16&255,a>>8&255,a&255]}return e}var dc;function fc(e){dc||(dc=uc(),dc.transparent=[0,0,0,0]);let t=dc[e.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}var pc=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function mc(e){let t=pc.exec(e),n=255,r,i,a;if(t){if(t[7]!==r){let e=+t[7];n=t[8]?Fs(e):Ps(e*255,0,255)}return r=+t[1],i=+t[3],a=+t[5],r=255&(t[2]?Fs(r):Ps(r,0,255)),i=255&(t[4]?Fs(i):Ps(i,0,255)),a=255&(t[6]?Fs(a):Ps(a,0,255)),{r,g:i,b:a,a:n}}}function hc(e){return e&&(e.a<255?`rgba(${e.r}, ${e.g}, ${e.b}, ${Ls(e.a)})`:`rgb(${e.r}, ${e.g}, ${e.b})`)}var gc=e=>e<=.0031308?e*12.92:e**(1/2.4)*1.055-.055,_c=e=>e<=.04045?e/12.92:((e+.055)/1.055)**2.4;function vc(e,t,n){let r=_c(Ls(e.r)),i=_c(Ls(e.g)),a=_c(Ls(e.b));return{r:Is(gc(r+n*(_c(Ls(t.r))-r))),g:Is(gc(i+n*(_c(Ls(t.g))-i))),b:Is(gc(a+n*(_c(Ls(t.b))-a))),a:e.a+n*(t.a-e.a)}}function yc(e,t,n){if(e){let r=$s(e);r[t]=Math.max(0,Math.min(r[t]+r[t]*n,t===0?360:1)),r=tc(r),e.r=r[0],e.g=r[1],e.b=r[2]}}function bc(e,t){return e&&Object.assign(t||{},e)}function xc(e){var t={r:0,g:0,b:0,a:255};return Array.isArray(e)?e.length>=3&&(t={r:e[0],g:e[1],b:e[2],a:255},e.length>3&&(t.a=Is(e[3]))):(t=bc(e,{r:0,g:0,b:0,a:1}),t.a=Is(t.a)),t}function Sc(e){return e.charAt(0)===`r`?mc(e):ac(e)}var Cc=class e{constructor(t){if(t instanceof e)return t;let n=typeof t,r;n===`object`?r=xc(t):n===`string`&&(r=Gs(t)||fc(t)||Sc(t)),this._rgb=r,this._valid=!!r}get valid(){return this._valid}get rgb(){var e=bc(this._rgb);return e&&(e.a=Ls(e.a)),e}set rgb(e){this._rgb=xc(e)}rgbString(){return this._valid?hc(this._rgb):void 0}hexString(){return this._valid?qs(this._rgb):void 0}hslString(){return this._valid?sc(this._rgb):void 0}mix(e,t){if(e){let n=this.rgb,r=e.rgb,i,a=t===i?.5:t,o=2*a-1,s=n.a-r.a,c=((o*s===-1?o:(o+s)/(1+o*s))+1)/2;i=1-c,n.r=255&c*n.r+i*r.r+.5,n.g=255&c*n.g+i*r.g+.5,n.b=255&c*n.b+i*r.b+.5,n.a=a*n.a+(1-a)*r.a,this.rgb=n}return this}interpolate(e,t){return e&&(this._rgb=vc(this._rgb,e._rgb,t)),this}clone(){return new e(this.rgb)}alpha(e){return this._rgb.a=Is(e),this}clearer(e){let t=this._rgb;return t.a*=1-e,this}greyscale(){let e=this._rgb;return e.r=e.g=e.b=Ns(e.r*.3+e.g*.59+e.b*.11),this}opaquer(e){let t=this._rgb;return t.a*=1+e,this}negate(){let e=this._rgb;return e.r=255-e.r,e.g=255-e.g,e.b=255-e.b,this}lighten(e){return yc(this._rgb,2,e),this}darken(e){return yc(this._rgb,2,-e),this}saturate(e){return yc(this._rgb,1,e),this}desaturate(e){return yc(this._rgb,1,-e),this}rotate(e){return oc(this._rgb,e),this}};function wc(){}var Tc=(()=>{let e=0;return()=>e++})();function Y(e){return e==null}function Ec(e){if(Array.isArray&&Array.isArray(e))return!0;let t=Object.prototype.toString.call(e);return t.slice(0,7)===`[object`&&t.slice(-6)===`Array]`}function X(e){return e!==null&&Object.prototype.toString.call(e)===`[object Object]`}function Dc(e){return(typeof e==`number`||e instanceof Number)&&isFinite(+e)}function Oc(e,t){return Dc(e)?e:t}function Z(e,t){return e===void 0?t:e}var kc=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100:+e/t,Ac=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100*t:+e;function jc(e,t,n){if(e&&typeof e.call==`function`)return e.apply(n,t)}function Q(e,t,n,r){let i,a,o;if(Ec(e)){if(a=e.length,r)for(i=a-1;i>=0;i--)t.call(n,e[i],i);else for(i=0;ie,x:e=>e.x,y:e=>e.y};function Bc(e){let t=e.split(`.`),n=[],r=``;for(let e of t)r+=e,r.endsWith(`\\`)?r=r.slice(0,-1)+`.`:(n.push(r),r=``);return n}function Vc(e){let t=Bc(e);return e=>{for(let n of t){if(n===``)break;e=e&&e[n]}return e}}function Hc(e,t){return(zc[t]||(zc[t]=Vc(t)))(e)}function Uc(e){return e.charAt(0).toUpperCase()+e.slice(1)}var Wc=e=>e!==void 0,Gc=e=>typeof e==`function`,Kc=(e,t)=>{if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0};function qc(e){return e.type===`mouseup`||e.type===`click`||e.type===`contextmenu`}var $=Math.PI,Jc=2*$,Yc=Jc+$,Xc=1/0,Zc=$/180,Qc=$/2,$c=$/4,el=$*2/3,tl=Math.log10,nl=Math.sign;function rl(e,t,n){return Math.abs(e-t)e-t).pop(),t}function ol(e){return typeof e==`symbol`||typeof e==`object`&&!!e&&!(Symbol.toPrimitive in e||`toString`in e||`valueOf`in e)}function sl(e){return!ol(e)&&!isNaN(parseFloat(e))&&isFinite(e)}function cl(e,t){let n=Math.round(e);return n-t<=e&&n+t>=e}function ll(e,t,n){let r,i,a;for(r=0,i=e.length;rc&&l=Math.min(t,n)-r&&e<=Math.max(t,n)+r}function xl(e,t,n){n=n||(n=>e[n]1;)a=i+r>>1,n(a)?i=a:r=a;return{lo:i,hi:r}}var Sl=(e,t,n,r)=>xl(e,n,r?r=>{let i=e[r][t];return ie[r][t]xl(e,n,r=>e[r][t]>=n);function wl(e,t,n){let r=0,i=e.length;for(;rr&&e[i-1]>n;)i--;return r>0||i{let n=`_onData`+Uc(t),r=e[t];Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value(...t){let i=r.apply(this,t);return e._chartjs.listeners.forEach(e=>{typeof e[n]==`function`&&e[n](...t)}),i}})}))}function Dl(e,t){let n=e._chartjs;if(!n)return;let r=n.listeners,i=r.indexOf(t);i!==-1&&r.splice(i,1),!(r.length>0)&&(Tl.forEach(t=>{delete e[t]}),delete e._chartjs)}function Ol(e){let t=new Set(e);return t.size===e.length?e:Array.from(t)}var kl=function(){return typeof window>`u`?function(e){return e()}:window.requestAnimationFrame}();function Al(e,t){let n=[],r=!1;return function(...i){n=i,r||(r=!0,kl.call(window,()=>{r=!1,e.apply(t,n)}))}}function jl(e,t){let n;return function(...r){return t?(clearTimeout(n),n=setTimeout(e,t,r)):e.apply(this,r),t}}var Ml=e=>e===`start`?`left`:e===`end`?`right`:`center`,Nl=(e,t,n)=>e===`start`?t:e===`end`?n:(t+n)/2;function Pl(e,t,n){let r=t.length,i=0,a=r;if(e._sorted){let{iScale:o,vScale:s,_parsed:c}=e,l=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null,u=o.axis,{min:d,max:f,minDefined:p,maxDefined:m}=o.getUserBounds();if(p){if(i=Math.min(Sl(c,u,d).lo,n?r:Sl(t,u,o.getPixelForValue(d)).lo),l){let e=c.slice(0,i+1).reverse().findIndex(e=>!Y(e[s.axis]));i-=Math.max(0,e)}i=vl(i,0,r-1)}if(m){let e=Math.max(Sl(c,o.axis,f,!0).hi+1,n?0:Sl(t,u,o.getPixelForValue(f),!0).hi+1);if(l){let t=c.slice(e-1).findIndex(e=>!Y(e[s.axis]));e+=Math.max(0,t)}a=vl(e,i,r)-i}else a=r-i}return{start:i,count:a}}function Fl(e){let{xScale:t,yScale:n,_scaleRanges:r}=e,i={xmin:t.min,xmax:t.max,ymin:n.min,ymax:n.max};if(!r)return e._scaleRanges=i,!0;let a=r.xmin!==t.min||r.xmax!==t.max||r.ymin!==n.min||r.ymax!==n.max;return Object.assign(r,i),a}var Il=e=>e===0||e===1,Ll=(e,t,n)=>-(2**(10*--e)*Math.sin((e-t)*Jc/n)),Rl=(e,t,n)=>2**(-10*e)*Math.sin((e-t)*Jc/n)+1,zl={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>-e*(e-2),easeInOutQuad:e=>(e/=.5)<1?.5*e*e:-.5*(--e*(e-2)-1),easeInCubic:e=>e*e*e,easeOutCubic:e=>--e*e*e+1,easeInOutCubic:e=>(e/=.5)<1?.5*e*e*e:.5*((e-=2)*e*e+2),easeInQuart:e=>e*e*e*e,easeOutQuart:e=>-(--e*e*e*e-1),easeInOutQuart:e=>(e/=.5)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2),easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>--e*e*e*e*e+1,easeInOutQuint:e=>(e/=.5)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2),easeInSine:e=>-Math.cos(e*Qc)+1,easeOutSine:e=>Math.sin(e*Qc),easeInOutSine:e=>-.5*(Math.cos($*e)-1),easeInExpo:e=>e===0?0:2**(10*(e-1)),easeOutExpo:e=>e===1?1:-(2**(-10*e))+1,easeInOutExpo:e=>Il(e)?e:e<.5?.5*2**(10*(e*2-1)):.5*(-(2**(-10*(e*2-1)))+2),easeInCirc:e=>e>=1?e:-(Math.sqrt(1-e*e)-1),easeOutCirc:e=>Math.sqrt(1- --e*e),easeInOutCirc:e=>(e/=.5)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1),easeInElastic:e=>Il(e)?e:Ll(e,.075,.3),easeOutElastic:e=>Il(e)?e:Rl(e,.075,.3),easeInOutElastic(e){let t=.1125,n=.45;return Il(e)?e:e<.5?.5*Ll(e*2,t,n):.5+.5*Rl(e*2-1,t,n)},easeInBack(e){return e*e*(2.70158*e-1.70158)},easeOutBack(e){return--e*e*(2.70158*e+1.70158)+1},easeInOutBack(e){let t=1.70158;return(e/=.5)<1?.5*(e*e*(((t*=1.525)+1)*e-t)):.5*((e-=2)*e*(((t*=1.525)+1)*e+t)+2)},easeInBounce:e=>1-zl.easeOutBounce(1-e),easeOutBounce(e){let t=7.5625,n=2.75;return e<1/n?t*e*e:e<2/n?t*(e-=1.5/n)*e+.75:e<2.5/n?t*(e-=2.25/n)*e+.9375:t*(e-=2.625/n)*e+.984375},easeInOutBounce:e=>e<.5?zl.easeInBounce(e*2)*.5:zl.easeOutBounce(e*2-1)*.5+.5};function Bl(e){if(e&&typeof e==`object`){let t=e.toString();return t===`[object CanvasPattern]`||t===`[object CanvasGradient]`}return!1}function Vl(e){return Bl(e)?e:new Cc(e)}function Hl(e){return Bl(e)?e:new Cc(e).saturate(.5).darken(.1).hexString()}var Ul=[`x`,`y`,`borderWidth`,`radius`,`tension`],Wl=[`color`,`borderColor`,`backgroundColor`];function Gl(e){e.set(`animation`,{delay:void 0,duration:1e3,easing:`easeOutQuart`,fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),e.describe(`animation`,{_fallback:!1,_indexable:!1,_scriptable:e=>e!==`onProgress`&&e!==`onComplete`&&e!==`fn`}),e.set(`animations`,{colors:{type:`color`,properties:Wl},numbers:{type:`number`,properties:Ul}}),e.describe(`animations`,{_fallback:`animation`}),e.set(`transitions`,{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:`transparent`},visible:{type:`boolean`,duration:0}}},hide:{animations:{colors:{to:`transparent`},visible:{type:`boolean`,easing:`linear`,fn:e=>e|0}}}})}function Kl(e){e.set(`layout`,{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}var ql=new Map;function Jl(e,t){t=t||{};let n=e+JSON.stringify(t),r=ql.get(n);return r||(r=new Intl.NumberFormat(e,t),ql.set(n,r)),r}function Yl(e,t,n){return Jl(t,n).format(e)}var Xl={values(e){return Ec(e)?e:``+e},numeric(e,t,n){if(e===0)return`0`;let r=this.chart.options.locale,i,a=e;if(n.length>1){let t=Math.max(Math.abs(n[0].value),Math.abs(n[n.length-1].value));(t<1e-4||t>0x38d7ea4c68000)&&(i=`scientific`),a=Zl(e,n)}let o=tl(Math.abs(a)),s=isNaN(o)?1:Math.max(Math.min(-1*Math.floor(o),20),0),c={notation:i,minimumFractionDigits:s,maximumFractionDigits:s};return Object.assign(c,this.options.ticks.format),Yl(e,r,c)},logarithmic(e,t,n){if(e===0)return`0`;let r=n[t].significand||e/10**Math.floor(tl(e));return[1,2,3,5,10,15].includes(r)||t>.8*n.length?Xl.numeric.call(this,e,t,n):``}};function Zl(e,t){let n=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(n)>=1&&e!==Math.floor(e)&&(n=e-Math.floor(e)),n}var Ql={formatters:Xl};function $l(e){e.set(`scale`,{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:`ticks`,clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(e,t)=>t.lineWidth,tickColor:(e,t)=>t.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:``,padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:``,padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Ql.formatters.values,minor:{},major:{},align:`center`,crossAlign:`near`,showLabelBackdrop:!1,backdropColor:`rgba(255, 255, 255, 0.75)`,backdropPadding:2}}),e.route(`scale.ticks`,`color`,``,`color`),e.route(`scale.grid`,`color`,``,`borderColor`),e.route(`scale.border`,`color`,``,`borderColor`),e.route(`scale.title`,`color`,``,`color`),e.describe(`scale`,{_fallback:!1,_scriptable:e=>!e.startsWith(`before`)&&!e.startsWith(`after`)&&e!==`callback`&&e!==`parser`,_indexable:e=>e!==`borderDash`&&e!==`tickBorderDash`&&e!==`dash`}),e.describe(`scales`,{_fallback:`scale`}),e.describe(`scale.ticks`,{_scriptable:e=>e!==`backdropPadding`&&e!==`callback`,_indexable:e=>e!==`backdropPadding`})}var eu=Object.create(null),tu=Object.create(null);function nu(e,t){if(!t)return e;let n=t.split(`.`);for(let t=0,r=n.length;te.chart.platform.getDevicePixelRatio(),this.elements={},this.events=[`mousemove`,`mouseout`,`click`,`touchstart`,`touchmove`],this.font={family:`'Helvetica Neue', 'Helvetica', 'Arial', sans-serif`,size:12,style:`normal`,lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(e,t)=>Hl(t.backgroundColor),this.hoverBorderColor=(e,t)=>Hl(t.borderColor),this.hoverColor=(e,t)=>Hl(t.color),this.indexAxis=`x`,this.interaction={mode:`nearest`,intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(e),this.apply(t)}set(e,t){return ru(this,e,t)}get(e){return nu(this,e)}describe(e,t){return ru(tu,e,t)}override(e,t){return ru(eu,e,t)}route(e,t,n,r){let i=nu(this,e),a=nu(this,n),o=`_`+t;Object.defineProperties(i,{[o]:{value:i[t],writable:!0},[t]:{enumerable:!0,get(){let e=this[o],t=a[r];return X(e)?Object.assign({},t,e):Z(e,t)},set(e){this[o]=e}}})}apply(e){e.forEach(e=>e(this))}}({_scriptable:e=>!e.startsWith(`on`),_indexable:e=>e!==`events`,hover:{_fallback:`interaction`},interaction:{_scriptable:!1,_indexable:!1}},[Gl,Kl,$l]);function au(e){return!e||Y(e.size)||Y(e.family)?null:(e.style?e.style+` `:``)+(e.weight?e.weight+` `:``)+e.size+`px `+e.family}function ou(e,t,n,r,i){let a=t[i];return a||(a=t[i]=e.measureText(i).width,n.push(i)),a>r&&(r=a),r}function su(e,t,n,r){r=r||{};let i=r.data=r.data||{},a=r.garbageCollect=r.garbageCollect||[];r.font!==t&&(i=r.data={},a=r.garbageCollect=[],r.font=t),e.save(),e.font=t;let o=0,s=n.length,c,l,u,d,f;for(c=0;cn.length){for(c=0;c0&&e.stroke()}}function fu(e,t,n){return n=n||.5,!t||e&&e.x>t.left-n&&e.xt.top-n&&e.y0&&a.strokeColor!==``,c,l;for(e.save(),e.font=i.string,_u(e,a),c=0;c+e||0;function Eu(e,t){let n={},r=X(t),i=r?Object.keys(t):t,a=X(e)?r?n=>Z(e[n],e[t[n]]):t=>e[t]:()=>e;for(let e of i)n[e]=Tu(a(e));return n}function Du(e){return Eu(e,{top:`y`,right:`x`,bottom:`y`,left:`x`})}function Ou(e){return Eu(e,[`topLeft`,`topRight`,`bottomLeft`,`bottomRight`])}function ku(e){let t=Du(e);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function Au(e,t){e=e||{},t=t||iu.font;let n=Z(e.size,t.size);typeof n==`string`&&(n=parseInt(n,10));let r=Z(e.style,t.style);r&&!(``+r).match(Cu)&&(console.warn(`Invalid font style specified: "`+r+`"`),r=void 0);let i={family:Z(e.family,t.family),lineHeight:wu(Z(e.lineHeight,t.lineHeight),n),size:n,style:r,weight:Z(e.weight,t.weight),string:``};return i.string=au(i),i}function ju(e,t,n,r){let i=!0,a,o,s;for(a=0,o=e.length;an&&e===0?0:e+t;return{min:o(r,-Math.abs(a)),max:o(i,a)}}function Nu(e,t){return Object.assign(Object.create(e),t)}function Pu(e,t=[``],n,r,i=()=>e[0]){let a=n||e;return r===void 0&&(r=Xu(`_fallback`,e)),new Proxy({[Symbol.toStringTag]:`Object`,_cacheable:!0,_scopes:e,_rootScopes:a,_fallback:r,_getTarget:i,override:n=>Pu([n,...e],t,a,r)},{deleteProperty(t,n){return delete t[n],delete t._keys,delete e[0][n],!0},get(n,r){return zu(n,r,()=>Yu(r,t,e,n))},getOwnPropertyDescriptor(e,t){return Reflect.getOwnPropertyDescriptor(e._scopes[0],t)},getPrototypeOf(){return Reflect.getPrototypeOf(e[0])},has(e,t){return Zu(e).includes(t)},ownKeys(e){return Zu(e)},set(e,t,n){let r=e._storage||(e._storage=i());return e[t]=r[t]=n,delete e._keys,!0}})}function Fu(e,t,n,r){let i={_cacheable:!1,_proxy:e,_context:t,_subProxy:n,_stack:new Set,_descriptors:Iu(e,r),setContext:t=>Fu(e,t,n,r),override:i=>Fu(e.override(i),t,n,r)};return new Proxy(i,{deleteProperty(t,n){return delete t[n],delete e[n],!0},get(e,t,n){return zu(e,t,()=>Bu(e,t,n))},getOwnPropertyDescriptor(t,n){return t._descriptors.allKeys?Reflect.has(e,n)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(e,n)},getPrototypeOf(){return Reflect.getPrototypeOf(e)},has(t,n){return Reflect.has(e,n)},ownKeys(){return Reflect.ownKeys(e)},set(t,n,r){return e[n]=r,delete t[n],!0}})}function Iu(e,t={scriptable:!0,indexable:!0}){let{_scriptable:n=t.scriptable,_indexable:r=t.indexable,_allKeys:i=t.allKeys}=e;return{allKeys:i,scriptable:n,indexable:r,isScriptable:Gc(n)?n:()=>n,isIndexable:Gc(r)?r:()=>r}}var Lu=(e,t)=>e?e+Uc(t):t,Ru=(e,t)=>X(t)&&e!==`adapters`&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function zu(e,t,n){if(Object.prototype.hasOwnProperty.call(e,t)||t===`constructor`)return e[t];let r=n();return e[t]=r,r}function Bu(e,t,n){let{_proxy:r,_context:i,_subProxy:a,_descriptors:o}=e,s=r[t];return Gc(s)&&o.isScriptable(t)&&(s=Vu(t,s,e,n)),Ec(s)&&s.length&&(s=Hu(t,s,e,o.isIndexable)),Ru(t,s)&&(s=Fu(s,i,a&&a[t],o)),s}function Vu(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_stack:s}=n;if(s.has(e))throw Error(`Recursion detected: `+Array.from(s).join(`->`)+`->`+e);s.add(e);let c=t(a,o||r);return s.delete(e),Ru(e,c)&&(c=Ku(i._scopes,i,e,c)),c}function Hu(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_descriptors:s}=n;if(a.index!==void 0&&r(e))return t[a.index%t.length];if(X(t[0])){let n=t,r=i._scopes.filter(e=>e!==n);t=[];for(let c of n){let n=Ku(r,i,e,c);t.push(Fu(n,a,o&&o[e],s))}}return t}function Uu(e,t,n){return Gc(e)?e(t,n):e}var Wu=(e,t)=>e===!0?t:typeof e==`string`?Hc(t,e):void 0;function Gu(e,t,n,r,i){for(let a of t){let t=Wu(n,a);if(t){e.add(t);let a=Uu(t._fallback,n,i);if(a!==void 0&&a!==n&&a!==r)return a}else if(t===!1&&r!==void 0&&n!==r)return null}return!1}function Ku(e,t,n,r){let i=t._rootScopes,a=Uu(t._fallback,n,r),o=[...e,...i],s=new Set;s.add(r);let c=qu(s,o,n,a||n,r);return c===null||a!==void 0&&a!==n&&(c=qu(s,o,a,c,r),c===null)?!1:Pu(Array.from(s),[``],i,a,()=>Ju(t,n,r))}function qu(e,t,n,r,i){for(;n;)n=Gu(e,t,n,r,i);return n}function Ju(e,t,n){let r=e._getTarget();t in r||(r[t]={});let i=r[t];return Ec(i)&&X(n)?n:i||{}}function Yu(e,t,n,r){let i;for(let a of t)if(i=Xu(Lu(a,e),n),i!==void 0)return Ru(e,i)?Ku(n,r,e,i):i}function Xu(e,t){for(let n of t){if(!n)continue;let t=n[e];if(t!==void 0)return t}}function Zu(e){let t=e._keys;return t||(t=e._keys=Qu(e._scopes)),t}function Qu(e){let t=new Set;for(let n of e)for(let e of Object.keys(n).filter(e=>!e.startsWith(`_`)))t.add(e);return Array.from(t)}function $u(e,t,n,r){let{iScale:i}=e,{key:a=`r`}=this._parsing,o=Array(r),s,c,l,u;for(s=0,c=r;ste===`x`?`y`:`x`;function rd(e,t,n,r){let i=e.skip?t:e,a=t,o=n.skip?t:n,s=ml(a,i),c=ml(o,a),l=s/(s+c),u=c/(s+c);l=isNaN(l)?0:l,u=isNaN(u)?0:u;let d=r*l,f=r*u;return{previous:{x:a.x-d*(o.x-i.x),y:a.y-d*(o.y-i.y)},next:{x:a.x+f*(o.x-i.x),y:a.y+f*(o.y-i.y)}}}function id(e,t,n){let r=e.length,i,a,o,s,c,l=td(e,0);for(let u=0;u!e.skip)),t.cubicInterpolationMode===`monotone`)od(e,i);else{let n=r?e[e.length-1]:e[0];for(a=0,o=e.length;ae.ownerDocument.defaultView.getComputedStyle(e,null);function md(e,t){return pd(e).getPropertyValue(t)}var hd=[`top`,`right`,`bottom`,`left`];function gd(e,t,n){let r={};n=n?`-`+n:``;for(let i=0;i<4;i++){let a=hd[i];r[a]=parseFloat(e[t+`-`+a+n])||0}return r.width=r.left+r.right,r.height=r.top+r.bottom,r}var _d=(e,t,n)=>(e>0||t>0)&&(!n||!n.shadowRoot);function vd(e,t){let n=e.touches,r=n&&n.length?n[0]:e,{offsetX:i,offsetY:a}=r,o=!1,s,c;if(_d(i,a,e.target))s=i,c=a;else{let e=t.getBoundingClientRect();s=r.clientX-e.left,c=r.clientY-e.top,o=!0}return{x:s,y:c,box:o}}function yd(e,t){if(`native`in e)return e;let{canvas:n,currentDevicePixelRatio:r}=t,i=pd(n),a=i.boxSizing===`border-box`,o=gd(i,`padding`),s=gd(i,`border`,`width`),{x:c,y:l,box:u}=vd(e,n),d=o.left+(u&&s.left),f=o.top+(u&&s.top),{width:p,height:m}=t;return a&&(p-=o.width+s.width,m-=o.height+s.height),{x:Math.round((c-d)/p*n.width/r),y:Math.round((l-f)/m*n.height/r)}}function bd(e,t,n){let r,i;if(t===void 0||n===void 0){let a=e&&dd(e);if(!a)t=e.clientWidth,n=e.clientHeight;else{let e=a.getBoundingClientRect(),o=pd(a),s=gd(o,`border`,`width`),c=gd(o,`padding`);t=e.width-c.width-s.width,n=e.height-c.height-s.height,r=fd(o.maxWidth,a,`clientWidth`),i=fd(o.maxHeight,a,`clientHeight`)}}return{width:t,height:n,maxWidth:r||Xc,maxHeight:i||Xc}}var xd=e=>Math.round(e*10)/10;function Sd(e,t,n,r){let i=pd(e),a=gd(i,`margin`),o=fd(i.maxWidth,e,`clientWidth`)||Xc,s=fd(i.maxHeight,e,`clientHeight`)||Xc,c=bd(e,t,n),{width:l,height:u}=c;if(i.boxSizing===`content-box`){let e=gd(i,`border`,`width`),t=gd(i,`padding`);l-=t.width+e.width,u-=t.height+e.height}return l=Math.max(0,l-a.width),u=Math.max(0,r?l/r:u-a.height),l=xd(Math.min(l,o,c.maxWidth)),u=xd(Math.min(u,s,c.maxHeight)),l&&!u&&(u=xd(l/2)),(t!==void 0||n!==void 0)&&r&&c.height&&u>c.height&&(u=c.height,l=xd(Math.floor(u*r))),{width:l,height:u}}function Cd(e,t,n){let r=t||1,i=xd(e.height*r),a=xd(e.width*r);e.height=xd(e.height),e.width=xd(e.width);let o=e.canvas;o.style&&(n||!o.style.height&&!o.style.width)&&(o.style.height=`${e.height}px`,o.style.width=`${e.width}px`);let s=Math.floor(i),c=Math.floor(a);return e.currentDevicePixelRatio!==r||o.height!==s||o.width!==c?(e.currentDevicePixelRatio=r,o.height=s,o.width=c,e.ctx.setTransform(r,0,0,r,0,0),!0):!1}var wd=function(){let e=!1;try{let t={get passive(){return e=!0,!1}};ud()&&(window.addEventListener(`test`,null,t),window.removeEventListener(`test`,null,t))}catch{}return e}();function Td(e,t){let n=md(e,t),r=n&&n.match(/^(\d+)(\.\d+)?px$/);return r?+r[1]:void 0}function Ed(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:e.y+n*(t.y-e.y)}}function Dd(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:r===`middle`?n<.5?e.y:t.y:r===`after`?n<1?e.y:t.y:n>0?t.y:e.y}}function Od(e,t,n,r){let i={x:e.cp2x,y:e.cp2y},a={x:t.cp1x,y:t.cp1y},o=Ed(e,i,n),s=Ed(i,a,n),c=Ed(a,t,n);return Ed(Ed(o,s,n),Ed(s,c,n),n)}var kd=function(e,t){return{x(n){return e+e+t-n},setWidth(e){t=e},textAlign(e){return e===`center`?e:e===`right`?`left`:`right`},xPlus(e,t){return e-t},leftForLtr(e,t){return e-t}}},Ad=function(){return{x(e){return e},setWidth(e){},textAlign(e){return e},xPlus(e,t){return e+t},leftForLtr(e,t){return e}}};function jd(e,t,n){return e?kd(t,n):Ad()}function Md(e,t){let n,r;(t===`ltr`||t===`rtl`)&&(n=e.canvas.style,r=[n.getPropertyValue(`direction`),n.getPropertyPriority(`direction`)],n.setProperty(`direction`,t,`important`),e.prevTextDirection=r)}function Nd(e,t){t!==void 0&&(delete e.prevTextDirection,e.canvas.style.setProperty(`direction`,t[0],t[1]))}function Pd(e){return e===`angle`?{between:_l,compare:hl,normalize:gl}:{between:bl,compare:(e,t)=>e-t,normalize:e=>e}}function Fd({start:e,end:t,count:n,loop:r,style:i}){return{start:e%n,end:t%n,loop:r&&(t-e+1)%n===0,style:i}}function Id(e,t,n){let{property:r,start:i,end:a}=n,{between:o,normalize:s}=Pd(r),c=t.length,{start:l,end:u,loop:d}=e,f,p;if(d){for(l+=c,u+=c,f=0,p=c;fc(i,y,_)&&s(i,y)!==0,x=()=>s(a,_)===0||c(a,y,_),S=()=>h||b(),C=()=>!h||x();for(let e=u,n=u;e<=d;++e)v=t[e%o],!v.skip&&(_=l(v[r]),_!==y&&(h=c(_,i,a),g===null&&S()&&(g=s(_,i)===0?e:n),g!==null&&C()&&(m.push(Fd({start:g,end:e,loop:f,count:o,style:p})),g=null),n=e,y=_));return g!==null&&m.push(Fd({start:g,end:d,loop:f,count:o,style:p})),m}function Rd(e,t){let n=[],r=e.segments;for(let i=0;ii&&e[a%t].skip;)a--;return a%=t,{start:i,end:a}}function Bd(e,t,n,r){let i=e.length,a=[],o=t,s=e[t],c;for(c=t+1;c<=n;++c){let n=e[c%i];n.skip||n.stop?s.skip||(r=!1,a.push({start:t%i,end:(c-1)%i,loop:r}),t=o=n.stop?c:null):(o=c,s.skip&&(t=c)),s=n}return o!==null&&a.push({start:t%i,end:o%i,loop:r}),a}function Vd(e,t){let n=e.points,r=e.options.spanGaps,i=n.length;if(!i)return[];let a=!!e._loop,{start:o,end:s}=zd(n,i,a,r);return r===!0?Hd(e,[{start:o,end:s,loop:a}],n,t):Hd(e,Bd(n,o,sr({chart:e,initial:t.initial,numSteps:a,currentStep:Math.min(n-t.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=kl.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(e=Date.now()){let t=0;this._charts.forEach((n,r)=>{if(!n.running||!n.items.length)return;let i=n.items,a=i.length-1,o=!1,s;for(;a>=0;--a)s=i[a],s._active?(s._total>n.duration&&(n.duration=s._total),s.tick(e),o=!0):(i[a]=i[i.length-1],i.pop());o&&(r.draw(),this._notify(r,n,e,`progress`)),i.length||(n.running=!1,this._notify(r,n,e,`complete`),n.initial=!1),t+=i.length}),this._lastDate=e,t===0&&(this._running=!1)}_getAnims(e){let t=this._charts,n=t.get(e);return n||(n={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},t.set(e,n)),n}listen(e,t,n){this._getAnims(e).listeners[t].push(n)}add(e,t){t&&t.length&&this._getAnims(e).items.push(...t)}has(e){return this._getAnims(e).items.length>0}start(e){let t=this._charts.get(e);t&&(t.running=!0,t.start=Date.now(),t.duration=t.items.reduce((e,t)=>Math.max(e,t._duration),0),this._refresh())}running(e){if(!this._running)return!1;let t=this._charts.get(e);return!(!t||!t.running||!t.items.length)}stop(e){let t=this._charts.get(e);if(!t||!t.items.length)return;let n=t.items,r=n.length-1;for(;r>=0;--r)n[r].cancel();t.items=[],this._notify(e,t,Date.now(),`complete`)}remove(e){return this._charts.delete(e)}},Xd=`transparent`,Zd={boolean(e,t,n){return n>.5?t:e},color(e,t,n){let r=Vl(e||Xd),i=r.valid&&Vl(t||Xd);return i&&i.valid?i.mix(r,n).hexString():t},number(e,t,n){return e+(t-e)*n}},Qd=class{constructor(e,t,n,r){let i=t[n];r=ju([e.to,r,i,e.from]);let a=ju([e.from,i,r]);this._active=!0,this._fn=e.fn||Zd[e.type||typeof a],this._easing=zl[e.easing]||zl.linear,this._start=Math.floor(Date.now()+(e.delay||0)),this._duration=this._total=Math.floor(e.duration),this._loop=!!e.loop,this._target=t,this._prop=n,this._from=a,this._to=r,this._promises=void 0}active(){return this._active}update(e,t,n){if(this._active){this._notify(!1);let r=this._target[this._prop],i=n-this._start,a=this._duration-i;this._start=n,this._duration=Math.floor(Math.max(a,e.duration)),this._total+=i,this._loop=!!e.loop,this._to=ju([e.to,t,r,e.from]),this._from=ju([e.from,r,t])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(e){let t=e-this._start,n=this._duration,r=this._prop,i=this._from,a=this._loop,o=this._to,s;this._active=i!==o&&(a||t1?2-s:s,s=this._easing(Math.min(1,Math.max(0,s))),this._target[r]=this._fn(i,o,s)):(this._target[r]=o,this._notify(!0))}wait(){let e=this._promises||(this._promises=[]);return new Promise((t,n)=>{e.push({res:t,rej:n})})}_notify(e){let t=e?`res`:`rej`,n=this._promises||[];for(let e=0;e{let i=e[r];if(!X(i))return;let a={};for(let e of t)a[e]=i[e];(Ec(i.properties)&&i.properties||[r]).forEach(e=>{e!==r&&n.has(e)||n.set(e,a)})})}_animateOptions(e,t){let n=t.options,r=tf(e,n);if(!r)return[];let i=this._createAnimations(r,n);return n.$shared&&ef(e.options.$animations,n).then(()=>{e.options=n},()=>{}),i}_createAnimations(e,t){let n=this._properties,r=[],i=e.$animations||(e.$animations={}),a=Object.keys(t),o=Date.now(),s;for(s=a.length-1;s>=0;--s){let c=a[s];if(c.charAt(0)===`$`)continue;if(c===`options`){r.push(...this._animateOptions(e,t));continue}let l=t[c],u=i[c],d=n.get(c);if(u){if(d&&u.active()){u.update(d,l,o);continue}u.cancel()}!d||!d.duration?e[c]=l:(i[c]=u=new Qd(d,e,c,l),r.push(u))}return r}update(e,t){if(this._properties.size===0){Object.assign(e,t);return}let n=this._createAnimations(e,t);if(n.length)return Yd.add(this._chart,n),!0}};function ef(e,t){let n=[],r=Object.keys(t);for(let t=0;t0||!n&&t<0)return i.index}return null}function mf(e,t){let{chart:n,_cachedMeta:r}=e,i=n._stacks||(n._stacks={}),{iScale:a,vScale:o,index:s}=r,c=a.axis,l=o.axis,u=uf(a,o,r),d=t.length,f;for(let e=0;en[e].axis===t).shift()}function gf(e,t){return Nu(e,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:`default`,type:`dataset`})}function _f(e,t,n){return Nu(e,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:n,index:t,mode:`default`,type:`data`})}function vf(e,t){let n=e.controller.index,r=e.vScale&&e.vScale.axis;if(r){t=t||e._parsed;for(let e of t){let t=e._stacks;t&&t[r]!==void 0&&t[r][n]!==void 0&&(delete t[r][n],t[r]._visualValues!==void 0&&t[r]._visualValues[n]!==void 0&&delete t[r]._visualValues[n])}}}var yf=e=>e===`reset`||e===`none`,bf=(e,t)=>t?e:Object.assign({},e),xf=(e,t,n)=>e&&!t.hidden&&t._stacked&&{keys:of(n,!0),values:null},Sf=class{constructor(e,t){this.chart=e,this._ctx=e.ctx,this.index=t,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){let e=this._cachedMeta;this.configure(),this.linkScales(),e._stacked=lf(e.vScale,e),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled(`filler`)&&console.warn(`Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options`)}updateIndex(e){this.index!==e&&vf(this._cachedMeta),this.index=e}linkScales(){let e=this.chart,t=this._cachedMeta,n=this.getDataset(),r=(e,t,n,r)=>e===`x`?t:e===`r`?r:n,i=t.xAxisID=Z(n.xAxisID,hf(e,`x`)),a=t.yAxisID=Z(n.yAxisID,hf(e,`y`)),o=t.rAxisID=Z(n.rAxisID,hf(e,`r`)),s=t.indexAxis,c=t.iAxisID=r(s,i,a,o),l=t.vAxisID=r(s,a,i,o);t.xScale=this.getScaleForId(i),t.yScale=this.getScaleForId(a),t.rScale=this.getScaleForId(o),t.iScale=this.getScaleForId(c),t.vScale=this.getScaleForId(l)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(e){return this.chart.scales[e]}_getOtherScale(e){let t=this._cachedMeta;return e===t.iScale?t.vScale:t.iScale}reset(){this._update(`reset`)}_destroy(){let e=this._cachedMeta;this._data&&Dl(this._data,this),e._stacked&&vf(e)}_dataCheck(){let e=this.getDataset(),t=e.data||(e.data=[]),n=this._data;if(X(t)){let e=this._cachedMeta;this._data=cf(t,e)}else if(n!==t){if(n){Dl(n,this);let e=this._cachedMeta;vf(e),e._parsed=[]}t&&Object.isExtensible(t)&&El(t,this),this._syncList=[],this._data=t}}addElements(){let e=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(e.dataset=new this.datasetElementType)}buildOrUpdateElements(e){let t=this._cachedMeta,n=this.getDataset(),r=!1;this._dataCheck();let i=t._stacked;t._stacked=lf(t.vScale,t),t.stack!==n.stack&&(r=!0,vf(t),t.stack=n.stack),this._resyncElements(e),(r||i!==t._stacked)&&(mf(this,t._parsed),t._stacked=lf(t.vScale,t))}configure(){let e=this.chart.config,t=e.datasetScopeKeys(this._type),n=e.getOptionScopes(this.getDataset(),t,!0);this.options=e.createResolver(n,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(e,t){let{_cachedMeta:n,_data:r}=this,{iScale:i,_stacked:a}=n,o=i.axis,s=e===0&&t===r.length||n._sorted,c=e>0&&n._parsed[e-1],l,u,d;if(this._parsing===!1)n._parsed=r,n._sorted=!0,d=r;else{d=Ec(r[e])?this.parseArrayData(n,r,e,t):X(r[e])?this.parseObjectData(n,r,e,t):this.parsePrimitiveData(n,r,e,t);let i=()=>u[o]===null||c&&u[o]t||u=0;--d)if(!p()){this.updateRangeFromParsed(c,e,f,s);break}}return c}getAllParsedValues(e){let t=this._cachedMeta._parsed,n=[],r,i,a;for(r=0,i=t.length;r=0&&ethis.getContext(n,r,t),u);return p.$shared&&(p.$shared=s,i[a]=Object.freeze(bf(p,s))),p}_resolveAnimations(e,t,n){let r=this.chart,i=this._cachedDataOpts,a=`animation-${t}`,o=i[a];if(o)return o;let s;if(r.options.animation!==!1){let r=this.chart.config,i=r.datasetAnimationScopeKeys(this._type,t),a=r.getOptionScopes(this.getDataset(),i);s=r.createResolver(a,this.getContext(e,n,t))}let c=new $d(r,s&&s.animations);return s&&s._cacheable&&(i[a]=Object.freeze(c)),c}getSharedOptions(e){if(e.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},e))}includeOptions(e,t){return!t||yf(e)||this.chart._animationsDisabled}_getSharedOptions(e,t){let n=this.resolveDataElementOptions(e,t),r=this._sharedOptions,i=this.getSharedOptions(n),a=this.includeOptions(t,i)||i!==r;return this.updateSharedOptions(i,t,n),{sharedOptions:i,includeOptions:a}}updateElement(e,t,n,r){yf(r)?Object.assign(e,n):this._resolveAnimations(t,r).update(e,n)}updateSharedOptions(e,t,n){e&&!yf(t)&&this._resolveAnimations(void 0,t).update(e,n)}_setStyle(e,t,n,r){e.active=r;let i=this.getStyle(t,r);this._resolveAnimations(t,n,r).update(e,{options:!r&&this.getSharedOptions(i)||i})}removeHoverStyle(e,t,n){this._setStyle(e,n,`active`,!1)}setHoverStyle(e,t,n){this._setStyle(e,n,`active`,!0)}_removeDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!1)}_setDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!0)}_resyncElements(e){let t=this._data,n=this._cachedMeta.data;for(let[e,t,n]of this._syncList)this[e](t,n);this._syncList=[];let r=n.length,i=t.length,a=Math.min(i,r);a&&this.parse(0,a),i>r?this._insertElements(r,i-r,e):i{for(e.length+=t,o=e.length-1;o>=a;o--)e[o]=e[o-t]};for(s(i),o=e;oe-t))}return e._cache.$bar}function wf(e){let t=e.iScale,n=Cf(t,e.type),r=t._length,i,a,o,s,c=()=>{o!==32767&&o!==-32768&&(Wc(s)&&(r=Math.min(r,Math.abs(o-s)||r)),s=o)};for(i=0,a=n.length;i0?i[e-1]:null,s=eMath.abs(s)&&(c=s,l=o),t[n.axis]=l,t._custom={barStart:c,barEnd:l,start:i,end:a,min:o,max:s}}function Of(e,t,n,r){return Ec(e)?Df(e,t,n,r):t[n.axis]=n.parse(e,r),t}function kf(e,t,n,r){let i=e.iScale,a=e.vScale,o=i.getLabels(),s=i===a,c=[],l,u,d,f;for(l=n,u=n+r;l=n?1:-1):nl(e)}function Mf(e){let t,n,r,i,a;return e.horizontal?(t=e.base>e.x,n=`left`,r=`right`):(t=e.basee.controller.options.grouped),i=n.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(t),s=o&&o[n.axis],c=e=>{let t=e._parsed.find(e=>e[n.axis]===s),r=t&&t[e.vScale.axis];if(Y(r)||isNaN(r))return!0};for(let n of r)if(!(t!==void 0&&c(n))&&((i===!1||a.indexOf(n.stack)===-1||i===void 0&&n.stack===void 0)&&a.push(n.stack),n.index===e))break;return a.length||a.push(void 0),a}_getStackCount(e){return this._getStacks(void 0,e).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){let e=this.chart.scales,t=this.chart.options.indexAxis;return Object.keys(e).filter(n=>e[n].axis===t).shift()}_getAxis(){let e={},t=this.getFirstScaleIdForIndexAxis();for(let n of this.chart.data.datasets)e[Z(this.chart.options.indexAxis===`x`?n.xAxisID:n.yAxisID,t)]=!0;return Object.keys(e)}_getStackIndex(e,t,n){let r=this._getStacks(e,n),i=t===void 0?-1:r.indexOf(t);return i===-1?r.length-1:i}_getRuler(){let e=this.options,t=this._cachedMeta,n=t.iScale,r=[],i,a;for(i=0,a=t.data.length;i=0;--n)t=Math.max(t,e[n].size(this.resolveDataElementOptions(n))/2);return t>0&&t}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart.data.labels||[],{xScale:r,yScale:i}=t,a=this.getParsed(e),o=r.getLabelForValue(a.x),s=i.getLabelForValue(a.y),c=a._custom;return{label:n[e]||``,value:`(`+o+`, `+s+(c?`, `+c:``)+`)`}}update(e){let t=this._cachedMeta.data;this.updateElements(t,0,t.length,e)}updateElements(e,t,n,r){let i=r===`reset`,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:s,includeOptions:c}=this._getSharedOptions(t,r),l=a.axis,u=o.axis;for(let d=t;d_l(e,s,c,!0)?1:Math.max(t,t*n,r,r*n),m=(e,t,r)=>_l(e,s,c,!0)?-1:Math.min(t,t*n,r,r*n),h=p(0,l,d),g=p(Qc,u,f),_=m($,l,d),v=m($+Qc,u,f);r=(h-_)/2,i=(g-v)/2,a=-(h+_)/2,o=-(g+v)/2}return{ratioX:r,ratioY:i,offsetX:a,offsetY:o}}var Vf=class extends Sf{constructor(e,t){super(e,t),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(e,t){let n=this.getDataset().data,r=this._cachedMeta;if(this._parsing===!1)r._parsed=n;else{let i=e=>+n[e];if(X(n[e])){let{key:e=`value`}=this._parsing;i=t=>+Hc(n[t],e)}let a,o;for(a=e,o=e+t;a0&&!isNaN(e)?Math.abs(e)/t*Jc:0}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart,r=n.data.labels||[],i=Yl(t._parsed[e],n.options.locale);return{label:r[e]||``,value:i}}getMaxBorderWidth(e){let t=0,n=this.chart,r,i,a,o,s;if(!e){for(r=0,i=n.data.datasets.length;re!==`spacing`&&e!==`spacingMode`,_indexable:e=>e!==`spacing`&&e!==`spacingMode`&&!e.startsWith(`borderDash`)&&!e.startsWith(`hoverBorderDash`)}),z(Vf,`overrides`,{aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){let t=e.data,{labels:{pointStyle:n,textAlign:r,color:i,useBorderRadius:a,borderRadius:o}}=e.legend.options;return t.labels.length&&t.datasets.length?t.labels.map((t,s)=>{let c=e.getDatasetMeta(0).controller.getStyle(s);return{text:t,fillStyle:c.backgroundColor,fontColor:i,hidden:!e.getDataVisibility(s),lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:c.borderWidth,strokeStyle:c.borderColor,textAlign:r,pointStyle:n,borderRadius:a&&(o||c.borderRadius),index:s}}):[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}}});var Hf=class extends Sf{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(e){let t=this._cachedMeta,{dataset:n,data:r=[],_dataset:i}=t,a=this.chart._animationsDisabled,{start:o,count:s}=Pl(t,r,a);this._drawStart=o,this._drawCount=s,Fl(t)&&(o=0,s=r.length),n._chart=this.chart,n._datasetIndex=this.index,n._decimated=!!i._decimated,n.points=r;let c=this.resolveDatasetElementOptions(e);this.options.showLine||(c.borderWidth=0),c.segment=this.options.segment,this.updateElement(n,void 0,{animated:!a,options:c},e),this.updateElements(r,o,s,e)}updateElements(e,t,n,r){let i=r===`reset`,{iScale:a,vScale:o,_stacked:s,_dataset:c}=this._cachedMeta,{sharedOptions:l,includeOptions:u}=this._getSharedOptions(t,r),d=a.axis,f=o.axis,{spanGaps:p,segment:m}=this.options,h=sl(p)?p:1/0,g=this.chart._animationsDisabled||i||r===`none`,_=t+n,v=e.length,y=t>0&&this.getParsed(t-1);for(let n=0;n=_){v.skip=!0;continue}let b=this.getParsed(n),x=Y(b[f]),S=v[d]=a.getPixelForValue(b[d],n),C=v[f]=i||x?o.getBasePixel():o.getPixelForValue(s?this.applyStack(o,b,s):b[f],n);v.skip=isNaN(S)||isNaN(C)||x,v.stop=n>0&&Math.abs(b[d]-y[d])>h,m&&(v.parsed=b,v.raw=c.data[n]),u&&(v.options=l||this.resolveDataElementOptions(n,p.active?`active`:r)),g||this.updateElement(p,n,v,r),y=b}}getMaxOverflow(){let e=this._cachedMeta,t=e.dataset,n=t.options&&t.options.borderWidth||0,r=e.data||[];if(!r.length)return n;let i=r[0].size(this.resolveDataElementOptions(0)),a=r[r.length-1].size(this.resolveDataElementOptions(r.length-1));return Math.max(n,i,a)/2}draw(){let e=this._cachedMeta;e.dataset.updateControlPoints(this.chart.chartArea,e.iScale.axis),super.draw()}};z(Hf,`id`,`line`),z(Hf,`defaults`,{datasetElementType:`line`,dataElementType:`point`,showLine:!0,spanGaps:!1}),z(Hf,`overrides`,{scales:{_index_:{type:`category`},_value_:{type:`linear`}}});var Uf=class extends Sf{constructor(e,t){super(e,t),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart,r=n.data.labels||[],i=Yl(t._parsed[e].r,n.options.locale);return{label:r[e]||``,value:i}}parseObjectData(e,t,n,r){return $u.bind(this)(e,t,n,r)}update(e){let t=this._cachedMeta.data;this._updateRadius(),this.updateElements(t,0,t.length,e)}getMinMax(){let e=this._cachedMeta,t={min:1/0,max:-1/0};return e.data.forEach((e,n)=>{let r=this.getParsed(n).r;!isNaN(r)&&this.chart.getDataVisibility(n)&&(rt.max&&(t.max=r))}),t}_updateRadius(){let e=this.chart,t=e.chartArea,n=e.options,r=Math.min(t.right-t.left,t.bottom-t.top),i=Math.max(r/2,0),a=(i-Math.max(n.cutoutPercentage?i/100*n.cutoutPercentage:1,0))/e.getVisibleDatasetCount();this.outerRadius=i-a*this.index,this.innerRadius=this.outerRadius-a}updateElements(e,t,n,r){let i=r===`reset`,a=this.chart,o=a.options.animation,s=this._cachedMeta.rScale,c=s.xCenter,l=s.yCenter,u=s.getIndexAngle(0)-.5*$,d=u,f,p=360/this.countVisibleElements();for(f=0;f{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&t++}),t}_computeAngle(e,t,n){return this.chart.getDataVisibility(e)?ul(this.resolveDataElementOptions(e,t).angle||n):0}};z(Uf,`id`,`polarArea`),z(Uf,`defaults`,{dataElementType:`arc`,animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:`number`,properties:[`x`,`y`,`startAngle`,`endAngle`,`innerRadius`,`outerRadius`]}},indexAxis:`r`,startAngle:0,spacing:0,spacingMode:`proportional`}),z(Uf,`overrides`,{aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){let t=e.data;if(t.labels.length&&t.datasets.length){let{labels:{pointStyle:n,color:r}}=e.legend.options;return t.labels.map((t,i)=>{let a=e.getDatasetMeta(0).controller.getStyle(i);return{text:t,fillStyle:a.backgroundColor,strokeStyle:a.borderColor,fontColor:r,lineWidth:a.borderWidth,pointStyle:n,hidden:!e.getDataVisibility(i),index:i}})}return[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}},scales:{r:{type:`radialLinear`,angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});var Wf=class extends Vf{};z(Wf,`id`,`pie`),z(Wf,`defaults`,{cutout:0,rotation:0,circumference:360,radius:`100%`});var Gf=class extends Sf{getLabelAndValue(e){let t=this._cachedMeta.vScale,n=this.getParsed(e);return{label:t.getLabels()[e],value:``+t.getLabelForValue(n[t.axis])}}parseObjectData(e,t,n,r){return $u.bind(this)(e,t,n,r)}update(e){let t=this._cachedMeta,n=t.dataset,r=t.data||[],i=t.iScale.getLabels();if(n.points=r,e!==`resize`){let t=this.resolveDatasetElementOptions(e);this.options.showLine||(t.borderWidth=0);let a={_loop:!0,_fullLoop:i.length===r.length,options:t};this.updateElement(n,void 0,a,e)}this.updateElements(r,0,r.length,e)}updateElements(e,t,n,r){let i=this._cachedMeta.rScale,a=r===`reset`;for(let o=t;o0&&this.getParsed(t-1);for(let l=t;l0&&Math.abs(n[f]-v[f])>g,h&&(m.parsed=n,m.raw=c.data[l]),d&&(m.options=u||this.resolveDataElementOptions(l,t.active?`active`:r)),_||this.updateElement(t,l,m,r),v=n}this.updateSharedOptions(u,r,l)}getMaxOverflow(){let e=this._cachedMeta,t=e.data||[];if(!this.options.showLine){let e=0;for(let n=t.length-1;n>=0;--n)e=Math.max(e,t[n].size(this.resolveDataElementOptions(n))/2);return e>0&&e}let n=e.dataset,r=n.options&&n.options.borderWidth||0;if(!t.length)return r;let i=t[0].size(this.resolveDataElementOptions(0)),a=t[t.length-1].size(this.resolveDataElementOptions(t.length-1));return Math.max(r,i,a)/2}};z(Kf,`id`,`scatter`),z(Kf,`defaults`,{datasetElementType:!1,dataElementType:`point`,showLine:!1,fill:!1}),z(Kf,`overrides`,{interaction:{mode:`point`},scales:{x:{type:`linear`},y:{type:`linear`}}});function qf(){throw Error(`This method is not implemented: Check that a complete date adapter is provided.`)}var Jf={_date:class e{static override(t){Object.assign(e.prototype,t)}constructor(e){z(this,`options`,void 0),this.options=e||{}}init(){}formats(){return qf()}parse(){return qf()}format(){return qf()}add(){return qf()}diff(){return qf()}startOf(){return qf()}endOf(){return qf()}}};function Yf(e,t,n,r){let{controller:i,data:a,_sorted:o}=e,s=i._cachedMeta.iScale,c=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null;if(s&&t===s.axis&&t!==`r`&&o&&a.length){let o=s._reversePixels?Cl:Sl;if(!r){let r=o(a,t,n);if(c){let{vScale:t}=i._cachedMeta,{_parsed:n}=e,a=n.slice(0,r.lo+1).reverse().findIndex(e=>!Y(e[t.axis]));r.lo-=Math.max(0,a);let o=n.slice(r.hi).findIndex(e=>!Y(e[t.axis]));r.hi+=Math.max(0,o)}return r}if(i._sharedOptions){let e=a[0],r=typeof e.getRange==`function`&&e.getRange(t);if(r){let e=o(a,t,n-r),i=o(a,t,n+r);return{lo:e.lo,hi:i.hi}}}}return{lo:0,hi:a.length-1}}function Xf(e,t,n,r,i){let a=e.getSortedVisibleDatasetMetas(),o=n[t];for(let e=0,n=a.length;e{e[o]&&e[o](t[n],i)&&(a.push({element:e,datasetIndex:r,index:c}),s=s||e.inRange(t.x,t.y,i))}),r&&!s?[]:a}var rp={evaluateInteractionItems:Xf,modes:{index(e,t,n,r){let i=yd(t,e),a=n.axis||`x`,o=n.includeInvisible||!1,s=n.intersect?Qf(e,i,a,r,o):tp(e,i,a,!1,r,o),c=[];return s.length?(e.getSortedVisibleDatasetMetas().forEach(e=>{let t=s[0].index,n=e.data[t];n&&!n.skip&&c.push({element:n,datasetIndex:e.index,index:t})}),c):[]},dataset(e,t,n,r){let i=yd(t,e),a=n.axis||`xy`,o=n.includeInvisible||!1,s=n.intersect?Qf(e,i,a,r,o):tp(e,i,a,!1,r,o);if(s.length>0){let t=s[0].datasetIndex,n=e.getDatasetMeta(t).data;s=[];for(let e=0;ee.pos===t)}function op(e,t){return e.filter(e=>ip.indexOf(e.pos)===-1&&e.box.axis===t)}function sp(e,t){return e.sort((e,n)=>{let r=t?n:e,i=t?e:n;return r.weight===i.weight?r.index-i.index:r.weight-i.weight})}function cp(e){let t=[],n,r,i,a,o,s;for(n=0,r=(e||[]).length;ne.box.fullSize),!0),r=sp(ap(t,`left`),!0),i=sp(ap(t,`right`)),a=sp(ap(t,`top`),!0),o=sp(ap(t,`bottom`)),s=op(t,`x`),c=op(t,`y`);return{fullSize:n,leftAndTop:r.concat(a),rightAndBottom:i.concat(c).concat(o).concat(s),chartArea:ap(t,`chartArea`),vertical:r.concat(i).concat(c),horizontal:a.concat(o).concat(s)}}function fp(e,t,n,r){return Math.max(e[n],t[n])+Math.max(e[r],t[r])}function pp(e,t){e.top=Math.max(e.top,t.top),e.left=Math.max(e.left,t.left),e.bottom=Math.max(e.bottom,t.bottom),e.right=Math.max(e.right,t.right)}function mp(e,t,n,r){let{pos:i,box:a}=n,o=e.maxPadding;if(!X(i)){n.size&&(e[i]-=n.size);let t=r[n.stack]||{size:0,count:1};t.size=Math.max(t.size,n.horizontal?a.height:a.width),n.size=t.size/t.count,e[i]+=n.size}a.getPadding&&pp(o,a.getPadding());let s=Math.max(0,t.outerWidth-fp(o,e,`left`,`right`)),c=Math.max(0,t.outerHeight-fp(o,e,`top`,`bottom`)),l=s!==e.w,u=c!==e.h;return e.w=s,e.h=c,n.horizontal?{same:l,other:u}:{same:u,other:l}}function hp(e){let t=e.maxPadding;function n(n){let r=Math.max(t[n]-e[n],0);return e[n]+=r,r}e.y+=n(`top`),e.x+=n(`left`),n(`right`),n(`bottom`)}function gp(e,t){let n=t.maxPadding;function r(e){let r={left:0,top:0,right:0,bottom:0};return e.forEach(e=>{r[e]=Math.max(t[e],n[e])}),r}return r(e?[`left`,`right`]:[`top`,`bottom`])}function _p(e,t,n,r){let i=[],a,o,s,c,l,u;for(a=0,o=e.length,l=0;a{typeof e.beforeLayout==`function`&&e.beforeLayout()});let u=c.reduce((e,t)=>t.box.options&&t.box.options.display===!1?e:e+1,0)||1,d=Object.freeze({outerWidth:t,outerHeight:n,padding:i,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/u,hBoxMaxHeight:o/2}),f=Object.assign({},i);pp(f,ku(r));let p=Object.assign({maxPadding:f,w:a,h:o,x:i.left,y:i.top},i),m=up(c.concat(l),d);_p(s.fullSize,p,d,m),_p(c,p,d,m),_p(l,p,d,m)&&_p(c,p,d,m),hp(p),yp(s.leftAndTop,p,d,m),p.x+=p.w,p.y+=p.h,yp(s.rightAndBottom,p,d,m),e.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},Q(s.chartArea,t=>{let n=t.box;Object.assign(n,e.chartArea),n.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}},xp=class{acquireContext(e,t){}releaseContext(e){return!1}addEventListener(e,t,n){}removeEventListener(e,t,n){}getDevicePixelRatio(){return 1}getMaximumSize(e,t,n,r){return t=Math.max(0,t||e.width),n=n||e.height,{width:t,height:Math.max(0,r?Math.floor(t/r):n)}}isAttached(e){return!0}updateConfig(e){}},Sp=class extends xp{acquireContext(e){return e&&e.getContext&&e.getContext(`2d`)||null}updateConfig(e){e.options.animation=!1}},Cp=`$chartjs`,wp={touchstart:`mousedown`,touchmove:`mousemove`,touchend:`mouseup`,pointerenter:`mouseenter`,pointerdown:`mousedown`,pointermove:`mousemove`,pointerup:`mouseup`,pointerleave:`mouseout`,pointerout:`mouseout`},Tp=e=>e===null||e===``;function Ep(e,t){let n=e.style,r=e.getAttribute(`height`),i=e.getAttribute(`width`);if(e[Cp]={initial:{height:r,width:i,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||`block`,n.boxSizing=n.boxSizing||`border-box`,Tp(i)){let t=Td(e,`width`);t!==void 0&&(e.width=t)}if(Tp(r)){if(e.style.height===``)e.height=e.width/(t||2);else{let t=Td(e,`height`);t!==void 0&&(e.height=t)}}return e}var Dp=wd?{passive:!0}:!1;function Op(e,t,n){e&&e.addEventListener(t,n,Dp)}function kp(e,t,n){e&&e.canvas&&e.canvas.removeEventListener(t,n,Dp)}function Ap(e,t){let n=wp[e.type]||e.type,{x:r,y:i}=yd(e,t);return{type:n,chart:t,native:e,x:r===void 0?null:r,y:i===void 0?null:i}}function jp(e,t){for(let n of e)if(n===t||n.contains(t))return!0}function Mp(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t=t||jp(n.addedNodes,r),t=t&&!jp(n.removedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}function Np(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t=t||jp(n.removedNodes,r),t=t&&!jp(n.addedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}var Pp=new Map,Fp=0;function Ip(){let e=window.devicePixelRatio;e!==Fp&&(Fp=e,Pp.forEach((t,n)=>{n.currentDevicePixelRatio!==e&&t()}))}function Lp(e,t){Pp.size||window.addEventListener(`resize`,Ip),Pp.set(e,t)}function Rp(e){Pp.delete(e),Pp.size||window.removeEventListener(`resize`,Ip)}function zp(e,t,n){let r=e.canvas,i=r&&dd(r);if(!i)return;let a=Al((e,t)=>{let r=i.clientWidth;n(e,t),r{let t=e[0],n=t.contentRect.width,r=t.contentRect.height;(n!==0||r!==0)&&a(n,r)});return o.observe(i),Lp(e,a),o}function Bp(e,t,n){n&&n.disconnect(),t===`resize`&&Rp(e)}function Vp(e,t,n){let r=e.canvas,i=Al(t=>{e.ctx!==null&&n(Ap(t,e))},e);return Op(r,t,i),i}var Hp=class extends xp{acquireContext(e,t){let n=e&&e.getContext&&e.getContext(`2d`);return n&&n.canvas===e?(Ep(e,t),n):null}releaseContext(e){let t=e.canvas;if(!t[Cp])return!1;let n=t[Cp].initial;[`height`,`width`].forEach(e=>{let r=n[e];Y(r)?t.removeAttribute(e):t.setAttribute(e,r)});let r=n.style||{};return Object.keys(r).forEach(e=>{t.style[e]=r[e]}),t.width=t.width,delete t[Cp],!0}addEventListener(e,t,n){this.removeEventListener(e,t);let r=e.$proxies||(e.$proxies={});r[t]=({attach:Mp,detach:Np,resize:zp}[t]||Vp)(e,t,n)}removeEventListener(e,t){let n=e.$proxies||(e.$proxies={}),r=n[t];r&&(({attach:Bp,detach:Bp,resize:Bp}[t]||kp)(e,t,r),n[t]=void 0)}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(e,t,n,r){return Sd(e,t,n,r)}isAttached(e){let t=e&&dd(e);return!!(t&&t.isConnected)}};function Up(e){return!ud()||typeof OffscreenCanvas<`u`&&e instanceof OffscreenCanvas?Sp:Hp}var Wp=class{constructor(){z(this,`x`,void 0),z(this,`y`,void 0),z(this,`active`,!1),z(this,`options`,void 0),z(this,`$animations`,void 0)}tooltipPosition(e){let{x:t,y:n}=this.getProps([`x`,`y`],e);return{x:t,y:n}}hasValue(){return sl(this.x)&&sl(this.y)}getProps(e,t){let n=this.$animations;if(!t||!n)return this;let r={};return e.forEach(e=>{r[e]=n[e]&&n[e].active()?n[e]._to:this[e]}),r}};z(Wp,`defaults`,{}),z(Wp,`defaultRoutes`,void 0);function Gp(e,t){let n=e.options.ticks,r=Kp(e),i=Math.min(n.maxTicksLimit||r,r),a=n.major.enabled?Jp(t):[],o=a.length,s=a[0],c=a[o-1],l=[];if(o>i)return Yp(t,l,a,o/i),l;let u=qp(a,t,i);if(o>0){let e,n,r=o>1?Math.round((c-s)/(o-1)):null;for(Xp(t,l,u,Y(r)?0:s-r,s),e=0,n=o-1;ei)return t}return Math.max(i,1)}function Jp(e){let t=[],n,r;for(n=0,r=e.length;ne===`left`?`right`:e===`right`?`left`:e,$p=(e,t,n)=>t===`top`||t===`left`?e[t]+n:e[t]-n,em=(e,t)=>Math.min(t||e,e);function tm(e,t){let n=[],r=e.length/t,i=e.length,a=0;for(;ao+s)))return c}function rm(e,t){Q(e,e=>{let n=e.gc,r=n.length/2,i;if(r>t){for(i=0;in?n:t,n=r&&t>n?t:n,{min:Oc(t,Oc(n,t)),max:Oc(n,Oc(t,n))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){let e=this.chart.data;return this.options.labels||(this.isHorizontal()?e.xLabels:e.yLabels)||e.labels||[]}getLabelItems(e=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(e))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){jc(this.options.beforeUpdate,[this])}update(e,t,n){let{beginAtZero:r,grace:i,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=e,this.maxHeight=t,this._margins=n=Object.assign({left:0,right:0,top:0,bottom:0},n),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+n.left+n.right:this.height+n.top+n.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=Mu(this,i,r),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();let s=o=i||n<=1||!this.isHorizontal()){this.labelRotation=r;return}let l=this._getLabelSizes(),u=l.widest.width,d=l.highest.height,f=vl(this.chart.width-u,0,this.maxWidth);o=e.offset?this.maxWidth/n:f/(n-1),u+6>o&&(o=f/(n-(e.offset?.5:1)),s=this.maxHeight-im(e.grid)-t.padding-am(e.title,this.chart.options.font),c=Math.sqrt(u*u+d*d),a=dl(Math.min(Math.asin(vl((l.highest.height+6)/o,-1,1)),Math.asin(vl(s/c,-1,1))-Math.asin(vl(d/c,-1,1)))),a=Math.max(r,Math.min(i,a))),this.labelRotation=a}afterCalculateLabelRotation(){jc(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){jc(this.options.beforeFit,[this])}fit(){let e={width:0,height:0},{chart:t,options:{ticks:n,title:r,grid:i}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){let a=am(r,t.options.font);if(o?(e.width=this.maxWidth,e.height=im(i)+a):(e.height=this.maxHeight,e.width=im(i)+a),n.display&&this.ticks.length){let{first:t,last:r,widest:i,highest:a}=this._getLabelSizes(),s=n.padding*2,c=ul(this.labelRotation),l=Math.cos(c),u=Math.sin(c);if(o){let t=n.mirror?0:u*i.width+l*a.height;e.height=Math.min(this.maxHeight,e.height+t+s)}else{let t=n.mirror?0:l*i.width+u*a.height;e.width=Math.min(this.maxWidth,e.width+t+s)}this._calculatePadding(t,r,u,l)}}this._handleMargins(),o?(this.width=this._length=t.width-this._margins.left-this._margins.right,this.height=e.height):(this.width=e.width,this.height=this._length=t.height-this._margins.top-this._margins.bottom)}_calculatePadding(e,t,n,r){let{ticks:{align:i,padding:a},position:o}=this.options,s=this.labelRotation!==0,c=o!==`top`&&this.axis===`x`;if(this.isHorizontal()){let o=this.getPixelForTick(0)-this.left,l=this.right-this.getPixelForTick(this.ticks.length-1),u=0,d=0;s?c?(u=r*e.width,d=n*t.height):(u=n*e.height,d=r*t.width):i===`start`?d=t.width:i===`end`?u=e.width:i!==`inner`&&(u=e.width/2,d=t.width/2),this.paddingLeft=Math.max((u-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((d-l+a)*this.width/(this.width-l),0)}else{let n=t.height/2,r=e.height/2;i===`start`?(n=0,r=e.height):i===`end`&&(n=t.height,r=0),this.paddingTop=n+a,this.paddingBottom=r+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){jc(this.options.afterFit,[this])}isHorizontal(){let{axis:e,position:t}=this.options;return t===`top`||t===`bottom`||e===`x`}isFullSize(){return this.options.fullSize}_convertTicksToLabels(e){this.beforeTickToLabelConversion(),this.generateTickLabels(e);let t,n;for(t=0,n=e.length;t({width:a[e]||0,height:o[e]||0});return{first:C(0),last:C(t-1),widest:C(x),highest:C(S),widths:a,heights:o}}getLabelForValue(e){return e}getPixelForValue(e,t){return NaN}getValueForPixel(e){}getPixelForTick(e){let t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e].value)}getPixelForDecimal(e){this._reversePixels&&(e=1-e);let t=this._startPixel+e*this._length;return yl(this._alignToPixels?cu(this.chart,t,0):t)}getDecimalForPixel(e){let t=(e-this._startPixel)/this._length;return this._reversePixels?1-t:t}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){let{min:e,max:t}=this;return e<0&&t<0?t:e>0&&t>0?e:0}getContext(e){let t=this.ticks||[];if(e>=0&&eo*r?o/n:s/r:s*r0:!!e}_computeGridLineItems(e){let t=this.axis,n=this.chart,r=this.options,{grid:i,position:a,border:o}=r,s=i.offset,c=this.isHorizontal(),l=this.ticks.length+ +!!s,u=im(i),d=[],f=o.setContext(this.getContext()),p=f.display?f.width:0,m=p/2,h=function(e){return cu(n,e,p)},g,_,v,y,b,x,S,C,w,T,E,D;if(a===`top`)g=h(this.bottom),x=this.bottom-u,C=g-m,T=h(e.top)+m,D=e.bottom;else if(a===`bottom`)g=h(this.top),T=e.top,D=h(e.bottom)-m,x=g+m,C=this.top+u;else if(a===`left`)g=h(this.right),b=this.right-u,S=g-m,w=h(e.left)+m,E=e.right;else if(a===`right`)g=h(this.left),w=e.left,E=h(e.right)-m,b=g+m,S=this.left+u;else if(t===`x`){if(a===`center`)g=h((e.top+e.bottom)/2+.5);else if(X(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}T=e.top,D=e.bottom,x=g+m,C=x+u}else if(t===`y`){if(a===`center`)g=h((e.left+e.right)/2);else if(X(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}b=g-m,S=b-u,w=e.left,E=e.right}let O=Z(r.ticks.maxTicksLimit,l),k=Math.max(1,Math.ceil(l/O));for(_=0;_0&&(a-=r/2)}f={left:a,top:i,width:r+t.width,height:n+t.height,color:e.backdropColor}}h.push({label:y,font:w,textOffset:D,options:{rotation:m,color:n,strokeColor:s,strokeWidth:l,textAlign:d,textBaseline:O,translation:[b,x],backdrop:f}})}return h}_getXAxisLabelAlignment(){let{position:e,ticks:t}=this.options;if(-ul(this.labelRotation))return e===`top`?`left`:`right`;let n=`center`;return t.align===`start`?n=`left`:t.align===`end`?n=`right`:t.align===`inner`&&(n=`inner`),n}_getYAxisLabelAlignment(e){let{position:t,ticks:{crossAlign:n,mirror:r,padding:i}}=this.options,a=this._getLabelSizes(),o=e+i,s=a.widest.width,c,l;return t===`left`?r?(l=this.right+i,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l+=s)):(l=this.right-o,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l=this.left)):t===`right`?r?(l=this.left+i,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l-=s)):(l=this.left+o,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l=this.right)):c=`right`,{textAlign:c,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;let e=this.chart,t=this.options.position;if(t===`left`||t===`right`)return{top:0,left:this.left,bottom:e.height,right:this.right};if(t===`top`||t===`bottom`)return{top:this.top,left:0,bottom:this.bottom,right:e.width}}drawBackground(){let{ctx:e,options:{backgroundColor:t},left:n,top:r,width:i,height:a}=this;t&&(e.save(),e.fillStyle=t,e.fillRect(n,r,i,a),e.restore())}getLineWidthForValue(e){let t=this.options.grid;if(!this._isVisible()||!t.display)return 0;let n=this.ticks.findIndex(t=>t.value===e);return n>=0?t.setContext(this.getContext(n)).lineWidth:0}drawGrid(e){let t=this.options.grid,n=this.ctx,r=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(e)),i,a,o=(e,t,r)=>{r.width&&r.color&&(n.save(),n.lineWidth=r.width,n.strokeStyle=r.color,n.setLineDash(r.borderDash||[]),n.lineDashOffset=r.borderDashOffset,n.beginPath(),n.moveTo(e.x,e.y),n.lineTo(t.x,t.y),n.stroke(),n.restore())};if(t.display)for(i=0,a=r.length;i{this.draw(e)}}]:[{z:r,draw:e=>{this.drawBackground(),this.drawGrid(e),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:n,draw:e=>{this.drawLabels(e)}}]}getMatchingVisibleMetas(e){let t=this.chart.getSortedVisibleDatasetMetas(),n=this.axis+`AxisID`,r=[],i,a;for(i=0,a=t.length;i{let r=n.split(`.`),i=r.pop(),a=[e].concat(r).join(`.`),o=t[n].split(`.`),s=o.pop(),c=o.join(`.`);iu.route(a,i,c,s)})}function mm(e){return`id`in e&&`defaults`in e}var hm=new class{constructor(){this.controllers=new dm(Sf,`datasets`,!0),this.elements=new dm(Wp,`elements`),this.plugins=new dm(Object,`plugins`),this.scales=new dm(um,`scales`),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...e){this._each(`register`,e)}remove(...e){this._each(`unregister`,e)}addControllers(...e){this._each(`register`,e,this.controllers)}addElements(...e){this._each(`register`,e,this.elements)}addPlugins(...e){this._each(`register`,e,this.plugins)}addScales(...e){this._each(`register`,e,this.scales)}getController(e){return this._get(e,this.controllers,`controller`)}getElement(e){return this._get(e,this.elements,`element`)}getPlugin(e){return this._get(e,this.plugins,`plugin`)}getScale(e){return this._get(e,this.scales,`scale`)}removeControllers(...e){this._each(`unregister`,e,this.controllers)}removeElements(...e){this._each(`unregister`,e,this.elements)}removePlugins(...e){this._each(`unregister`,e,this.plugins)}removeScales(...e){this._each(`unregister`,e,this.scales)}_each(e,t,n){[...t].forEach(t=>{let r=n||this._getRegistryForType(t);n||r.isForType(t)||r===this.plugins&&t.id?this._exec(e,r,t):Q(t,t=>{let r=n||this._getRegistryForType(t);this._exec(e,r,t)})})}_exec(e,t,n){let r=Uc(e);jc(n[`before`+r],[],n),t[e](n),jc(n[`after`+r],[],n)}_getRegistryForType(e){for(let t=0;te.filter(e=>!t.some(t=>e.plugin.id===t.plugin.id));this._notify(r(t,n),e,`stop`),this._notify(r(n,t),e,`start`)}};function _m(e){let t={},n=[],r=Object.keys(hm.plugins.items);for(let e=0;e1&&wm(e[0].toLowerCase());if(t)return t}throw Error(`Cannot determine type of '${e}' axis. Please provide 'axis' or 'position' option.`)}function Dm(e,t,n){if(n[t+`AxisID`]===e)return{axis:t}}function Om(e,t){if(t.data&&t.data.datasets){let n=t.data.datasets.filter(t=>t.xAxisID===e||t.yAxisID===e);if(n.length)return Dm(e,`x`,n[0])||Dm(e,`y`,n[0])}return{}}function km(e,t){let n=eu[e.type]||{scales:{}},r=t.scales||{},i=xm(e.type,t),a=Object.create(null);return Object.keys(r).forEach(t=>{let o=r[t];if(!X(o))return console.error(`Invalid scale configuration for scale: ${t}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);let s=Em(t,o,Om(t,e),iu.scales[o.type]),c=Cm(s,i),l=n.scales||{};a[t]=Lc(Object.create(null),[{axis:s},o,l[s],l[c]])}),e.data.datasets.forEach(n=>{let i=n.type||e.type,o=n.indexAxis||xm(i,t),s=(eu[i]||{}).scales||{};Object.keys(s).forEach(e=>{let t=Sm(e,o),i=n[t+`AxisID`]||t;a[i]=a[i]||Object.create(null),Lc(a[i],[{axis:t},r[i],s[e]])})}),Object.keys(a).forEach(e=>{let t=a[e];Lc(t,[iu.scales[t.type],iu.scale])}),a}function Am(e){let t=e.options||(e.options={});t.plugins=Z(t.plugins,{}),t.scales=km(e,t)}function jm(e){return e=e||{},e.datasets=e.datasets||[],e.labels=e.labels||[],e}function Mm(e){return e=e||{},e.data=jm(e.data),Am(e),e}var Nm=new Map,Pm=new Set;function Fm(e,t){let n=Nm.get(e);return n||(n=t(),Nm.set(e,n),Pm.add(n)),n}var Im=(e,t,n)=>{let r=Hc(t,n);r!==void 0&&e.add(r)},Lm=class{constructor(e){this._config=Mm(e),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(e){this._config.type=e}get data(){return this._config.data}set data(e){this._config.data=jm(e)}get options(){return this._config.options}set options(e){this._config.options=e}get plugins(){return this._config.plugins}update(){let e=this._config;this.clearCache(),Am(e)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(e){return Fm(e,()=>[[`datasets.${e}`,``]])}datasetAnimationScopeKeys(e,t){return Fm(`${e}.transition.${t}`,()=>[[`datasets.${e}.transitions.${t}`,`transitions.${t}`],[`datasets.${e}`,``]])}datasetElementScopeKeys(e,t){return Fm(`${e}-${t}`,()=>[[`datasets.${e}.elements.${t}`,`datasets.${e}`,`elements.${t}`,``]])}pluginScopeKeys(e){let t=e.id,n=this.type;return Fm(`${n}-plugin-${t}`,()=>[[`plugins.${t}`,...e.additionalOptionScopes||[]]])}_cachedScopes(e,t){let n=this._scopeCache,r=n.get(e);return(!r||t)&&(r=new Map,n.set(e,r)),r}getOptionScopes(e,t,n){let{options:r,type:i}=this,a=this._cachedScopes(e,n),o=a.get(t);if(o)return o;let s=new Set;t.forEach(t=>{e&&(s.add(e),t.forEach(t=>Im(s,e,t))),t.forEach(e=>Im(s,r,e)),t.forEach(e=>Im(s,eu[i]||{},e)),t.forEach(e=>Im(s,iu,e)),t.forEach(e=>Im(s,tu,e))});let c=Array.from(s);return c.length===0&&c.push(Object.create(null)),Pm.has(t)&&a.set(t,c),c}chartOptionScopes(){let{options:e,type:t}=this;return[e,eu[t]||{},iu.datasets[t]||{},{type:t},iu,tu]}resolveNamedOptions(e,t,n,r=[``]){let i={$shared:!0},{resolver:a,subPrefixes:o}=Rm(this._resolverCache,e,r),s=a;if(Bm(a,t)){i.$shared=!1,n=Gc(n)?n():n;let t=this.createResolver(e,n,o);s=Fu(a,n,t)}for(let e of t)i[e]=s[e];return i}createResolver(e,t,n=[``],r){let{resolver:i}=Rm(this._resolverCache,e,n);return X(t)?Fu(i,t,void 0,r):i}};function Rm(e,t,n){let r=e.get(t);r||(r=new Map,e.set(t,r));let i=n.join(),a=r.get(i);return a||(a={resolver:Pu(t,n),subPrefixes:n.filter(e=>!e.toLowerCase().includes(`hover`))},r.set(i,a)),a}var zm=e=>X(e)&&Object.getOwnPropertyNames(e).some(t=>Gc(e[t]));function Bm(e,t){let{isScriptable:n,isIndexable:r}=Iu(e);for(let i of t){let t=n(i),a=r(i),o=(a||t)&&e[i];if(t&&(Gc(o)||zm(o))||a&&Ec(o))return!0}return!1}var Vm=`4.6.1`,Hm=[`top`,`bottom`,`left`,`right`,`chartArea`];function Um(e,t){return e===`top`||e===`bottom`||Hm.indexOf(e)===-1&&t===`x`}function Wm(e,t){return function(n,r){return n[e]===r[e]?n[t]-r[t]:n[e]-r[e]}}function Gm(e){let t=e.chart,n=t.options.animation;t.notifyPlugins(`afterRender`),jc(n&&n.onComplete,[e],t)}function Km(e){let t=e.chart,n=t.options.animation;jc(n&&n.onProgress,[e],t)}function qm(e){return ud()&&typeof e==`string`?e=document.getElementById(e):e&&e.length&&(e=e[0]),e&&e.canvas&&(e=e.canvas),e}var Jm={},Ym=e=>{let t=qm(e);return Object.values(Jm).filter(e=>e.canvas===t).pop()};function Xm(e,t,n){let r=Object.keys(e);for(let i of r){let r=+i;if(r>=t){let a=e[i];delete e[i],(n>0||r>t)&&(e[r+n]=a)}}}function Zm(e,t,n,r){return!n||e.type===`mouseout`?null:r?t:e}var Qm=class{static register(...e){hm.add(...e),$m()}static unregister(...e){hm.remove(...e),$m()}constructor(e,t){let n=this.config=new Lm(t),r=qm(e),i=Ym(r);if(i)throw Error(`Canvas is already in use. Chart with ID '`+i.id+`' must be destroyed before the canvas with ID '`+i.canvas.id+`' can be reused.`);let a=n.createResolver(n.chartOptionScopes(),this.getContext());this.platform=new(n.platform||(Up(r))),this.platform.updateConfig(n);let o=this.platform.acquireContext(r,a.aspectRatio),s=o&&o.canvas,c=s&&s.height,l=s&&s.width;this.id=Tc(),this.ctx=o,this.canvas=s,this.width=l,this.height=c,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new gm,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=jl(e=>this.update(e),a.resizeDelay||0),this._dataChanges=[],Jm[this.id]=this,!o||!s?console.error(`Failed to create chart: can't acquire context from the given item`):(Yd.listen(this,`complete`,Gm),Yd.listen(this,`progress`,Km),this._initialize(),this.attached&&this.update())}get aspectRatio(){let{options:{aspectRatio:e,maintainAspectRatio:t},width:n,height:r,_aspectRatio:i}=this;return Y(e)?t&&i?i:r?n/r:null:e}get data(){return this.config.data}set data(e){this.config.data=e}get options(){return this._options}set options(e){this.config.options=e}get registry(){return hm}_initialize(){return this.notifyPlugins(`beforeInit`),this.options.responsive?this.resize():Cd(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins(`afterInit`),this}clear(){return lu(this.canvas,this.ctx),this}stop(){return Yd.stop(this),this}resize(e,t){Yd.running(this)?this._resizeBeforeDraw={width:e,height:t}:this._resize(e,t)}_resize(e,t){let n=this.options,r=this.canvas,i=n.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(r,e,t,i),o=n.devicePixelRatio||this.platform.getDevicePixelRatio(),s=this.width?`resize`:`attach`;this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,Cd(this,o,!0)&&(this.notifyPlugins(`resize`,{size:a}),jc(n.onResize,[this,a],this),this.attached&&this._doResize(s)&&this.render())}ensureScalesHaveIDs(){Q(this.options.scales||{},(e,t)=>{e.id=t})}buildOrUpdateScales(){let e=this.options,t=e.scales,n=this.scales,r=Object.keys(n).reduce((e,t)=>(e[t]=!1,e),{}),i=[];t&&(i=i.concat(Object.keys(t).map(e=>{let n=t[e],r=Em(e,n),i=r===`r`,a=r===`x`;return{options:n,dposition:i?`chartArea`:a?`bottom`:`left`,dtype:i?`radialLinear`:a?`category`:`linear`}}))),Q(i,t=>{let i=t.options,a=i.id,o=Em(a,i),s=Z(i.type,t.dtype);(i.position===void 0||Um(i.position,o)!==Um(t.dposition))&&(i.position=t.dposition),r[a]=!0;let c=null;a in n&&n[a].type===s?c=n[a]:(c=new(hm.getScale(s))({id:a,type:s,ctx:this.ctx,chart:this}),n[c.id]=c),c.init(i,e)}),Q(r,(e,t)=>{e||delete n[t]}),Q(n,e=>{bp.configure(this,e,e.options),bp.addBox(this,e)})}_updateMetasets(){let e=this._metasets,t=this.data.datasets.length,n=e.length;if(e.sort((e,t)=>e.index-t.index),n>t){for(let e=t;et.length&&delete this._stacks,e.forEach((e,n)=>{t.filter(t=>t===e._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){let e=[],t=this.data.datasets,n,r;for(this._removeUnreferencedMetasets(),n=0,r=t.length;n{this.getDatasetMeta(t).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins(`reset`)}update(e){let t=this.config;t.update();let n=this._options=t.createResolver(t.chartOptionScopes(),this.getContext()),r=this._animationsDisabled=!n.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins(`beforeUpdate`,{mode:e,cancelable:!0})===!1)return;let i=this.buildOrUpdateControllers();this.notifyPlugins(`beforeElementsUpdate`);let a=0;for(let e=0,t=this.data.datasets.length;e{e.reset()}),this._updateDatasets(e),this.notifyPlugins(`afterUpdate`,{mode:e}),this._layers.sort(Wm(`z`,`_idx`));let{_active:o,_lastEvent:s}=this;s?this._eventHandler(s,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){Q(this.scales,e=>{bp.removeBox(this,e)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){let e=this.options;Kc(new Set(Object.keys(this._listeners)),new Set(e.events))&&!!this._responsiveListeners===e.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){let{_hiddenIndices:e}=this,t=this._getUniformDataChanges()||[];for(let{method:n,start:r,count:i}of t)Xm(e,r,n===`_removeElements`?-i:i)}_getUniformDataChanges(){let e=this._dataChanges;if(!e||!e.length)return;this._dataChanges=[];let t=this.data.datasets.length,n=t=>new Set(e.filter(e=>e[0]===t).map((e,t)=>t+`,`+e.splice(1).join(`,`))),r=n(0);for(let e=1;ee.split(`,`)).map(e=>({method:e[1],start:+e[2],count:+e[3]}))}_updateLayout(e){if(this.notifyPlugins(`beforeLayout`,{cancelable:!0})===!1)return;bp.update(this,this.width,this.height,e);let t=this.chartArea,n=t.width<=0||t.height<=0;this._layers=[],Q(this.boxes,e=>{n&&e.position===`chartArea`||(e.configure&&e.configure(),this._layers.push(...e._layers()))},this),this._layers.forEach((e,t)=>{e._idx=t}),this.notifyPlugins(`afterLayout`)}_updateDatasets(e){if(this.notifyPlugins(`beforeDatasetsUpdate`,{mode:e,cancelable:!0})!==!1){for(let e=0,t=this.data.datasets.length;e=0;--t)this._drawDataset(e[t]);this.notifyPlugins(`afterDatasetsDraw`)}_drawDataset(e){let t=this.ctx,n={meta:e,index:e.index,cancelable:!0},r=Jd(this,e);this.notifyPlugins(`beforeDatasetDraw`,n)!==!1&&(r&&pu(t,r),e.controller.draw(),r&&mu(t),n.cancelable=!1,this.notifyPlugins(`afterDatasetDraw`,n))}isPointInArea(e){return fu(e,this.chartArea,this._minPadding)}getElementsAtEventForMode(e,t,n,r){let i=rp.modes[t];return typeof i==`function`?i(this,e,n,r):[]}getDatasetMeta(e){let t=this.data.datasets[e],n=this._metasets,r=n.filter(e=>e&&e._dataset===t).pop();return r||(r={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:t&&t.order||0,index:e,_dataset:t,_parsed:[],_sorted:!1},n.push(r)),r}getContext(){return this.$context||(this.$context=Nu(null,{chart:this,type:`chart`}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(e){let t=this.data.datasets[e];if(!t)return!1;let n=this.getDatasetMeta(e);return typeof n.hidden==`boolean`?!n.hidden:!t.hidden}setDatasetVisibility(e,t){let n=this.getDatasetMeta(e);n.hidden=!t}toggleDataVisibility(e){this._hiddenIndices[e]=!this._hiddenIndices[e]}getDataVisibility(e){return!this._hiddenIndices[e]}_updateVisibility(e,t,n){let r=n?`show`:`hide`,i=this.getDatasetMeta(e),a=i.controller._resolveAnimations(void 0,r);Wc(t)?(i.data[t].hidden=!n,this.update()):(this.setDatasetVisibility(e,n),a.update(i,{visible:n}),this.update(t=>t.datasetIndex===e?r:void 0))}hide(e,t){this._updateVisibility(e,t,!1)}show(e,t){this._updateVisibility(e,t,!0)}_destroyDatasetMeta(e){let t=this._metasets[e];t&&t.controller&&t.controller._destroy(),delete this._metasets[e]}_stop(){let e,t;for(this.stop(),Yd.remove(this),e=0,t=this.data.datasets.length;e{t.addEventListener(this,n,r),e[n]=r},r=(e,t,n)=>{e.offsetX=t,e.offsetY=n,this._eventHandler(e)};Q(this.options.events,e=>n(e,r))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});let e=this._responsiveListeners,t=this.platform,n=(n,r)=>{t.addEventListener(this,n,r),e[n]=r},r=(n,r)=>{e[n]&&(t.removeEventListener(this,n,r),delete e[n])},i=(e,t)=>{this.canvas&&this.resize(e,t)},a,o=()=>{r(`attach`,o),this.attached=!0,this.resize(),n(`resize`,i),n(`detach`,a)};a=()=>{this.attached=!1,r(`resize`,i),this._stop(),this._resize(0,0),n(`attach`,o)},t.isAttached(this.canvas)?o():a()}unbindEvents(){Q(this._listeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._listeners={},Q(this._responsiveListeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._responsiveListeners=void 0}updateHoverStyle(e,t,n){let r=n?`set`:`remove`,i,a,o,s;for(t===`dataset`&&(i=this.getDatasetMeta(e[0].datasetIndex),i.controller[`_`+r+`DatasetHoverStyle`]()),o=0,s=e.length;o{let n=this.getDatasetMeta(e);if(!n)throw Error(`No dataset found at index `+e);return{datasetIndex:e,element:n.data[t],index:t}});Mc(n,t)||(this._active=n,this._lastEvent=null,this._updateHoverStyles(n,t))}notifyPlugins(e,t,n){return this._plugins.notify(this,e,t,n)}isPluginEnabled(e){return this._plugins._cache.filter(t=>t.plugin.id===e).length===1}_updateHoverStyles(e,t,n){let r=this.options.hover,i=(e,t)=>e.filter(e=>!t.some(t=>e.datasetIndex===t.datasetIndex&&e.index===t.index)),a=i(t,e),o=n?e:i(e,t);a.length&&this.updateHoverStyle(a,r.mode,!1),o.length&&r.mode&&this.updateHoverStyle(o,r.mode,!0)}_eventHandler(e,t){let n={event:e,replay:t,cancelable:!0,inChartArea:this.isPointInArea(e)},r=t=>(t.options.events||this.options.events).includes(e.native.type);if(this.notifyPlugins(`beforeEvent`,n,r)===!1)return;let i=this._handleEvent(e,t,n.inChartArea);return n.cancelable=!1,this.notifyPlugins(`afterEvent`,n,r),(i||n.changed)&&this.render(),this}_handleEvent(e,t,n){let{_active:r=[],options:i}=this,a=t,o=this._getActiveElements(e,r,n,a),s=qc(e),c=Zm(e,this._lastEvent,n,s);n&&(this._lastEvent=null,jc(i.onHover,[e,o,this],this),s&&jc(i.onClick,[e,o,this],this));let l=!Mc(o,r);return(l||t)&&(this._active=o,this._updateHoverStyles(o,r,t)),this._lastEvent=c,l}_getActiveElements(e,t,n,r){if(e.type===`mouseout`)return[];if(!n)return t;let i=this.options.hover;return this.getElementsAtEventForMode(e,i.mode,i,r)}};z(Qm,`defaults`,iu),z(Qm,`instances`,Jm),z(Qm,`overrides`,eu),z(Qm,`registry`,hm),z(Qm,`version`,Vm),z(Qm,`getChart`,Ym);function $m(){return Q(Qm.instances,e=>e._plugins.invalidate())}function eh(e,t,n){let{startAngle:r,x:i,y:a,outerRadius:o,innerRadius:s,options:c}=t,{borderWidth:l,borderJoinStyle:u}=c,d=Math.min(l/o,gl(r-n));if(e.beginPath(),e.arc(i,a,o-l/2,r+d/2,n-d/2),s>0){let t=Math.min(l/s,gl(r-n));e.arc(i,a,s+l/2,n-t/2,r+t/2,!0)}else{let t=Math.min(l/2,o*gl(r-n));if(u===`round`)e.arc(i,a,t,n-$/2,r+$/2,!0);else if(u===`bevel`){let o=2*t*t,s=-o*Math.cos(n+$/2)+i,c=-o*Math.sin(n+$/2)+a,l=o*Math.cos(r+$/2)+i,u=o*Math.sin(r+$/2)+a;e.lineTo(s,c),e.lineTo(l,u)}}e.closePath(),e.moveTo(0,0),e.rect(0,0,e.canvas.width,e.canvas.height),e.clip(`evenodd`)}function th(e,t,n){let{startAngle:r,pixelMargin:i,x:a,y:o,outerRadius:s,innerRadius:c}=t,l=i/s;e.beginPath(),e.arc(a,o,s,r-l,n+l),c>i?(l=i/c,e.arc(a,o,c,n+l,r-l,!0)):e.arc(a,o,i,n+Qc,r-Qc),e.closePath(),e.clip()}function nh(e){return Eu(e,[`outerStart`,`outerEnd`,`innerStart`,`innerEnd`])}function rh(e,t,n,r){let i=nh(e.options.borderRadius),a=(n-t)/2,o=Math.min(a,r*t/2),s=e=>{let t=(n-Math.min(a,e))*r/2;return vl(e,0,Math.min(a,t))};return{outerStart:s(i.outerStart),outerEnd:s(i.outerEnd),innerStart:vl(i.innerStart,0,o),innerEnd:vl(i.innerEnd,0,o)}}function ih(e,t,n,r){return{x:n+e*Math.cos(t),y:r+e*Math.sin(t)}}function ah(e,t,n,r){let{x:i,y:a,startAngle:o,pixelMargin:s,innerRadius:c}=t,l=Math.max(t.outerRadius+r+n-s,0),u=c>0?c+r+n+s:0;e.beginPath(),e.arc(i,a,l,o,o+Jc),u>0&&(e.moveTo(i+Math.cos(o)*u,a+Math.sin(o)*u),e.arc(i,a,u,o+Jc,o,!0)),e.closePath()}function oh(e,t,n,r,i,a){let{x:o,y:s,startAngle:c,pixelMargin:l,innerRadius:u}=t,{spacingMode:d=`angular`}=t.options,f=i-c;if(a&&t.options.selfJoin&&Math.abs(f)>=Jc-1e-4){ah(e,t,n,r);return}let p=Math.max(t.outerRadius+r+n-l,0),m=u>0?u+r+n+l:0,h=0,g=0,_=p>0?Math.max(.001,f*p-n/$)/p:.001,v=(f-_)/2;if(r){let e=((u>0?u-r:0)+(p>0?p-r:0))/2,t=(()=>{let t=e===0?f:f*e/(e+r);return(f-t)/2})(),n=e>0?Math.asin(Math.min(1,r/e)):0,i=Math.max(0,_/2-.001),a=Math.sin(i);if(d===`parallel`){if(m===0&&a>0){let e=r/a,t=Math.max(0,p-.001);m=Math.min(e,t)}let e=Math.min(p>0?p*a:1/0,m>0?m*a:1/0),t=Math.min(r,e);h=p>0?Math.asin(Math.min(1,t/p)):Math.min(i,n),g=m>0?Math.asin(Math.min(1,t/m)):h}else d===`proportional`?(h=Math.min(i,t),g=Math.min(i,t)):(h=Math.min(i,n),g=Math.min(i,n))}let y=c+v+h,b=i-v-h,x=c+v+g,S=i-v-g,C=Math.min(b-y,S-x),{outerStart:w,outerEnd:T,innerStart:E,innerEnd:D}=rh(t,m,p,C),O=p-w,k=p-T,A=y+w/O,j=b-T/k,M=m+E,N=m+D,P=x+E/M,ee=S-D/N;if(e.beginPath(),a){let t=(A+j)/2;if(e.arc(o,s,p,A,t),e.arc(o,s,p,t,j),T>0){let t=ih(k,j,o,s);e.arc(t.x,t.y,T,j,b+Qc)}let n=ih(N,S,o,s);if(e.lineTo(n.x,n.y),D>0){let t=ih(N,ee,o,s);e.arc(t.x,t.y,D,S+Qc,ee+Math.PI)}let r=(S-D/m+(x+E/m))/2;if(e.arc(o,s,m,S-D/m,r,!0),e.arc(o,s,m,r,x+E/m,!0),E>0){let t=ih(M,P,o,s);e.arc(t.x,t.y,E,P+Math.PI,x-Qc)}let i=ih(O,y,o,s);if(e.lineTo(i.x,i.y),w>0){let t=ih(O,A,o,s);e.arc(t.x,t.y,w,y-Qc,A)}}else{e.moveTo(o,s);let t=Math.cos(A)*p+o,n=Math.sin(A)*p+s;e.lineTo(t,n);let r=Math.cos(j)*p+o,i=Math.sin(j)*p+s;e.lineTo(r,i)}e.closePath()}function sh(e,t,n,r,i){let{fullCircles:a,startAngle:o,circumference:s}=t,c=t.endAngle;if(a){oh(e,t,n,r,c,i);for(let t=0;t=Jc-1e-4;if(a){oh(e,t,n,r,h,i);for(let t=0;t0)&&c.selfJoin&&h-o>=$&&p===0&&u!==`miter`&&eh(e,t,h),a||(oh(e,t,n,r,h,i),e.stroke())}var lh=class extends Wp{constructor(e){super(),z(this,`circumference`,void 0),z(this,`endAngle`,void 0),z(this,`fullCircles`,void 0),z(this,`innerRadius`,void 0),z(this,`outerRadius`,void 0),z(this,`pixelMargin`,void 0),z(this,`startAngle`,void 0),z(this,`circular`,void 0),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,this.circular=!1,e&&Object.assign(this,e)}inRange(e,t,n){let{angle:r,distance:i}=pl(this.getProps([`x`,`y`],n),{x:e,y:t}),{startAngle:a,endAngle:o,innerRadius:s,outerRadius:c,circumference:l}=this.getProps([`startAngle`,`endAngle`,`innerRadius`,`outerRadius`,`circumference`],n),u=(this.options.spacing+this.options.borderWidth)/2,d=Z(l,o-a),f=_l(r,a,o)&&a!==o,p=d>=Jc||f,m=bl(i,s+u,c+u);return p&&m}getCenterPoint(e){let{x:t,y:n,startAngle:r,endAngle:i,innerRadius:a,outerRadius:o}=this.getProps([`x`,`y`,`startAngle`,`endAngle`,`innerRadius`,`outerRadius`],e),{offset:s,spacing:c}=this.options,l=(r+i)/2,u=(a+o+c+s)/2;return{x:t+Math.cos(l)*u,y:n+Math.sin(l)*u}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){let{options:t,circumference:n}=this,r=(t.offset||0)/4,i=(t.spacing||0)/2,a=t.circular;if(this.pixelMargin=t.borderAlign===`inner`?.33:0,this.fullCircles=n>Jc?Math.floor(n/Jc):0,n===0||this.innerRadius<0||this.outerRadius<0)return;e.save();let o=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(o)*r,Math.sin(o)*r);let s=r*(1-Math.sin(Math.min($,n||0)));e.fillStyle=t.backgroundColor,e.strokeStyle=t.borderColor,sh(e,this,s,i,a),ch(e,this,s,i,a),e.restore()}};z(lh,`id`,`arc`),z(lh,`defaults`,{borderAlign:`center`,borderColor:`#fff`,borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,spacingMode:`angular`,angle:void 0,circular:!0,selfJoin:!1}),z(lh,`defaultRoutes`,{backgroundColor:`backgroundColor`}),z(lh,`descriptors`,{_scriptable:!0,_indexable:e=>e!==`borderDash`});function uh(e,t,n=t){e.lineCap=Z(n.borderCapStyle,t.borderCapStyle),e.setLineDash(Z(n.borderDash,t.borderDash)),e.lineDashOffset=Z(n.borderDashOffset,t.borderDashOffset),e.lineJoin=Z(n.borderJoinStyle,t.borderJoinStyle),e.lineWidth=Z(n.borderWidth,t.borderWidth),e.strokeStyle=Z(n.borderColor,t.borderColor)}function dh(e,t,n){e.lineTo(n.x,n.y)}function fh(e){return e.stepped?hu:e.tension||e.cubicInterpolationMode===`monotone`?gu:dh}function ph(e,t,n={}){let r=e.length,{start:i=0,end:a=r-1}=n,{start:o,end:s}=t,c=Math.max(i,o),l=Math.min(a,s),u=is&&a>s;return{count:r,start:c,loop:t.loop,ilen:l(o+(l?s-e:e))%a,y=()=>{h!==g&&(e.lineTo(u,g),e.lineTo(u,h),e.lineTo(u,_))};for(c&&(p=i[v(0)],e.moveTo(p.x,p.y)),f=0;f<=s;++f){if(p=i[v(f)],p.skip)continue;let t=p.x,n=p.y,r=t|0;r===m?(ng&&(g=n),u=(d*u+t)/++d):(y(),e.lineTo(t,n),m=r,d=0,h=g=n),_=n}y()}function gh(e){let t=e.options,n=t.borderDash&&t.borderDash.length;return!e._decimated&&!e._loop&&!t.tension&&t.cubicInterpolationMode!==`monotone`&&!t.stepped&&!n?hh:mh}function _h(e){return e.stepped?Dd:e.tension||e.cubicInterpolationMode===`monotone`?Od:Ed}function vh(e,t,n,r){let i=t._path;i||(i=t._path=new Path2D,t.path(i,n,r)&&i.closePath()),uh(e,t.options),e.stroke(i)}function yh(e,t,n,r){let{segments:i,options:a}=t,o=gh(t);for(let s of i)uh(e,a,s.style),e.beginPath(),o(e,t,s,{start:n,end:n+r-1})&&e.closePath(),e.stroke()}var bh=typeof Path2D==`function`;function xh(e,t,n,r){bh&&!t.options.segment?vh(e,t,n,r):yh(e,t,n,r)}var Sh=class extends Wp{constructor(e){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,e&&Object.assign(this,e)}updateControlPoints(e,t){let n=this.options;if((n.tension||n.cubicInterpolationMode===`monotone`)&&!n.stepped&&!this._pointsUpdated){let r=n.spanGaps?this._loop:this._fullLoop;ld(this._points,n,e,r,t),this._pointsUpdated=!0}}set points(e){this._points=e,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Vd(this,this.options.segment))}first(){let e=this.segments,t=this.points;return e.length&&t[e[0].start]}last(){let e=this.segments,t=this.points,n=e.length;return n&&t[e[n-1].end]}interpolate(e,t){let n=this.options,r=e[t],i=this.points,a=Rd(this,{property:t,start:r,end:r});if(!a.length)return;let o=[],s=_h(n),c,l;for(c=0,l=a.length;ce!==`borderDash`&&e!==`fill`});function Ch(e,t,n,r){let i=e.options,{[n]:a}=e.getProps([n],r);return Math.abs(t-a)e+t)/r.size,y:i/a}},nearest(e,t){if(!e.length)return!1;let n=t.x,r=t.y,i=1/0,a,o,s;for(a=0,o=e.length;a-1?e.split(` -`):e}function zm(e,t){let{element:n,datasetIndex:r,index:i}=t,a=e.getDatasetMeta(r).controller,{label:o,value:s}=a.getLabelAndValue(i);return{chart:e,label:o,parsed:a.getParsed(i),raw:e.data.datasets[r].data[i],formattedValue:s,dataset:a.getDataset(),dataIndex:i,datasetIndex:r,element:n}}function Bm(e,t){let n=e.chart.ctx,{body:r,footer:i,title:a}=e,{boxWidth:o,boxHeight:s}=t,c=Ml(t.bodyFont),l=Ml(t.titleFont),u=Ml(t.footerFont),d=a.length,f=i.length,p=r.length,m=jl(t.padding),h=m.height,g=0,_=r.reduce((e,t)=>e+t.before.length+t.lines.length+t.after.length,0);if(_+=e.beforeBody.length+e.afterBody.length,d&&(h+=d*l.lineHeight+(d-1)*t.titleSpacing+t.titleMarginBottom),_){let e=t.displayColors?Math.max(s,c.lineHeight):c.lineHeight;h+=p*e+(_-p)*c.lineHeight+(_-1)*t.bodySpacing}f&&(h+=t.footerMarginTop+f*u.lineHeight+(f-1)*t.footerSpacing);let v=0,y=function(e){g=Math.max(g,n.measureText(e).width+v)};return n.save(),n.font=l.string,Q(e.title,y),n.font=c.string,Q(e.beforeBody.concat(e.afterBody),y),v=t.displayColors?o+2+t.boxPadding:0,Q(r,e=>{Q(e.before,y),Q(e.lines,y),Q(e.after,y)}),v=0,n.font=u.string,Q(e.footer,y),n.restore(),g+=m.width,{width:g,height:h}}function Vm(e,t){let{y:n,height:r}=t;return ne.height-r/2?`bottom`:`center`}function Hm(e,t,n,r){let{x:i,width:a}=r,o=n.caretSize+n.caretPadding;if(e===`left`&&i+a+o>t.width||e===`right`&&i-a-o<0)return!0}function Um(e,t,n,r){let{x:i,width:a}=n,{width:o,chartArea:{left:s,right:c}}=e,l=`center`;return r===`center`?l=i<=(s+c)/2?`left`:`right`:i<=a/2?l=`left`:i>=o-a/2&&(l=`right`),Hm(l,e,t,n)&&(l=`center`),l}function Wm(e,t,n){let r=n.yAlign||t.yAlign||Vm(e,n);return{xAlign:n.xAlign||t.xAlign||Um(e,t,n,r),yAlign:r}}function Gm(e,t){let{x:n,width:r}=e;return t===`right`?n-=r:t===`center`&&(n-=r/2),n}function Km(e,t,n){let{y:r,height:i}=e;return t===`top`?r+=n:r-=t===`bottom`?i+n:i/2,r}function qm(e,t,n,r){let{caretSize:i,caretPadding:a,cornerRadius:o}=e,{xAlign:s,yAlign:c}=n,l=i+a,{topLeft:u,topRight:d,bottomLeft:f,bottomRight:p}=Al(o),m=Gm(t,s),h=Km(t,c,l);return c===`center`?s===`left`?m+=l:s===`right`&&(m-=l):s===`left`?m-=Math.max(u,f)+i:s===`right`&&(m+=Math.max(d,p)+i),{x:bc(m,0,r.width-t.width),y:bc(h,0,r.height-t.height)}}function Jm(e,t,n){let r=jl(n.padding);return t===`center`?e.x+e.width/2:t===`right`?e.x+e.width-r.right:e.x+r.left}function Ym(e){return Lm([],Rm(e))}function Xm(e,t,n){return Fl(e,{tooltip:t,tooltipItems:n,type:`tooltip`})}function Zm(e,t){let n=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return n?e.override(n):e}var Qm={beforeTitle:Es,title(e){if(e.length>0){let t=e[0],n=t.chart.data.labels,r=n?n.length:0;if(this&&this.options&&this.options.mode===`dataset`)return t.dataset.label||``;if(t.label)return t.label;if(r>0&&t.dataIndex{let t={before:[],lines:[],after:[]},i=Zm(n,e);Lm(t.before,Rm($m(i,`beforeLabel`,this,e))),Lm(t.lines,$m(i,`label`,this,e)),Lm(t.after,Rm($m(i,`afterLabel`,this,e))),r.push(t)}),r}getAfterBody(e,t){return Ym($m(t.callbacks,`afterBody`,this,e))}getFooter(e,t){let{callbacks:n}=t,r=$m(n,`beforeFooter`,this,e),i=$m(n,`footer`,this,e),a=$m(n,`afterFooter`,this,e),o=[];return o=Lm(o,Rm(r)),o=Lm(o,Rm(i)),o=Lm(o,Rm(a)),o}_createItems(e){let t=this._active,n=this.chart.data,r=[],i=[],a=[],o=[],s,c;for(s=0,c=t.length;se.filter(t,r,i,n))),e.itemSort&&(o=o.sort((t,r)=>e.itemSort(t,r,n))),Q(o,t=>{let n=Zm(e.callbacks,t);r.push($m(n,`labelColor`,this,t)),i.push($m(n,`labelPointStyle`,this,t)),a.push($m(n,`labelTextColor`,this,t))}),this.labelColors=r,this.labelPointStyles=i,this.labelTextColors=a,this.dataPoints=o,o}update(e,t){let n=this.options.setContext(this.getContext()),r=this._active,i,a=[];if(!r.length)this.opacity!==0&&(i={opacity:0});else{let e=Im[n.position].call(this,r,this._eventPosition);a=this._createItems(n),this.title=this.getTitle(a,n),this.beforeBody=this.getBeforeBody(a,n),this.body=this.getBody(a,n),this.afterBody=this.getAfterBody(a,n),this.footer=this.getFooter(a,n);let t=this._size=Bm(this,n),o=Object.assign({},e,t),s=Wm(this.chart,n,o),c=qm(n,o,s,this.chart);this.xAlign=s.xAlign,this.yAlign=s.yAlign,i={opacity:1,x:c.x,y:c.y,width:t.width,height:t.height,caretX:e.x,caretY:e.y}}this._tooltipItems=a,this.$context=void 0,i&&this._resolveAnimations().update(this,i),e&&n.external&&n.external.call(this,{chart:this.chart,tooltip:this,replay:t})}drawCaret(e,t,n,r){let i=this.getCaretPosition(e,n,r);t.lineTo(i.x1,i.y1),t.lineTo(i.x2,i.y2),t.lineTo(i.x3,i.y3)}getCaretPosition(e,t,n){let{xAlign:r,yAlign:i}=this,{caretSize:a,cornerRadius:o}=n,{topLeft:s,topRight:c,bottomLeft:l,bottomRight:u}=Al(o),{x:d,y:f}=e,{width:p,height:m}=t,h,g,_,v,y,b;return i===`center`?(y=f+m/2,r===`left`?(h=d,g=h-a,v=y+a,b=y-a):(h=d+p,g=h+a,v=y-a,b=y+a),_=h):(g=r===`left`?d+Math.max(s,l)+a:r===`right`?d+p-Math.max(c,u)-a:this.caretX,i===`top`?(v=f,y=v-a,h=g-a,_=g+a):(v=f+m,y=v+a,h=g+a,_=g-a),b=v),{x1:h,x2:g,x3:_,y1:v,y2:y,y3:b}}drawTitle(e,t,n){let r=this.title,i=r.length,a,o,s;if(i){let c=Nu(n.rtl,this.x,this.width);for(e.x=Jm(this,n.titleAlign,n),t.textAlign=c.textAlign(n.titleAlign),t.textBaseline=`middle`,a=Ml(n.titleFont),o=n.titleSpacing,t.fillStyle=n.titleColor,t.font=a.string,s=0;se!==0)?(e.beginPath(),e.fillStyle=i.multiKeyBackground,Cl(e,{x:t,y:p,w:c,h:s,radius:o}),e.fill(),e.stroke(),e.fillStyle=a.backgroundColor,e.beginPath(),Cl(e,{x:n,y:p+1,w:c-2,h:s-2,radius:o}),e.fill()):(e.fillStyle=i.multiKeyBackground,e.fillRect(t,p,c,s),e.strokeRect(t,p,c,s),e.fillStyle=a.backgroundColor,e.fillRect(n,p+1,c-2,s-2))}e.fillStyle=this.labelTextColors[n]}drawBody(e,t,n){let{body:r}=this,{bodySpacing:i,bodyAlign:a,displayColors:o,boxHeight:s,boxWidth:c,boxPadding:l}=n,u=Ml(n.bodyFont),d=u.lineHeight,f=0,p=Nu(n.rtl,this.x,this.width),m=function(n){t.fillText(n,p.x(e.x+f),e.y+d/2),e.y+=d+i},h=p.textAlign(a),g,_,v,y,b,x,S;for(t.textAlign=a,t.textBaseline=`middle`,t.font=u.string,e.x=Jm(this,h,n),t.fillStyle=n.bodyColor,Q(this.beforeBody,m),f=o&&h!==`right`?a===`center`?c/2+l:c+2+l:0,y=0,x=r.length;y0&&t.stroke()}_updateAnimationTarget(e){let t=this.chart,n=this.$animations,r=n&&n.x,i=n&&n.y;if(r||i){let n=Im[e.position].call(this,this._active,this._eventPosition);if(!n)return;let a=this._size=Bm(this,e),o=Object.assign({},n,this._size),s=Wm(t,e,o),c=qm(e,o,s,t);(r._to!==c.x||i._to!==c.y)&&(this.xAlign=s.xAlign,this.yAlign=s.yAlign,this.width=a.width,this.height=a.height,this.caretX=n.x,this.caretY=n.y,this._resolveAnimations().update(this,c))}}_willRender(){return!!this.opacity}draw(e){let t=this.options.setContext(this.getContext()),n=this.opacity;if(!n)return;this._updateAnimationTarget(t);let r={width:this.width,height:this.height},i={x:this.x,y:this.y};n=Math.abs(n)<.001?0:n;let a=jl(t.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;t.enabled&&o&&(e.save(),e.globalAlpha=n,this.drawBackground(i,e,r,t),Pu(e,t.textDirection),i.y+=a.top,this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),Fu(e,t.textDirection),e.restore())}getActiveElements(){return this._active||[]}setActiveElements(e,t){let n=this._active,r=e.map(({datasetIndex:e,index:t})=>{let n=this.chart.getDatasetMeta(e);if(!n)throw Error(`Cannot find a dataset at index `+e);return{datasetIndex:e,element:n.data[t],index:t}}),i=!Ps(n,r),a=this._positionChanged(r,t);(i||a)&&(this._active=r,this._eventPosition=t,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(e,t,n=!0){if(t&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;let r=this.options,i=this._active||[],a=this._getActiveElements(e,i,t,n),o=this._positionChanged(a,e),s=t||!Ps(a,i)||o;return s&&(this._active=a,(r.enabled||r.external)&&(this._eventPosition={x:e.x,y:e.y},this.update(!0,t))),s}_getActiveElements(e,t,n,r){let i=this.options;if(e.type===`mouseout`)return[];if(!r)return t.filter(e=>this.chart.data.datasets[e.datasetIndex]&&this.chart.getDatasetMeta(e.datasetIndex).controller.getParsed(e.index)!==void 0);let a=this.chart.getElementsAtEventForMode(e,i.mode,i,n);return i.reverse&&a.reverse(),a}_positionChanged(e,t){let{caretX:n,caretY:r,options:i}=this,a=Im[i.position].call(this,e,t);return a!==!1&&(n!==a.x||r!==a.y)}};I(eh,`positioners`,Im);var th={id:`tooltip`,_element:eh,positioners:Im,afterInit(e,t,n){n&&(e.tooltip=new eh({chart:e,options:n}))},beforeUpdate(e,t,n){e.tooltip&&e.tooltip.initialize(n)},reset(e,t,n){e.tooltip&&e.tooltip.initialize(n)},afterDraw(e){let t=e.tooltip;if(t&&t._willRender()){let n={tooltip:t};if(e.notifyPlugins(`beforeTooltipDraw`,{...n,cancelable:!0})===!1)return;t.draw(e.ctx),e.notifyPlugins(`afterTooltipDraw`,n)}},afterEvent(e,t){if(e.tooltip){let n=t.replay;e.tooltip.handleEvent(t.event,n,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:`average`,backgroundColor:`rgba(0,0,0,0.8)`,titleColor:`#fff`,titleFont:{weight:`bold`},titleSpacing:2,titleMarginBottom:6,titleAlign:`left`,bodyColor:`#fff`,bodySpacing:2,bodyFont:{},bodyAlign:`left`,footerColor:`#fff`,footerSpacing:2,footerMarginTop:6,footerFont:{weight:`bold`},footerAlign:`left`,padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(e,t)=>t.bodyFont.size,boxWidth:(e,t)=>t.bodyFont.size,multiKeyBackground:`#fff`,displayColors:!0,boxPadding:0,borderColor:`rgba(0,0,0,0)`,borderWidth:0,animation:{duration:400,easing:`easeOutQuart`},animations:{numbers:{type:`number`,properties:[`x`,`y`,`width`,`height`,`caretX`,`caretY`]},opacity:{easing:`linear`,duration:200}},callbacks:Qm},defaultRoutes:{bodyFont:`font`,footerFont:`font`,titleFont:`font`},descriptors:{_scriptable:e=>e!==`filter`&&e!==`itemSort`&&e!==`external`,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:`animation`}},additionalOptionScopes:[`interaction`]},nh=(e,t,n,r)=>(typeof t==`string`?(n=e.push(t)-1,r.unshift({index:n,label:t})):isNaN(t)&&(n=null),n);function rh(e,t,n,r){let i=e.indexOf(t);return i===-1?nh(e,t,n,r):i===e.lastIndexOf(t)?i:n}var ih=(e,t)=>e===null?null:bc(Math.round(e),0,t);function ah(e){let t=this.getLabels();return e>=0&&et.length-1?null:this.getPixelForValue(t[e].value)}getValueForPixel(e){return Math.round(this._startValue+this.getDecimalForPixel(e)*this._valueRange)}getBasePixel(){return this.bottom}};I(oh,`id`,`category`),I(oh,`defaults`,{ticks:{callback:ah}});function sh(e,t){let n=[],{bounds:r,step:i,min:a,max:o,precision:s,count:c,maxTicks:l,maxDigits:u,includeBounds:d}=e,f=i||1,p=l-1,{min:m,max:h}=t,g=!Y(a),_=!Y(o),v=!Y(c),y=(h-m)/(u+1),b=oc((h-m)/p/f)*f,x,S,C,w;if(b<1e-14&&!g&&!_)return[{value:m},{value:h}];w=Math.ceil(h/b)-Math.floor(m/b),w>p&&(b=oc(w*b/p/f)*f),Y(s)||(x=10**s,b=Math.ceil(b*x)/x),r===`ticks`?(S=Math.floor(m/b)*b,C=Math.ceil(h/b)*b):(S=m,C=h),g&&_&&i&&uc((o-a)/i,b/1e3)?(w=Math.round(Math.min((o-a)/b,l)),b=(o-a)/w,S=a,C=o):v?(S=g?a:S,C=_?o:C,w=c-1,b=(C-S)/w):(w=(C-S)/b,w=ac(w,Math.round(w),b/1e3)?Math.round(w):Math.ceil(w));let T=Math.max(mc(b),mc(S));x=10**(Y(s)?T:s),S=Math.round(S*x)/x,C=Math.round(C*x)/x;let E=0;for(g&&(d&&S!==a?(n.push({value:a}),So)break;n.push({value:e})}return _&&d&&C!==o?n.length&&ac(n[n.length-1].value,o,ch(o,y,e))?n[n.length-1].value=o:n.push({value:o}):(!_||C===o)&&n.push({value:C}),n}function ch(e,t,{horizontal:n,minRotation:r}){let i=fc(r),a=(n?Math.sin(i):Math.cos(i))||.001,o=.75*t*(``+e).length;return Math.min(t/a,o)}var lh=class extends fp{constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(e,t){return Y(e)||(typeof e==`number`||e instanceof Number)&&!isFinite(+e)?null:+e}handleTickRangeOptions(){let{beginAtZero:e}=this.options,{minDefined:t,maxDefined:n}=this.getUserBounds(),{min:r,max:i}=this,a=e=>r=t?r:e,o=e=>i=n?i:e;if(e){let e=ic(r),t=ic(i);e<0&&t<0?o(0):e>0&&t>0&&a(0)}if(r===i){let t=i===0?1:Math.abs(i*.05);o(i+t),e||a(r-t)}this.min=r,this.max=i}getTickLimit(){let{maxTicksLimit:e,stepSize:t}=this.options.ticks,n;return t?(n=Math.ceil(this.max/t)-Math.floor(this.min/t)+1,n>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${t} would result generating up to ${n} ticks. Limiting to 1000.`),n=1e3)):(n=this.computeTickLimit(),e=e||11),e&&(n=Math.min(e,n)),n}computeTickLimit(){return 1/0}buildTicks(){let e=this.options,t=e.ticks,n=this.getTickLimit();n=Math.max(2,n);let r=sh({maxTicks:n,bounds:e.bounds,min:e.min,max:e.max,precision:t.precision,step:t.stepSize,count:t.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:t.minRotation||0,includeBounds:t.includeBounds!==!1},this._range||this);return e.bounds===`ticks`&&dc(r,this,`value`),e.reverse?(r.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),r}configure(){let e=this.ticks,t=this.min,n=this.max;if(super.configure(),this.options.offset&&e.length){let r=(n-t)/Math.max(e.length-1,1)/2;t-=r,n+=r}this._startValue=t,this._endValue=n,this._valueRange=n-t}getLabelForValue(e){return Zc(e,this.chart.options.locale,this.options.ticks.format)}},uh=class extends lh{determineDataLimits(){let{min:e,max:t}=this.getMinMax(!0);this.min=ks(e)?e:0,this.max=ks(t)?t:1,this.handleTickRangeOptions()}computeTickLimit(){let e=this.isHorizontal(),t=e?this.width:this.height,n=fc(this.options.ticks.minRotation),r=(e?Math.sin(n):Math.cos(n))||.001,i=this._resolveTickFontOptions(0);return Math.ceil(t/Math.min(40,i.lineHeight/r))}getPixelForValue(e){return e===null?NaN:this.getPixelForDecimal((e-this._startValue)/this._valueRange)}getValueForPixel(e){return this._startValue+this.getDecimalForPixel(e)*this._valueRange}};I(uh,`id`,`linear`),I(uh,`defaults`,{ticks:{callback:el.formatters.numeric}});var dh=e=>Math.floor(rc(e)),fh=(e,t)=>10**(dh(e)+t);function ph(e){return e/10**dh(e)==1}function mh(e,t,n){let r=10**n,i=Math.floor(e/r);return Math.ceil(t/r)-i}function hh(e,t){let n=dh(t-e);for(;mh(e,t,n)>10;)n++;for(;mh(e,t,n)<10;)n--;return Math.min(n,dh(e))}function gh(e,{min:t,max:n}){t=As(e.min,t);let r=[],i=dh(t),a=hh(t,n),o=a<0?10**Math.abs(a):1,s=10**a,c=i>a?10**i:0,l=Math.round((t-c)*o)/o,u=Math.floor((t-c)/s/10)*s*10,d=Math.floor((l-u)/10**a),f=As(e.min,Math.round((c+u+d*10**a)*o)/o);for(;f=10?d=d<15?15:20:d++,d>=20&&(a++,d=2,o=a>=0?1:o),f=Math.round((c+u+d*10**a)*o)/o;let p=As(e.max,f);return r.push({value:p,major:ph(p),significand:d}),r}var _h=class extends fp{constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(e,t){let n=lh.prototype.parse.apply(this,[e,t]);if(n===0)this._zero=!0;else return ks(n)&&n>0?n:null}determineDataLimits(){let{min:e,max:t}=this.getMinMax(!0);this.min=ks(e)?Math.max(0,e):null,this.max=ks(t)?Math.max(0,t):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!ks(this._userMin)&&(this.min=e===fh(this.min,0)?fh(this.min,-1):fh(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){let{minDefined:e,maxDefined:t}=this.getUserBounds(),n=this.min,r=this.max,i=t=>n=e?n:t,a=e=>r=t?r:e;n===r&&(n<=0?(i(1),a(10)):(i(fh(n,-1)),a(fh(r,1)))),n<=0&&i(fh(r,-1)),r<=0&&a(fh(n,1)),this.min=n,this.max=r}buildTicks(){let e=this.options,t=gh({min:this._userMin,max:this._userMax},this);return e.bounds===`ticks`&&dc(t,this,`value`),e.reverse?(t.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),t}getLabelForValue(e){return e===void 0?`0`:Zc(e,this.chart.options.locale,this.options.ticks.format)}configure(){let e=this.min;super.configure(),this._startValue=rc(e),this._valueRange=rc(this.max)-rc(e)}getPixelForValue(e){return(e===void 0||e===0)&&(e=this.min),e===null||isNaN(e)?NaN:this.getPixelForDecimal(e===this.min?0:(rc(e)-this._startValue)/this._valueRange)}getValueForPixel(e){let t=this.getDecimalForPixel(e);return 10**(this._startValue+t*this._valueRange)}};I(_h,`id`,`logarithmic`),I(_h,`defaults`,{ticks:{callback:el.formatters.logarithmic,major:{enabled:!0}}});function vh(e){let t=e.ticks;if(t.display&&e.display){let e=jl(t.backdropPadding);return Z(t.font&&t.font.size,ol.font.size)+e.height}return 0}function yh(e,t,n){return n=Os(n)?n:[n],{w:ll(e,t.string,n),h:n.length*t.lineHeight}}function bh(e,t,n,r,i){return e===r||e===i?{start:t-n/2,end:t+n/2}:ei?{start:t-n,end:t}:{start:t,end:t+n}}function xh(e){let t={l:e.left+e._padding.left,r:e.right-e._padding.right,t:e.top+e._padding.top,b:e.bottom-e._padding.bottom},n=Object.assign({},t),r=[],i=[],a=e._pointLabels.length,o=e.options.pointLabels,s=o.centerPointLabels?$/a:0;for(let c=0;ct.r&&(s=(r.end-t.r)/a,e.r=Math.max(e.r,t.r+s)),i.startt.b&&(c=(i.end-t.b)/o,e.b=Math.max(e.b,t.b+c))}function Ch(e,t,n){let r=e.drawingArea,{extra:i,additionalAngle:a,padding:o,size:s}=n,c=e.getPointPosition(t,r+i+o,a),l=Math.round(pc(vc(c.angle+ec))),u=Oh(c.y,s.h,l),d=Eh(l),f=Dh(c.x,s.w,d);return{visible:!0,x:c.x,y:u,textAlign:d,left:f,top:u,right:f+s.w,bottom:u+s.h}}function wh(e,t){if(!t)return!0;let{left:n,top:r,right:i,bottom:a}=e;return!(ml({x:n,y:r},t)||ml({x:n,y:a},t)||ml({x:i,y:r},t)||ml({x:i,y:a},t))}function Th(e,t,n){let r=[],i=e._pointLabels.length,a=e.options,{centerPointLabels:o,display:s}=a.pointLabels,c={extra:vh(a)/2,additionalAngle:o?$/i:0},l;for(let a=0;a270||n<90)&&(e-=t),e}function kh(e,t,n){let{left:r,top:i,right:a,bottom:o}=n,{backdropColor:s}=t;if(!Y(s)){let n=Al(t.borderRadius),c=jl(t.backdropPadding);e.fillStyle=s;let l=r-c.left,u=i-c.top,d=a-r+c.width,f=o-i+c.height;Object.values(n).some(e=>e!==0)?(e.beginPath(),Cl(e,{x:l,y:u,w:d,h:f,radius:n}),e.fill()):e.fillRect(l,u,d,f)}}function Ah(e,t){let{ctx:n,options:{pointLabels:r}}=e;for(let i=t-1;i>=0;i--){let t=e._pointLabelItems[i];if(!t.visible)continue;let a=r.setContext(e.getPointLabelContext(i));kh(n,a,t);let o=Ml(a.font),{x:s,y:c,textAlign:l}=t;Sl(n,e._pointLabels[i],s,c+o.lineHeight/2,o,{color:a.color,textAlign:l,textBaseline:`middle`})}}function jh(e,t,n,r){let{ctx:i}=e;if(n)i.arc(e.xCenter,e.yCenter,t,0,Xs);else{let n=e.getPointPosition(0,t);i.moveTo(n.x,n.y);for(let a=1;a{let n=Ns(this.options.pointLabels.callback,[e,t],this);return n||n===0?n:``}).filter((e,t)=>this.chart.getDataVisibility(t))}fit(){let e=this.options;e.display&&e.pointLabels.display?xh(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(e,t,n,r){this.xCenter+=Math.floor((e-t)/2),this.yCenter+=Math.floor((n-r)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(e,t,n,r))}getIndexAngle(e){let t=Xs/(this._pointLabels.length||1),n=this.options.startAngle||0;return vc(e*t+fc(n))}getDistanceFromCenterForValue(e){if(Y(e))return NaN;let t=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-e)*t:(e-this.min)*t}getValueForDistanceFromCenter(e){if(Y(e))return NaN;let t=e/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-t:this.min+t}getPointLabelContext(e){let t=this._pointLabels||[];if(e>=0&&e{if(t!==0||t===0&&this.min<0){s=this.getDistanceFromCenterForValue(e.value);let n=this.getContext(t),o=r.setContext(n),c=i.setContext(n);Mh(this,o,s,a,c)}}),n.display){for(e.save(),o=a-1;o>=0;o--){let r=n.setContext(this.getPointLabelContext(o)),{color:i,lineWidth:a}=r;a&&i&&(e.lineWidth=a,e.strokeStyle=i,e.setLineDash(r.borderDash),e.lineDashOffset=r.borderDashOffset,s=this.getDistanceFromCenterForValue(t.reverse?this.min:this.max),c=this.getPointPosition(o,s),e.beginPath(),e.moveTo(this.xCenter,this.yCenter),e.lineTo(c.x,c.y),e.stroke())}e.restore()}}drawBorder(){}drawLabels(){let e=this.ctx,t=this.options,n=t.ticks;if(!n.display)return;let r=this.getIndexAngle(0),i,a;e.save(),e.translate(this.xCenter,this.yCenter),e.rotate(r),e.textAlign=`center`,e.textBaseline=`middle`,this.ticks.forEach((r,o)=>{if(o===0&&this.min>=0&&!t.reverse)return;let s=n.setContext(this.getContext(o)),c=Ml(s.font);if(i=this.getDistanceFromCenterForValue(this.ticks[o].value),s.showLabelBackdrop){e.font=c.string,a=e.measureText(r.label).width,e.fillStyle=s.backdropColor;let t=jl(s.backdropPadding);e.fillRect(-a/2-t.left,-i-c.size/2-t.top,a+t.width,c.size+t.height)}Sl(e,r.label,0,-i,c,{color:s.color,strokeColor:s.textStrokeColor,strokeWidth:s.textStrokeWidth})}),e.restore()}drawTitle(){}};I(Ph,`id`,`radialLinear`),I(Ph,`defaults`,{display:!0,animate:!0,position:`chartArea`,angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:el.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(e){return e},padding:5,centerPointLabels:!1}}),I(Ph,`defaultRoutes`,{"angleLines.color":`borderColor`,"pointLabels.color":`color`,"ticks.color":`color`}),I(Ph,`descriptors`,{angleLines:{_fallback:`grid`}});var Fh={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Ih=Object.keys(Fh);function Lh(e,t){return e-t}function Rh(e,t){if(Y(t))return null;let n=e._adapter,{parser:r,round:i,isoWeekday:a}=e._parseOpts,o=t;return typeof r==`function`&&(o=r(o)),ks(o)||(o=typeof r==`string`?n.parse(o,r):n.parse(o)),o===null?null:(i&&(o=i===`week`&&(lc(a)||a===!0)?n.startOf(o,`isoWeek`,a):n.startOf(o,i)),+o)}function zh(e,t,n,r){let i=Ih.length;for(let a=Ih.indexOf(e);a=Ih.indexOf(n);a--){let n=Ih[a];if(Fh[n].common&&e._adapter.diff(i,r,n)>=t-1)return n}return Ih[n?Ih.indexOf(n):0]}function Vh(e){for(let t=Ih.indexOf(e)+1,n=Ih.length;t=t?n[r]:n[i];e[a]=!0}}function Uh(e,t,n,r){let i=e._adapter,a=+i.startOf(t[0].value,r),o=t[t.length-1].value,s,c;for(s=a;s<=o;s=+i.add(s,1,r))c=n[s],c>=0&&(t[c].major=!0);return t}function Wh(e,t,n){let r=[],i={},a=t.length,o,s;for(o=0;o+e.value))}initOffsets(e=[]){let t=0,n=0,r,i;this.options.offset&&e.length&&(r=this.getDecimalForValue(e[0]),t=e.length===1?1-r:(this.getDecimalForValue(e[1])-r)/2,i=this.getDecimalForValue(e[e.length-1]),n=e.length===1?i:(i-this.getDecimalForValue(e[e.length-2]))/2);let a=e.length<3?.5:.25;t=bc(t,0,a),n=bc(n,0,a),this._offsets={start:t,end:n,factor:1/(t+1+n)}}_generate(){let e=this._adapter,t=this.min,n=this.max,r=this.options,i=r.time,a=i.unit||zh(i.minUnit,t,n,this._getLabelCapacity(t)),o=Z(r.ticks.stepSize,1),s=a===`week`&&i.isoWeekday,c=lc(s)||s===!0,l={},u=t,d,f;if(c&&(u=+e.startOf(u,`isoWeek`,s)),u=+e.startOf(u,c?`day`:a),e.diff(n,t,a)>1e5*o)throw Error(t+` and `+n+` are too far apart with stepSize of `+o+` `+a);let p=r.ticks.source===`data`&&this.getDataTimestamps();for(d=u,f=0;d+e)}getLabelForValue(e){let t=this._adapter,n=this.options.time;return n.tooltipFormat?t.format(e,n.tooltipFormat):t.format(e,n.displayFormats.datetime)}format(e,t){let n=this.options.time.displayFormats,r=this._unit,i=t||n[r];return this._adapter.format(e,i)}_tickFormatFunction(e,t,n,r){let i=this.options,a=i.ticks.callback;if(a)return Ns(a,[e,t,n],this);let o=i.time.displayFormats,s=this._unit,c=this._majorUnit,l=s&&o[s],u=c&&o[c],d=n[t],f=c&&u&&d&&d.major;return this._adapter.format(e,r||(f?u:l))}generateTickLabels(e){let t,n,r;for(t=0,n=e.length;t0?o:1}getDataTimestamps(){let e=this._cache.data||[],t,n;if(e.length)return e;let r=this.getMatchingVisibleMetas();if(this._normalized&&r.length)return this._cache.data=r[0].controller.getAllParsedValues(this);for(t=0,n=r.length;t=e[r].pos&&t<=e[i].pos&&({lo:r,hi:i}=wc(e,`pos`,t)),{pos:a,time:s}=e[r],{pos:o,time:c}=e[i]):(t>=e[r].time&&t<=e[i].time&&({lo:r,hi:i}=wc(e,`time`,t)),{time:a,pos:s}=e[r],{time:o,pos:c}=e[i]);let l=o-a;return l?s+(c-s)*(t-a)/l:s}var qh=class extends Gh{constructor(e){super(e),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){let e=this._getTimestampsForTable(),t=this._table=this.buildLookupTable(e);this._minPos=Kh(t,this.min),this._tableRange=Kh(t,this.max)-this._minPos,super.initOffsets(e)}buildLookupTable(e){let{min:t,max:n}=this,r=[],i=[],a,o,s,c,l;for(a=0,o=e.length;a=t&&c<=n&&r.push(c);if(r.length<2)return[{time:t,pos:0},{time:n,pos:1}];for(a=0,o=r.length;ae-t)}_getTimestampsForTable(){let e=this._cache.all||[];if(e.length)return e;let t=this.getDataTimestamps(),n=this.getLabelTimestamps();return e=t.length&&n.length?this.normalize(t.concat(n)):t.length?t:n,e=this._cache.all=e,e}getDecimalForValue(e){return(Kh(this._table,e)-this._minPos)/this._tableRange}getValueForPixel(e){let t=this._offsets,n=this.getDecimalForPixel(e)/t.factor-t.end;return Kh(this._table,n*this._tableRange+this._minPos,!0)}};I(qh,`id`,`timeseries`),I(qh,`defaults`,Gh.defaults),em.register(zd,Fm,oh,uh,th);var Jh=new Intl.DateTimeFormat(`ko-KR`,{hour:`2-digit`,hour12:!1}),Yh=`#94a3b8`,Xh=`rgba(148, 163, 184, 0.18)`,Zh=`#0d9488`,Qh=`#0f766e`;function $h(e){return Jh.format(new Date(e*1e3))}function eg(e){return e.map((t,n)=>n%3==0||n===e.length-1?$h(t.bucketStart):``)}function tg({buckets:e}){let t=P(null),n=P(null),r=P(e);return r.current=e,N(()=>{let e=t.current;if(!e)return;let i=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,a=window.getComputedStyle(e).fontFamily,o={animation:!i&&{duration:500,easing:`easeOutQuart`},maintainAspectRatio:!1,responsive:!0,interaction:{intersect:!1,mode:`index`},plugins:{legend:{display:!1},tooltip:{displayColors:!1,callbacks:{title:e=>{let t=e[0]?.dataIndex??-1,n=r.current[t];return n?$h(n.bucketStart):``},label:e=>`차단 ${J(Number(e.raw??0))}`,afterLabel:e=>{let t=r.current[e.dataIndex];return t?`DNS 요청 ${J(t.queries)}`:``}}}},scales:{x:{border:{display:!1},grid:{display:!1},ticks:{autoSkip:!1,color:Yh,font:{family:a,size:11,weight:700},maxRotation:0,minRotation:0}},y:{beginAtZero:!0,border:{display:!1},grid:{color:Xh},ticks:{color:Yh,font:{family:a,size:11,weight:700},maxTicksLimit:4,precision:0}}}};return n.current=new em(e,{type:`bar`,data:{labels:eg(r.current),datasets:[{data:r.current.map(e=>e.blocked),backgroundColor:Zh,hoverBackgroundColor:Qh,borderRadius:4,borderSkipped:!1,barPercentage:.82,categoryPercentage:.9,maxBarThickness:24}]},options:o}),()=>{n.current?.destroy(),n.current=null}},[]),N(()=>{let t=n.current;t&&(t.data.labels=eg(e),t.data.datasets[0].data=e.map(e=>e.blocked),t.update())},[e]),z(`div`,{class:`mt-5 h-44 sm:h-52`,children:z(`canvas`,{"aria-label":`최근 24시간 시간대별 SafeShield 차단 요청`,ref:t,role:`img`,children:`최근 24시간 시간대별 SafeShield 차단 요청 차트`})})}var ng=3600,rg=24;function ig(e,t){return e<=0?`0.0%`:`${(t/e*100).toFixed(1)}%`}function ag(e){let t=e.hourly[e.hourly.length-1];if(t?.bucketStart)return t.bucketStart;let n=e.updatedAt>0?e.updatedAt:Math.floor(Date.now()/1e3);return Math.floor(n/ng)*ng}function og(e){let t=new Map(e.hourly.map(e=>[e.bucketStart,e])),n=ag(e)-23*ng;return Array.from({length:rg},(e,r)=>{let i=n+r*ng;return t.get(i)??{bucketStart:i,queries:0,blocked:0}})}function sg({children:e}){return z(`div`,{class:`mt-5 flex min-h-52 items-center justify-center rounded-xl border border-slate-200 bg-slate-50 px-5 text-center`,children:z(`p`,{class:`m-0 max-w-lg text-sm font-semibold leading-6 text-slate-500`,children:e})})}function cg({data:e,error:t,loading:n,nowTimestamp:r,refreshing:i}){let a;if(n&&!e)a=z(sg,{children:`SafeShield 보호 활동을 불러오는 중입니다.`});else if(t&&!e)a=z(sg,{children:`SafeShield 보호 활동을 불러오지 못했습니다. SafeShield 페이지에서 상태를 확인해 주세요.`});else if(!e||!e.available)a=z(sg,{children:`현재 SafeShield에서 차단 통계를 제공하지 않습니다. 통계 기능을 확인해 주세요.`});else if(!e.enabled)a=z(sg,{children:`통계 수집이 꺼져 있습니다. SafeShield 페이지에서 통계를 켜면 최근 24시간 활동이 표시됩니다.`});else{let t=og(e),n=t.reduce((e,t)=>({queries:e.queries+t.queries,blocked:e.blocked+t.blocked}),{queries:0,blocked:0});a=z(v,{children:[z(`dl`,{class:`mt-5 grid gap-3 sm:grid-cols-3`,children:[z(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3`,children:[z(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:`DNS 요청`}),z(`dd`,{class:`mt-1 mb-0 ml-0 text-lg font-black text-slate-950`,children:J(n.queries)})]}),z(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3`,children:[z(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:`차단`}),z(`dd`,{class:`mt-1 mb-0 ml-0 text-lg font-black text-teal-700`,children:J(n.blocked)})]}),z(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3`,children:[z(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:`차단율`}),z(`dd`,{class:`mt-1 mb-0 ml-0 text-lg font-black text-slate-950`,children:ig(n.queries,n.blocked)})]})]}),z(tg,{buckets:t})]})}return z(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[z(`div`,{class:`min-w-0`,children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`SafeShield activity`}),z(`div`,{class:`mt-2 flex min-w-0 items-center justify-between gap-3`,children:[z(`h3`,{class:`m-0 min-w-0 text-xl font-black text-slate-950`,children:`최근 24시간 보호 활동`}),z(`a`,{class:`shrink-0 whitespace-nowrap text-xs font-extrabold text-teal-700 no-underline hover:text-teal-800`,href:`#safeshield`,children:`상세 통계 →`})]}),e?.updatedAt?z(`p`,{class:`mt-2 mb-0 text-[0.68rem] font-semibold text-slate-400`,title:qa(e.updatedAt),children:i?`갱신 중…`:`집계: ${Ja(e.updatedAt,r)}`}):null]}),a,t&&e?z(`p`,{class:`mt-3 mb-0 text-xs font-bold text-amber-700`,children:`최근 통계 갱신에 실패해 마지막 정상 데이터를 표시하고 있습니다.`}):null]})}var lg=7200;function ug(e,t=Math.floor(Date.now()/1e3)){return!e||!e.settings.checkEnabled||e.phase===`checking`||!e.lastCheckAt?!1:Math.max(0,t-e.lastCheckAt)>Math.max(e.settings.checkIntervalSeconds*2,lg)}function dg(e){return e===`healthy`?`bg-emerald-50 text-emerald-700 ring-emerald-200`:e===`warning`?`bg-amber-50 text-amber-800 ring-amber-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function fg({detail:e,eyebrow:t,href:n,icon:r,linkLabel:i=`자세히 보기 →`,meta:a,metaState:o,metaWarning:s=!1,state:c=`neutral`,value:l}){let u=z(v,{children:[z(`div`,{class:`flex items-start justify-between gap-4`,children:[z(`p`,{class:`m-0 text-[0.68rem] font-black uppercase tracking-[0.16em] text-slate-500`,children:t}),z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl ring-1 ring-inset ${dg(c)}`,children:r})]}),z(`p`,{class:`mt-4 mb-0 break-words text-2xl font-black tracking-tight text-slate-950`,children:l}),z(`p`,{class:`mt-2 mb-0 min-h-10 text-sm font-medium leading-5 text-slate-500`,children:e}),a?z(`p`,{class:`mt-3 mb-0 text-xs font-bold ${o===`healthy`?`text-emerald-700`:o===`warning`||s?`text-amber-700`:`text-slate-400`}`,children:a}):null,n?z(`span`,{class:`mt-4 inline-flex text-xs font-extrabold text-teal-700`,children:i}):null]}),d=`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 transition`;return n?z(`a`,{class:`${d} no-underline hover:border-slate-300 hover:shadow-md`,href:n,children:u}):z(`article`,{class:d,children:u})}var pg=6e4;function mg(e,t){return!e||!Number.isFinite(e)||e<=0?null:Math.max(0,t-e)}function hg(e,t,n,r){return!t||t<=0?`${e}: ${r}`:z(`span`,{title:qa(t),children:[e,`: `,Ja(t,n)]})}function gg(e){if(!e)return null;switch(e.toLowerCase()){case`dhcp`:return`DHCP`;case`static`:return`Static`;case`pppoe`:return`PPPoE`;default:return e.toUpperCase()}}function _g(e){if(!e)return!1;let t=e.split(`.`).map(e=>Number(e));if(t.length!==4||t.some(e=>!Number.isInteger(e)||e<0||e>255))return!1;let[n,r]=t;return n===void 0||r===void 0?!1:n===10||n===172&&r>=16&&r<=31||n===192&&r===168}function vg({label:e,value:t}){return z(`div`,{class:`flex min-w-0 items-start justify-between gap-4 border-b border-slate-100 py-3 last:border-b-0`,children:[z(`dt`,{class:`text-sm font-semibold text-slate-500`,children:e}),z(`dd`,{class:`m-0 min-w-0 max-w-[68%] break-words text-right text-sm font-extrabold text-slate-950`,children:t})]})}function yg(e){return e===`initializing`?{badge:`bg-teal-100 text-teal-800`,icon:`text-teal-700`,label:`준비 중`,panel:`border-teal-200 bg-teal-50`}:e===`critical`?{badge:`bg-rose-100 text-rose-800`,icon:`text-rose-700`,label:`이상`,panel:`border-rose-200 bg-rose-50/70`}:e===`warning`?{badge:`bg-amber-100 text-amber-800`,icon:`text-amber-700`,label:`주의`,panel:`border-amber-200 bg-amber-50/70`}:e===`unknown`?{badge:`bg-slate-200 text-slate-700`,icon:`text-slate-500`,label:`확인 불가`,panel:`border-slate-200 bg-slate-50`}:{badge:`bg-emerald-100 text-emerald-800`,icon:`text-emerald-700`,label:`정상`,panel:`border-emerald-200 bg-emerald-50/70`}}function bg({data:e,error:t,loading:n,nowTimestamp:r}){let i=!!(e&&e.generatedAt>0),a=yg(i&&e?e.overall:`unknown`),o=i&&e?e.checks.filter(e=>e.status!==`ok`):[],s=o.slice(0,2),c=Math.max(0,o.length-s.length);return z(`div`,{class:`mt-5 border-t border-slate-200 pt-5`,children:[z(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[z(`div`,{class:`flex items-center gap-2`,children:[z(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:`장치 진단`}),i?z(`span`,{class:`rounded-full px-2.5 py-1 text-[11px] font-extrabold ${a.badge}`,children:a.label}):null]}),z(`a`,{class:`text-xs font-extrabold text-teal-700 no-underline hover:text-teal-900`,href:`#settings`,children:`상세 보기 →`})]}),t&&!i?z(`div`,{class:`mt-3 rounded-xl border border-amber-200 bg-amber-50/70 px-4 py-3`,children:z(`div`,{class:`flex items-start gap-2`,children:[z(U,{class:`mt-0.5 size-4 shrink-0 text-amber-700`}),z(`div`,{class:`min-w-0`,children:[z(`p`,{class:`m-0 text-sm font-extrabold text-slate-900`,children:`진단 상태를 확인하지 못했습니다.`}),z(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`설정에서 장치 진단 상태를 다시 확인해 주세요.`})]})]})}):i&&e?z(`div`,{class:`mt-3 rounded-xl border px-4 py-3 ${a.panel}`,children:[z(`div`,{class:`flex min-w-0 items-start gap-3`,children:[e.overall===`ok`?z(H,{class:`mt-0.5 size-5 shrink-0 ${a.icon}`}):e.overall===`initializing`?z(Ht,{class:`mt-0.5 size-5 shrink-0 ${a.icon}`}):z(U,{class:`mt-0.5 size-5 shrink-0 ${a.icon}`}),z(`div`,{class:`min-w-0 flex-1`,children:[z(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:e.summary.message}),z(`p`,{class:`mt-1 mb-0 text-xs font-semibold leading-5 text-slate-500`,children:[`마지막 진단: `,Ja(e.generatedAt,r),` · 검사 항목:`,` `,e.summary.total,`개`]})]})]}),s.length>0?z(`div`,{class:`mt-3 grid gap-2 sm:grid-cols-2`,children:s.map(e=>z(`div`,{class:`min-w-0 rounded-lg border border-white/80 bg-white/70 px-3 py-2`,children:[z(`p`,{class:`m-0 text-xs font-extrabold text-slate-900`,children:e.label}),z(`p`,{class:`mt-1 mb-0 line-clamp-2 text-xs leading-5 text-slate-500`,children:e.message})]},e.id))}):null,c>0?z(`p`,{class:`mt-2 mb-0 text-xs font-extrabold text-slate-600`,children:[`외 `,c,`건의 확인 항목이 있습니다.`]}):null]}):z(`div`,{class:`mt-3 rounded-xl border border-slate-200 bg-slate-50 px-4 py-3`,children:[z(`p`,{class:`m-0 text-sm font-extrabold text-slate-900`,children:n?`진단 상태를 확인하고 있습니다.`:`아직 생성된 진단 결과가 없습니다.`}),z(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`진단 결과가 생성되면 현재 장치 상태를 이곳에 요약해서 표시합니다.`})]})]})}function xg(e,t,n){if(t&&!e)return{detail:`보호 상태를 확인하고 있습니다.`,state:`neutral`,value:`확인 중`};if(n&&!e)return{detail:`SafeShield 상태를 불러오지 못했습니다.`,state:`warning`,value:`확인 필요`};if(!e||!e.available)return{detail:`SafeShield 서비스를 사용할 수 없습니다.`,state:`warning`,value:`사용 불가`};if(!e.enabled||e.status===`disabled`)return{detail:`DNS 보호가 비활성화되어 있습니다.`,state:`neutral`,value:`꺼짐`};if(e.status===`running`)return{detail:`차단 목록을 갱신하고 있습니다.`,state:`neutral`,value:`갱신 중`};if(!(e.active&&e.runtime.dnsmasqRunning&&e.runtime.dnsRuntimeOk&&e.health.overall!==`error`&&e.issueCounts.errors===0))return{detail:e.runtime.lastErrorCode?`최근 오류: ${e.runtime.lastErrorCode}`:`DNS 보호 상태를 확인해 주세요.`,state:`warning`,value:`확인 필요`};let r=e.entitlement.plan?.trim(),i=e.blocklist.validLineCount>0?`${J(e.blocklist.validLineCount)}개 차단 규칙`:`차단 목록 적용됨`;return{detail:r?`${i} · ${r.toUpperCase()}`:i,state:`healthy`,value:`보호 중`}}function Sg({accountRegistered:e,activity:t,activityError:n,activityLoading:r,data:i,devices:a,devicesError:o,devicesLoading:s,error:c,firmware:l,firmwareError:u,firmwareLoading:d,health:f,healthError:p,healthLoading:m,lan:h,lanError:g,lanLoading:_,loading:v,onRetry:y,safeshield:b,safeshieldError:x,safeshieldLoading:S,statistics:C,statisticsError:w,statisticsLoading:T,statisticsRefreshing:E,updates:D,updatesError:O,updatesLoading:k}){let A=Qe(()=>i?$a(i.runtime.memory):null,[i]),[j,ee]=M(()=>Math.floor(Date.now()/1e3));if(N(()=>{let e=window.setInterval(()=>{ee(Math.floor(Date.now()/1e3))},pg);return()=>window.clearInterval(e)},[]),v&&!i)return z(bo,{});if(c&&!i)return z(xo,{message:c,onRetry:y});if(!i)return null;let te=A?Math.round(A.percent):0,ne=xg(b,S,x),re=D?.packages.find(e=>e.name===`luci-app-smartsafehub`)??D?.packages[0]??null,ie=!!(D&&D.updateCount>0),ae=D?ie?`${D.updateCount}개 업데이트`:D.lastCheckAt?`최신 상태`:`확인 전`:O?`확인 필요`:`확인 중`,oe=re?ie&&re.availableVersion?`${re.installedVersion} → ${re.availableVersion}`:`설치 버전 ${re.installedVersion}`:O?`업데이트 상태를 불러오지 못했습니다.`:k?`업데이트 상태를 확인하고 있습니다.`:`업데이트 상태를 확인할 수 없습니다.`,se=a?`${J(a.totals.online)}대`:s?`확인 중`:`확인 필요`,ce=a?`Wi-Fi ${J(a.totals.wireless)}대 · 유선/기타 ${J(a.totals.ethernet)}대`:o||`연결 기기 요약을 불러오고 있습니다.`,le=gg(i.network.protocol),ue=i.network.available?i.network.ipv4Address?`WAN ${i.network.ipv4Address}${le?` · ${le}`:``}`:le?`${le} · WAN 주소를 받지 못했습니다.`:`WAN 주소를 받지 못했습니다.`:`WAN 인터페이스를 찾을 수 없습니다.`,de=!!h?.conflict.detected,fe=!i.network.up||de||g!==null&&!h?`warning`:h?`healthy`:`neutral`,pe=de?`네트워크 충돌`:i.network.up?`정상 연결`:`연결 확인`,me=i.network.up?de?`⚠ LAN 대역과 충돌합니다`:_&&!h?`네트워크 대역 확인 중`:g&&!h?`네트워크 대역을 확인하지 못했습니다.`:h?`✓ 네트워크 충돌 없음`:`네트워크 대역 확인 필요`:`WAN 연결 상태를 확인해 주세요.`,he=!i.network.up||de||g!==null&&!h?`warning`:h?`healthy`:`neutral`,ge=i.network.ipv4Address?_g(i.network.ipv4Address)?`${i.network.ipv4Address} · 사설 네트워크`:i.network.ipv4Address:`할당되지 않음`,_e=mg(b?.timestamps.lastSuccess,j),ve=b?Math.max(b.timestamps.refreshIntervalS*2,86400):null,ye=!!(b?.enabled&&b.status!==`running`&&_e!==null&&ve!==null&&_e>ve),be=ug(D,j),xe=!!l?.current.metadataAvailable,Se=d&&!l?`확인 중`:u&&!l?`확인 필요`:xe?l?.current.releaseVersion?`SmartSafeHub ${l.current.releaseVersion}`:`SmartSafeHub 펌웨어`:`${i.software.distribution} ${i.software.version}`,Ce=d&&!l?`확인 중`:u&&!l?`확인 필요`:xe&&l?.current.buildId||i.software.revision,we=xe?`빌드 ID`:`리비전`;return z(`div`,{class:`min-w-0 space-y-6`,children:[z(`section`,{"aria-labelledby":`dashboard-overview-title`,children:[z(q,{description:`인터넷, SafeShield, 연결 기기와 소프트웨어 상태를 한눈에 확인합니다.`,eyebrow:`Overview`,id:`dashboard-overview-title`,title:`시스템 개요`}),z(`div`,{class:`grid min-w-0 gap-4 sm:grid-cols-2 xl:grid-cols-4`,children:[z(fg,{detail:ue,eyebrow:`Internet`,href:`#network`,icon:z(Bt,{class:`size-5`}),linkLabel:de?`해결하기 →`:`자세히 보기 →`,meta:me,metaState:he,state:fe,value:pe}),z(fg,{detail:ne.detail,eyebrow:`SafeShield`,href:`#safeshield`,icon:z(At,{class:`size-5`}),meta:hg(ye?`차단 목록 갱신 지연`:`차단 목록 갱신`,b?.timestamps.lastSuccess,j,S?`확인 중`:`기록 없음`),metaWarning:ye,state:ne.state===`healthy`&&ye?`warning`:ne.state,value:ne.value}),z(fg,{detail:ce,eyebrow:`Connected devices`,href:`#devices`,icon:z(Mt,{class:`size-5`}),meta:hg(`목록 확인`,a?.generatedAt,j,s?`확인 중`:`기록 없음`),state:a?`healthy`:o?`warning`:`neutral`,value:se}),z(fg,{detail:oe,eyebrow:`Software update`,href:`#system`,icon:z(Ft,{class:`size-5`}),meta:D&&!D.settings.checkEnabled?hg(`자동 확인 꺼짐 · 마지막 확인`,D.lastCheckAt,j,`확인 기록 없음`):hg(be?`업데이트 확인 지연`:`마지막 확인`,D?.lastCheckAt,j,k?`확인 중`:`아직 없음`),metaWarning:be,state:O||be||ie?`warning`:D?.lastCheckAt?`healthy`:`neutral`,value:ae})]}),e===!1?z(`div`,{class:`ssh-dashboard-account-banner mt-4 flex flex-col gap-4 rounded-2xl border p-4 sm:flex-row sm:items-center sm:justify-between sm:p-5`,role:`status`,children:[z(`div`,{class:`flex min-w-0 items-start gap-3`,children:[z(`span`,{class:`ssh-dashboard-account-banner-icon grid size-10 shrink-0 place-items-center rounded-xl`,"aria-hidden":`true`,children:z(Pt,{class:`size-5`})}),z(`div`,{class:`min-w-0`,children:[z(`div`,{class:`flex flex-wrap items-center gap-2`,children:[z(`p`,{class:`ssh-dashboard-account-banner-title m-0 font-bold`,children:`SmartSafeHub 계정을 연결해 주세요`}),z(`span`,{class:`ssh-dashboard-account-banner-badge rounded-full px-2 py-0.5 text-[0.7rem] font-bold`,children:`연결 필요`})]}),z(`p`,{class:`ssh-dashboard-account-banner-description mt-1 mb-0 text-sm leading-relaxed`,children:`계정을 연결하면 웹사이트에서 기기를 관리하고 구독 정보를 확인할 수 있습니다. DNS 보호는 연결하지 않아도 계속 작동합니다.`})]})]}),z(`a`,{href:`#account`,class:`ssh-dashboard-account-banner-action inline-flex min-h-10 shrink-0 items-center justify-center rounded-xl px-4 py-2 text-sm font-bold no-underline transition-colors focus-visible:outline-2 focus-visible:outline-offset-2`,children:`계정 연결하기 →`})]}):null]}),z(`section`,{"aria-labelledby":`dashboard-activity-title`,children:[z(q,{description:`최근 SafeShield 차단 활동과 현재 네트워크 연결 구성을 함께 확인합니다.`,eyebrow:`Activity`,id:`dashboard-activity-title`,title:`네트워크 보호 활동`}),z(`div`,{class:`grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1.55fr)_minmax(18rem,0.65fr)]`,children:[z(cg,{data:C,error:w,loading:T,nowTimestamp:j,refreshing:E}),z(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[z(`div`,{class:`flex items-start justify-between gap-4`,children:[z(`div`,{children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Network`}),z(`h3`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:`연결 상태`})]}),z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl ${i.network.up&&!de?`bg-emerald-50 text-emerald-700`:`bg-amber-50 text-amber-800`}`,children:z(Bt,{class:`size-5`})})]}),z(`dl`,{class:`mt-4 mb-0`,children:[z(vg,{label:`인터넷`,value:de?`네트워크 충돌`:i.network.up?`정상 연결`:`연결 확인`}),z(vg,{label:`WAN IP`,value:ge}),z(vg,{label:`프로토콜`,value:le||`확인되지 않음`}),z(vg,{label:`상위 네트워크`,value:h?.wan.subnet||(_?`확인 중`:g?`확인 필요`:`확인되지 않음`)}),z(vg,{label:`LAN 네트워크`,value:h?.lan.subnet||(_?`확인 중`:g?`확인 필요`:`확인되지 않음`)}),z(vg,{label:`대역 충돌`,value:h?z(`span`,{class:h.conflict.detected?`text-amber-700`:`text-emerald-700`,children:h.conflict.detected?`충돌 감지`:`없음`}):_?`확인 중`:`확인 필요`})]}),z(`a`,{class:`mt-5 inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-slate-200 bg-slate-50 px-4 py-2 text-sm font-extrabold text-slate-700 no-underline transition hover:border-teal-200 hover:bg-teal-50 hover:text-teal-800`,href:`#network`,children:`네트워크 보기`})]})]})]}),z(`section`,{"aria-labelledby":`dashboard-recent-activity-title`,children:[z(q,{action:z(`a`,{class:`inline-flex whitespace-nowrap text-xs font-extrabold text-teal-700 no-underline hover:text-teal-900`,href:`#activity`,children:`전체 보기 →`}),description:`인터넷, 보호, 업데이트와 진단에서 실제 상태가 바뀐 시점을 확인합니다.`,eyebrow:`History`,id:`dashboard-recent-activity-title`,title:`최근 활동`}),z(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:r||n&&!t?z(ho,{error:n,loading:r}):z(mo,{compact:!0,events:(t?.events??[]).slice(0,3)})})]}),z(`section`,{"aria-labelledby":`dashboard-system-title`,children:[z(q,{description:`메모리, 시스템 부하와 장치 정보를 빠르게 점검합니다.`,eyebrow:`System`,id:`dashboard-system-title`,title:`시스템 상태`}),z(`div`,{class:`grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1.45fr)_minmax(20rem,0.75fr)]`,children:[z(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[z(`div`,{class:`flex flex-wrap items-start justify-between gap-4`,children:[z(`div`,{children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Runtime`}),z(`h3`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:`리소스 사용량`})]}),z(`span`,{class:`inline-flex items-center gap-2 rounded-full px-3 py-1.5 text-xs font-black ring-1 ring-inset ${te>=90?`bg-amber-50 text-amber-800 ring-amber-200`:`bg-emerald-50 text-emerald-700 ring-emerald-200`}`,children:[z(`span`,{class:`size-2 rounded-full ${te>=90?`bg-amber-500`:`bg-emerald-500`}`}),te>=90?`메모리 확인`:`정상 실행`]})]}),z(`div`,{class:`mt-5 grid gap-3 sm:grid-cols-3`,children:[z(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[z(`div`,{class:`flex items-center gap-2 text-slate-500`,children:[z(Ut,{class:`size-4`}),z(`span`,{class:`text-xs font-extrabold`,children:`메모리`})]}),z(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:[te,`%`]}),z(`p`,{class:`mt-1 mb-0 text-xs font-semibold text-slate-500`,children:[A?Wa(A.used):`-`,` /`,` `,Wa(i.runtime.memory.total)]}),z(`div`,{"aria-label":`메모리 사용률 ${te}%`,class:`mt-3 h-1.5 overflow-hidden rounded-full bg-slate-200`,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":te,children:z(`div`,{class:`h-full rounded-full transition-[width] duration-300 ${te>=90?`bg-amber-500`:`bg-teal-600`}`,style:{width:`${Math.min(100,te)}%`}})})]}),z(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[z(`div`,{class:`flex items-center gap-2 text-slate-500`,children:[z(jt,{class:`size-4`}),z(`span`,{class:`text-xs font-extrabold`,children:`시스템 부하`})]}),z(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:Ga(i.runtime.load[0])}),z(`p`,{class:`mt-1 mb-0 text-xs font-semibold text-slate-500`,children:[`5분 `,Ga(i.runtime.load[1]),` · 15분`,` `,Ga(i.runtime.load[2])]})]}),z(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[z(`div`,{class:`flex items-center gap-2 text-slate-500`,children:[z(Ht,{class:`size-4`}),z(`span`,{class:`text-xs font-extrabold`,children:`실행 시간`})]}),z(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:Ua(i.runtime.uptime)}),z(`p`,{class:`mt-1 mb-0 text-xs font-semibold text-slate-500`,children:[`부팅 `,Ka(i.runtime.localtime,i.runtime.uptime)]})]})]}),z(bg,{data:f,error:p,loading:m,nowTimestamp:j})]}),z(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[z(`div`,{class:`flex items-start justify-between gap-4`,children:[z(`div`,{children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Device`}),z(`h3`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:`장치 정보`})]}),z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:z(jt,{class:`size-5`})})]}),z(`dl`,{class:`mt-4 mb-0`,children:[z(vg,{label:`모델`,value:i.device.model}),z(vg,{label:`호스트 이름`,value:i.device.hostname}),z(vg,{label:`펌웨어`,value:z(`span`,{title:xe?l?.current.releaseVersion?`SmartSafeHub 펌웨어 ${l.current.releaseVersion}`:`SmartSafeHub 커스텀 펌웨어`:u||void 0,children:Se})}),z(vg,{label:we,value:Ce}),z(vg,{label:`커널`,value:i.software.kernel}),z(vg,{label:`WAN IP`,value:i.network.ipv4Address||`할당되지 않음`})]})]})]})]})]})}var Cg=Object.assign,wg=/^(-|f[lo].*[^se]$|g.{5,}[^ps]$|z|o[pr]|(W.{5})?[lL]i.*(t|mp)$|an|(bo|s).{4}Im|sca|m.{6}[ds]|ta|c.*[st]$|wido|ini)/;function Tg(e,t){var n=le(e,t);return n.containerInfo=t,n}var Eg=Symbol.for(`react.element`),Dg=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(?!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Og=/[A-Z0-9]/g,kg=typeof document<`u`,Ag=function(e){return/fil|che|rad/.test(e)};y.prototype.isReactComponent=!0,[`componentWillMount`,`componentWillReceiveProps`,`componentWillUpdate`].forEach(function(e){Object.defineProperty(y.prototype,e,{configurable:!0,get:function(){return this[`UNSAFE_`+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})});var jg=e.event;e.event=function(e){return jg&&(e=jg(e)),e.persist=function(){},e.isPropagationStopped=function(){return this.cancelBubble},e.isDefaultPrevented=function(){return this.defaultPrevented},e.nativeEvent=e};var Mg={configurable:!0,get:function(){return this.class}},Ng=e.vnode;e.vnode=function(e){if(typeof e.type==`string`)(function(e){var t=e.props,n=e.type,r={},i=n.indexOf(`-`)==-1;for(var a in t){var o=t[a];if(!(a==`value`&&`defaultValue`in t&&o==null||kg&&a==`children`&&n==`noscript`||a==`class`||a==`className`)){if(a==`style`&&typeof o==`object`){var s=void 0;for(var c in o)typeof o[c]!=`number`||wg.test(c)||(s||(s=o=Cg({},o)),o[c]+=`px`)}else if(a==`defaultValue`&&`value`in t&&t.value==null)a=`value`;else if(a==`download`&&!0===o)o=``;else if(a==`translate`&&o===`no`)o=!1;else if(a[0]==`o`&&a[1]==`n`){var l=a.toLowerCase();l==`ondoubleclick`?a=`ondblclick`:l!=`onchange`||n!=`input`&&n!=`textarea`||Ag(t.type)?l==`onfocus`?a=`onfocusin`:l==`onblur`&&(a=`onfocusout`):l=a=`oninput`,l==`oninput`&&r[a=l]&&(a=`oninputCapture`)}else i&&Dg.test(a)?a=a.replace(Og,`-$&`).toLowerCase():o===null&&(o=void 0);r[a]=o}}n==`select`&&(r.multiple&&Array.isArray(r.value)&&(r.value=D(t.children).forEach(function(e){e.props.selected=r.value.indexOf(e.props.value)!=-1})),r.defaultValue!=null&&(r.value=D(t.children).forEach(function(e){e.props.selected=r.multiple?r.defaultValue.indexOf(e.props.value)!=-1:r.defaultValue==e.props.value}))),t.class&&!t.className?(r.class=t.class,Object.defineProperty(r,"className",Mg)):t.className&&(r.class=r.className=t.className),e.props=r})(e);else if(typeof e.type==`function`&&(`ref`in e.props&&`prototype`in e.type&&e.type.prototype.render&&(e.ref=e.props.ref,delete e.props.ref),e.type.defaultProps)){var t=Cg({},e.props);for(var n in e.type.defaultProps)t[n]===void 0&&(t[n]=e.type.defaultProps[n]);e.props=t}e.ref&&!(`ref`in e.props)&&Object.defineProperty(e.props,"ref",{value:e.ref,configurable:!0,writable:!0}),e.$$typeof=Eg,Ng&&Ng(e)};var Pg=8,Fg=256,Ig=8;function Lg(e){return e.findIndex(e=>!e.disabled)}function Rg(e){for(let t=e.length-1;t>=0;--t)if(!e[t]?.disabled)return t;return-1}function zg(e,t,n){if(e.length===0)return-1;let r=t;for(let t=0;te.value===t&&!e.disabled);return n>=0?n:Lg(e)}function Vg({ariaLabel:e,className:t=``,disabled:n=!1,id:r,onChange:i,options:a,value:o,variant:s=`default`}){let c=$e(),l=r??`ssh-custom-select-${c}`,u=`${l}-menu`,d=P(null),f=P(null),p=P(null),m=P([]),[h,g]=M(!1),[_,v]=M(()=>Bg(a,o)),[y,b]=M(`bottom`),[x,S]=M(Fg),[C,w]=M({}),[T,E]=M(null),D=Qe(()=>a.find(e=>e.value===o)??a[0]??null,[a,o]),O=()=>{let e=f.current;if(!e)return;let t=e.getBoundingClientRect(),n=Math.min(Fg,Math.max(44,a.length*42+12)),r=window.innerHeight-t.bottom-Ig,i=t.top-Ig,o=rr?`top`:`bottom`,s=Math.min(t.width,Math.max(0,window.innerWidth-16)),c=Math.max(Ig,Math.min(t.left,window.innerWidth-s-Ig)),l=o===`bottom`?r:i;b(o),S(Math.max(44,Math.min(Fg,Math.floor(l)))),w({left:`${c}px`,width:`${s}px`,...o===`bottom`?{top:`${t.bottom+Pg}px`}:{bottom:`${window.innerHeight-t.top+Pg}px`}})},k=(e=!1)=>{g(!1),e&&window.requestAnimationFrame(()=>f.current?.focus())},A=e=>{e<0||(v(e),window.requestAnimationFrame(()=>m.current[e]?.focus()))},j=e=>{let t=a[e];t&&!t.disabled&&(i(t.value),g(!1),window.requestAnimationFrame(()=>f.current?.focus()))},ee=e=>{n||a.length===0||(O(),g(!0),A(e??Bg(a,o)))};N(()=>{let e=d.current?.closest(`.ssh-app`);if(e){E(e);return}let t=d.current?.getRootNode();t instanceof ShadowRoot?E(t):typeof document<`u`&&E(document.body)},[]),N(()=>{v(Bg(a,o)),m.current=m.current.slice(0,a.length)},[a,o]),N(()=>{if(!h)return;O();let e=e=>{let t=e.composedPath();d.current&&t.includes(d.current)||p.current&&t.includes(p.current)||k()},t=e=>{e.key===`Escape`&&(e.preventDefault(),k(!0))},n=()=>O();return document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t),window.addEventListener(`resize`,n),window.addEventListener(`scroll`,n,!0),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t),window.removeEventListener(`resize`,n),window.removeEventListener(`scroll`,n,!0)}},[h,a.length]),N(()=>{n&&h&&k()},[n,h]);let te=s===`emphasized`?`min-h-11 border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100`:`min-h-11 border border-slate-300 bg-slate-50 px-3 py-2.5 text-sm font-bold text-slate-900 focus:border-teal-500 focus:ring-2 focus:ring-teal-100`,ne=h?z(`div`,{"aria-label":`${e} 목록`,class:`ssh-custom-select-menu fixed z-[1000] overflow-hidden rounded-xl border border-slate-200 bg-white p-1.5 shadow-xl shadow-slate-950/10`,id:u,ref:p,role:`listbox`,style:C,children:z(`div`,{class:`overflow-y-auto overscroll-contain`,style:{maxHeight:`${x}px`},children:a.map((e,t)=>{let n=e.value===o;return z(`button`,{"aria-selected":n,class:`flex min-h-10 w-full items-center justify-between gap-3 rounded-lg px-3 py-2.5 text-left text-sm font-bold transition ${n?`bg-teal-50 text-teal-800`:`text-slate-700 hover:bg-slate-50`} ${e.disabled?`cursor-not-allowed opacity-50`:``}`,disabled:e.disabled,onClick:()=>j(t),onFocus:()=>v(t),onKeyDown:e=>{switch(e.key){case`ArrowDown`:e.preventDefault(),A(zg(a,t,1));break;case`ArrowUp`:e.preventDefault(),A(zg(a,t,-1));break;case`Home`:e.preventDefault(),A(Lg(a));break;case`End`:e.preventDefault(),A(Rg(a));break;case`Enter`:case` `:e.preventDefault(),j(t);break;case`Escape`:e.preventDefault(),k(!0);break;case`Tab`:g(!1)}},ref:e=>{m.current[t]=e},role:`option`,tabIndex:_===t?0:-1,type:`button`,children:[z(`span`,{class:`min-w-0 truncate`,children:e.label}),n?z(`span`,{"aria-hidden":`true`,class:`size-2 shrink-0 rounded-full bg-teal-500`}):null]},e.value)})})}):null;return z(`div`,{class:`relative ${t}`,ref:d,children:[z(`button`,{"aria-controls":u,"aria-expanded":h,"aria-haspopup":`listbox`,"aria-label":e,class:`ssh-custom-select-trigger flex w-full cursor-pointer items-center justify-between gap-3 rounded-xl text-left outline-none transition disabled:cursor-not-allowed disabled:bg-slate-100 disabled:text-slate-400 disabled:opacity-60 ${te}`,disabled:n,id:l,onClick:()=>{h?k():(O(),g(!0))},onKeyDown:e=>{switch(e.key){case`ArrowDown`:e.preventDefault(),ee(h?zg(a,_,1):Bg(a,o));break;case`ArrowUp`:e.preventDefault(),ee(h?zg(a,_,-1):Bg(a,o));break;case`Home`:e.preventDefault(),ee(Lg(a));break;case`End`:e.preventDefault(),ee(Rg(a));break;case`Enter`:case` `:e.preventDefault(),h?k():ee();break;case`Escape`:h&&(e.preventDefault(),k())}},ref:f,type:`button`,children:[z(`span`,{class:`min-w-0 truncate`,children:D?.label??`선택하세요`}),z(an,{"aria-hidden":`true`,class:`size-4 shrink-0 text-slate-400 transition-transform ${h?`rotate-180`:``}`})]}),ne&&T?Tg(ne,T):null,z(`span`,{class:`sr-only`,"aria-live":`polite`,children:y===`top`?`선택 목록이 위쪽에 열렸습니다.`:``})]})}var Hg=[{value:`skb`,label:`SK Broadband`},{value:`lgu`,label:`LG U+`}];function Ug(e){return e===`lgu`?`LG U+`:`SK Broadband`}function Wg({active:e,label:t,value:n}){return z(`div`,{class:`rounded-xl border border-slate-200 bg-white p-4`,children:[z(`div`,{class:`flex items-center justify-between gap-3`,children:[z(`p`,{class:`m-0 text-xs font-extrabold text-slate-500`,children:t}),z(`span`,{class:`size-2.5 shrink-0 rounded-full ${e?`bg-emerald-500`:`bg-slate-300`}`,"aria-hidden":`true`})]}),z(`p`,{class:`mt-2 mb-0 text-sm font-black text-slate-950`,children:n})]})}function Gg({data:e,error:t,feedback:n,loading:r,onDismissFeedback:i,onRetry:a,onSave:o,saving:s}){let[c,l]=M(!1),[u,d]=M(`skb`);if(N(()=>{e&&(l(e.enabled),d(e.provider))},[e]),r&&!e)return z(bo,{});if(t&&!e)return z(xo,{message:t,onRetry:a});if(!e)return z(xo,{message:`IPTV 설정을 확인할 수 없습니다.`,onRetry:a});let f=c!==e.enabled||u!==e.provider,p=!e.enabled||e.running&&e.igmpSnooping;return z(`div`,{class:`space-y-5`,children:[z(`section`,{class:`rounded-2xl border border-amber-200 bg-amber-50 p-5 sm:p-6`,children:z(`div`,{class:`flex items-start gap-4`,children:[z(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-amber-100 text-amber-800`,children:z(U,{class:`size-5`})}),z(`div`,{class:`min-w-0 flex-1`,children:[z(`div`,{class:`flex flex-wrap items-center gap-2`,children:[z(`h2`,{class:`m-0 text-base font-black text-amber-950`,children:`IPTV 실험 기능`}),z(`span`,{class:`rounded-full border border-amber-300 bg-amber-100 px-2 py-0.5 text-[10px] font-black uppercase tracking-[0.12em] text-amber-800`,children:`Beta`})]}),z(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-amber-900/80`,children:`현재 SK Broadband와 LG U+를 지원하며 두 통신사에는 동일한 멀티캐스트 IPTV 프로파일을 적용합니다. KT IPTV는 별도 네트워크 방식이 필요해 아직 지원하지 않습니다.`})]})]})}),n?z(`section`,{"aria-live":`polite`,class:`rounded-2xl border p-4 ${n.kind===`success`?`border-emerald-200 bg-emerald-50 text-emerald-900`:`border-red-200 bg-red-50 text-red-900`}`,children:z(`div`,{class:`flex items-start justify-between gap-3`,children:[z(`p`,{class:`m-0 text-sm font-bold leading-6`,children:n.message}),z(`button`,{class:`shrink-0 text-xs font-extrabold underline underline-offset-2`,onClick:i,type:`button`,children:`닫기`})]})}):null,z(q,{eyebrow:`IPTV`,title:`IPTV 설정`,description:`통신사 환경에 맞는 멀티캐스트 중계 기능을 관리합니다.`}),z(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[z(`div`,{class:`flex min-w-0 items-start gap-3`,children:[z(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:z(Vt,{class:`size-5`})}),z(`div`,{class:`min-w-0 flex-1`,children:[z(`div`,{class:`flex min-w-0 flex-wrap items-center justify-between gap-2`,children:[z(`h2`,{class:`m-0 text-lg font-black text-slate-950`,children:`IPTV`}),z(`div`,{class:`flex shrink-0 items-center gap-2`,children:[f?z(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[z(U,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]}):null,z(`button`,{"aria-checked":c,"aria-label":`IPTV 사용`,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border-0 transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 ${c?`bg-teal-700`:`bg-slate-300`} disabled:cursor-not-allowed disabled:opacity-60`,disabled:s||!e.available,onClick:()=>l(e=>!e),role:`switch`,type:`button`,children:z(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${c?`left-6`:`left-1`}`})})]})]}),z(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-600`,children:`WAN의 멀티캐스트 방송을 LAN 셋톱박스로 전달합니다.`})]})]}),z(`div`,{class:`mt-6 grid gap-5 lg:grid-cols-[minmax(0,1fr)_minmax(0,1fr)]`,children:[z(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[z(`div`,{class:`flex flex-wrap items-start justify-between gap-2`,children:[z(`div`,{children:[z(`label`,{class:`block text-xs font-extrabold text-slate-600`,htmlFor:`iptv-provider`,children:`통신사`}),z(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`IPTV를 제공하는 회선 사업자를 선택하세요.`})]}),z(`span`,{class:`rounded-full border border-teal-200 bg-teal-50 px-2.5 py-1 text-[10px] font-black text-teal-700`,children:`멀티캐스트 방식`})]}),z(Vg,{ariaLabel:`IPTV 통신사`,className:`mt-3`,disabled:s||!c,id:`iptv-provider`,onChange:e=>d(e),options:Hg,value:u}),z(`div`,{class:`mt-3 flex items-start gap-2 rounded-lg border border-slate-200 bg-white p-3`,children:[z(H,{"aria-hidden":`true`,class:`mt-0.5 size-4 shrink-0 text-teal-700`}),z(`p`,{class:`m-0 text-xs leading-5 text-slate-600`,children:[Ug(u),`에는 현재 SK Broadband/LG U+ 공통 IGMP Proxy 프로파일을 적용합니다. KT는 추후 별도 IPTV 프로파일로 지원할 예정입니다.`]})]})]}),z(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[z(`div`,{class:`flex items-center justify-between gap-3`,children:[z(`p`,{class:`m-0 text-xs font-extrabold text-slate-500`,children:`현재 지원 프로파일`}),z(`span`,{class:`text-xs font-extrabold text-slate-500`,children:`SKB · LG U+`})]}),z(`p`,{class:`mt-2 mb-0 text-sm font-black text-slate-950`,children:`WAN → IGMP Proxy → LAN`}),z(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-600`,children:`WAN을 upstream, LAN을 downstream으로 사용하고 LAN bridge에는 IGMP snooping을 함께 활성화해 필요하지 않은 포트와 Wi-Fi로 멀티캐스트가 불필요하게 퍼지는 것을 줄입니다.`})]})]}),e.available?null:z(`div`,{class:`mt-5 rounded-xl border border-red-200 bg-red-50 p-4 text-sm font-bold leading-6 text-red-900`,children:`IGMP Proxy 패키지를 찾지 못했습니다. 현재 펌웨어에 igmpproxy 패키지가 포함되어 있는지 확인해 주세요.`}),z(`div`,{class:`mt-6 flex flex-wrap items-center justify-between gap-3 border-t border-slate-200 pt-5`,children:[z(`p`,{class:`m-0 text-xs leading-5 text-slate-500`,children:`설정을 적용하면 네트워크 서비스가 잠시 다시 로드될 수 있습니다.`}),z(`button`,{class:`inline-flex min-h-11 items-center justify-center rounded-xl border-0 bg-teal-700 px-5 py-2.5 text-sm font-black text-white shadow-sm transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:s||!e.available||!f&&!c,onClick:()=>void o({enabled:c,provider:u}),type:`button`,children:s?`적용 중…`:f?`변경사항 적용`:`설정 다시 적용`})]})]}),z(q,{eyebrow:`Runtime`,title:`IPTV 동작 상태`,description:`마지막으로 적용한 IPTV 설정과 중계 서비스의 실행 상태를 확인합니다.`}),z(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[z(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[z(`p`,{class:`m-0 text-xs leading-5 text-slate-500`,children:`적용된 IPTV 중계 서비스와 멀티캐스트 전달 상태입니다.`}),z(`span`,{class:`inline-flex items-center gap-1.5 rounded-full px-3 py-1 text-xs font-black ${p?`bg-emerald-100 text-emerald-800`:`bg-amber-100 text-amber-800`}`,children:[z(H,{class:`size-4`}),p?e.enabled?`정상`:`꺼짐`:`확인 필요`]})]}),f?z(`div`,{class:`mt-4 flex items-start gap-2 rounded-xl border border-amber-200 bg-amber-50 p-3 text-xs font-bold leading-5 text-amber-900`,children:[z(U,{"aria-hidden":`true`,class:`mt-0.5 size-4 shrink-0`}),`아래 동작 상태는 마지막으로 적용된 설정 기준입니다. 변경사항을 적용하면 새 설정으로 갱신됩니다.`]}):null,z(`div`,{class:`mt-5 grid gap-3 sm:grid-cols-2 lg:grid-cols-4`,children:[z(Wg,{active:e.enabled&&e.running,label:`IGMP Proxy`,value:e.enabled?e.running?`동작 중`:`중지됨`:`꺼짐`}),z(Wg,{active:e.enabled&&e.igmpSnooping,label:`IGMP Snooping`,value:e.igmpSnooping?`켜짐`:`꺼짐`}),z(Wg,{active:e.enabled,label:`Upstream`,value:e.upstreamNetwork.toUpperCase()}),z(Wg,{active:e.enabled,label:`Downstream`,value:e.lanBridge??e.downstreamNetwork.toUpperCase()})]})]})]})}function Kg(e){let t=e.split(`.`);return[t[0]??``,t[1]??``,t[2]??``,t[3]??``]}function qg(e){return e.replace(/\D/g,``).slice(0,3)}function Jg(e){return e.every(e=>e===``)?``:e.join(`.`)}function Yg({disabled:e=!1,label:t,value:n,onChange:r}){let i=Kg(n),a=(e,t)=>{let n=[...i];n[e]=qg(t),r(Jg(n))};return z(`div`,{class:`ssh-ipv4-segments mt-2 min-h-11`,"aria-label":`${t} 입력`,children:i.map((n,r)=>z(`div`,{class:`ssh-ipv4-segment`,children:[z(`input`,{"aria-label":`${t} ${r+1}번째 옥텟`,autocomplete:`off`,class:`min-h-11 w-full min-w-0 max-w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-1.5 py-2.5 text-center text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100 sm:px-2`,disabled:e,inputMode:`numeric`,maxLength:3,onInput:e=>a(r,e.currentTarget.value),pattern:`[0-9]*`,spellcheck:!1,value:n}),r{if(!/^(0|[1-9][0-9]{0,2})$/.test(e))return!1;let t=Number(e);return t>=0&&t<=255})}function $g(e){let t=Kg(e);return t.slice(0,3).some(e=>e===``||Number(e)>255)?null:t.slice(0,3).join(`.`)}function e_(e){return Kg(e)[3]}function t_(e){let t=$g(e.lan.address),n=e_(e.dhcp.start??``),r=e_(e.dhcp.end??``);return{ipAddress:e.lan.address,prefixLength:e.lan.prefixLength,dhcpEnabled:e.dhcp.enabled,dhcpStart:t&&n?`${t}.${n}`:e.dhcp.start??``,dhcpEnd:t&&r?`${t}.${r}`:e.dhcp.end??``,leaseTime:e.dhcp.leaseTime}}function n_({disabled:e,label:t,lanAddress:n,value:r,onChange:i}){let a=$g(n),o=a?.split(`.`)??[``,``,``],s=e_(r),c=e=>{let t=qg(e);i(a&&t!==``?`${a}.${t}`:t)};return z(`label`,{class:`block`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:t}),z(`div`,{class:`ssh-ipv4-segments mt-2 min-h-11`,"aria-label":`${t} 입력`,children:[o.map((e,t)=>z(`div`,{class:`ssh-ipv4-segment`,children:[z(`span`,{class:`grid min-h-11 w-full min-w-0 max-w-full place-items-center rounded-xl border border-slate-200 bg-slate-100 px-1.5 py-2.5 text-center text-sm font-bold text-slate-500 sm:px-2`,children:e||`—`}),z(`span`,{"aria-hidden":`true`,class:`ssh-ipv4-separator text-sm font-black text-slate-400`,children:`.`})]},t)),z(`div`,{class:`ssh-ipv4-segment`,children:z(`input`,{"aria-label":`${t} 마지막 옥텟`,autocomplete:`off`,class:`min-h-11 w-full min-w-0 max-w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-1.5 py-2.5 text-center text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100 sm:px-2`,disabled:e||!a,inputMode:`numeric`,maxLength:3,onInput:e=>c(e.currentTarget.value),pattern:`[0-9]*`,spellcheck:!1,value:s})})]}),z(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`앞 3개 주소는 공유기 IP 주소와 동일하게 유지됩니다.`})]})}function r_(e){return`${window.location.protocol}//${e}${window.location.pathname}${window.location.search}${window.location.hash}`}function i_({feedback:e,onDismiss:t}){return z(`div`,{"aria-live":`polite`,class:`mb-5 rounded-2xl border px-4 py-4 text-sm ${e.kind===`success`?`border-emerald-200 bg-emerald-50 text-emerald-900`:e.kind===`warning`?`border-amber-200 bg-amber-50 text-amber-950`:`border-red-200 bg-red-50 text-red-900`}`,children:[z(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[z(`p`,{class:`m-0 font-bold leading-6`,children:e.message}),z(`button`,{class:`min-h-10 shrink-0 rounded-lg border border-current bg-transparent px-3 py-1.5 text-xs font-extrabold`,onClick:t,type:`button`,children:`닫기`})]}),e.newAddress?z(`a`,{class:`mt-3 inline-flex min-h-10 items-center rounded-lg border border-current px-3 py-2 font-extrabold underline underline-offset-2`,href:r_(e.newAddress),children:[`새 공유기 주소 `,e.newAddress,`로 연결`]}):null]})}function a_({data:e}){let t=e.conflict.detected;return z(`section`,{class:`grid gap-4 lg:grid-cols-3`,"aria-label":`내부 네트워크 상태`,children:[z(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[z(`span`,{class:`grid size-10 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:z(jt,{class:`size-5`})}),z(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`SmartSafeHub LAN`}),z(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:e.lan.subnet}),z(`p`,{class:`mt-1 mb-0 text-sm font-semibold text-slate-600`,children:[`공유기 주소 `,e.lan.address]})]}),z(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[z(`span`,{class:`grid size-10 place-items-center rounded-xl bg-slate-100 text-slate-700`,children:z(Bt,{class:`size-5`})}),z(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`상위 네트워크`}),z(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:e.wan.subnet??`확인 전`}),z(`p`,{class:`mt-1 mb-0 text-sm font-semibold text-slate-600`,children:e.wan.connected?`WAN ${e.wan.address??`주소 확인 중`}`:`WAN 연결 후 자동으로 확인합니다.`})]}),z(`article`,{class:`rounded-2xl border p-5 shadow-sm shadow-slate-900/5 ${t?`border-red-200 bg-red-50 text-red-950`:`border-emerald-200 bg-emerald-50 text-emerald-950`}`,children:[z(`span`,{class:`grid size-10 place-items-center rounded-xl ${t?`bg-red-100 text-red-700`:`bg-emerald-100 text-emerald-700`}`,children:z(t?U:H,{class:`size-5`})}),z(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] opacity-70`,children:`대역 충돌`}),z(`p`,{class:`mt-2 mb-0 text-lg font-black`,children:t?`주소 대역이 겹칩니다`:`충돌이 감지되지 않았습니다`}),z(`p`,{class:`mt-1 mb-0 text-sm font-semibold leading-6 opacity-80`,children:t?`상위 네트워크 ${e.conflict.wanSubnet??``}와 다른 LAN 대역이 필요합니다.`:e.wan.connected?`현재 WAN과 LAN이 서로 다른 IPv4 대역을 사용합니다.`:`WAN이 연결되면 상위 네트워크와의 충돌 여부를 확인합니다.`})]})]})}function o_({action:e,data:t,error:n,feedback:r,loading:i,onApplyRecommendation:a,onDismissFeedback:o,onRetry:s,onSave:c}){let[l,u]=M(``),[d,f]=M(24),[p,m]=M(!0),[h,g]=M(``),[_,y]=M(``),[b,x]=M(`12h`),[S,C]=M(!1),[w,T]=M(null),E=(e={})=>{if(!t)return!1;let n=t_(t);return(e.ipAddress??l).trim()!==n.ipAddress||(e.prefixLength??d)!==n.prefixLength||(e.dhcpEnabled??p)!==n.dhcpEnabled||(e.dhcpStart??h).trim()!==n.dhcpStart||(e.dhcpEnd??_).trim()!==n.dhcpEnd||(e.leaseTime??b)!==n.leaseTime},D=e=>{let t=$g(e);if(u(e),!t){C(E({ipAddress:e}));return}let n=e_(h),r=e_(_),i=n?`${t}.${n}`:``,a=r?`${t}.${r}`:``;g(i),y(a),C(E({ipAddress:e,dhcpStart:i,dhcpEnd:a}))},O=e=>{g(e),C(E({dhcpStart:e}))},k=e=>{y(e),C(E({dhcpEnd:e}))},A=e=>{f(e),C(E({prefixLength:e}))},j=e=>{x(e),C(E({leaseTime:e}))},ee=e=>{m(e),C(E({dhcpEnabled:e}))};N(()=>{if(!t||S)return;let e=t_(t);u(e.ipAddress),f(e.prefixLength),m(e.dhcpEnabled),g(e.dhcpStart),y(e.dhcpEnd),x(e.leaseTime),T(null)},[t,S]);let te=Qe(()=>{let e=[...Xg];return e.includes(d)||(e.push(d),e.sort((e,t)=>e-t)),e},[d]),ne=Qe(()=>{let e=[...Zg];return e.some(([e])=>e===b)||e.push([b,`현재 설정 (${b})`]),e},[b]);if(i)return z(bo,{});if(n)return z(xo,{message:n,onRetry:s});if(!t)return null;let re=e!==null,ie=async e=>{e.preventDefault(),Qg(l)?!Qg(h)||!Qg(_)?T(`DHCP 시작/종료 주소를 올바른 IPv4 형식으로 입력해 주세요.`):window.confirm(`내부 네트워크 설정을 적용하면 연결된 기기가 새 DHCP 정보를 받는 동안 잠시 연결이 끊길 수 있습니다. 계속하시겠습니까?`)&&(T(null),await c({ipAddress:l.trim(),prefixLength:d,dhcpEnabled:p,dhcpStart:h.trim(),dhcpEnd:_.trim(),leaseTime:b})&&C(!1)):T(`공유기 주소를 올바른 IPv4 형식으로 입력해 주세요.`)},ae=async()=>{t.recommendation&&window.confirm(`상위 네트워크와 겹치지 않는 ${t.recommendation.subnet} 대역으로 자동 변경합니다. 현재 연결이 잠시 끊길 수 있습니다. 계속하시겠습니까?`)&&(T(null),await a()&&C(!1))};return z(v,{children:[r?z(i_,{feedback:r,onDismiss:o}):null,z(q,{eyebrow:`Overview`,title:`내부 네트워크 상태`,description:`LAN 주소와 DHCP 할당 상태를 확인합니다.`}),z(a_,{data:t}),t.conflict.detected?z(`section`,{class:`mt-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-amber-950 sm:p-6`,children:z(`div`,{class:`flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between`,children:[z(`div`,{class:`min-w-0`,children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-amber-700`,children:`자동 충돌 해결`}),z(`h2`,{class:`mt-2 mb-0 text-lg font-black`,children:`안전한 LAN 대역으로 변경할 수 있습니다`}),z(`p`,{class:`mt-2 mb-0 text-sm font-semibold leading-6 text-amber-900/80`,children:t.recommendation?`${t.recommendation.subnet} · DHCP ${t.recommendation.dhcpStart} ~ ${t.recommendation.dhcpEnd}`:`현재 활성 네트워크와 겹치지 않는 추천 대역을 찾지 못했습니다. 아래에서 직접 설정해 주세요.`})]}),t.recommendation?z(`button`,{class:`inline-flex min-h-11 shrink-0 items-center justify-center gap-2 rounded-xl border-0 bg-amber-700 px-5 py-2.5 text-sm font-extrabold text-white transition hover:bg-amber-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-amber-200 disabled:cursor-wait disabled:opacity-60`,disabled:re,onClick:()=>void ae(),type:`button`,children:[z(H,{class:`size-5 ${e===`auto`?`animate-pulse`:``}`}),e===`auto`?`변경 중`:`추천 대역으로 자동 변경`]}):null]})}):null,z(`div`,{class:`mt-7`,children:z(q,{eyebrow:`Local network`,title:`LAN 및 DHCP 설정`,description:`상위 공유기와 다른 주소 대역을 사용해야 안정적으로 라우팅할 수 있습니다.`})}),z(`form`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void ie(e),children:[S?z(`div`,{class:`mb-5 flex justify-end`,children:z(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 self-start items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[z(U,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]})}):null,z(`div`,{class:`grid gap-5 lg:grid-cols-2`,children:[z(`div`,{class:`block`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`공유기 IP 주소`}),z(Yg,{disabled:re,label:`공유기 IP 주소`,onChange:D,value:l})]}),z(`div`,{class:`block`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`현재 LAN 대역`}),z(`div`,{class:`mt-2 min-h-11 rounded-xl border border-slate-200 bg-slate-50 px-4 py-3 text-sm font-bold text-slate-700`,children:t.lan.subnet}),z(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`서브넷 마스크는 아래 고급 설정에서 변경할 수 있습니다.`})]}),z(n_,{disabled:re,label:`DHCP 시작 주소`,lanAddress:l,onChange:O,value:h}),z(n_,{disabled:re,label:`DHCP 종료 주소`,lanAddress:l,onChange:k,value:_})]}),z(`details`,{class:`mt-6 rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[z(`summary`,{class:`cursor-pointer text-sm font-black text-slate-900`,children:`고급 DHCP 설정`}),z(`div`,{class:`mt-5 grid gap-5 lg:grid-cols-2`,children:[z(`div`,{class:`block`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`서브넷 마스크`}),z(Vg,{ariaLabel:`서브넷 마스크`,className:`mt-2`,disabled:re,id:`lan-prefix-length`,onChange:e=>A(Number(e)),options:te.map(e=>({value:String(e),label:`/${e} · ${e===t.lan.prefixLength?t.lan.netmask:`CIDR /${e}`}`})),value:String(d),variant:`emphasized`}),z(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`일반 가정용 네트워크는 /24 사용을 권장합니다.`})]}),z(`div`,{class:`block`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`DHCP 임대 시간`}),z(Vg,{ariaLabel:`DHCP 임대 시간`,className:`mt-2`,disabled:re,id:`lan-dhcp-lease-time`,onChange:j,options:ne.map(([e,t])=>({value:e,label:t})),value:b,variant:`emphasized`})]}),z(`label`,{class:`inline-flex min-h-11 items-center gap-3 text-sm font-extrabold text-slate-800 lg:col-span-2`,children:[z(`input`,{checked:p,class:`size-5 accent-teal-700`,disabled:re,onChange:e=>ee(e.currentTarget.checked),type:`checkbox`}),`SmartSafeHub DHCP 서버 사용`]}),z(`p`,{class:`m-0 text-xs font-semibold leading-5 text-slate-500 lg:col-span-2`,children:`DHCP를 끄면 SmartSafeHub에 연결되는 장치에 IP 주소를 자동으로 할당하지 않습니다. 별도의 DHCP 서버를 사용하는 고급 구성에서만 비활성화하세요.`})]})]}),w?z(`p`,{class:`mt-5 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:w}):null,z(`div`,{class:`mt-6 flex flex-col gap-3 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[z(`p`,{class:`m-0 text-xs font-semibold leading-5 text-slate-500`,children:`주소가 바뀌면 현재 관리 페이지 연결이 종료되며 새 IP를 받아 다시 접속해야 합니다.`}),z(`button`,{class:`inline-flex min-h-11 w-full shrink-0 items-center justify-center gap-2 rounded-xl border-0 bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white shadow-sm transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:re||!S,type:`submit`,children:[z(H,{class:`size-5 ${e===`saving`?`animate-pulse`:``}`}),e===`saving`?`저장 중`:`설정 저장`]})]})]})]})}var s_=[`dhcp`,`pppoe`,`static`],c_=`1.1.1.1`,l_=Array.from({length:33},(e,t)=>t);function u_(e){return s_.includes(e)}function d_(e){switch(e){case`dhcp`:return`자동 IP (DHCP)`;case`pppoe`:return`PPPoE`;case`static`:return`고정 IPv4`;default:return e?e.toUpperCase():`확인 전`}}function f_(e){return{protocol:e.configuration.protocol,pppoeUsername:e.configuration.pppoe.username,pppoePassword:``,staticAddress:e.configuration.static.address??``,staticPrefixLength:e.configuration.static.prefixLength??24,staticGateway:e.configuration.static.gateway??``,dnsPrimary:e.configuration.static.dns[0]??``,dnsSecondary:e.configuration.static.dns[1]??``}}function p_(e){return e.trim()}function m_(e,t){let n=f_(t);return e.protocol===n.protocol?e.protocol===`dhcp`||!u_(e.protocol)?!1:e.protocol===`pppoe`?p_(e.pppoeUsername)!==n.pppoeUsername||e.pppoePassword.length>0:p_(e.staticAddress)!==n.staticAddress||e.staticPrefixLength!==n.staticPrefixLength||p_(e.staticGateway)!==n.staticGateway||p_(e.dnsPrimary)!==n.dnsPrimary||p_(e.dnsSecondary)!==n.dnsSecondary:!0}function h_(e){let t=e.trim().split(`.`);return t.length===4&&t.every(e=>{if(!/^(0|[1-9][0-9]{0,2})$/.test(e))return!1;let t=Number(e);return t>=0&&t<=255})}function g_(e){let t=e;return Array.from({length:4},()=>{if(t>=8)return t-=8,255;if(t<=0)return 0;let e=256-2**(8-t);return t=0,e}).join(`.`)}function __(e){if(!Number.isFinite(e)||e<=0)return`연결 시간 확인 전`;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}일 ${n}시간 연결됨`:n>0?`${n}시간 ${r}분 연결됨`:`${Math.max(1,r)}분 연결됨`}function v_({feedback:e,onDismiss:t}){return z(`div`,{"aria-live":`polite`,class:`mb-5 rounded-2xl border px-4 py-4 text-sm ${e.kind===`success`?`border-emerald-200 bg-emerald-50 text-emerald-900`:e.kind===`warning`?`border-amber-200 bg-amber-50 text-amber-950`:`border-red-200 bg-red-50 text-red-900`}`,children:z(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[z(`p`,{class:`m-0 font-bold leading-6`,children:e.message}),z(`button`,{class:`min-h-10 shrink-0 rounded-lg border border-current bg-transparent px-3 py-1.5 text-xs font-extrabold`,onClick:t,type:`button`,children:`닫기`})]})})}function y_({data:e,busy:t,onReconnect:n}){let r=e.status,i=r.connected;return z(`section`,{class:`grid gap-4 lg:grid-cols-3`,"aria-label":`인터넷 연결 상태`,children:[z(`article`,{class:`rounded-2xl border p-5 shadow-sm shadow-slate-900/5 ${i?`border-emerald-200 bg-emerald-50 text-emerald-950`:`border-amber-200 bg-amber-50 text-amber-950`}`,children:[z(`div`,{class:`flex items-start justify-between gap-3`,children:[z(`span`,{class:`grid size-10 place-items-center rounded-xl ${i?`bg-emerald-100 text-emerald-700`:`bg-amber-100 text-amber-700`}`,children:z(i?H:U,{class:`size-5`})}),z(`button`,{class:`inline-flex min-h-10 items-center justify-center gap-2 rounded-xl border border-current bg-transparent px-3 py-2 text-xs font-extrabold transition disabled:cursor-wait disabled:opacity-60`,disabled:t,onClick:n,type:`button`,children:[z(V,{class:`size-4 ${t?`animate-spin`:``}`}),`재연결`]})]}),z(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] opacity-70`,children:`인터넷 상태`}),z(`p`,{class:`mt-2 mb-0 text-xl font-black`,children:r.pending?`연결 중`:i?`연결됨`:`연결 안 됨`}),z(`p`,{class:`mt-1 mb-0 text-sm font-semibold leading-6 opacity-80`,children:[d_(r.protocol??e.configuration.protocol),` · `,__(r.uptimeSeconds)]})]}),z(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[z(`span`,{class:`grid size-10 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:z(Bt,{class:`size-5`})}),z(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`WAN IPv4`}),z(`p`,{class:`mt-2 mb-0 break-all text-xl font-black text-slate-950`,children:r.address?`${r.address}${r.prefixLength===null?``:`/${r.prefixLength}`}`:`주소 없음`}),z(`p`,{class:`mt-1 mb-0 text-sm font-semibold text-slate-600`,children:r.device?`인터페이스 ${r.device}`:`인터페이스 확인 전`})]}),z(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[z(`span`,{class:`grid size-10 place-items-center rounded-xl bg-slate-100 text-slate-700`,children:z(jt,{class:`size-5`})}),z(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`Gateway · DNS`}),z(`p`,{class:`mt-2 mb-0 break-all text-base font-black text-slate-950`,children:r.gateway??`Gateway 확인 전`}),z(`p`,{class:`mt-1 mb-0 break-all text-sm font-semibold leading-6 text-slate-600`,children:r.dns.length>0?r.dns.join(` · `):`DNS 확인 전`})]})]})}function b_({action:e,data:t,error:n,feedback:r,loading:i,onDismissFeedback:a,onReconnect:o,onRetry:s,onSave:c}){let[l,u]=M({protocol:`dhcp`,pppoeUsername:``,pppoePassword:``,staticAddress:``,staticPrefixLength:24,staticGateway:``,dnsPrimary:``,dnsSecondary:``}),[d,f]=M(!1),[p,m]=M(!1),[h,g]=M(null);N(()=>{t&&!d&&(u(f_(t)),g(null))},[t,d]);let _=Qe(()=>{let e=[{value:`dhcp`,label:`자동 IP (DHCP)`},{value:`pppoe`,label:`PPPoE`},{value:`static`,label:`고정 IPv4`}];return t&&!t.configuration.supported&&e.unshift({value:t.configuration.protocol,label:`현재 설정 (${t.configuration.protocol})`}),e},[t]);if(i)return z(bo,{});if(n)return z(xo,{message:n,onRetry:s});if(!t)return null;let y=e!==null,b=e=>{u(n=>{let r={...n,...e};return f(m_(r,t)),r}),g(null)},x=async e=>{if(e.preventDefault(),!u_(l.protocol))g(`DHCP, PPPoE 또는 고정 IPv4 중 하나를 선택해 주세요.`);else{if(l.protocol===`pppoe`){if(!p_(l.pppoeUsername)){g(`PPPoE 사용자명을 입력해 주세요.`);return}if((t.configuration.protocol!==`pppoe`||!t.configuration.pppoe.passwordConfigured)&&l.pppoePassword.length===0){g(`PPPoE 연결을 시작하려면 비밀번호를 입력해 주세요.`);return}}if(l.protocol===`static`){if(!h_(l.staticAddress)){g(`고정 IPv4 주소를 올바르게 입력해 주세요.`);return}if(!h_(l.staticGateway)){g(`기본 게이트웨이를 올바르게 입력해 주세요.`);return}if(!h_(l.dnsPrimary)){g(`기본 DNS 서버를 올바르게 입력해 주세요.`);return}if(p_(l.dnsSecondary)&&!h_(l.dnsSecondary)){g(`보조 DNS 서버를 올바르게 입력해 주세요.`);return}}window.confirm(`인터넷 연결 설정을 적용하면 WAN 연결이 다시 시작되어 인터넷이 잠시 끊길 수 있습니다. 계속하시겠습니까?`)&&await c({protocol:l.protocol,pppoeUsername:p_(l.pppoeUsername),pppoePassword:l.pppoePassword,pppoePasswordChanged:l.pppoePassword.length>0,staticAddress:p_(l.staticAddress),staticPrefixLength:l.staticPrefixLength,staticGateway:p_(l.staticGateway),dnsPrimary:p_(l.dnsPrimary),dnsSecondary:p_(l.dnsSecondary)})&&(u(e=>({...e,pppoePassword:``})),f(!1))}};return z(v,{children:[r?z(v_,{feedback:r,onDismiss:a}):null,z(q,{eyebrow:`Overview`,title:`인터넷 연결 상태`,description:`WAN 연결 상태와 네트워크 정보를 확인합니다.`}),z(y_,{data:t,busy:y,onReconnect:()=>{window.confirm(`WAN 연결을 다시 시작합니다. 인터넷이 잠시 끊길 수 있습니다. 계속하시겠습니까?`)&&o()}}),t.configuration.supported?null:z(`section`,{class:`mt-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-amber-950 sm:p-6`,children:z(`div`,{class:`flex items-start gap-3`,children:[z(U,{class:`mt-0.5 size-5 shrink-0 text-amber-700`}),z(`div`,{children:[z(`h2`,{class:`m-0 text-base font-black`,children:`현재 WAN 방식은 직접 관리하지 않습니다`}),z(`p`,{class:`mt-2 mb-0 text-sm font-semibold leading-6 text-amber-900/80`,children:[`현재 설정은 `,t.configuration.protocol,`입니다. 아래에서 DHCP, PPPoE 또는 고정 IPv4를 선택해 저장하면 해당 방식으로 전환합니다.`]})]})]})}),z(`div`,{class:`mt-7`,children:z(q,{eyebrow:`Internet`,title:`인터넷 연결 설정`,description:`통신사 또는 상위 네트워크 환경에 맞는 WAN 연결 방식을 선택합니다.`})}),z(`form`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void x(e),children:[d?z(`div`,{class:`mb-5 flex justify-end`,children:z(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 self-start items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[z(U,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]})}):null,z(`div`,{children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`연결 방식`}),z(Vg,{ariaLabel:`WAN 연결 방식`,className:`mt-2 max-w-xl`,disabled:y,id:`wan-protocol`,onChange:e=>b(e===`static`&&!p_(l.dnsSecondary)?{protocol:e,dnsSecondary:c_}:{protocol:e}),options:_,value:l.protocol,variant:`emphasized`}),z(`span`,{class:`mt-2 block text-xs font-semibold leading-5 text-slate-500`,children:`대부분의 가정용 인터넷과 상위 공유기 연결은 자동 IP(DHCP)를 사용합니다.`})]}),l.protocol===`pppoe`?z(`div`,{class:`mt-6 grid gap-5 lg:grid-cols-2`,children:[z(`label`,{class:`block`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`PPPoE 사용자명`}),z(`input`,{autocomplete:`username`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:y,onInput:e=>b({pppoeUsername:e.currentTarget.value}),spellcheck:!1,value:l.pppoeUsername})]}),z(`label`,{class:`block`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`PPPoE 비밀번호`}),z(`span`,{class:`relative mt-2 block`,children:[z(`input`,{autocomplete:`new-password`,class:`min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 pr-12 text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:y,onInput:e=>b({pppoePassword:e.currentTarget.value}),placeholder:t.configuration.protocol===`pppoe`&&t.configuration.pppoe.passwordConfigured?`변경할 때만 입력`:`PPPoE 비밀번호`,...p?{type:`text`}:{type:`password`},value:l.pppoePassword}),z(`button`,{"aria-label":p?`비밀번호 숨기기`:`비밀번호 표시`,class:`absolute inset-y-0 right-1 grid w-10 place-items-center rounded-lg border-0 bg-transparent text-slate-500`,disabled:y,onClick:()=>m(e=>!e),type:`button`,children:z(p?Xt:Yt,{class:`size-5`})})]}),z(`span`,{class:`mt-2 block text-xs text-slate-500`,children:t.configuration.protocol===`pppoe`&&t.configuration.pppoe.passwordConfigured?`비워 두면 현재 저장된 비밀번호를 그대로 사용합니다.`:`통신사에서 제공한 PPPoE 비밀번호를 입력해 주세요.`})]})]}):null,l.protocol===`static`?z(`div`,{class:`mt-6 grid gap-5 lg:grid-cols-2`,children:[z(`label`,{class:`block`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`IPv4 주소`}),z(Yg,{disabled:y,label:`IPv4 주소`,onChange:e=>b({staticAddress:e}),value:l.staticAddress})]}),z(`div`,{class:`block`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`서브넷 마스크`}),z(Vg,{ariaLabel:`WAN 서브넷 마스크`,className:`mt-2`,disabled:y,id:`wan-static-prefix-length`,onChange:e=>b({staticPrefixLength:Number(e)}),options:l_.map(e=>({value:String(e),label:`/${e} · ${g_(e)}`})),value:String(l.staticPrefixLength),variant:`emphasized`})]}),z(`label`,{class:`block`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`기본 게이트웨이`}),z(Yg,{disabled:y,label:`기본 게이트웨이`,onChange:e=>b({staticGateway:e}),value:l.staticGateway})]}),z(`label`,{class:`block`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`기본 DNS`}),z(Yg,{disabled:y,label:`기본 DNS`,onChange:e=>b({dnsPrimary:e}),value:l.dnsPrimary})]}),z(`label`,{class:`block lg:col-start-2`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`보조 DNS (선택)`}),z(Yg,{disabled:y,label:`보조 DNS`,onChange:e=>b({dnsSecondary:e}),value:l.dnsSecondary})]})]}):null,l.protocol===`dhcp`?z(`div`,{class:`mt-6 rounded-xl border border-slate-200 bg-slate-50 px-4 py-4 text-sm font-semibold leading-6 text-slate-600`,children:`상위 공유기 또는 통신사 장비에서 IP 주소, 기본 게이트웨이와 DNS 정보를 자동으로 받습니다. 별도의 계정이나 고정 주소가 없다면 이 방식을 사용하세요.`}):null,h?z(`p`,{class:`mt-5 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:h}):null,z(`div`,{class:`mt-6 flex flex-col gap-3 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[z(`p`,{class:`m-0 text-xs font-semibold leading-5 text-slate-500`,children:`설정 저장 후 WAN만 다시 연결하며 LAN 관리 페이지와 내부 네트워크 설정은 유지됩니다.`}),z(`button`,{class:`inline-flex min-h-11 w-full shrink-0 items-center justify-center gap-2 rounded-xl border-0 bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white shadow-sm transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:y||!d,type:`submit`,children:[z(H,{class:`size-5 ${e===`saving`?`animate-pulse`:``}`}),e===`saving`?`저장 중`:`설정 저장`]})]})]})]})}var x_=3,S_=10;function C_(e,t){return e<=0?`0.0%`:`${(t/e*100).toFixed(1)}%`}function w_(e){return e.id===`other`?`기타 기기`:e.hostname?e.hostname:e.identified?`이름 없는 기기`:`미식별 기기`}function T_(e){return[...e].sort((e,t)=>e.id===`other`?1:t.id===`other`?-1:t.blocked-e.blocked||t.queries-e.queries||w_(e).localeCompare(w_(t),`ko`))}function E_({devices:e,deviceLimit:t,truncated:n}){let r=T_(e),[i,a]=M(!1),[o,s]=M(1),c=Math.max(1,Math.ceil(r.length/S_)),l=Math.min(o,c),u=(l-1)*S_,d=Math.min(u+S_,r.length),f=i?r.slice(u,d):r.slice(0,x_),p=r.length>x_;return N(()=>{s(e=>Math.min(e,c))},[c]),z(`div`,{class:`mt-6 rounded-2xl border border-slate-100 bg-slate-50/70 p-4 sm:p-5`,children:[z(`div`,{class:`flex flex-wrap items-start justify-between gap-3`,children:[z(`div`,{children:[z(`div`,{class:`flex flex-wrap items-center gap-2`,children:[z(`p`,{class:`m-0 text-xs font-bold text-slate-500`,children:`기기별 통계`}),p&&!i?z(`span`,{class:`inline-flex items-center rounded-full bg-teal-50 px-2 py-1 text-[10px] font-extrabold tracking-wide text-teal-700 ring-1 ring-teal-100`,children:`차단 TOP 3`}):null]}),z(`h3`,{class:`mt-1 mb-0 text-base font-extrabold text-slate-950`,children:`어떤 기기에서 차단되었는지 확인`}),z(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-500`,children:`DHCP 정보가 있는 기기는 MAC 주소를 기준으로 식별하며, 기기별 숫자만 현재 부팅 세션 동안 메모리에 집계합니다.`})]}),z(`div`,{class:`flex flex-wrap items-center justify-end gap-2`,children:[z(`span`,{class:`inline-flex items-center gap-2 rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-slate-600 ring-1 ring-slate-200`,children:[z(Mt,{class:`size-4 text-teal-700`}),J(r.length),`개 항목`]}),p?z(`button`,{"aria-controls":`safeshield-device-statistics-list`,"aria-expanded":i,class:`rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-teal-700 ring-1 ring-slate-200 transition hover:bg-slate-50`,onClick:()=>{a(e=>!e),s(1)},type:`button`,children:i?`간단히 보기 ↑`:`전체 ${J(r.length)}개 기기 보기 ↓`}):null]})]}),r.length===0?z(`p`,{class:`mt-4 mb-0 rounded-xl bg-white p-4 text-sm leading-6 text-slate-500 ring-1 ring-slate-100`,children:`아직 기기별 DNS 통계가 없습니다. 클라이언트에서 DNS 요청이 발생하면 다음 통계 갱신 시 표시됩니다.`}):z(`div`,{class:`mt-4 grid gap-3`,id:`safeshield-device-statistics-list`,children:f.map(e=>z(`article`,{class:`grid gap-4 rounded-xl bg-white p-4 ring-1 ring-slate-100 sm:grid-cols-[minmax(0,1fr)_auto] sm:items-center`,children:[z(`div`,{class:`min-w-0`,children:z(`div`,{class:`flex min-w-0 flex-wrap items-center gap-2`,children:[z(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg bg-teal-50 text-teal-700`,children:z(Mt,{class:`size-4`})}),z(`div`,{class:`min-w-0`,children:[z(`h4`,{class:`m-0 truncate text-sm font-extrabold text-slate-950`,children:w_(e)}),z(`p`,{class:`mt-1 mb-0 break-all text-xs text-slate-500`,children:[e.ip||`IP 미확인`,e.mac?` · ${e.mac}`:``]})]}),z(`span`,{class:`rounded-full px-2 py-1 text-[11px] font-extrabold ${e.identified?`bg-emerald-50 text-emerald-700`:`bg-slate-100 text-slate-600`}`,children:e.id===`other`?`합산`:e.identified?`DHCP 식별`:`IP 임시 식별`})]})}),z(`dl`,{class:`m-0 grid grid-cols-3 gap-2 text-right`,children:[z(`div`,{class:`min-w-20`,children:[z(`dt`,{class:`text-[11px] font-bold text-slate-400`,children:`DNS 요청`}),z(`dd`,{class:`mt-1 mb-0 ml-0 text-sm font-extrabold text-slate-900`,children:J(e.queries)})]}),z(`div`,{class:`min-w-20`,children:[z(`dt`,{class:`text-[11px] font-bold text-slate-400`,children:`차단`}),z(`dd`,{class:`mt-1 mb-0 ml-0 text-sm font-extrabold text-teal-700`,children:J(e.blocked)})]}),z(`div`,{class:`min-w-20`,children:[z(`dt`,{class:`text-[11px] font-bold text-slate-400`,children:`차단율`}),z(`dd`,{class:`mt-1 mb-0 ml-0 text-sm font-extrabold text-slate-900`,children:C_(e.queries,e.blocked)})]})]})]},e.id))}),p&&!i?z(`p`,{class:`mt-3 mb-0 text-xs font-semibold leading-5 text-slate-500`,children:[`전체 `,J(r.length),`개 기기 중 차단 수 기준 상위 `,x_,`개를 표시하고 있습니다.`]}):null,i&&r.length>S_?z(`nav`,{"aria-label":`기기별 통계 페이지`,class:`mt-4 flex flex-wrap items-center justify-between gap-3`,children:[z(`p`,{class:`m-0 text-xs font-semibold text-slate-500`,children:[J(u+1),`–`,J(d),` /`,` `,J(r.length),`개`]}),z(`div`,{class:`flex items-center gap-2`,children:[z(`button`,{class:`rounded-lg bg-white px-3 py-2 text-xs font-extrabold text-slate-700 ring-1 ring-slate-200 transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50`,disabled:l<=1,onClick:()=>s(e=>Math.max(1,e-1)),type:`button`,children:`이전`}),z(`span`,{"aria-current":`page`,class:`min-w-20 text-center text-xs font-extrabold text-slate-600`,children:[J(l),` / `,J(c)]}),z(`button`,{class:`rounded-lg bg-white px-3 py-2 text-xs font-extrabold text-slate-700 ring-1 ring-slate-200 transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50`,disabled:l>=c,onClick:()=>s(e=>Math.min(c,e+1)),type:`button`,children:`다음`})]})]}):null,n?z(`p`,{class:`mt-4 mb-0 rounded-xl border border-amber-200 bg-amber-50 p-3 text-xs font-semibold leading-5 text-amber-800`,children:[`개별 통계는 최대 `,J(t),`개 기기까지 추적합니다. 한도를 초과한 기기의 요청은 기타 기기로 합산됩니다.`]}):null]})}var D_=3600,O_=24;function k_(e,t){return e<=0?`0.0%`:`${(t/e*100).toFixed(1)}%`}function A_(e){let t=e.hourly[e.hourly.length-1];if(t?.bucketStart)return t.bucketStart;let n=e.updatedAt>0?e.updatedAt:Math.floor(Date.now()/1e3);return Math.floor(n/D_)*D_}function j_(e){let t=new Map(e.hourly.map(e=>[e.bucketStart,e])),n=A_(e)-23*D_;return Array.from({length:O_},(e,r)=>{let i=n+r*D_;return t.get(i)??{bucketStart:i,queries:0,blocked:0}})}function M_({emphasized:e=!1,label:t,value:n}){return z(`div`,{class:`rounded-xl bg-slate-50 p-4 sm:p-5`,children:[z(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:t}),z(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight ${e?`text-teal-700`:`text-slate-950`}`,children:n})]})}function N_({action:e,data:t,error:n,loading:r,onRetry:i,onSetEnabled:a,refreshing:o}){if(r&&t===null)return z(v,{children:[z(q,{eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청과 차단 현황을 확인합니다.`}),z(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:z(`p`,{class:`m-0 text-sm font-bold text-slate-500`,children:`차단 통계를 불러오는 중입니다…`})})]});if(n&&t===null)return z(v,{children:[z(q,{eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청과 차단 현황을 확인합니다.`}),z(`section`,{class:`rounded-2xl border border-amber-200 bg-amber-50 p-5 sm:p-6`,children:[z(`p`,{class:`m-0 text-sm font-extrabold text-amber-950`,children:`차단 통계를 불러오지 못했습니다.`}),z(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-amber-800`,children:n}),z(`button`,{class:`mt-4 inline-flex min-h-9 items-center justify-center rounded-xl border border-amber-300 bg-white px-3 py-2 text-xs font-extrabold text-amber-900 transition hover:bg-amber-100 focus:outline-none focus-visible:ring-4 focus-visible:ring-amber-100`,onClick:i,type:`button`,children:`다시 시도`})]})]});if(!t)return z(v,{children:[z(q,{eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청과 차단 현황을 확인합니다.`}),z(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:z(`p`,{class:`m-0 text-sm leading-6 text-slate-600`,children:`현재 SafeShield에서 통계 데이터를 제공하지 않습니다. SafeShield 0.3.15 버전 이상이 설치되어 있고, 통계 수집이 활성화되어 있는지 확인해 주세요.`})})]});let s=j_(t),c=s[s.length-1],l=s.reduce((e,t)=>({queries:e.queries+t.queries,blocked:e.blocked+t.blocked}),{queries:0,blocked:0}),u=e===`statistics-enable`||e===`statistics-disable`,d=e===`statistics-enable`||e!==`statistics-disable`&&t.enabled,f=u?d?`활성화하는 중…`:`비활성화하는 중…`:t.enabled?t.collectorRunning?`활성화 · 수집 중`:`활성화 · 시작 중`:`비활성화`;return z(v,{children:[z(q,{action:z(`div`,{class:`flex items-center gap-3 rounded-xl border border-slate-100 bg-slate-50 px-3 py-2.5`,children:[z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-500`,children:z(Kt,{class:`size-5`})}),z(`div`,{class:`text-right`,children:[z(`p`,{class:`m-0 text-[0.68rem] font-bold text-slate-400`,children:`통계 수집`}),z(`p`,{class:`mt-1 mb-0 text-xs font-extrabold ${u||d?`text-emerald-700`:`text-slate-500`}`,role:`status`,children:f})]}),z(`button`,{"aria-checked":d,"aria-label":d?`차단 통계 수집 끄기`:`차단 통계 수집 켜기`,class:`ssh-switch-control relative inline-flex shrink-0 items-center rounded-full border-0 p-0 transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 ${u?`cursor-wait opacity-80`:`disabled:cursor-not-allowed disabled:opacity-50`} ${d?`bg-teal-600`:`bg-slate-300`}`,disabled:e!==null,onClick:()=>a(!t.enabled),role:`switch`,type:`button`,children:z(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 grid place-items-center shadow-sm transition-all ${d?`left-6`:`left-1`}`,children:u?z(V,{"aria-hidden":`true`,class:`size-3 animate-spin text-teal-600`}):null})})]}),eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청 원본은 저장하지 않고 숫자만 로컬 메모리에 집계합니다.`}),z(`section`,{"aria-busy":u,class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 ${u?`cursor-wait`:``}`,children:[t.enabled?null:z(`div`,{class:`mb-4 rounded-xl border border-slate-200 bg-slate-50 px-4 py-3 text-sm leading-6 text-slate-600`,children:`통계 수집이 꺼져 있습니다. 활성화하면 DNS 요청 원본은 저장하지 않고 요청 수와 차단 수만 로컬 메모리에 집계합니다.`}),z(`dl`,{class:`mt-2 grid gap-3 sm:grid-cols-2 xl:grid-cols-4`,children:[z(M_,{label:`최근 24시간 DNS 요청`,value:J(l.queries)}),z(M_,{emphasized:!0,label:`최근 24시간 차단`,value:J(l.blocked)}),z(M_,{label:`최근 24시간 차단율`,value:k_(l.queries,l.blocked)}),z(M_,{label:`현재 시간 차단`,value:J(c?.blocked??0)})]}),z(`div`,{class:`mt-5 rounded-xl bg-slate-50/70 p-4 sm:p-5`,children:[z(`div`,{class:`flex flex-wrap items-end justify-between gap-3`,children:[z(`div`,{children:[z(`p`,{class:`m-0 text-xs font-bold text-slate-500`,children:`최근 24시간`}),z(`h3`,{class:`mt-1 mb-0 text-base font-extrabold text-slate-950`,children:`시간대별 차단 요청`})]}),z(`span`,{class:`text-xs font-bold text-slate-500`,children:o?`갱신 중…`:`마지막 집계 ${qa(t.updatedAt)}`})]}),z(tg,{buckets:s})]}),z(E_,{deviceLimit:t.deviceLimit,devices:t.devices,truncated:t.devicesTruncated}),z(`div`,{class:`mt-5 flex flex-wrap gap-x-5 gap-y-2 border-t border-slate-100 pt-4 text-xs leading-5 text-slate-500`,children:[z(`span`,{children:[`수집 누적 DNS 요청 `,J(t.totals.queries)]}),z(`span`,{children:[`수집 누적 차단 `,J(t.totals.blocked)]}),z(`span`,{children:[`수집 시작 `,qa(t.startedAt)]}),z(`span`,{children:[`보존 `,J(t.retentionHours),`시간`]}),t.volatile?z(`span`,{children:`재부팅 시 초기화되는 메모리 통계`}):null]}),n?z(`p`,{class:`mt-3 mb-0 text-xs font-bold text-amber-700`,children:`최근 자동 갱신에 실패했습니다. 현재 표시된 마지막 정상 통계를 유지합니다.`}):null]})]})}function P_({timestamp:e,fallback:t=`기록 없음`}){let[n,r]=M(()=>Date.now()/1e3),i=typeof e==`number`&&Number.isFinite(e)&&e>0&&e<=864e10;if(N(()=>{if(!i)return;r(Date.now()/1e3);let e=window.setInterval(()=>r(Date.now()/1e3),6e4);return()=>window.clearInterval(e)},[e,i]),!i||e==null)return z(`span`,{children:t});let a=qa(e);return z(`span`,{class:`inline-flex max-w-full flex-wrap items-center gap-1`,children:[z(`time`,{class:`min-w-0`,dateTime:new Date(e*1e3).toISOString(),title:a,children:Ya(e,n)}),z(`details`,{class:`group inline-flex max-w-full flex-wrap items-center gap-1 align-middle`,children:[z(`summary`,{"aria-label":`정확한 날짜 및 시간 확인`,class:`inline-flex size-6 cursor-pointer list-none items-center justify-center rounded-full text-slate-400 transition hover:text-teal-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-teal-500 [&::-webkit-details-marker]:hidden`,title:`정확한 날짜 및 시간 확인`,children:z(`svg`,{"aria-hidden":`true`,class:`size-3.5`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,viewBox:`0 0 24 24`,children:[z(`circle`,{cx:`12`,cy:`12`,r:`9`}),z(`path`,{d:`M12 11v5m0-8h.01`,strokeLinecap:`round`})]})}),z(`span`,{class:`hidden max-w-full break-words rounded-md bg-slate-100 px-2 py-1 text-xs font-semibold text-slate-700 group-open:inline-block`,children:a})]})]})}var F_=`https://www.smartsafehub.com/pricing/`;function I_({value:e,trueLabel:t=`정상`,falseLabel:n=`확인 필요`}){return z(`span`,{class:`inline-flex items-center gap-2 text-sm font-extrabold ${e?`text-emerald-700`:`text-slate-500`}`,children:[z(`span`,{class:`size-2 rounded-full ${e?`bg-emerald-500`:`bg-slate-300`}`}),e?t:n]})}function L_(e){return!e.enabled||e.status===`disabled`?`disabled`:e.status===`running`?`refreshing`:e.status===`error`||e.health.overall===`error`||e.issueCounts.errors>0?`error`:e.status===`paused`?`paused`:e.active&&e.runtime.dnsmasqRunning&&e.runtime.dnsRuntimeOk?`protecting`:`attention`}function R_(e){return!e.enabled||e.status===`disabled`?`비활성화`:e.active&&e.runtime.dnsmasqRunning&&e.runtime.dnsRuntimeOk?`보호 중`:e.status===`paused`?`일시 중지`:`확인 필요`}function z_(e){let t=L_(e);return t===`error`&&R_(e)===`보호 중`&&e.runtime.lastErrorCode?`갱신 실패`:{disabled:`비활성화`,refreshing:`갱신 중`,protecting:`보호 중`,paused:`일시 중지`,error:`오류`,attention:`확인 필요`}[t]}function B_(e){return e?`자동 최적화`:`확인되지 않음`}function V_(e){let t=Xa(e);return t===null?`확인되지 않음`:z(P_,{timestamp:t})}function H_(e){let t=L_(e);return t===`protecting`?e.blocklist.validLineCount>0?`${J(e.blocklist.validLineCount)}개 도메인 차단 규칙으로 DNS를 보호하고 있습니다.`:e.blocklist.installed?`차단 목록이 설치되어 있으며 DNS 보호가 정상적으로 동작하고 있습니다.`:`SafeShield 서비스와 DNS 런타임이 정상적으로 동작하고 있습니다.`:t===`refreshing`?`차단 목록을 최신 상태로 갱신하고 있습니다.`:t===`disabled`?`SafeShield DNS 보호가 비활성화되어 있습니다.`:t===`paused`?`SafeShield 작업이 일시 중지되어 있습니다.`:t===`error`?R_(e)===`보호 중`?`기존 DNS 보호는 유지되고 있지만 최근 차단 목록 갱신을 완료하지 못했습니다.`:`SafeShield 보호 상태에 문제가 발생했습니다. 아래 오류 내용을 확인해 주세요.`:e.active?e.runtime.dnsmasqRunning?e.runtime.dnsRuntimeOk?e.summary.message:`SafeShield DNS 런타임 상태를 확인해야 합니다.`:`dnsmasq가 실행 중이 아니어서 DNS 보호 상태를 확인해야 합니다.`:`SafeShield가 활성화되어 있지만 서비스가 실행 중이 아닙니다.`}function U_(e){return{ok:`정상`,warning:`경고`,error:`오류`,unavailable:`사용 불가`}[e]??e}function W_({data:e}){let t=L_(e);return z(`span`,{class:`inline-flex items-center rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${t===`error`?`bg-red-50 text-red-700 ring-red-200`:t===`disabled`?`bg-slate-100 text-slate-700 ring-slate-200`:t===`refreshing`?`bg-blue-50 text-blue-700 ring-blue-200`:t===`paused`||t===`attention`?`bg-amber-50 text-amber-800 ring-amber-200`:`bg-emerald-50 text-emerald-700 ring-emerald-200`}`,children:z_(e)})}function G_({failed:e,step:t,total:n}){let r=2*Math.PI*17,i=r*.22,a=r-i;return z(`span`,{"aria-label":e?`갱신 실패 · ${t}/${n} 단계`:`갱신 ${t}/${n} 단계`,class:`ssh-safeshield-refresh-donut`,"data-state":e?`error`:`active`,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":n,"aria-valuenow":t,children:[z(`svg`,{"aria-hidden":`true`,class:e?`ssh-safeshield-refresh-loader-svg ssh-safeshield-refresh-loader-svg-error`:`ssh-safeshield-refresh-loader-svg`,viewBox:`0 0 48 48`,children:[z(`circle`,{class:`ssh-safeshield-refresh-loader-track`,cx:`24`,cy:`24`,fill:`none`,r:17,stroke:`currentColor`,strokeWidth:2.5}),e?null:z(`circle`,{class:`ssh-safeshield-refresh-loader-arc`,cx:`24`,cy:`24`,fill:`none`,r:17,stroke:`currentColor`,strokeDasharray:`${i} ${a}`,strokeLinecap:`round`,strokeWidth:3.5})]}),z(`span`,{class:`ssh-safeshield-refresh-donut-label`,children:e?`!`:`${t}/${n}`})]})}function K_({data:e}){let t=ca(e.status,e.stage),n=L_(e)===`error`;if(!t&&!n)return null;let r=la(e.stage),i=n?da(e.runtime.lastErrorCode,e.stage):null;return z(`div`,{"aria-live":n?`assertive`:`polite`,class:`ssh-safeshield-refresh`,"data-state":n?`error`:`active`,role:n?`alert`:`status`,children:[z(G_,{failed:n,step:r.number,total:r.total}),z(`div`,{class:`ssh-safeshield-refresh-copy`,children:[z(`p`,{class:`ssh-safeshield-refresh-kicker`,children:n?`갱신 실패 · ${r.number}/${r.total}`:`갱신 ${r.number}/${r.total}`}),z(`p`,{class:`ssh-safeshield-refresh-title`,children:n?`${r.label} 단계에서 문제가 발생했습니다.`:r.label}),z(`p`,{class:`ssh-safeshield-refresh-description`,children:i??r.description}),n&&e.runtime.lastErrorCode?z(`p`,{class:`ssh-safeshield-refresh-error-code`,children:[`오류 코드: `,z(`code`,{children:e.runtime.lastErrorCode})]}):null]})]})}function q_({label:e,value:t}){return z(`div`,{class:`bg-white px-5 py-4 sm:px-6`,children:[z(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.14em] text-slate-400`,children:e}),z(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-extrabold text-slate-950`,title:typeof t==`string`?t:void 0,children:t})]})}function J_(e){return e?.trim().toUpperCase()||`FREE`}function Y_(e){return e===`FREE`?`free`:e===`PRO`?`pro`:e===`ULTIMATE`?`ultimate`:`paid`}function X_({compact:e=!1,plan:t}){let n=Y_(t),r=n!==`free`;return z(`span`,{class:`ssh-safeshield-plan-badge`,"data-compact":e?`true`:`false`,"data-tier":n,title:r?`${t} 멤버십`:`무료 플랜`,children:[z(`span`,{"aria-hidden":`true`,class:`ssh-safeshield-plan-badge-mark`,children:r?`✦`:`•`}),z(`span`,{children:t})]})}function Z_({plan:e}){let t=Y_(e)===`free`;return z(`div`,{class:`bg-white px-5 py-4 sm:px-6`,children:[z(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.14em] text-slate-400`,children:`Plan`}),z(`dd`,{class:`mt-2 mb-0 ml-0 flex min-w-0 flex-wrap items-center gap-2`,children:[z(X_,{plan:e}),t?z(`span`,{class:`ssh-safeshield-plan-caption`,children:`기본 플랜`}):null]})]})}function Q_(){return z(`div`,{class:`ssh-safeshield-upgrade-card`,children:[z(`span`,{"aria-hidden":`true`,class:`ssh-safeshield-upgrade-mark`,children:`✦`}),z(`div`,{class:`ssh-safeshield-upgrade-copy`,children:[z(`div`,{class:`ssh-safeshield-upgrade-meta`,children:[z(`span`,{children:`SmartSafeHub Membership`}),z(`span`,{class:`ssh-safeshield-upgrade-soon`,children:`Coming soon`})]}),z(`strong`,{children:`더 강력한 보호 기능을 준비하고 있습니다.`}),z(`span`,{children:`프리미엄 보호와 확장된 관리 기능을 미리 확인해 보세요.`})]}),z(`a`,{class:`ssh-safeshield-upgrade-action`,href:F_,rel:`noopener noreferrer`,target:`_blank`,children:[`요금제 보기`,z(`span`,{"aria-hidden":`true`,children:`→`})]})]})}function $_({children:e,eyebrow:t,icon:n,title:r}){return z(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:p-4 2xl:p-5`,children:[z(`div`,{class:`flex min-w-0 items-start justify-between gap-4 xl:gap-2`,children:[z(`div`,{children:[z(`p`,{class:`m-0 text-[0.68rem] font-black uppercase tracking-[0.16em] text-slate-400`,children:t}),z(`h3`,{class:`mt-2 mb-0 text-lg font-black tracking-tight text-slate-950 xl:text-base 2xl:text-lg`,children:r})]}),z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-500 xl:size-9 2xl:size-10`,children:n})]}),z(`dl`,{class:`mt-5 mb-0 grid gap-3`,children:e})]})}function ev({label:e,value:t}){return z(`div`,{class:`flex min-w-0 items-center justify-between gap-2 border-b border-slate-100 pb-3 last:border-b-0 last:pb-0`,children:[z(`dt`,{class:`text-sm font-semibold text-slate-500`,children:e}),z(`dd`,{class:`m-0 min-w-0 break-words text-right text-sm font-extrabold text-slate-950`,children:t})]})}function tv({error:e,message:t,onDismiss:n}){if(!e&&!t)return null;let r=e!==null;return z(`div`,{"aria-live":r?`assertive`:`polite`,class:`mt-4 flex flex-col items-start gap-3 rounded-2xl border px-4 py-3 text-sm sm:flex-row sm:justify-between ${r?`border-red-200 bg-red-50 text-red-900`:`border-emerald-200 bg-emerald-50 text-emerald-900`}`,role:r?`alert`:`status`,children:[z(`div`,{class:`flex min-w-0 items-start gap-3`,children:[z(r?U:H,{class:`mt-0.5 size-5 shrink-0`}),z(`p`,{class:`m-0 font-semibold leading-6`,children:e??t})]}),z(`button`,{"aria-label":`알림 닫기`,class:`shrink-0 rounded-lg border-0 bg-transparent px-2 py-1 font-black text-current opacity-60 transition hover:opacity-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-current`,onClick:n,type:`button`,children:`×`})]})}function nv({action:e,actionError:t,actionMessage:n,data:r,error:i,loading:a,statistics:o,statisticsError:s,statisticsLoading:c,statisticsRefreshing:l,onDismissFeedback:u,onRefreshBlocklist:d,onRetry:f,onRetryStatistics:p,onSetEnabled:m,onSetStatisticsEnabled:h}){let[g,_]=M(null);if(N(()=>{r?.available&&r.blocklist.validLineCount>0&&!ca(r.status,r.stage)&&_(r.blocklist.validLineCount)},[r?.available,r?.blocklist.validLineCount,r?.stage,r?.status]),a)return z(bo,{});if(i)return z(xo,{message:i,onRetry:f});if(!r)return z(bo,{});if(!r.available)return z(`section`,{class:`rounded-2xl border border-amber-200 bg-amber-50 p-5 sm:p-6`,children:[z(`span`,{class:`grid size-11 place-items-center rounded-xl bg-amber-100 text-amber-800`,children:z(U,{class:`size-6`})}),z(`h2`,{class:`mt-5 mb-0 text-xl font-extrabold text-amber-950`,children:`SafeShield 상태 API를 찾을 수 없습니다`}),z(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-amber-900`,children:`safeshield 패키지와 rpcd ucode 플러그인이 설치되어 있는지 확인해 주세요.`})]});let y=r.enabled,b=J_(r.entitlement.plan),x=r.status===`running`,S=e!==null,C=(ca(r.status,r.stage)||L_(r)===`error`)&&r.blocklist.validLineCount===0&&g!==null?g:r.blocklist.validLineCount,w=y?e===`disable`?`끄는 중…`:`보호 끄기`:e===`enable`?`켜는 중…`:`보호 켜기`;function T(){(!y||window.confirm(`보호를 끄면, 현재 차단 목록이 제거되어 위험에 노출될 수 있습니다. 그래도 계속하시겠습니까?`))&&m(!y)}return z(v,{children:[z(q,{eyebrow:`Protection`,title:`SafeShield 보호 상태`,description:`DNS 보호 상태와 적용 중인 차단 목록을 확인합니다.`}),z(`section`,{class:`mb-8 grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1.08fr)_minmax(0,0.92fr)] xl:items-stretch`,children:[z(`article`,{"aria-label":`보호 상태 요약`,class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:h-full`,children:[z(`div`,{class:`flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between xl:flex-col 2xl:flex-row`,children:[z(`div`,{class:`flex min-w-0 items-start gap-3`,children:[z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:z(At,{class:`size-5`})}),z(`div`,{class:`min-w-0`,children:[z(`div`,{class:`flex flex-wrap items-center gap-2`,children:[z(`h3`,{class:`m-0 text-base font-black text-slate-950`,children:`현재 보호 상태`}),z(W_,{data:r})]}),z(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:H_(r)})]})]}),z(`div`,{class:`flex w-full flex-col gap-2 sm:w-auto sm:flex-row sm:flex-wrap xl:justify-end`,children:[z(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border px-4 py-2.5 text-sm font-extrabold transition focus:outline-none focus-visible:ring-4 disabled:cursor-not-allowed disabled:opacity-50 ${r.enabled?`border-red-200 bg-white text-red-700 hover:border-red-300 hover:bg-red-50 focus-visible:ring-red-100`:`border-teal-700 bg-teal-700 text-white hover:border-teal-800 hover:bg-teal-800 focus-visible:ring-teal-100`}`,disabled:S||x,onClick:T,type:`button`,children:[z(Wt,{class:`size-4 ${e===`enable`||e===`disable`?`animate-pulse`:``}`}),w]}),z(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border border-slate-200 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-700 transition hover:border-teal-300 hover:bg-teal-50 hover:text-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!r.enabled||S||x,onClick:d,type:`button`,children:[z(Gt,{class:`size-4 ${e===`refresh`||x?`animate-bounce`:``}`}),e===`refresh`?`시작 중…`:x?`갱신 중…`:r.status===`error`?`다시 갱신`:`지금 갱신`]})]})]}),z(K_,{data:r}),z(`dl`,{class:`mt-5 mb-0 grid min-w-0 grid-cols-2 overflow-hidden rounded-xl border border-slate-200 bg-slate-200`,children:[z(q_,{label:`SafeShield`,value:r.version??`확인되지 않음`}),z(q_,{label:`Blocklist`,value:`${J(C)}개 도메인`}),z(q_,{label:`Last refresh`,value:z(P_,{timestamp:r.timestamps.lastSuccess})}),z(Z_,{plan:b})]}),b===`FREE`?z(Q_,{}):null]}),z(`section`,{"aria-label":`보호 데이터 요약`,class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:h-full`,children:[z(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[z(`div`,{class:`flex min-w-0 items-center gap-3`,children:[z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-500`,children:z(Kt,{class:`size-5`})}),z(`div`,{children:[z(`p`,{class:`m-0 text-[0.65rem] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Protection data`}),z(`h3`,{class:`mt-1 mb-0 text-sm font-black text-slate-950`,children:`보호 데이터`})]})]}),z(`span`,{"aria-label":`보호 데이터 상태: ${r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?`최신`:`확인 필요`}`,class:`inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-xs font-extrabold ${r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?`bg-emerald-50 text-emerald-700`:`bg-amber-50 text-amber-700`}`,children:[r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?z(H,{class:`size-3.5 shrink-0`}):z(U,{class:`size-3.5 shrink-0`}),r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?`최신`:`확인 필요`]})]}),z(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-500`,children:`SafeShield가 기기 성능에 맞춰 사용하는 보호 목록의 구성과 최신 상태를 확인합니다.`}),z(`dl`,{class:`mt-3 mb-0 grid grid-cols-1 gap-2 sm:grid-cols-2`,children:[z(`div`,{class:`min-w-0 rounded-lg border border-slate-200 bg-white px-3 py-2.5`,children:[z(`dt`,{class:`text-xs font-bold text-slate-500`,children:`기기 최적화`}),z(`dd`,{class:`mt-1 mb-0 text-sm font-extrabold text-slate-950`,children:B_(r.artifact.tier)})]}),z(`div`,{class:`min-w-0 rounded-lg border border-slate-200 bg-white px-3 py-2.5`,children:[z(`dt`,{class:`text-xs font-bold text-slate-500`,children:`마지막 업데이트`}),z(`dd`,{class:`mt-1 mb-0 text-sm font-extrabold leading-5 text-slate-950`,children:V_(r.artifact.version)})]})]}),z(`section`,{"aria-label":`보호 데이터 세부 정보`,class:`mt-3 border-t border-slate-200 pt-3`,children:[z(`h4`,{class:`m-0 text-xs font-extrabold text-slate-600`,children:`세부 정보`}),z(`dl`,{class:`mt-3 mb-0 grid gap-2`,children:[z(ev,{label:`데이터 프로필`,value:r.artifact.tier||`확인되지 않음`}),z(ev,{label:`데이터 버전`,value:r.artifact.version||`확인되지 않음`})]})]})]})]}),z(tv,{error:t,message:n,onDismiss:u}),z(N_,{action:e,data:o,error:s,loading:c,onRetry:p,onSetEnabled:h,refreshing:l}),z(`section`,{class:`mt-7`,children:[z(q,{description:`DNS 보호 런타임, 차단 목록, 갱신 일정과 상태 점검 결과를 한곳에서 확인합니다.`,eyebrow:`Protection details`,title:`보호 구성`}),z(`div`,{class:`grid min-w-0 grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4`,children:[z($_,{eyebrow:`Runtime`,icon:z(H,{class:`size-5`}),title:`DNS 보호 런타임`,children:[z(ev,{label:`SafeShield 서비스`,value:z(I_,{falseLabel:`중지됨`,trueLabel:`동작 중`,value:r.active})}),z(ev,{label:`DNS 서비스`,value:z(I_,{falseLabel:`중지됨`,value:r.runtime.dnsmasqRunning})}),z(ev,{label:`SafeShield DNS 연동`,value:z(I_,{value:r.runtime.dnsRuntimeOk})}),z(ev,{label:`차단 목록 갱신`,value:z(I_,{falseLabel:`중지됨`,value:r.runtime.refreshdRunning})})]}),z($_,{eyebrow:`Blocklist`,icon:z(Kt,{class:`size-5`}),title:`차단 목록`,children:[z(ev,{label:`적용 규칙`,value:`${J(r.blocklist.validLineCount)}개 도메인`}),z(ev,{label:`파일 크기`,value:Wa(r.blocklist.fileSizeKb*1024)}),z(ev,{label:`설치 상태`,value:z(I_,{falseLabel:`미설치`,trueLabel:`설치됨`,value:r.blocklist.installed})}),z(ev,{label:`검증 상태`,value:z(I_,{falseLabel:`확인 필요`,value:r.blocklist.verificationOk})})]}),z($_,{eyebrow:`Refresh schedule`,icon:z(Zt,{class:`size-5`}),title:`차단 목록 갱신`,children:[z(ev,{label:`마지막 성공`,value:z(P_,{timestamp:r.timestamps.lastSuccess})}),z(ev,{label:`다음 갱신`,value:qa(r.timestamps.nextRefreshAt)}),z(ev,{label:`갱신 주기`,value:Qa(r.timestamps.refreshIntervalS)}),z(ev,{label:`최근 결과`,value:r.runtime.lastResult||(x?`갱신 중`:`확인되지 않음`)})]}),z($_,{eyebrow:`Health`,icon:z(At,{class:`size-5`}),title:`상태 점검`,children:[z(ev,{label:`전체 상태`,value:U_(r.health.overall)}),z(ev,{label:`경고`,value:z(`span`,{class:`text-amber-700`,children:J(r.issueCounts.warnings)})}),z(ev,{label:`오류`,value:z(`span`,{class:`text-red-700`,children:J(r.issueCounts.errors)})}),z(ev,{label:`최근 오류 코드`,value:r.runtime.lastErrorCode||`없음`})]})]})]})]})}function rv(e){return e.trim().toLowerCase().replace(/\.+$/,``)}function iv(e){return e.length===0||e.length>253||!e.includes(`.`)||!/^[a-z0-9.-]+$/.test(e)?!1:e.split(`.`).every(e=>e.length>0&&e.length<=63&&/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(e))}function av({action:e,kind:t,onAddRule:n,onDeleteRule:r,rules:i,recommendedDomains:a,recommendedKnown:o,recommendedRules:s,onRequestRevoke:c,revokeBusy:l}){let[u,d]=M(``),[f,p]=M(``),[m,h]=M(null),[g,_]=M(!0),[v,y]=M(null),b=t===`allow`,x=e!==null,S=Qe(()=>{let e=f.trim().toLowerCase();return e?i.filter(t=>t.includes(e)):i},[i,f]),C=f.trim().length>0,w=b&&o?S.filter(e=>a.includes(e)):[],T=b&&o?S.filter(e=>!a.includes(e)):S,E=b?s.filter(e=>!C||e.title.toLowerCase().includes(f.trim().toLowerCase())||e.domains.some(e=>e.includes(f.trim().toLowerCase()))):[],D=C||(v??(s.length||w.length)<=3),O=C||g;async function k(e){e.preventDefault();let r=rv(u);iv(r)?(h(null),await n(t,r,()=>{d(e=>rv(e)===r?``:e)})):h(`example.com 형식의 도메인을 입력해 주세요. URL, IP 주소, 와일드카드는 사용할 수 없습니다.`)}let A=b?{badge:`bg-emerald-100 text-emerald-800`,button:`border-emerald-700 bg-emerald-700 text-white hover:border-emerald-800 hover:bg-emerald-800 focus-visible:ring-emerald-100`,icon:`bg-emerald-50 text-emerald-700`,label:`허용 목록`,description:`직접 허용하거나 웹사이트 추천으로 추가된 도메인을 관리합니다.`,empty:`등록된 허용 도메인이 없습니다.`}:{badge:`bg-red-100 text-red-800`,button:`border-red-700 bg-red-700 text-white hover:border-red-800 hover:bg-red-800 focus-visible:ring-red-100`,icon:`bg-red-50 text-red-700`,label:`차단 목록`,description:`SafeShield 기본 목록에 없더라도 직접 차단할 도메인을 등록합니다.`,empty:`등록된 차단 도메인이 없습니다.`};function j(n){let i=b&&o&&a.includes(n),s=!b||o?i?`추천 규칙`:`직접 추가`:null,c=e?.operation===`delete`&&e.action===t&&e.domain===n;return z(`li`,{class:`flex min-w-0 items-center justify-between gap-3 px-3.5 py-3`,children:[z(`div`,{class:`flex min-w-0 flex-1 flex-wrap items-center gap-2`,children:z(`code`,{class:`min-w-0 break-all font-mono text-sm font-semibold text-slate-800`,children:n})}),i?z(`span`,{class:`shrink-0 rounded-full bg-teal-50 px-2.5 py-1 text-[11px] font-bold text-teal-800`,title:`추천 규칙의 적용과 해제는 웹사이트에서 관리합니다.`,children:`웹사이트 관리`}):z(`button`,{"aria-label":`${n} ${A.label}에서 삭제`,class:`inline-flex size-9 shrink-0 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-500 transition hover:border-red-200 hover:bg-red-50 hover:text-red-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-red-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:x||i,onClick:()=>void r(t,n),title:s===`직접 추가`?`직접 추가한 규칙 삭제`:`삭제`,type:`button`,children:z($t,{class:`size-4 ${c?`animate-pulse`:``}`})})]},n)}return z(`article`,{class:`min-w-0 overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm shadow-slate-900/5`,children:[z(`div`,{class:`border-b border-slate-200 p-4 sm:p-6`,children:[z(`div`,{class:`flex min-w-0 items-start gap-3`,children:[z(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl ${A.icon}`,children:z(b?H:At,{class:`size-6`})}),z(`div`,{class:`min-w-0`,children:[z(`div`,{class:`flex flex-wrap items-center gap-2`,children:[z(`h2`,{class:`m-0 text-xl font-extrabold tracking-tight text-slate-950`,children:A.label}),z(`span`,{class:`rounded-full px-2.5 py-1 text-xs font-extrabold ${A.badge}`,children:i.length})]}),z(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:A.description})]})]}),z(`form`,{class:`mt-5`,onSubmit:k,children:[z(`label`,{class:`block text-xs font-extrabold text-slate-600`,for:`${t}-domain`,children:`새 도메인`}),z(`div`,{class:`mt-2 flex flex-col gap-2 sm:flex-row`,children:[z(`input`,{"aria-describedby":m?`${t}-domain-error`:void 0,"aria-invalid":m?!0:void 0,autocomplete:`off`,class:`min-h-11 min-w-0 flex-1 rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:x,id:`${t}-domain`,onInput:e=>d(e.currentTarget.value),placeholder:`example.com`,spellcheck:!1,type:`text`,value:u}),z(`button`,{class:`inline-flex min-h-11 w-full shrink-0 items-center justify-center gap-2 rounded-xl border px-4 py-2.5 text-sm font-extrabold transition focus:outline-none focus-visible:ring-4 disabled:cursor-not-allowed disabled:opacity-50 sm:w-auto ${A.button}`,disabled:x||u.trim().length===0,type:`submit`,children:[z(Qt,{class:`size-4`}),e?.operation===`add`&&e.action===t?`추가 중…`:`추가`]})]}),m?z(`p`,{class:`mt-2 mb-0 text-xs font-semibold leading-5 text-red-700`,id:`${t}-domain-error`,children:m}):null]})]}),z(`div`,{class:`p-4 sm:p-6`,children:[z(`label`,{class:`relative block`,for:`${t}-search`,children:[z(`span`,{class:`sr-only`,children:[A.label,` 검색`]}),z(`span`,{class:`pointer-events-none absolute inset-y-0 left-0 flex w-11 items-center justify-center text-slate-400`,children:z(en,{class:`size-4`})}),z(`input`,{class:`min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 py-2.5 pr-4 pl-11 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100`,id:`${t}-search`,onInput:e=>p(e.currentTarget.value),placeholder:`${A.label} 검색`,type:`search`,value:f})]}),b&&o?z(`div`,{class:`mt-4 overflow-hidden rounded-xl border border-slate-200`,children:[z(`section`,{"aria-label":`직접 추가한 허용 규칙`,children:[z(`button`,{"aria-controls":`allow-manual-domains`,"aria-expanded":O,class:`flex min-h-14 w-full items-center justify-between gap-3 ssh-rule-group-toggle bg-slate-50 px-4 py-3 text-left focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>_(!O),type:`button`,children:[z(`span`,{class:`min-w-0 text-sm font-extrabold text-slate-800`,children:[`직접 추가한 규칙 `,z(`span`,{class:`ml-1 rounded-full bg-white px-2 py-0.5 text-xs font-bold text-slate-600`,children:[T.length,C?`개 검색됨`:`개`]})]}),z(`span`,{"aria-hidden":`true`,class:`shrink-0 text-sm font-bold text-slate-500`,children:O?`접기 −`:`펼치기 +`})]}),z(`div`,{hidden:!O,id:`allow-manual-domains`,children:T.length?z(`ul`,{class:`m-0 max-h-[20rem] list-none divide-y divide-slate-200 overflow-y-auto p-0`,children:T.map(j)}):z(`p`,{class:`m-0 px-4 py-5 text-sm text-slate-500`,children:C?`검색 결과가 없습니다.`:`직접 추가한 허용 도메인이 없습니다.`})})]}),z(`section`,{"aria-label":`웹사이트 추천 규칙`,class:`border-t border-slate-200`,children:[z(`button`,{"aria-controls":`allow-recommended-domains`,"aria-expanded":D,class:`flex min-h-14 w-full items-center justify-between gap-3 ssh-rule-group-toggle bg-slate-50 px-4 py-3 text-left focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>y(!D),type:`button`,children:[z(`span`,{class:`min-w-0 text-sm font-extrabold text-slate-800`,children:[`추천 규칙 `,z(`span`,{class:`ml-1 rounded-full bg-white px-2 py-0.5 text-xs font-bold text-teal-800`,children:[!C&&s.length?s.length:w.length,C?`개 검색됨`:`개`]})]}),z(`span`,{"aria-hidden":`true`,class:`shrink-0 text-sm font-bold text-slate-500`,children:D?`접기 −`:`펼치기 +`})]}),z(`div`,{hidden:!D,id:`allow-recommended-domains`,children:[E.length?z(`ul`,{class:`m-0 max-h-[22rem] list-none divide-y divide-slate-200 overflow-y-auto p-0`,children:E.map(e=>z(`li`,{class:`flex min-w-0 flex-wrap items-center justify-between gap-3 px-3.5 py-3`,children:[z(`div`,{class:`min-w-0 flex-1`,children:[z(`strong`,{class:`block break-words text-sm text-slate-900`,children:e.title}),z(`div`,{class:`mt-1 flex flex-wrap gap-1.5`,children:e.domains.map(e=>z(`code`,{class:`break-all text-xs text-slate-600`,children:e},e))})]}),c?z(`button`,{class:`shrink-0 rounded-lg border border-red-200 px-3 py-2 text-xs font-bold text-red-700 hover:bg-red-50 disabled:opacity-50`,disabled:l||x,onClick:()=>c(e),type:`button`,children:`적용 해제`}):z(`span`,{class:`text-xs text-slate-500`,children:`웹사이트 관리`})]},e.id))}):w.length?z(`ul`,{class:`m-0 max-h-[20rem] list-none divide-y divide-slate-200 overflow-y-auto p-0`,children:w.map(j)}):z(`p`,{class:`m-0 px-4 py-5 text-sm text-slate-500`,children:C?`검색 결과가 없습니다.`:`추천으로 추가된 허용 도메인이 없습니다.`}),C?null:z(`p`,{class:`m-0 border-t border-slate-100 px-4 py-3 text-xs leading-5 text-slate-500`,children:`추천 규칙은 이 공유기에서 적용 해제할 수 있습니다. 새 규칙의 적용은 SmartSafeHub 웹사이트에서 관리해 주세요.`})]})]})]}):z(`div`,{class:`mt-4 max-h-[28rem] overflow-y-auto rounded-xl border border-slate-200`,children:S.length?z(`ul`,{class:`m-0 list-none divide-y divide-slate-200 p-0`,children:S.map(j)}):z(`div`,{class:`px-5 py-10 text-center`,children:[z(tn,{class:`mx-auto size-8 text-slate-300`}),z(`p`,{class:`mt-3 mb-0 text-sm font-bold text-slate-600`,children:C?`검색 결과가 없습니다.`:A.empty})]})})]})]})}function ov({action:e,data:t,error:n,feedback:r,loading:i,onAddRule:a,onDeleteRule:o,onDismissFeedback:s,onRetry:c,onLoadRecommendedRulesStatus:l,onSyncRecommendedRules:u,onRevokeRecommendedRule:d}){let[f,p]=M(null),[m,h]=M(!1),[g,_]=M(!1),[y,b]=M(null),[x,S]=M(!1),[C,w]=M(!1),[T,E]=M(!1),D=P(null),O=P(null),k=P(c);k.current=c;let[A,j]=M(null),[ee,te]=M(null),ne=f?.domains??[],re=f?.rules??[],ie=F(e=>{p(e),h(!0);let t=JSON.stringify([e.revision,e.domains,e.rules.map(e=>e.id),e.syncStatus]);O.current!==null&&O.current!==t&&k.current(),O.current=t,e.syncStatus===`confirmed`&&D.current===null&&te(null),D.current!==null&&e.syncStatus===`confirmed`&&!e.rules.some(e=>e.id===D.current)&&(D.current=null,w(!1),E(!1),te(null),j(`추천 규칙 적용 해제를 확인했습니다.`))},[]);N(()=>{if(!l)return;let e=l,t=!0,n=!1;function r(){n||g||x||(n=!0,e().then(e=>{t&&ie(e)}).catch(()=>{}).finally(()=>{n=!1}))}r();let i=window.setInterval(r,15e3),a=()=>r(),o=()=>{document.hidden||r()};return window.addEventListener(`focus`,a),document.addEventListener(`visibilitychange`,o),()=>{t=!1,window.clearInterval(i),window.removeEventListener(`focus`,a),document.removeEventListener(`visibilitychange`,o)}},[t?.allow.join(` -`),l,g,x,ie]),N(()=>{if(!C)return;let e=window.setTimeout(()=>E(!0),6e4);return()=>window.clearTimeout(e)},[C]);async function ae(){if(!(!u||g||x)){_(!0),te(null),j(null);try{let e=await u();ie(e),j(e.syncStatus===`confirmed`?`서버에서 규칙을 가져와 SafeShield 허용 목록을 확인했습니다.`:`추천 규칙 상태를 확인 중입니다. 진행 결과는 자동으로 갱신됩니다.`),c()}catch{te(`추천 규칙을 동기화하지 못했습니다. 서버 연결 및 기기 등록 상태를 확인해 주세요.`)}finally{_(!1)}}}async function oe(){if(!y||x||!d)return;let e=y.id;D.current=e,S(!0),w(!0),E(!1),te(null),j(null);try{let t=await d(e);ie(t),b(null),D.current!==null&&j(`적용 해제 요청을 처리했습니다. 공유기의 허용 목록을 확인하고 있습니다.`),k.current()}catch{b(null),te(`적용 해제 결과를 아직 확인하지 못했습니다. 공유기의 상태를 자동으로 다시 확인합니다.`);try{let e=await l?.();e&&ie(e)}catch{}}finally{S(!1)}}let se=f?.syncStage,ce=f?.syncStatus===`pending`,le=f?.syncStatus===`delayed`,ue=f?.syncStatus===`failed`,de=se===`server_sync`?`서버 동기화 중`:se===`safeshield_refreshing`?`SafeShield 갱신 중`:se===`applying`?`추천 규칙 적용 중`:se===`verifying`?`허용 목록 확인 중`:le?`재확인 지연`:ue?`동기화 실패`:ce?`동기화 대기`:`허용 목록 확인`,fe=se===`safeshield_refreshing`&&ce?`SafeShield가 보호 목록을 갱신하고 있습니다. 갱신이 끝나면 추천 규칙을 자동으로 다시 확인합니다.`:se===`applying`&&ce?`추천 규칙을 SafeShield 허용 목록에 반영하고 있습니다.`:se===`verifying`&&ce?`SafeShield 허용 목록에서 추천 규칙 반영 결과를 확인하고 있습니다.`:se===`server_sync`&&ce?`SmartSafeHub 서버에서 최신 추천 규칙을 확인하고 있습니다.`:le?`서버 응답이 지연되고 있습니다. 이미 확인한 허용 규칙은 유지되며 자동으로 다시 시도합니다.`:ue?f?.syncReason===`auth_rejected`?`SmartSafeHub 기기 인증이 거부되었습니다. 공유기 계정 연결 상태를 확인해 주세요.`:f?.syncReason===`api_rejected`?`서버가 추천 규칙 요청을 거부했습니다. Hub API 배포 상태를 확인해 주세요.`:f?.syncReason===`invalid_response`?`서버 응답을 확인할 수 없습니다. 규칙은 유지되며 다음 동기화에서 다시 확인합니다.`:`추천 규칙 반영을 완료하지 못했습니다. 다음 자동 동기화에서 다시 시도합니다.`:ce?`추천 규칙의 적용 결과를 기다리고 있습니다.`:null,pe=C&&D.current!==null?{tone:`amber`,label:T?`적용 해제 처리 지연`:`적용 해제 확인 중`,description:T?`적용 해제 확인이 지연되고 있습니다. SafeShield 갱신 중이라면 완료 후 자동으로 재확인합니다.`:fe??`적용 해제 상태를 확인하고 있습니다. 확인되면 목록과 상태가 자동 갱신됩니다.`}:ce||le||ue?{tone:ue?`red`:`amber`,label:de,description:fe??``}:ee?{tone:`red`,label:`상태 확인 필요`,description:ee}:f?.syncWarning?{tone:`amber`,label:`서버 재확인 지연`,description:`이미 확인한 허용 규칙은 유지되며 자동으로 다시 시도합니다.`}:A?{tone:`green`,label:`허용 목록 확인`,description:A}:null;return i&&!t?z(bo,{}):n&&!t?z(xo,{message:n,onRetry:c}):t?z(v,{children:[y?z(`div`,{class:`fixed inset-0 z-50 flex items-center justify-center bg-slate-950/70 p-4`,role:`presentation`,onClick:()=>{x||b(null)},children:z(`section`,{"aria-labelledby":`recommended-revoke-title`,"aria-modal":`true`,class:`w-full max-w-md rounded-2xl border border-slate-200 bg-white p-5 shadow-xl`,onClick:e=>e.stopPropagation(),role:`dialog`,children:[z(`h2`,{class:`m-0 text-lg font-extrabold text-slate-950`,id:`recommended-revoke-title`,children:`추천 규칙 적용 해제`}),z(`p`,{class:`mt-3 text-sm text-slate-700`,children:[z(`strong`,{children:y.title}),` 규칙을 이 공유기에서 해제할까요?`]}),z(`p`,{class:`mt-2 text-xs leading-5 text-slate-600`,children:[`포함된 도메인 `,y.domains.length,`개를 다시 확인합니다. 직접 추가한 허용 규칙과 다른 추천 규칙에 필요한 도메인은 유지됩니다.`]}),z(`div`,{class:`mt-5 flex justify-end gap-2`,children:[z(`button`,{class:`rounded-lg border border-slate-200 px-4 py-2 text-sm font-bold text-slate-700 disabled:cursor-wait disabled:opacity-50`,disabled:x,onClick:()=>b(null),type:`button`,children:`취소`}),z(`button`,{class:`inline-flex min-w-24 items-center justify-center gap-2 rounded-lg bg-red-700 px-4 py-2 text-sm font-bold text-white transition hover:bg-red-800 disabled:cursor-progress disabled:bg-red-700 disabled:opacity-80`,"aria-busy":x,disabled:x,onClick:()=>void oe(),type:`button`,children:[x?z(`svg`,{class:`size-4 animate-spin`,"aria-hidden":`true`,viewBox:`0 0 24 24`,fill:`none`,children:[z(`circle`,{cx:`12`,cy:`12`,r:`9`,stroke:`currentColor`,"stroke-width":`3`,opacity:`0.25`}),z(`path`,{d:`M21 12a9 9 0 0 0-9-9`,stroke:`currentColor`,"stroke-width":`3`,"stroke-linecap":`round`})]}):null,z(`span`,{role:`status`,children:x?`해제 중…`:`적용 해제`})]})]})]})}):null,z(q,{eyebrow:`Local overrides`,title:`사용자 도메인 규칙`,description:`허용 목록은 오탐을 해제하고, 차단 목록은 원하는 도메인을 SafeShield 보호 목록에 추가합니다.`}),z(`section`,{"aria-label":`규칙 개수 요약`,class:`min-w-0`,children:z(`dl`,{class:`m-0 grid grid-cols-1 gap-3 sm:grid-cols-3`,children:[z(`div`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white px-5 py-4 shadow-sm shadow-slate-900/5`,children:[z(`dt`,{class:`text-sm font-extrabold text-emerald-700`,children:`허용 도메인`}),z(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight text-slate-950`,children:[t.counts.allow,z(`span`,{class:`ml-1 text-sm font-bold text-slate-500`,children:`개`})]}),z(`p`,{class:`mt-1 mb-0 text-xs text-slate-500`,children:`차단하지 않도록 등록한 도메인`})]}),z(`div`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white px-5 py-4 shadow-sm shadow-slate-900/5`,children:[z(`dt`,{class:`text-sm font-extrabold text-red-700`,children:`차단 도메인`}),z(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight text-slate-950`,children:[t.counts.block,z(`span`,{class:`ml-1 text-sm font-bold text-slate-500`,children:`개`})]}),z(`p`,{class:`mt-1 mb-0 text-xs text-slate-500`,children:`추가로 차단하도록 등록한 도메인`})]}),z(`div`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white px-5 py-4 shadow-sm shadow-slate-900/5`,children:[z(`dt`,{class:`text-sm font-extrabold text-slate-600`,children:`전체 등록 규칙`}),z(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight text-slate-950`,children:[t.counts.total,z(`span`,{class:`ml-1 text-sm font-bold text-slate-500`,children:`개`})]}),z(`p`,{class:`mt-1 mb-0 text-xs text-slate-500`,children:`허용 및 차단 규칙의 합계`})]})]})}),z(`div`,{class:`mt-7`,children:z(q,{eyebrow:`Recommendations`,title:`추천 사용자 규칙`,description:`웹사이트에서 선택한 권장 허용 규칙의 동기화 상태를 확인하고 관리합니다.`})}),z(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,"aria-label":`추천 사용자 규칙`,children:[z(`div`,{class:`flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between`,children:[z(`div`,{class:`min-w-0 flex-1`,children:[z(`div`,{class:`flex flex-wrap items-center gap-2`,children:[z(`span`,{class:`grid size-8 place-items-center rounded-lg bg-teal-50 text-teal-700`,children:z(H,{class:`size-4`})}),z(`h3`,{class:`m-0 text-base font-extrabold text-slate-950`,children:`동기화 상태`}),l?z(`span`,{"aria-live":`polite`,class:`rounded-full px-2.5 py-1 text-xs font-bold ${f?.syncStatus===`confirmed`?`bg-emerald-100 text-emerald-800`:f?.syncStatus===`failed`?`bg-red-100 text-red-800`:`bg-amber-100 text-amber-800`}`,children:f?.syncStatus===`confirmed`?`허용 목록 확인`:de}):null]}),z(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:`웹사이트에서 선택한 허용 규칙을 약 30초마다 확인합니다. 적용 해제는 이 공유기에서도 할 수 있습니다.`}),z(`div`,{class:`mt-2 flex flex-wrap items-center gap-x-4 gap-y-1 text-xs font-semibold text-slate-600`,children:[z(`span`,{children:[`추천으로 추가 `,z(`strong`,{class:`text-teal-800`,children:[m?ne.length:`—`,`개 도메인`]})]}),f?.syncStatus===`confirmed`?z(`span`,{children:[`허용 확인 `,z(`strong`,{class:`text-emerald-800`,children:[f.confirmedDomains.length,`개`]})]}):null,f?.lastCheckedAt?z(`span`,{children:[f.syncWarning?`최근 재확인 시도`:`최근 확인`,`: `,z(P_,{timestamp:f.lastCheckedAt})]}):null]})]}),z(`div`,{class:`flex w-full flex-wrap gap-2 sm:w-auto lg:shrink-0`,children:[u?z(`button`,{class:`inline-flex min-h-10 flex-1 items-center justify-center rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-800 transition hover:bg-slate-50 disabled:cursor-wait disabled:opacity-60 sm:flex-none`,disabled:g,onClick:()=>void ae(),type:`button`,children:g?`동기화 중…`:`지금 동기화`}):null,z(`a`,{class:`inline-flex min-h-10 flex-1 items-center justify-center rounded-xl border border-teal-700 bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 sm:flex-none`,href:`https://www.smartsafehub.com/dashboard/recommended-rules/`,target:`_blank`,rel:`noopener noreferrer`,children:`추천 규칙 보기 ↗`})]})]}),pe?z(`div`,{"aria-live":`polite`,class:`mt-3 flex items-start gap-2 rounded-xl px-3 py-2.5 text-sm ${pe.tone===`red`?`bg-red-50 text-red-800`:pe.tone===`green`?`bg-emerald-50 text-emerald-800`:`bg-amber-50 text-amber-800`}`,role:`status`,children:[z(`span`,{"aria-hidden":`true`,class:`mt-1 size-2 shrink-0 rounded-full ${pe.tone===`red`?`bg-red-500`:pe.tone===`green`?`bg-emerald-500`:`bg-amber-500`}`}),z(`div`,{class:`min-w-0`,children:[z(`strong`,{children:pe.label}),z(`p`,{class:`mt-1 mb-0 leading-5`,children:pe.description})]})]}):null,z(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`추천 규칙 동기화는 SafeShield 차단 목록 갱신과 별개입니다. 허용 목록 확인은 DNS 처리나 서비스 재생 성공을 보장하지 않습니다.`})]}),t.applyLocalOverrides?null:z(`section`,{class:`mt-4 flex items-start gap-3 rounded-2xl border border-amber-200 bg-amber-50 p-4`,role:`alert`,children:[z(U,{class:`mt-0.5 size-5 shrink-0 text-amber-700`}),z(`div`,{children:[z(`p`,{class:`m-0 text-sm font-extrabold text-amber-950`,children:`로컬 규칙 적용이 꺼져 있습니다`}),z(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-amber-800`,children:`규칙은 저장되지만 SafeShield의 apply_local_overrides 설정을 켜기 전까지 DNS에 반영되지 않습니다.`})]})]}),t.safeshieldEnabled?null:z(`section`,{class:`mt-4 flex items-start gap-3 rounded-2xl border border-slate-200 bg-slate-100 p-4`,role:`status`,children:[z(At,{class:`mt-0.5 size-5 shrink-0 text-slate-600`}),z(`div`,{children:[z(`p`,{class:`m-0 text-sm font-extrabold text-slate-950`,children:`SafeShield가 비활성화되어 있습니다`}),z(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-600`,children:`규칙을 미리 저장할 수 있으며, SafeShield를 켜고 차단 목록을 갱신하면 적용됩니다.`})]})]}),r?z(`section`,{"aria-live":`polite`,class:`mt-4 flex flex-col items-start gap-3 rounded-2xl border border-teal-200 bg-teal-50 sm:flex-row sm:justify-between p-4`,children:[z(`div`,{class:`flex min-w-0 items-start gap-3`,children:[z(H,{class:`mt-0.5 size-5 shrink-0 text-teal-700`}),z(`p`,{class:`m-0 text-sm font-semibold leading-6 text-teal-950`,children:r})]}),z(`button`,{class:`shrink-0 rounded-lg border-0 bg-transparent px-2 py-1 text-xs font-extrabold text-teal-800 hover:bg-teal-100`,onClick:s,type:`button`,children:`닫기`})]}):null,n&&t?z(`section`,{"aria-live":`assertive`,class:`mt-4 flex items-start gap-3 rounded-2xl border border-red-200 bg-red-50 p-4`,children:[z(U,{class:`mt-0.5 size-5 shrink-0 text-red-700`}),z(`p`,{class:`m-0 text-sm font-semibold leading-6 text-red-900`,children:n})]}):null,z(`section`,{class:`mt-5 grid gap-5 xl:grid-cols-2`,children:[z(av,{action:e,kind:`allow`,onAddRule:a,onDeleteRule:o,rules:t.allow,recommendedDomains:ne,recommendedKnown:m,recommendedRules:re,...d?{onRequestRevoke:b}:{},revokeBusy:x}),z(av,{action:e,kind:`block`,onAddRule:a,onDeleteRule:o,rules:t.block,recommendedDomains:ne,recommendedKnown:m,recommendedRules:re,revokeBusy:x})]})]}):z(xo,{message:`사용자 규칙 응답이 비어 있습니다.`,onRetry:c})}function sv(e,t){return R(`smartsafehub`,`system_root_password_change`,{current_password:e,new_password:t})}var cv=Array.from({length:24},(e,t)=>{let n=String(t).padStart(2,`0`);return{value:n,label:`${n}시`}}),lv=Array.from({length:60},(e,t)=>{let n=String(t).padStart(2,`0`);return{value:n,label:`${n}분`}});function uv(e){let t=/^([01]\d|2[0-3]):([0-5]\d)$/.exec(e);return{hour:t?.[1]??`03`,minute:t?.[2]??`00`}}function dv({ariaLabel:e,className:t=``,disabled:n=!1,id:r,onChange:i,value:a,variant:o=`default`}){let{hour:s,minute:c}=uv(a),l=(e,t)=>{i(`${e}:${t}`)};return z(`div`,{"aria-label":e,class:`ssh-time-select ${t}`.trim(),"data-time-select":r,role:`group`,children:[z(Vg,{ariaLabel:`${e} 시`,disabled:n,id:`${r}-hour`,onChange:e=>l(e,c),options:cv,value:s,variant:o}),z(Vg,{ariaLabel:`${e} 분`,disabled:n,id:`${r}-minute`,onChange:e=>l(s,e),options:lv,value:c,variant:o})]})}function fv(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||null}catch{return null}}function pv(e){return z(`article`,{class:`h-full min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 ${e.className??``}`,children:[z(`div`,{class:`flex min-w-0 items-start justify-between gap-3`,children:[z(`div`,{class:`flex min-w-0 items-start gap-4`,children:[z(`div`,{class:`flex size-11 shrink-0 items-center justify-center rounded-xl bg-slate-100 text-slate-600`,children:e.icon}),z(`div`,{class:`min-w-0`,children:[z(`div`,{class:`flex flex-wrap items-center gap-2`,children:[z(`h2`,{class:`m-0 text-lg font-black text-slate-950`,children:e.title}),e.titleActions]}),z(`p`,{class:`mt-1.5 mb-0 text-sm leading-6 text-slate-500`,children:e.description})]})]}),e.headerActions?z(`div`,{class:`shrink-0`,children:e.headerActions}):null]}),z(`div`,{class:`mt-5`,children:e.children})]})}function mv(e){let[t,n]=M(``),[r,i]=M(e.data?.localtime??0),a=fv();N(()=>{e.data?.zonename&&n(e.data.zonename)},[e.data?.zonename]),N(()=>{let t=e.data?.localtime??0,n=Date.now();if(i(t),!Number.isFinite(t)||t<=0)return;let r=window.setInterval(()=>{i(t+Math.floor((Date.now()-n)/1e3))},1e3);return()=>window.clearInterval(r)},[e.data?.localtime]);let o=e.data?Object.keys(e.data.timezones).sort((e,t)=>e.localeCompare(t)):[],s=Za(r,e.data?.zonename??`UTC`),c=a!==null&&e.data?.timezones[a]!==void 0,l=e.data!==null&&t.length>0&&t!==e.data.zonename;return z(v,{children:[z(pv,{description:`공유기의 기준 시간대를 설정합니다. 로그, 통계, 자동 설치와 예약 재부팅 시각도 이 시간대를 기준으로 동작합니다.`,icon:z(Ht,{class:`size-5`}),title:`시간 및 시간대`,children:[(e.saveError||e.saveMessage)&&z(`div`,{class:`mb-5 flex min-w-0 items-start justify-between gap-3 rounded-xl border px-4 py-3 text-sm font-bold ${e.saveError?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[z(`span`,{class:`min-w-0`,children:e.saveError||e.saveMessage}),z(`button`,{class:`shrink-0 rounded-lg px-2 py-1 text-xs font-extrabold hover:bg-black/5`,onClick:e.onDismissFeedback,type:`button`,children:`닫기`})]}),e.error&&!e.data?z(`div`,{class:`rounded-xl border border-rose-200 bg-rose-50 p-4`,children:[z(`p`,{class:`m-0 text-sm font-bold text-rose-800`,children:e.error}),z(`button`,{class:`mt-3 inline-flex min-h-10 items-center rounded-xl border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700 transition hover:bg-rose-100`,onClick:e.onRetry,type:`button`,children:`다시 불러오기`})]}):z(v,{children:[z(`div`,{class:`grid min-w-0 grid-cols-1 gap-3 sm:grid-cols-2`,children:[z(`div`,{class:`rounded-xl bg-slate-50 p-4`,children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.12em] text-slate-500`,children:`현재 시간`}),z(`p`,{class:`mt-2 mb-0 text-sm font-extrabold leading-6 text-slate-900`,children:s}),z(`p`,{class:`mt-1 mb-0 break-words text-xs leading-5 text-slate-500`,children:e.data?.zonename??`시간대 확인 중`})]}),z(`div`,{class:`rounded-xl bg-slate-50 p-4`,children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.12em] text-slate-500`,children:`시간 동기화`}),z(`p`,{class:`mt-2 mb-0 text-sm font-extrabold ${e.data?.ntpEnabled?`text-emerald-700`:`text-amber-700`}`,children:e.data?.ntpEnabled?`자동 동기화 설정됨`:`자동 동기화 꺼짐`}),z(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`장치의 기본 NTP 설정 상태입니다.`}),z(`button`,{class:`mt-3 inline-flex min-h-9 items-center justify-center gap-2 rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700 transition hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!e.data?.ntpEnabled||e.saving||e.syncing,onClick:()=>void e.onSync(),type:`button`,children:e.syncing?`동기화 요청 중`:`지금 동기화`})]})]}),z(`div`,{class:`mt-5`,children:[z(`label`,{class:`mb-2 block text-sm font-extrabold text-slate-800`,for:`smartsafehub-timezone`,children:`시간대`}),z(Vg,{ariaLabel:`시간대`,disabled:e.loading||e.saving||e.syncing||!e.data,id:`smartsafehub-timezone`,onChange:n,options:e.data?o.map(e=>({value:e,label:e})):[{value:``,label:`시간대 불러오는 중`}],value:t}),z(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-500`,children:`시간대를 변경하면 시스템에 즉시 적용되며 자동 설치와 예약 재부팅 일정도 새 기준 시간으로 다시 계산합니다.`})]}),z(`div`,{class:`mt-4 flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:justify-end`,children:[c&&a!==t&&z(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-700 transition hover:bg-slate-50 disabled:opacity-60 sm:w-auto`,disabled:e.saving||e.syncing,onClick:()=>n(a),type:`button`,children:`브라우저 시간대 사용`}),z(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center rounded-xl bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:cursor-not-allowed disabled:opacity-50 sm:w-auto`,disabled:!l||e.saving||e.syncing,onClick:()=>void e.onSave(t),type:`button`,children:e.saving?`시간대 저장 중`:`시간대 저장`})]})]})]}),z(`div`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:z(Ev,{data:e.scheduledRebootData,error:e.scheduledRebootError,loading:e.scheduledRebootLoading,onDismissFeedback:e.onDismissScheduledRebootFeedback,onRetry:e.onRetry,onSave:e.onSaveScheduledReboot,saveError:e.scheduledRebootSaveError,saveMessage:e.scheduledRebootSaveMessage,saving:e.scheduledRebootSaving})})]})}function hv(e){return e===`initializing`?{badge:`bg-teal-100 text-teal-800`,panel:`border-teal-200 bg-teal-50`,label:`준비 중`}:e===`critical`?{badge:`bg-rose-100 text-rose-800`,panel:`border-rose-200 bg-rose-50`,label:`이상`}:e===`warning`?{badge:`bg-amber-100 text-amber-800`,panel:`border-amber-200 bg-amber-50`,label:`주의`}:e===`unknown`?{badge:`bg-slate-200 text-slate-700`,panel:`border-slate-200 bg-slate-50`,label:`확인 불가`}:{badge:`bg-emerald-100 text-emerald-800`,panel:`border-emerald-200 bg-emerald-50`,label:`정상`}}function gv(e){if(!e.enabled)return`보고 중지됨`;switch(e.lastResult){case`reported`:return`정상 보고`;case`initializing`:return e.lastReportAt>0?`상태 갱신 중`:`첫 보고 진행 중`;case`failed`:return`최근 보고 실패`;case`idle`:return`다음 보고 대기`;case`ineligible`:return`멤버십 확인 필요`;case`disabled`:case`never`:return`첫 보고 준비 중`;default:return`보고 준비 중`}}function _v(e){return e.lastReportAt>0?Ja(e.lastReportAt):e.enabled?`첫 보고 대기 중`:`보고 기록 없음`}function vv(e){let t=e?.plan?.trim().toUpperCase(),n=e?.entitlementStatus?.trim().toLowerCase();return t&&(n===`trial`||n===`trialing`)?`${t} · 체험`:t||`유료 · Trial`}function yv(e){let t=e.data,n=hv(t?.overall??`unknown`),r=t?.checks.filter(e=>e.status!==`ok`)??[],i=r.length>0?r.slice(0,4):t?.checks.filter(e=>[`system.memory`,`network.wan`,`service.dnsmasq`,`safeshield.runtime`].includes(e.id))??[],a=t?.reporter,o=a?.enabled===!0,s=a?.eligible===!0||o,c=e.savingReporter?o?`원격 상태 보고를 켜고 있습니다.`:`원격 상태 보고를 끄고 있습니다.`:o?`원격 상태 보고가 켜져 있습니다.`:`원격 상태 보고가 꺼져 있습니다.`,l=o?`장치 상태가 바뀌면 즉시 보고하고, 정상 상태에서도 주기적으로 SmartSafeHub 서버에 보고합니다.`:`로컬 진단은 계속 동작하지만 장치 상태는 SmartSafeHub 서버에 자동으로 전송되지 않습니다.`;return z(v,{children:[z(pv,{description:`SmartSafeHub가 장치 상태를 직접 점검하고 이상 항목을 알려줍니다.`,icon:z(Gt,{class:`size-5`}),title:`장치 진단`,children:[(e.actionError||e.actionMessage)&&z(`div`,{class:`mb-4 flex items-start justify-between gap-3 rounded-xl border px-4 py-3 text-sm font-bold ${e.actionError?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[z(`span`,{children:e.actionError||e.actionMessage}),z(`button`,{class:`shrink-0 rounded-lg px-2 py-1 text-xs font-extrabold hover:bg-black/5`,onClick:e.onDismissFeedback,type:`button`,children:`닫기`})]}),e.error&&!t?z(`div`,{class:`rounded-xl border border-rose-200 bg-rose-50 p-4`,children:[z(`p`,{class:`m-0 text-sm font-bold text-rose-800`,children:e.error}),z(`button`,{class:`mt-3 inline-flex min-h-10 items-center rounded-xl border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700 transition hover:bg-rose-100`,onClick:e.onRetry,type:`button`,children:`다시 불러오기`})]}):z(v,{children:[z(`div`,{class:`rounded-xl border p-4 ${n.panel}`,children:z(`div`,{class:`flex flex-wrap items-start justify-between gap-3`,children:[z(`div`,{class:`flex min-w-0 items-start gap-3`,children:[z(`span`,{class:`mt-0.5 shrink-0`,children:t?.overall===`ok`?z(H,{class:`size-5 text-emerald-700`}):t?.overall===`initializing`?z(Ht,{class:`size-5 text-teal-700`}):z(U,{class:`size-5 text-amber-700`})}),z(`div`,{class:`min-w-0`,children:[z(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:t?.summary.message??`장치 상태를 확인하고 있습니다.`}),z(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-600`,children:[`마지막 진단 : `,t?Ja(t.generatedAt):`확인 중`]})]})]}),z(`span`,{class:`rounded-full px-2.5 py-1 text-xs font-extrabold ${n.badge}`,children:n.label})]})}),t&&z(`div`,{class:`mt-4 grid grid-cols-3 gap-2`,children:[z(`div`,{class:`rounded-xl bg-slate-50 p-3`,children:[z(`p`,{class:`m-0 text-[11px] font-extrabold text-slate-500`,children:`진단 항목`}),z(`p`,{class:`mt-1 mb-0 text-lg font-black text-slate-950`,children:t.summary.total})]}),z(`div`,{class:`rounded-xl bg-slate-50 p-3`,children:[z(`p`,{class:`m-0 text-[11px] font-extrabold text-slate-500`,children:`주의`}),z(`p`,{class:`mt-1 mb-0 text-lg font-black text-amber-700`,children:t.summary.warning})]}),z(`div`,{class:`rounded-xl bg-slate-50 p-3`,children:[z(`p`,{class:`m-0 text-[11px] font-extrabold text-slate-500`,children:`이상`}),z(`p`,{class:`mt-1 mb-0 text-lg font-black text-rose-700`,children:t.summary.critical})]})]}),i.length>0&&z(`div`,{class:`mt-4 space-y-2`,children:i.map(e=>{let t=hv(e.status);return z(`div`,{class:`flex min-w-0 items-start justify-between gap-3 rounded-xl border border-slate-200 px-3 py-2.5`,children:[z(`div`,{class:`min-w-0`,children:[z(`p`,{class:`m-0 text-xs font-extrabold text-slate-900`,children:e.label}),z(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:e.message})]}),z(`span`,{class:`shrink-0 rounded-full px-2 py-1 text-[11px] font-extrabold ${t.badge}`,children:t.label})]},e.id)})}),z(`div`,{class:`mt-4 flex flex-col gap-2 sm:flex-row`,children:[z(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center rounded-xl bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:e.running||e.loading,onClick:e.onRun,type:`button`,children:e.running?`진단 중`:`지금 진단`}),z(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-800 transition hover:bg-slate-50 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:e.downloadBusy,onClick:e.onDownload,type:`button`,children:e.downloadBusy?`진단 정보 생성 중`:`진단 정보 다운로드`})]}),z(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`다운로드 파일에는 호스트명, WAN IP와 Wi-Fi SSID 같은 네트워크 식별 정보가 포함될 수 있으므로 외부 전달 전에 내용을 확인해 주세요.`})]})]}),z(`div`,{class:`grid min-w-0 content-start gap-4`,children:[z(pv,{description:`장치의 최소 상태 정보와 이상 코드만 서버로 전송합니다. 직접 켜고 언제든지 끌 수 있습니다.`,icon:z(At,{class:`size-5`}),title:`원격 상태 보고`,titleActions:z(`span`,{class:`inline-flex rounded-full bg-slate-100 px-2.5 py-1 text-[11px] font-extrabold uppercase tracking-[0.08em] text-slate-600`,children:vv(a)}),headerActions:z(`button`,{"aria-checked":a?.enabled===!0,"aria-label":`원격 상태 보고 사용`,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${a?.enabled?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:!t||e.savingReporter||!s,onClick:()=>e.onSetReporter(!(a?.enabled??!1)),role:`switch`,type:`button`,children:z(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${a?.enabled?`left-6`:`left-1`}`})}),children:z(`div`,{class:`min-w-0`,children:a?.eligible?z(`div`,{class:`rounded-xl bg-slate-50 p-4`,children:[z(`div`,{class:`mb-4 flex items-start gap-3 rounded-xl border p-3 ${o?`border-emerald-200 bg-emerald-50`:`border-slate-200 bg-white`}`,children:[z(`span`,{class:`mt-0.5 shrink-0`,children:o?z(H,{class:`size-5 text-emerald-700`}):z(Wt,{class:`size-5 text-slate-500`})}),z(`div`,{class:`min-w-0 flex-1`,children:[z(`div`,{class:`flex flex-wrap items-center gap-2`,children:[z(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:c}),z(`span`,{class:`rounded-full px-2 py-0.5 text-[10px] font-extrabold ${e.savingReporter?`bg-slate-200 text-slate-700`:o?`bg-emerald-100 text-emerald-800`:`bg-slate-200 text-slate-700`}`,children:e.savingReporter?`설정 중`:o?`켜짐`:`꺼짐`})]}),z(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-600`,children:l})]})]}),z(`div`,{class:`grid grid-cols-1 gap-3 sm:grid-cols-2`,children:[z(`div`,{children:[z(`p`,{class:`m-0 text-[11px] font-extrabold text-slate-500`,children:`최근 전송 상태`}),z(`p`,{class:`mt-1 mb-0 text-sm font-black text-slate-900`,children:e.savingReporter?`설정 반영 중`:gv(a)})]}),z(`div`,{children:[z(`p`,{class:`m-0 text-[11px] font-extrabold text-slate-500`,children:`마지막 서버 보고`}),z(`p`,{class:`mt-1 mb-0 text-sm font-black text-slate-900`,children:_v(a)})]})]}),a.enabled&&a.lastErrorCode&&z(`p`,{class:`mt-3 mb-0 text-xs font-bold text-rose-700`,children:[`최근 보고 오류 : `,a.lastErrorCode]})]}):z(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[z(`p`,{class:`m-0 text-sm font-extrabold text-slate-900`,children:`원격 상태 보고는 유료 멤버십 또는 체험 기간에 사용할 수 있습니다.`}),z(`a`,{class:`mt-3 inline-flex text-xs font-extrabold text-teal-700 hover:text-teal-800`,href:`https://www.smartsafehub.com/pricing/`,rel:`noopener noreferrer`,target:`_blank`,children:`멤버십 알아보기`})]})})}),z(pv,{description:`진단에 필요한 최소한의 상태 정보만 전송하며, 네트워크 식별 정보와 이용 내용은 보내지 않습니다.`,icon:z(At,{class:`size-5`}),title:`개인정보 보호`,children:z(`div`,{class:`grid grid-cols-1 gap-3 sm:grid-cols-2`,children:[z(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-3.5`,children:[z(`div`,{class:`flex items-center gap-2`,children:[z(`span`,{class:`flex size-7 shrink-0 items-center justify-center rounded-lg bg-white text-slate-600`,children:z(Kt,{class:`size-4`})}),z(`p`,{class:`m-0 text-sm font-black text-slate-900`,children:`전송되는 정보`})]}),z(`div`,{class:`mt-3 space-y-3`,children:[z(`div`,{children:[z(`p`,{class:`m-0 text-[11px] font-extrabold text-slate-500`,children:`기기 상태 수치`}),z(`p`,{class:`mt-1 mb-0 text-xs font-semibold leading-5 text-slate-700`,children:`메모리 · 부하 · 저장 공간`})]}),z(`div`,{children:[z(`p`,{class:`m-0 text-[11px] font-extrabold text-slate-500`,children:`진단 정보`}),z(`p`,{class:`mt-1 mb-0 text-xs font-semibold leading-5 text-slate-700`,children:`진단 상태 · 이상 코드 · 보고 시각`})]})]})]}),z(`div`,{class:`rounded-xl border border-teal-200 bg-teal-50 p-3.5`,children:[z(`div`,{class:`flex items-center gap-2`,children:[z(`span`,{class:`flex size-7 shrink-0 items-center justify-center rounded-lg bg-white text-teal-700`,children:z(At,{class:`size-4`})}),z(`p`,{class:`m-0 text-sm font-black text-slate-900`,children:`전송하지 않는 정보`})]}),z(`div`,{class:`mt-3 space-y-3`,children:[z(`div`,{children:[z(`p`,{class:`m-0 text-[11px] font-extrabold text-teal-800`,children:`개인 식별 · 네트워크 정보`}),z(`p`,{class:`mt-1 mb-0 text-xs font-semibold leading-5 text-slate-700`,children:`호스트명 · WAN IP · Wi-Fi SSID/MAC`})]}),z(`div`,{children:[z(`p`,{class:`m-0 text-[11px] font-extrabold text-teal-800`,children:`이용 내용 및 원문 데이터`}),z(`p`,{class:`mt-1 mb-0 text-xs font-semibold leading-5 text-slate-700`,children:`DNS 요청 내용 · 시스템 로그 원문`})]})]})]})]})})]})]})}function bv(e){let[t,n]=M(!1);return z(`label`,{class:`block min-w-0`,for:e.id,children:[z(`span`,{class:`mb-2 block text-sm font-extrabold text-slate-800`,children:e.label}),z(`span`,{class:`relative block min-w-0`,children:[z(`input`,{autoComplete:e.autoComplete,class:`ssh-password-input min-h-11 w-full rounded-xl border border-slate-300 bg-white px-3 py-2.5 pr-12 text-sm font-bold text-slate-900 outline-none transition focus:border-teal-500 focus:ring-2 focus:ring-teal-100 disabled:cursor-wait disabled:opacity-60`,disabled:e.disabled,id:e.id,name:e.name,onInput:t=>e.onInput(t.currentTarget.value),placeholder:e.placeholder,...t?{type:`text`}:{type:`password`},value:e.value}),z(`button`,{"aria-label":t?`${e.label} 숨기기`:`${e.label} 표시`,"aria-pressed":t,class:`absolute inset-y-0 right-1 my-auto flex size-9 items-center justify-center rounded-lg text-slate-500 transition hover:bg-slate-100 hover:text-slate-800 disabled:opacity-50`,disabled:e.disabled,onClick:()=>n(e=>!e),title:t?`비밀번호 숨기기`:`비밀번호 표시`,type:`button`,children:z(t?Xt:Yt,{class:`size-4`})})]})]})}function xv(e){return z(`li`,{class:`flex min-w-0 items-center gap-1.5 text-xs font-bold ${e.met?`text-emerald-700`:`text-slate-500`}`,children:[z(H,{class:`size-3.5 shrink-0`,"aria-hidden":`true`}),z(`span`,{children:e.label})]})}function Sv(e){let[t,n]=M(``),[r,i]=M(``),[a,o]=M(``),[s,c]=M(!1),[l,u]=M(null),d=hn(r),f=gn(d),p=a.length>0&&r===a,m=t.length>0&&r.length>0&&t!==r,h=!s&&m&&f&&p,g=async()=>{if(u(null),!t)u(`현재 관리자 비밀번호를 입력해 주세요.`);else if(!f)u(`새 비밀번호는 8자 이상이며 영문과 숫자를 각각 하나 이상 포함해야 합니다.`);else if(t===r)u(`새 관리자 비밀번호는 현재 비밀번호와 다르게 설정해 주세요.`);else if(r!==a)u(`새 비밀번호 확인 값이 일치하지 않습니다.`);else{c(!0);try{await sv(t,r),n(``),i(``),o(``);try{await Oe()}catch{}c(!1),e.onChanged()}catch(e){u(G(e,`관리자 비밀번호를 변경하지 못했습니다. 잠시 후 다시 시도해 주세요.`)),c(!1)}}};return z(pv,{description:`현재 비밀번호를 확인한 뒤 공유기 관리자 비밀번호를 변경합니다. 변경이 완료되면 새 비밀번호로 다시 로그인해야 합니다.`,icon:z(qt,{class:`size-5`}),title:`관리자 비밀번호`,children:z(`form`,{class:`space-y-4`,noValidate:!0,onSubmit:e=>{e.preventDefault(),g()},children:[l&&z(`div`,{"aria-live":`polite`,class:`rounded-xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm font-bold text-rose-800`,role:`alert`,children:l}),z(bv,{autoComplete:`current-password`,disabled:s,id:`smartsafehub-current-admin-password`,label:`현재 비밀번호`,name:`current-password`,onInput:n,placeholder:`현재 관리자 비밀번호`,value:t}),z(bv,{autoComplete:`new-password`,disabled:s,id:`smartsafehub-new-admin-password`,label:`새 비밀번호`,name:`new-password`,onInput:i,placeholder:`새 관리자 비밀번호`,value:r}),z(`ul`,{"aria-label":`새 비밀번호 요구 사항`,class:`m-0 grid list-none grid-cols-1 gap-2 p-0 sm:grid-cols-3`,children:[z(xv,{label:`8자 이상`,met:d.length}),z(xv,{label:`영문자 포함`,met:d.letter}),z(xv,{label:`숫자 포함`,met:d.number})]}),z(`div`,{class:`pt-2`,children:z(bv,{autoComplete:`new-password`,disabled:s,id:`smartsafehub-confirm-admin-password`,label:`새 비밀번호 확인`,name:`confirm-password`,onInput:o,placeholder:`새 관리자 비밀번호 다시 입력`,value:a})}),a.length>0&&z(`p`,{"aria-live":`polite`,class:`m-0 text-xs font-bold ${p?`text-emerald-700`:`text-rose-700`}`,role:`status`,children:p?`새 비밀번호가 일치합니다.`:`새 비밀번호 확인 값이 일치하지 않습니다.`}),r.length>0&&t===r&&z(`p`,{class:`m-0 text-xs font-bold text-amber-700`,children:`새 비밀번호는 현재 비밀번호와 다르게 설정해 주세요.`}),z(`div`,{class:`pt-2`,children:z(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-3 text-xs leading-5 text-slate-600`,children:`비밀번호는 현재 공유기에 직접 적용되며 외부 서버로 전송되지 않습니다. 변경 후 현재 로그인 세션은 종료됩니다.`})}),z(`div`,{class:`rounded-xl border border-amber-200 bg-amber-50 p-3 text-xs leading-5 text-amber-900`,children:[z(`strong`,{class:`block font-extrabold`,children:`비밀번호를 잊었을 때`}),`전원이 켜진 상태에서 Reset 버튼을 5~9초 누른 뒤 놓으면 관리자 비밀번호만 복구할 수 있습니다. 네트워크, Wi-Fi와 SafeShield 설정은 유지됩니다. 10초 이상 누르면 모든 사용자 설정을 초기화하는 기기 초기화가 실행됩니다.`]}),z(`div`,{class:`flex justify-end`,children:z(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center rounded-xl bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:cursor-not-allowed disabled:opacity-50 sm:w-auto`,disabled:!h,type:`submit`,children:s?`비밀번호 변경 중`:`비밀번호 변경`})})]})})}function Cv(e){let t=P(null),[n,r]=M(null),[i,a]=M(!1),o=e.action!==null;N(()=>{e.validated||a(!1)},[e.validated]);let s=()=>{!o&&!e.restoreAccepted&&t.current?.click()},c=async()=>{n&&await e.onUpload(n)&&(r(null),t.current&&(t.current.value=``))};return z(pv,{description:`펌웨어 업데이트나 복구 전에 현재 OpenWrt 설정을 표준 백업 파일로 저장하고, 필요할 때 검증 후 복원합니다.`,icon:z(Kt,{class:`size-5`}),title:`설정 백업 및 복원`,children:[(e.error||e.message)&&z(`div`,{class:`mb-5 flex min-w-0 items-start justify-between gap-3 rounded-xl border px-4 py-3 text-sm font-bold ${e.error?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[z(`span`,{class:`min-w-0`,children:e.error||e.message}),!e.restoreAccepted&&z(`button`,{class:`shrink-0 rounded-lg px-2 py-1 text-xs font-extrabold hover:bg-black/5`,onClick:e.onDismissFeedback,type:`button`,children:`닫기`})]}),z(`div`,{class:`grid min-w-0 grid-cols-1 gap-3`,children:[z(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4 sm:p-5`,children:[z(`p`,{class:`m-0 text-sm font-black text-slate-900`,children:`현재 설정 백업`}),z(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-600`,children:`네트워크, Wi-Fi, SmartSafeHub와 SafeShield 등 OpenWrt가 관리하는 설정을 표준 백업 파일로 저장합니다.`}),z(`button`,{class:`mt-4 inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:o||e.restoreAccepted,onClick:e.onDownload,type:`button`,children:[z(Gt,{class:`size-4`}),e.action===`download`?`백업 생성 중`:`설정 백업 다운로드`]}),z(`p`,{class:`mt-3 mb-0 text-xs font-bold leading-5 text-amber-700`,children:`백업에는 Wi-Fi 비밀번호, 관리자 설정, VPN 키나 기기 인증 정보 같은 민감한 값이 포함될 수 있으므로 안전한 위치에 보관해 주세요.`})]}),z(`div`,{class:`rounded-xl border border-slate-200 bg-white p-4 sm:p-5`,children:[z(`p`,{class:`m-0 text-sm font-black text-slate-900`,children:`설정 복원`}),z(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-600`,children:`SmartSafeHub 또는 OpenWrt 백업을 업로드하고 검증한 뒤 복원합니다. 최대 16MB까지 사용할 수 있습니다.`}),e.validated?z(`div`,{class:`mt-4 rounded-xl border border-emerald-200 bg-emerald-50 p-4`,children:[z(`div`,{class:`flex min-w-0 flex-col gap-1 sm:flex-row sm:items-center sm:justify-between`,children:z(`div`,{class:`min-w-0`,children:[z(`p`,{class:`m-0 break-words text-sm font-extrabold text-emerald-900`,children:e.validated.filename}),z(`p`,{class:`mt-1 mb-0 text-xs font-bold text-emerald-700`,children:[Wa(e.validated.sizeBytes),` · 검증 완료`]})]})}),i?z(`div`,{class:`mt-4 rounded-xl border border-rose-200 bg-white p-4`,children:[z(`p`,{class:`m-0 text-sm font-black text-rose-900`,children:`현재 설정을 백업 파일의 내용으로 덮어쓰시겠습니까?`}),z(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-rose-700`,children:`LAN 주소, Wi-Fi, 관리자 접속 정보가 바뀌어 현재 연결이 끊길 수 있습니다. 복원 직후 공유기가 자동으로 재부팅됩니다. 같은 장치와 호환되는 백업만 사용해 주세요.`}),z(`div`,{class:`mt-4 flex flex-col gap-3 sm:flex-row sm:flex-wrap`,children:[z(`button`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-slate-300 bg-white px-4 py-2 text-sm font-extrabold text-slate-700 transition hover:bg-slate-50 disabled:opacity-60 sm:w-auto`,disabled:o,onClick:()=>a(!1),type:`button`,children:`취소`}),z(`button`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl bg-rose-700 px-4 py-2 text-sm font-extrabold text-white transition hover:bg-rose-800 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:o,onClick:()=>void e.onRestore(),type:`button`,children:e.action===`restore`?`설정 복원 중`:`설정 복원 및 재부팅`})]})]}):z(`div`,{class:`mt-4 flex flex-col gap-3 sm:flex-row sm:flex-wrap`,children:[z(`button`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-slate-300 bg-white px-4 py-2 text-sm font-extrabold text-slate-700 transition hover:bg-slate-50 disabled:opacity-60 sm:w-auto`,disabled:o||e.restoreAccepted,onClick:()=>void e.onDiscard(),type:`button`,children:e.action===`discard`?`파일 삭제 중`:`파일 삭제`}),z(`button`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl bg-amber-600 px-4 py-2 text-sm font-extrabold text-white transition hover:bg-amber-700 disabled:opacity-60 sm:w-auto`,disabled:o||e.restoreAccepted,onClick:()=>a(!0),type:`button`,children:`복원 준비`})]})]}):z(v,{children:[z(`input`,{accept:`.tar.gz,.tgz,application/gzip,application/x-gzip`,class:`sr-only`,disabled:o||e.restoreAccepted,onChange:e=>r(e.currentTarget.files?.[0]??null),ref:t,type:`file`}),z(`button`,{class:`mt-4 flex min-h-11 w-full items-center justify-between gap-3 rounded-xl border border-dashed border-slate-300 bg-slate-50 px-4 py-3 text-left text-sm font-bold text-slate-700 transition hover:border-teal-400 hover:bg-teal-50 disabled:cursor-wait disabled:opacity-60`,disabled:o||e.restoreAccepted,onClick:s,type:`button`,children:[z(`span`,{class:`min-w-0 truncate`,children:n?.name??`복원할 백업 파일 선택`}),z(`span`,{class:`shrink-0 text-xs font-extrabold text-teal-700`,children:`찾아보기`})]}),n&&z(`div`,{class:`mt-3 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[z(`span`,{class:`text-xs font-bold text-slate-500`,children:Wa(n.size)}),z(`button`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-teal-300 bg-white px-4 py-2 text-sm font-extrabold text-teal-800 transition hover:bg-teal-50 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:o||e.restoreAccepted,onClick:()=>void c(),type:`button`,children:e.action===`upload`?`업로드 중 ${Math.round(e.uploadProgress??0)}%`:e.action===`validate`?`백업 검증 중`:`업로드 및 검증`})]})]})]})]})]})}function wv(e){return z(pv,{description:`공유기 재부팅과 SmartSafeHub에서 제공하지 않는 고급 관리 도구를 한곳에서 제공합니다.`,...e.className===void 0?{}:{className:e.className},icon:z(It,{class:`size-5`}),title:`시스템 도구`,children:z(`div`,{class:`space-y-3`,children:[z(`section`,{"aria-labelledby":`router-reboot-heading`,class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[z(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[z(`div`,{class:`flex min-w-0 items-start gap-3`,children:[z(`span`,{class:`flex size-9 shrink-0 items-center justify-center rounded-lg bg-rose-50 text-rose-700`,children:z(Wt,{class:`size-4`})}),z(`div`,{class:`min-w-0`,children:[z(`p`,{class:`m-0 text-sm font-black text-rose-950`,id:`router-reboot-heading`,children:`공유기 재부팅`}),z(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`재부팅 중에는 인터넷과 Wi-Fi 연결이 잠시 중단됩니다.`})]})]}),!e.confirmingReboot&&z(`button`,{class:`inline-flex min-h-10 w-full shrink-0 items-center justify-center rounded-xl border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700 transition hover:bg-rose-50 disabled:opacity-60 sm:w-auto`,disabled:e.action!==null||e.rebootAccepted,onClick:e.onConfirmReboot,type:`button`,children:`재부팅`})]}),e.confirmingReboot&&z(`div`,{class:`mt-3 rounded-xl border border-rose-200 bg-rose-50 p-3`,children:[z(`p`,{class:`m-0 text-xs font-extrabold leading-5 text-rose-900`,children:`지금 공유기를 재부팅하시겠습니까? 저장되지 않은 LuCI 설정이 있다면 먼저 저장해 주세요.`}),z(`div`,{class:`mt-3 flex flex-col gap-2 sm:flex-row sm:flex-wrap`,children:[z(`button`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700 transition hover:bg-slate-50 sm:w-auto`,disabled:e.action!==null,onClick:e.onCancelReboot,type:`button`,children:`취소`}),z(`button`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl bg-rose-700 px-3 py-2 text-xs font-extrabold text-white transition hover:bg-rose-800 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:e.action!==null,onClick:e.onReboot,type:`button`,children:e.action===`reboot`?`재부팅 요청 중`:`지금 재부팅`})]})]})]}),z(`section`,{"aria-labelledby":`advanced-tools-heading`,class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[z(`div`,{class:`min-w-0`,children:[z(`p`,{class:`m-0 text-sm font-black text-slate-900`,id:`advanced-tools-heading`,children:`고급 도구`}),z(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`SmartSafeHub에서 아직 제공하지 않는 상세 시스템 설정이나 원본 로그가 필요할 때 사용합니다.`})]}),z(`div`,{class:`mt-3 flex flex-col gap-2 sm:flex-row sm:flex-wrap`,children:[z(`a`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-800 no-underline transition hover:bg-slate-50 sm:w-auto`,href:e.advancedSystemUrl,children:`LuCI 고급 설정 열기`}),z(`a`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-800 no-underline transition hover:bg-slate-50 sm:w-auto`,href:e.logsUrl,children:`시스템 로그 열기`})]})]})]})})}var Tv=[{value:`mon`,label:`월요일`},{value:`tue`,label:`화요일`},{value:`wed`,label:`수요일`},{value:`thu`,label:`목요일`},{value:`fri`,label:`금요일`},{value:`sat`,label:`토요일`},{value:`sun`,label:`일요일`}];function Ev(e){let[t,n]=M(!1),[r,i]=M(`weekly`),[a,o]=M(`sun`),[s,c]=M(`04:00`);N(()=>{e.data&&(n(e.data.enabled),i(e.data.frequency),o(e.data.dayOfWeek),c(e.data.time))},[e.data?.dayOfWeek,e.data?.enabled,e.data?.frequency,e.data?.time]);let l=e.data!==null&&(t!==e.data.enabled||r!==e.data.frequency||a!==e.data.dayOfWeek||s!==e.data.time),u=Tv.find(e=>e.value===a),d=t?r===`daily`?`매일 ${s}`:`매주 ${u?.label??`일요일`} ${s}`:`예약 재부팅 꺼짐`;return z(`section`,{"aria-labelledby":`scheduled-reboot-heading`,class:`min-w-0`,children:[z(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between`,children:[z(`div`,{class:`flex min-w-0 items-start gap-3`,children:[z(`span`,{class:`flex size-11 shrink-0 items-center justify-center rounded-xl bg-slate-100 text-slate-600`,children:z(Zt,{class:`size-5`})}),z(`div`,{class:`min-w-0`,children:[z(`h2`,{class:`m-0 text-lg font-black text-slate-950`,id:`scheduled-reboot-heading`,children:`예약 재부팅`}),z(`p`,{class:`mt-1.5 mb-0 text-sm leading-6 text-slate-500`,children:`공유기를 정해진 시간에 자동으로 재부팅합니다. 기본값은 꺼짐이며 필요한 장치에서만 사용하세요.`})]})]}),z(`div`,{class:`flex shrink-0 flex-wrap items-center justify-between gap-3 sm:justify-end`,children:[l&&z(`span`,{"aria-live":`polite`,class:`inline-flex items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[z(U,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]}),z(`span`,{class:`text-xs font-extrabold text-slate-500`,children:t?`사용 중`:`꺼짐`}),z(`button`,{"aria-checked":t,"aria-label":`예약 재부팅 사용`,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${t?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:e.loading||e.saving||!e.data,onClick:()=>n(e=>!e),role:`switch`,type:`button`,children:z(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${t?`left-6`:`left-1`}`})})]})]}),(e.saveError||e.saveMessage)&&z(`div`,{class:`mt-4 flex min-w-0 items-start justify-between gap-3 rounded-xl border px-4 py-3 text-sm font-bold ${e.saveError?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[z(`span`,{class:`min-w-0`,children:e.saveError||e.saveMessage}),z(`button`,{class:`shrink-0 rounded-lg px-2 py-1 text-xs font-extrabold hover:bg-black/5`,onClick:e.onDismissFeedback,type:`button`,children:`닫기`})]}),e.error&&!e.data?z(`div`,{class:`mt-4 rounded-xl border border-rose-200 bg-rose-50 p-4`,children:[z(`p`,{class:`m-0 text-sm font-bold text-rose-800`,children:e.error}),z(`button`,{class:`mt-3 inline-flex min-h-10 items-center rounded-xl border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700 transition hover:bg-rose-100`,onClick:e.onRetry,type:`button`,children:`다시 불러오기`})]}):z(v,{children:[z(`div`,{class:`mt-4 grid min-w-0 grid-cols-1 gap-4 md:grid-cols-3`,children:[z(`div`,{children:[z(`label`,{class:`mb-2 block text-sm font-extrabold text-slate-800`,for:`scheduled-reboot-frequency`,children:`주기`}),z(Vg,{ariaLabel:`예약 재부팅 주기`,disabled:!t||e.saving||!e.data,id:`scheduled-reboot-frequency`,onChange:e=>i(e),options:[{value:`weekly`,label:`매주`},{value:`daily`,label:`매일`}],value:r})]}),z(`div`,{children:[z(`label`,{class:`mb-2 block text-sm font-extrabold text-slate-800`,for:`scheduled-reboot-day`,children:`요일`}),z(Vg,{ariaLabel:`예약 재부팅 요일`,disabled:!t||r!==`weekly`||e.saving||!e.data,id:`scheduled-reboot-day`,onChange:e=>o(e),options:Tv.map(e=>({value:e.value,label:e.label})),value:a})]}),z(`div`,{children:[z(`label`,{class:`mb-2 block text-sm font-extrabold text-slate-800`,for:`scheduled-reboot-time-hour`,children:`재부팅 시간`}),z(dv,{ariaLabel:`예약 재부팅 시간`,disabled:!t||e.saving||!e.data,id:`scheduled-reboot-time`,onChange:c,value:s})]})]}),z(`div`,{class:`mt-4 flex flex-col gap-3 rounded-xl bg-slate-50 p-4 sm:flex-row sm:items-end sm:justify-between`,children:[z(`div`,{class:`min-w-0`,children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.12em] text-slate-500`,children:`예약 일정`}),z(`p`,{class:`mt-1.5 mb-0 text-sm font-extrabold text-slate-900`,children:d}),z(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:[e.data?.timezone??`장치 시간대`,` 기준 · 업데이트 작업 중이면 15분 단위로 최대 2시간 연기합니다.`]})]}),z(`button`,{class:`inline-flex min-h-11 w-full shrink-0 items-center justify-center rounded-xl bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:cursor-not-allowed disabled:opacity-50 sm:w-auto`,disabled:!l||e.saving||!e.data,onClick:()=>void e.onSave({enabled:t,frequency:r,dayOfWeek:a,time:s}),type:`button`,children:e.saving?`예약 저장 중`:`예약 저장`})]})]})]})}function Dv({activeTab:e,action:t,backupAction:n,backupError:r,backupMessage:i,backupRestoreAccepted:a,backupUploadProgress:o,backupValidated:s,data:c,error:l,feedbackError:u,feedbackMessage:d,health:f,healthActionError:p,healthActionMessage:m,healthError:h,healthLoading:g,healthRunning:_,healthSavingReporter:v,loading:y,rebootAccepted:b,scheduledRebootData:x,scheduledRebootError:S,scheduledRebootLoading:C,scheduledRebootSaveError:w,scheduledRebootSaveMessage:T,scheduledRebootSaving:E,timeData:D,timeError:O,timeLoading:k,timeSaveError:A,timeSaveMessage:j,timeSaving:ee,timeSyncing:te,onBackupDiscard:ne,onBackupDownload:re,onBackupRestore:ie,onBackupUpload:ae,onDismissBackupFeedback:oe,onDismissFeedback:se,onDismissHealthFeedback:ce,onDismissTimeFeedback:le,onDownloadDiagnostics:ue,onRunHealth:de,onSetHealthReporter:fe,onReboot:pe,onRetry:me,onDismissScheduledRebootFeedback:he,onSaveScheduledReboot:ge,onSaveTimezone:_e,onSyncTime:ve,onAdministratorPasswordChanged:ye}){let[xe,Se]=M(!1),Ce=be(`/admin/system`),we=be(`/admin/status/logs`);return z(`section`,{class:`min-w-0 space-y-7`,children:[(u||d)&&z(`div`,{class:`flex min-w-0 flex-col gap-3 rounded-xl border px-4 py-3 text-sm font-bold sm:flex-row sm:items-center sm:justify-between ${u?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[z(`span`,{class:`min-w-0`,children:u||d}),!b&&z(`button`,{class:`shrink-0 self-start rounded-lg px-3 py-1.5 text-xs font-extrabold hover:bg-black/5 sm:self-auto`,onClick:se,type:`button`,children:`닫기`})]}),z(Dr,{active:e,label:`설정 메뉴`,tabs:[{id:`diagnostics`,label:`진단 및 지원`,href:`#settings`},{id:`time`,label:`시간 및 예약`,href:`#settings/time`},{id:`management`,label:`관리 및 복구`,href:`#settings/management`}]}),z(`section`,{"aria-labelledby":`diagnostics-tab`,class:`min-w-0`,hidden:e!==`diagnostics`,id:`diagnostics-panel`,role:`tabpanel`,children:[l&&!c?z(`div`,{class:`mb-4 rounded-xl border border-amber-200 bg-amber-50 p-4 text-sm font-semibold text-amber-900`,role:`status`,children:[z(`p`,{class:`m-0`,children:[`시스템 정보를 불러오지 못해 진단 파일 다운로드가 제한될 수 있습니다. `,l]}),z(`button`,{class:`mt-2 rounded-lg border border-current px-3 py-1.5 text-xs font-extrabold`,onClick:me,type:`button`,children:`다시 시도`})]}):y&&!c?z(`p`,{class:`mb-4 text-sm font-semibold text-slate-500`,role:`status`,children:`진단 파일에 필요한 시스템 정보를 확인하고 있습니다.`}):null,z(q,{eyebrow:`Device health`,title:`진단 및 지원`,description:`장치 진단과 원격 상태 보고를 확인하고 개인정보 보호 정책을 관리합니다.`}),z(`div`,{class:`grid min-w-0 grid-cols-1 gap-4 lg:grid-cols-2`,children:z(yv,{actionError:p,actionMessage:m,data:f,downloadBusy:t===`diagnostics`,error:h,loading:g,onDismissFeedback:ce,onDownload:ue,onRetry:me,onRun:de,onSetReporter:fe,running:_,savingReporter:v})})]}),z(`section`,{"aria-labelledby":`time-tab`,class:`min-w-0`,hidden:e!==`time`,id:`time-panel`,role:`tabpanel`,children:[z(q,{eyebrow:`Device settings`,title:`시간 및 예약`,description:`시간 기준과 예약 재부팅을 SmartSafeHub에서 직접 관리합니다.`}),z(`div`,{class:`grid min-w-0 grid-cols-1 gap-4 lg:grid-cols-2`,children:z(mv,{data:D,error:O,loading:k,onDismissFeedback:le,onDismissScheduledRebootFeedback:he,onRetry:me,onSave:_e,onSaveScheduledReboot:ge,onSync:ve,saveError:A,saveMessage:j,saving:ee,scheduledRebootData:x,scheduledRebootError:S,scheduledRebootLoading:C,scheduledRebootSaveError:w,scheduledRebootSaveMessage:T,scheduledRebootSaving:E,syncing:te})})]}),z(`section`,{"aria-labelledby":`management-tab`,class:`min-w-0`,hidden:e!==`management`,id:`management-panel`,role:`tabpanel`,children:[z(q,{eyebrow:`System management`,title:`시스템 관리`,description:`관리자 비밀번호, 설정 백업·복원과 공유기 시스템 도구를 한곳에서 관리합니다.`}),z(`div`,{class:`grid min-w-0 grid-cols-1 gap-4 lg:grid-cols-2`,children:[z(Sv,{onChanged:ye}),z(Cv,{action:n,error:r,message:i,onDiscard:ne,onDismissFeedback:oe,onDownload:re,onRestore:ie,onUpload:ae,restoreAccepted:a,uploadProgress:o,validated:s}),z(wv,{action:t,className:`lg:col-span-2`,advancedSystemUrl:Ce,confirmingReboot:xe,logsUrl:we,onCancelReboot:()=>Se(!1),onConfirmReboot:()=>Se(!0),onReboot:pe,rebootAccepted:b})]})]})]})}var Ov=`https://www.smartsafehub.com/dashboard/devices/`;async function kv(e){if(navigator.clipboard?.writeText)try{await navigator.clipboard.writeText(e);return}catch{}let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`readonly`,``),t.style.position=`fixed`,t.style.inset=`0 auto auto -9999px`,t.style.opacity=`0`,document.body.appendChild(t),t.select(),t.setSelectionRange(0,e.length);let n=document.execCommand(`copy`);if(t.remove(),!n)throw Error(`clipboard_copy_failed`)}function Av(e){return(e||`free`).toUpperCase()}function jv(e){return e===`FREE`?`free`:e===`PRO`?`pro`:e===`ULTIMATE`?`ultimate`:`paid`}function Mv({plan:e}){let t=jv(e),n=t!==`free`;return z(`span`,{class:`ssh-safeshield-plan-badge`,"data-compact":`false`,"data-tier":t,title:n?`${e} 멤버십`:`무료 플랜`,children:[z(`span`,{"aria-hidden":`true`,class:`ssh-safeshield-plan-badge-mark`,children:n?`✦`:`•`}),z(`span`,{children:e})]})}function Nv(e){if(!e.pairingCode||!e.pairingExpiresAt)return!1;let t=Date.parse(e.pairingExpiresAt);return Number.isFinite(t)&&t<=Date.now()}function Pv({data:e,error:t,loading:n,pairingBusy:r,refreshing:i,syncError:a,onRequestPairing:o,onRetry:s}){let[c,l]=M(null),[u,d]=M(!1);if(N(()=>{if(!u)return;let e=window.setTimeout(()=>d(!1),1800);return()=>window.clearTimeout(e)},[u]),n&&!e)return z(bo,{});if(t&&!e)return z(xo,{message:t,onRetry:s});let f=e,p=f?.accountRegistered===!0,m=Av(f?.plan??null),h=f?Nv(f):!1,g=!p&&!h?f?.pairingCode:null;async function _(){l(null),d(!1);try{await o()}catch{l(`계정 연결 코드를 발급하지 못했습니다. 잠시 후 다시 시도해 주세요.`)}}async function v(){if(g)try{await kv(g),l(null),d(!0)}catch{d(!1),l(`연결 코드를 복사하지 못했습니다. 코드를 직접 선택해 복사해 주세요.`)}}return z(`div`,{class:`min-w-0`,children:[z(q,{eyebrow:`Account connection`,title:`기기 계정 연결`,description:`계정에 연결하면 웹사이트에서 기기를 관리하고 Cloud 기능과 구독 권한을 사용할 수 있습니다.`}),z(`div`,{class:`grid items-start gap-5 xl:items-stretch xl:grid-cols-[minmax(0,1.2fr)_minmax(18rem,0.8fr)]`,children:[z(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:h-full`,children:p?z(`div`,{children:[z(`div`,{class:`flex items-center gap-3`,children:[z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-full bg-emerald-100 text-emerald-700`,children:z(H,{class:`size-5`})}),z(`div`,{children:[z(`p`,{class:`m-0 text-base font-black text-slate-950`,children:`SmartSafeHub 계정에 연결됨`}),z(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-600`,children:`이 기기가 계정과 정상적으로 연결되어 있습니다. 연결 코드는 더 이상 필요하지 않습니다.`})]})]}),z(`a`,{class:`mt-5 inline-flex min-h-11 items-center justify-center rounded-xl border border-emerald-700 bg-emerald-700 px-4 py-2 text-sm font-extrabold text-white no-underline transition hover:bg-emerald-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-emerald-100`,href:Ov,rel:`noopener noreferrer`,target:`_blank`,children:`웹사이트에서 기기 관리`}),z(`p`,{class:`mt-4 mb-0 border-t border-slate-100 pt-4 text-xs font-semibold leading-5 text-slate-500`,children:`웹사이트에서 기기 등록을 해제하면 공유기도 다음 계정 상태 동기화에서 자동으로 연결 해제를 반영합니다.`})]}):z(`div`,{children:[z(`div`,{children:[z(`div`,{class:`flex flex-wrap items-center justify-between gap-2`,children:[z(`p`,{class:`m-0 text-sm font-black text-slate-900`,children:`계정 연결 코드`}),z(`span`,{class:`inline-flex items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-[0.7rem] font-black text-amber-800`,children:[z(Ht,{class:`size-3.5`}),`10분 동안 유효`]})]}),z(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-500`,children:`코드를 발급한 뒤 smartsafehub.com에 로그인하여 기기를 연결하세요.`})]}),g?z(`div`,{class:`mt-4 flex flex-col gap-3 rounded-2xl border border-teal-200 bg-teal-50 p-4 sm:flex-row sm:items-center sm:justify-between`,role:`group`,"aria-label":`계정 연결 코드`,children:[z(`div`,{class:`min-w-0`,children:[z(`span`,{class:`block text-[0.7rem] font-black text-teal-700`,children:`연결 코드`}),z(`code`,{class:`mt-1 block select-all break-all font-mono text-2xl font-black tracking-[0.14em] text-slate-950`,children:g})]}),z(`button`,{"aria-label":`계정 연결 코드 복사`,class:`inline-flex min-h-11 shrink-0 items-center justify-center gap-2 rounded-xl border border-teal-300 bg-white px-4 text-sm font-black text-teal-800 transition hover:bg-teal-100 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:()=>void v(),type:`button`,children:[z(u?H:Jt,{class:`size-4`}),z(`span`,{"aria-live":`polite`,children:u?`복사됨`:`복사`})]})]}):h?z(`p`,{class:`mt-4 mb-0 rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm font-bold text-amber-800`,children:`이전 연결 코드가 만료되었습니다. 새 코드를 발급해 주세요.`}):null,z(`button`,{class:`mt-4 inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl border border-teal-700 bg-teal-700 px-4 py-2 text-sm font-black text-white transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:r,onClick:()=>void _(),type:`button`,children:[r?z(V,{class:`size-4 animate-spin`}):null,r?`발급 중…`:g?`새 코드 발급`:`연결 코드 발급`]}),c?z(`p`,{class:`mt-3 mb-0 text-sm font-semibold text-red-700`,children:c}):null]})}),z(`aside`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:h-full`,children:[z(`p`,{class:`m-0 text-[0.68rem] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Device status`}),z(`h2`,{class:`mt-2 mb-0 text-lg font-black tracking-tight text-slate-950`,children:`연결 상태`}),z(`dl`,{class:`mt-5 mb-0 grid gap-4`,children:[z(`div`,{class:`flex items-center justify-between gap-4 border-b border-slate-100 pb-4`,children:[z(`dt`,{class:`text-sm font-bold text-slate-500`,children:`계정`}),z(`dd`,{class:`m-0 text-sm font-black ${p?`text-emerald-700`:`text-slate-700`}`,children:p?`연결됨`:`연결 필요`})]}),z(`div`,{class:`flex items-center justify-between gap-4 border-b border-slate-100 pb-4`,children:[z(`dt`,{class:`text-sm font-bold text-slate-500`,children:`요금제`}),z(`dd`,{class:`m-0 flex min-w-0 flex-wrap items-center justify-end gap-2`,children:[z(Mv,{plan:m}),m===`FREE`?z(`span`,{class:`ssh-safeshield-plan-caption`,children:`기본 플랜`}):null]})]}),z(`div`,{class:`flex items-center justify-between gap-4`,children:[z(`dt`,{class:`text-sm font-bold text-slate-500`,children:`마지막 확인`}),z(`dd`,{class:`m-0 text-sm font-black text-slate-700`,children:Ja(f?.lastSuccessAt??0)})]})]}),i?z(`p`,{class:`mt-5 mb-0 text-xs font-bold text-teal-700`,children:`최신 상태를 확인하고 있습니다…`}):null,a?p?z(`p`,{class:`mt-5 mb-0 text-xs font-semibold leading-5 text-slate-500`,children:`최신 상태 확인이 지연되고 있습니다. 마지막으로 확인된 연결 상태를 표시합니다.`}):z(`p`,{class:`mt-5 mb-0 rounded-xl border border-amber-200 bg-amber-50 px-3 py-2 text-xs font-bold leading-5 text-amber-800`,children:[a,` 로컬에 저장된 마지막 상태를 표시합니다.`]}):null]})]})]})}function Fv(e,t){if(!e||!t)return`unknown`;if(e===t)return`same`;let n=/^(\d+)\.(\d+)\.(\d+)(?:-r(\d+))?$/,r=n.exec(e),i=n.exec(t);if(!r||!i)return`different`;for(let e=1;e<=4;e+=1){let t=BigInt(r[e]||`0`),n=BigInt(i[e]||`0`);if(t>n)return`newer`;if(t=1048576?`${(e/1048576).toFixed(1)} MB`:`${(e/1024).toFixed(1)} KB`}function Lv(e){switch(e.phase){case`checking`:return`확인 중`;case`downloading`:return`다운로드 중`;case`verifying`:return`검증 중`;case`ready`:return`설치 준비 완료`;case`flashing`:return`설치 중`;case`error`:return`확인 필요`;default:return e.updateAvailable?`업데이트 가능`:e.lastCheckAt?`최신 상태`:`확인 전`}}function Rv(e){return e.phase===`error`?`bg-rose-50 text-rose-700 ring-rose-200`:e.phase===`checking`||e.phase===`downloading`||e.phase===`verifying`||e.phase===`flashing`?`bg-sky-50 text-sky-700 ring-sky-200`:e.phase===`ready`||e.updateAvailable?`bg-amber-50 text-amber-800 ring-amber-200`:e.lastCheckAt?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function zv(e){return e.phase===`checking`||e.phase===`downloading`||e.phase===`verifying`||e.phase===`flashing`?z(V,{class:`size-3.5 animate-spin`}):e.phase===`error`?z(U,{class:`size-3.5`}):e.phase===`ready`||e.updateAvailable?z(Gt,{class:`size-3.5`}):e.lastCheckAt?z(H,{class:`size-3.5`}):z(Ht,{class:`size-3.5`})}function Bv({checked:e,disabled:t,onChange:n}){return z(`button`,{"aria-checked":e,"aria-label":`현재 설정 유지`,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${e?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:t,onClick:()=>n(!e),role:`switch`,type:`button`,children:z(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${e?`left-6`:`left-1`}`})})}function Vv({action:e,actionError:t,data:n,software:r,error:i,loading:a,message:o,reconnecting:s,uploadProgress:c,onCheck:l,onDiscard:u,onDismissFeedback:d,onInstall:f,onPrepare:p,onRetry:m,onUpload:h}){let g=P(null),[_,y]=M(null),[b,x]=M(!0),[S,C]=M(!1);N(()=>{n?.prepared&&x(n.prepared.allowBackup)},[n?.prepared]);let w=e!==null||n?.phase===`checking`||n?.phase===`downloading`||n?.phase===`verifying`||n?.phase===`flashing`,T=n?.phase===`ready`?n.prepared:null,E=e===`check`||n?.phase===`checking`,D=e===`prepare`||n?.phase===`downloading`||n?.phase===`verifying`,O=e===`upload`||e===`validate-upload`,k=n?.release?.bundledSoftware?.smartsafehub??null,A=r?.packages.find(e=>e.name===`luci-app-smartsafehub`)?.installedVersion??null,j=Fv(k,A),ee=async()=>{_&&await h(_)&&(y(null),g.current&&(g.current.value=``))};return z(`article`,{class:`min-w-0 overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm shadow-slate-900/5`,"data-component":`firmware-update-card`,children:[z(`div`,{class:`p-5 sm:p-6`,children:[z(`div`,{class:`flex flex-col gap-5 lg:flex-row lg:items-start lg:justify-between`,children:[z(`div`,{class:`flex min-w-0 gap-4`,children:[z(`span`,{class:`grid size-12 shrink-0 place-items-center rounded-2xl bg-sky-50 text-sky-700`,children:z(jt,{class:`size-6`})}),z(`div`,{class:`min-w-0`,children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-sky-700`,children:`Firmware update`}),z(`h2`,{class:`mt-2 mb-0 text-xl font-black text-slate-950 sm:text-2xl`,children:`펌웨어 업데이트`}),z(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500 lg:whitespace-nowrap`,children:`시스템 펌웨어를 확인하고 설치합니다. 온라인·수동 설치는 안전성 검증 후 진행됩니다.`})]})]}),n?z(`div`,{class:`flex shrink-0 flex-col gap-2 sm:flex-row lg:justify-end`,children:[z(`span`,{class:`inline-flex min-h-11 items-center justify-center gap-1.5 rounded-xl px-3 py-2 text-xs font-extrabold ring-1 ring-inset ${Rv(n)}`,children:[zv(n),Lv(n)]}),z(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-800 transition hover:bg-slate-50 disabled:cursor-wait disabled:opacity-60`,disabled:w||T!==null,onClick:l,type:`button`,children:[z(V,{class:`size-4 ${E?`animate-spin`:``}`}),E?`확인 중...`:`펌웨어 확인`]}),n.updateAvailable&&!T?z(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl bg-sky-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-sky-800 disabled:cursor-wait disabled:opacity-60`,disabled:w,onClick:p,type:`button`,children:[D?z(V,{class:`size-4 animate-spin`}):z(Gt,{class:`size-4`}),D?`준비 중...`:`다운로드 및 검증`]}):null]}):null]}),t||o?z(`div`,{class:`mt-5 flex flex-col gap-3 rounded-xl border px-4 py-3 text-sm font-bold sm:flex-row sm:items-center sm:justify-between ${t?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[z(`span`,{children:t||o}),z(`button`,{class:`shrink-0 self-start rounded-lg px-3 py-1.5 text-xs font-extrabold hover:bg-black/5 sm:self-auto`,onClick:d,type:`button`,children:`닫기`})]}):null,s||n?.phase===`flashing`?z(`div`,{class:`mt-5 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:p-5`,role:`status`,children:z(`div`,{class:`flex gap-3`,children:[z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-amber-700 ring-1 ring-inset ring-amber-200`,children:z(V,{class:`size-5 animate-spin`})}),z(`div`,{children:[z(`strong`,{class:`block text-sm font-black text-amber-950`,children:`펌웨어를 설치하고 재부팅하고 있습니다.`}),z(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-amber-800`,children:`전원을 끄지 마세요. 현재 주소에서 공유기가 다시 응답하면 SmartSafeHub가 자동으로 새로고침됩니다.`})]})]})}):null,i&&!n?z(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 text-sm text-rose-800`,children:[z(`p`,{class:`m-0 font-bold`,children:i}),z(`button`,{class:`mt-3 rounded-lg border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700`,onClick:m,type:`button`,children:`다시 시도`})]}):a&&!n?z(`div`,{class:`mt-5 flex items-center gap-3 rounded-xl bg-slate-50 p-4 text-sm font-bold text-slate-500`,children:[z(V,{class:`size-4 animate-spin`}),`펌웨어 상태를 확인하고 있습니다.`]}):n?z(v,{children:[n.lastError?z(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 sm:p-5`,children:z(`div`,{class:`flex gap-3`,children:[z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-rose-700 ring-1 ring-inset ring-rose-200`,children:z(U,{class:`size-5`})}),z(`div`,{class:`min-w-0 flex-1`,children:[z(`strong`,{class:`block text-sm font-black text-rose-950`,children:`펌웨어 작업을 완료하지 못했습니다.`}),z(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-rose-800`,children:n.lastError.message}),z(`details`,{class:`mt-3 rounded-lg border border-rose-200 bg-white p-3`,children:[z(`summary`,{class:`cursor-pointer text-xs font-extrabold text-rose-800`,children:`상세 정보 보기`}),z(`p`,{class:`mt-2 mb-0 break-all font-mono text-[11px] text-slate-600`,children:n.lastError.code})]})]})]})}):null,n.current.metadataAvailable?null:z(`div`,{class:`mt-5 rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-xs leading-5 text-amber-900`,children:[z(`strong`,{class:`block font-extrabold`,children:`현재 펌웨어의 버전 정보를 완전히 확인할 수 없습니다.`}),z(`span`,{class:`mt-1 block text-amber-800`,children:`새 펌웨어를 설치하면 이후부터 정확한 설치 버전을 자동으로 확인할 수 있습니다.`}),z(`details`,{class:`mt-2`,children:[z(`summary`,{class:`cursor-pointer font-extrabold text-amber-800`,children:`기술 상세 보기`}),z(`p`,{class:`mt-2 mb-0 break-all font-mono text-[11px] leading-5 text-amber-800`,children:`SmartSafeHub build ID metadata is missing. Future images should include /usr/share/smartsafehub/firmware.json.`})]})]}),z(`dl`,{class:`mt-5 grid overflow-hidden rounded-xl border border-slate-200 bg-slate-200 sm:grid-cols-2 xl:grid-cols-4`,children:[z(`div`,{class:`bg-white p-4`,children:[z(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Device`}),z(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black text-slate-950`,children:n.current.deviceCode||n.current.boardName||`미확인`})]}),z(`div`,{class:`bg-white p-4`,children:[z(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Current version`}),z(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black text-slate-950`,children:n.current.releaseVersion||`미확인`}),n.current.buildId?z(`span`,{class:`mt-1 block break-all text-[11px] leading-5 text-slate-400`,children:[`빌드 ID `,n.current.buildId]}):n.current.openwrtVersion?z(`span`,{class:`mt-1 block text-[11px] leading-5 text-slate-400`,children:[`OpenWrt `,n.current.openwrtVersion]}):null]}),z(`div`,{class:`bg-white p-4`,children:[z(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Available version`}),z(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black ${n.updateAvailable?`text-amber-700`:`text-slate-950`}`,children:n.lastCheckAt?n.release?.version?`${n.release.version}${n.updateAvailable?``:` · 최신`}`:n.updateAvailable?`새 펌웨어`:`최신 버전`:`미확인`}),n.release?.buildId?z(`span`,{class:`mt-1 block break-all text-[11px] leading-5 text-slate-400`,children:[`빌드 ID `,n.release.buildId]}):null]}),z(`div`,{class:`bg-white p-4`,children:[z(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Last check`}),z(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-black text-slate-950`,children:z(P_,{fallback:`아직 없음`,timestamp:n.lastCheckAt})})]})]})]}):null,n?.updateAvailable&&n.release?z(`section`,{class:`mt-5 rounded-xl border border-sky-200 bg-sky-50/60 p-4 sm:p-5`,"data-section":`available-firmware`,children:[z(`div`,{class:`flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-4`,children:[z(`div`,{children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-sky-700`,children:`Available firmware`}),z(`h3`,{class:`mt-2 mb-0 text-lg font-black text-slate-950`,children:`새 펌웨어가 있습니다.`}),z(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:[`펌웨어 `,n.release.version||`미확인`,` · `,Iv(n.release.sysupgrade.sizeBytes),` · `,(n.release.channel||n.settings.channel)===`beta`?`Beta`:`Stable`]})]}),z(`div`,{class:`flex shrink-0 flex-wrap items-center justify-start gap-2 sm:justify-end`,children:[z(`span`,{class:`rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-sky-700 ring-1 ring-inset ring-sky-200`,children:n.release.version||`Latest`}),k?z(`span`,{class:`inline-flex items-center gap-1.5 rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-slate-700 ring-1 ring-inset ring-sky-200`,"data-section":`firmware-bundled-software-chip`,children:[z(`span`,{class:`text-[11px] uppercase tracking-[0.12em] text-slate-500`,children:`관리 SW`}),z(`span`,{class:`text-slate-950`,children:k})]}):null]})]}),k?z(`div`,{class:`mt-4 rounded-xl border border-sky-100 bg-white p-4`,"data-section":`firmware-bundled-software`,children:[z(`div`,{class:`flex flex-wrap items-center justify-between gap-2`,children:[z(`span`,{class:`text-xs font-extrabold text-slate-800`,children:`포함된 관리 소프트웨어`}),z(`div`,{class:`flex flex-wrap items-center gap-2`,children:[z(`span`,{class:`text-sm font-black text-slate-950`,children:k}),j===`same`?z(`span`,{class:`rounded-full bg-emerald-50 px-2.5 py-1 text-[11px] font-extrabold text-emerald-700 ring-1 ring-inset ring-emerald-200`,children:`현재 버전과 동일`}):null]})]}),z(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-600`,children:j===`same`?`관리 소프트웨어는 이미 같은 버전입니다. 펌웨어 업데이트는 시스템 구성 요소를 갱신합니다.`:j===`older`?`현재 설치된 관리 소프트웨어(${A})보다 이전 버전이 포함되어 있습니다. 펌웨어 설치 전 버전을 확인해 주세요.`:j===`newer`?`현재 설치된 관리 소프트웨어(${A})보다 새 버전이 포함되어 있습니다.`:A?`현재 설치 버전 ${A} · 펌웨어 포함 버전 ${k}`:`이 펌웨어에 포함된 관리 소프트웨어 버전입니다.`})]}):null,n.release.releaseNotes.length?z(`ul`,{class:`mt-4 mb-0 space-y-2 rounded-xl bg-white p-4 pl-9 text-sm leading-6 text-slate-700 ring-1 ring-inset ring-sky-100`,children:n.release.releaseNotes.map((e,t)=>z(`li`,{children:e},`${t}-${e}`))}):null]}):null,T?z(`section`,{class:`mt-5 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:p-5`,"data-section":`prepared-firmware`,children:z(`div`,{class:`flex gap-4`,children:[z(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-white text-amber-700 ring-1 ring-inset ring-amber-200`,children:z(H,{class:`size-5`})}),z(`div`,{class:`min-w-0 flex-1`,children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-amber-700`,children:`Verified image`}),z(`h3`,{class:`mt-2 mb-0 text-lg font-black text-amber-950`,children:`설치할 펌웨어가 준비되었습니다.`}),z(`p`,{class:`mt-2 mb-0 break-all text-sm leading-6 text-amber-900`,children:[T.filename||`firmware.bin`,` · `,Iv(T.sizeBytes)]}),T.sha256?z(`p`,{class:`mt-2 mb-0 break-all font-mono text-[11px] leading-5 text-amber-800`,children:[`SHA-256 `,T.sha256]}):null,z(`div`,{class:`mt-5 flex items-start justify-between gap-4 rounded-xl border border-amber-200 bg-white p-4`,children:[z(`div`,{children:[z(`strong`,{class:`block text-sm font-black text-slate-950`,children:`현재 설정 유지`}),z(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:`Wi-Fi, SafeShield, SmartSafeHub 설정을 유지합니다.`}),T.allowBackup?null:z(`span`,{class:`mt-2 block text-xs font-bold text-rose-700`,children:`이 이미지는 설정 유지 업그레이드를 지원하지 않습니다.`})]}),z(Bv,{checked:b,disabled:!T.allowBackup,onChange:x})]}),S?z(`div`,{class:`mt-4 rounded-xl border border-rose-200 bg-rose-50 p-4`,children:[z(`strong`,{class:`block text-sm font-black text-rose-950`,children:`펌웨어 설치를 시작할까요?`}),z(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-rose-800`,children:`설치 중 전원을 끄면 장치가 복구 불가능한 상태가 될 수 있습니다. 이미지 검증은 설치 직전에 다시 수행됩니다.`}),z(`div`,{class:`mt-4 flex flex-wrap justify-end gap-2`,children:[z(`button`,{class:`min-h-10 rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700`,onClick:()=>C(!1),type:`button`,children:`취소`}),z(`button`,{class:`min-h-10 rounded-lg bg-rose-700 px-3 py-2 text-xs font-extrabold text-white`,onClick:()=>{C(!1),f(b)},type:`button`,children:`설치 시작`})]})]}):z(`div`,{class:`mt-4 flex flex-wrap justify-end gap-2`,children:[z(`button`,{class:`min-h-10 rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700`,disabled:e===`discard`,onClick:()=>void u(),type:`button`,children:`파일 삭제`}),z(`button`,{class:`inline-flex min-h-10 items-center gap-2 rounded-lg bg-rose-700 px-4 py-2 text-xs font-extrabold text-white`,onClick:()=>C(!0),type:`button`,children:[z(Ft,{class:`size-4`}),`펌웨어 설치`]})]})]})]})}):null]}),z(`details`,{class:`group mx-5 mb-5 rounded-xl border border-slate-200 bg-slate-50/70 sm:mx-6 sm:mb-6`,"data-layout":`firmware-card-subsection`,"data-section":`manual-firmware`,children:[z(`summary`,{class:`flex cursor-pointer list-none items-center justify-between gap-4 px-4 py-4 sm:px-5 [&::-webkit-details-marker]:hidden`,children:[z(`div`,{class:`flex min-w-0 items-center gap-3`,children:[z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-slate-600 ring-1 ring-inset ring-slate-200`,children:z(Gt,{class:`size-5 rotate-180`})}),z(`div`,{class:`min-w-0`,children:[z(`strong`,{class:`block text-sm font-black text-slate-950`,children:`수동 펌웨어 설치`}),z(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:`펌웨어 파일(.bin)을 직접 업로드하여 검증한 뒤 설치합니다.`})]})]}),z(`span`,{class:`shrink-0 rounded-full bg-white px-3 py-1.5 text-[11px] font-extrabold text-slate-600 ring-1 ring-inset ring-slate-200 group-open:hidden`,children:`열기`}),z(`span`,{class:`hidden shrink-0 rounded-full bg-white px-3 py-1.5 text-[11px] font-extrabold text-slate-600 ring-1 ring-inset ring-slate-200 group-open:inline-flex`,children:`닫기`})]}),z(`div`,{class:`border-t border-slate-200 px-5 pb-5 pt-3 sm:px-6`,children:[z(`p`,{class:`mt-0 mb-4 text-xs leading-5 text-slate-500 lg:whitespace-nowrap`,children:"이 장치에 맞는 Sysupgrade 이미지(.bin)만 사용하세요. 업로드한 파일은 이미지 검증과 `sysupgrade --test`를 모두 통과해야 설치할 수 있으며 강제 설치는 제공하지 않습니다."}),z(`div`,{class:`rounded-xl border border-slate-200 bg-white p-4 sm:p-5`,"data-layout":`firmware-file-picker`,children:[z(`input`,{accept:`.bin,application/octet-stream`,"aria-label":`펌웨어 파일 선택`,class:`sr-only`,disabled:w||T!==null,onChange:e=>y(e.currentTarget.files?.[0]??null),ref:g,type:`file`}),z(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between`,children:[z(`div`,{class:`flex min-w-0 items-center gap-3`,children:[z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-50 text-slate-500 ring-1 ring-inset ring-slate-200`,children:z(Gt,{class:`size-5 rotate-180`})}),z(`div`,{class:`min-w-0`,children:[z(`strong`,{class:`block truncate text-sm font-black text-slate-900`,children:_?_.name:`펌웨어 파일을 선택하세요`}),z(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:_?`${Iv(_.size)} · Sysupgrade 이미지 (.bin)`:`이 장치에 맞는 Sysupgrade 이미지 (.bin)를 선택합니다.`})]})]}),z(`div`,{class:`flex shrink-0 flex-wrap gap-2 sm:justify-end`,children:[z(`button`,{class:`inline-flex min-h-10 items-center justify-center rounded-lg border border-slate-300 bg-white px-3.5 py-2 text-xs font-extrabold text-slate-700 transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50`,disabled:w||T!==null,onClick:()=>g.current?.click(),type:`button`,children:_?`다른 파일 선택`:`파일 선택`}),z(`button`,{class:`inline-flex min-h-10 items-center justify-center gap-2 rounded-lg bg-slate-900 px-3.5 py-2 text-xs font-extrabold text-white transition hover:bg-slate-800 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!_||w||T!==null,onClick:()=>void ee(),type:`button`,children:[O?z(V,{class:`size-4 animate-spin`}):z(Gt,{class:`size-4 rotate-180`}),O?`처리 중...`:`업로드 및 검증`]})]})]}),c===null?null:z(`div`,{class:`mt-4 border-t border-slate-100 pt-4`,children:[z(`div`,{class:`mb-2 flex items-center justify-between gap-3 text-xs font-bold text-slate-600`,children:[z(`span`,{children:`업로드 중`}),z(`span`,{children:[c,`%`]})]}),z(`div`,{class:`h-2 overflow-hidden rounded-full bg-slate-200`,children:z(`div`,{class:`h-full rounded-full bg-sky-600 transition-[width]`,style:{width:`${Math.max(0,Math.min(100,c))}%`}})})]})]})]})]})]})}var Hv=[{value:3600,label:`1시간마다`},{value:21600,label:`6시간마다`},{value:43200,label:`12시간마다`},{value:86400,label:`24시간마다`}],Uv=`luci-app-smartsafehub`;function Wv(e){return e?new Date(e*1e3).toLocaleString(`ko-KR`,{dateStyle:`medium`,timeStyle:`short`}):`아직 없음`}function Gv(e){return e===`stable`?`Stable`:e===`beta`?`Beta`:`미확인`}function Kv(e){return e===`stable`?`bg-emerald-50 text-emerald-700 ring-emerald-200`:e===`beta`?`bg-amber-50 text-amber-700 ring-amber-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function qv(e){return e.code===`UPDATES_INDEX_REFRESH_FAILED`?{title:`패키지 저장소를 확인하지 못했습니다.`,description:`OpenWrt 패키지 저장소 동기화 또는 네트워크 상태가 일시적으로 불안정할 수 있습니다. 잠시 후 업데이트 확인을 다시 실행해 주세요.`}:e.code===`UPDATES_INSTALL_FAILED`?{title:`관리 소프트웨어 업데이트 설치에 실패했습니다.`,description:`패키지 설치가 완료되지 않았습니다. 네트워크 연결과 저장 공간을 확인한 뒤 다시 시도해 주세요.`}:{title:`최근 업데이트 작업을 완료하지 못했습니다.`,description:`잠시 후 다시 시도해 주세요. 문제가 반복되면 상세 정보를 확인해 주세요.`}}function Jv(e,t){return e.phase===`checking`?`업데이트 확인 중`:e.phase===`installing`?`업데이트 설치 중`:e.phase===`error`?`확인 필요`:e.updateCount>0?`업데이트 가능`:t?`업데이트 확인 지연`:e.lastCheckAt?`최신 상태`:`확인 전`}function Yv(e,t){return e.phase===`error`?`bg-rose-50 text-rose-700 ring-rose-200`:e.phase===`checking`||e.phase===`installing`?`bg-sky-50 text-sky-700 ring-sky-200`:e.updateCount>0||t?`bg-amber-50 text-amber-800 ring-amber-200`:e.lastCheckAt?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function Xv(e,t){return e.phase===`checking`||e.phase===`installing`?z(V,{class:`size-3.5 shrink-0 animate-spin`}):e.phase===`error`?z(U,{class:`size-3.5 shrink-0`}):e.updateCount>0?z(Gt,{class:`size-3.5 shrink-0`}):t?z(U,{class:`size-3.5 shrink-0`}):e.lastCheckAt?z(H,{class:`size-3.5 shrink-0`}):z(Ht,{class:`size-3.5 shrink-0`})}function Zv({checked:e,disabled:t=!1,label:n,onChange:r}){return z(`button`,{"aria-checked":e,"aria-label":n,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${e?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:t,onClick:()=>r(!e),role:`switch`,type:`button`,children:z(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${e?`left-6`:`left-1`}`})})}function Qv({action:e,actionError:t,data:n,firmware:r,error:i,loading:a,message:o,onCheck:s,onDismissFeedback:c,onInstall:l,onRetry:u,onSaveSettings:d}){let[f,p]=M(!0),[m,h]=M(21600),[g,_]=M(!1),[y,b]=M(`03:00`),[x,S]=M(!1),[C,w]=M(!1);N(()=>{n&&!x&&(p(n.settings.checkEnabled),h(n.settings.checkIntervalSeconds),_(n.settings.autoInstall),b(n.settings.autoInstallTime))},[n,x]);let T=e===`check`||n?.phase===`checking`,E=e===`install`||n?.phase===`installing`,D=T||E,O=ug(n),k=n?.phase===`error`&&n.lastError?.code===`UPDATES_INDEX_REFRESH_FAILED`,A=n?.lastError?qv(n.lastError):null,j=n?.packages.find(e=>e.name===Uv)??n?.packages[0]??null,ee=r?.updateAvailable?r.release?.bundledSoftware?.smartsafehub:null,te=!(!n?.lastCheckAt||n.updateCount!==0||O||j?.name!==Uv)&&Fv(ee,j?.installedVersion)===`same`,ne=(e={})=>n?(e.checkEnabled??f)!==n.settings.checkEnabled||(e.checkIntervalSeconds??m)!==n.settings.checkIntervalSeconds||(e.autoInstall??g)!==n.settings.autoInstall||(e.autoInstallTime??y)!==n.settings.autoInstallTime:!1,re=async()=>{await d({checkEnabled:f,checkIntervalSeconds:m,autoInstall:g,autoInstallTime:y})&&S(!1)};return z(`article`,{class:`min-w-0 overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm shadow-slate-900/5 ${n?`grid xl:grid-cols-[minmax(0,0.95fr)_minmax(0,1.05fr)]`:``}`,"data-component":`management-software-update-card`,"data-layout":`management-software-sections`,children:[z(`section`,{class:`min-w-0 xl:col-start-1 xl:row-start-1`,"data-section":`software-update-status`,children:[z(`div`,{class:`p-5 sm:p-6`,children:[z(`div`,{class:`flex flex-col gap-5 lg:flex-row lg:items-start lg:justify-between`,children:[z(`div`,{class:`flex min-w-0 gap-4`,children:[z(`span`,{class:`grid size-12 shrink-0 place-items-center rounded-2xl bg-teal-50 text-teal-700`,children:z(Ft,{class:`size-6`})}),z(`div`,{class:`min-w-0`,children:[z(`div`,{class:`flex flex-wrap items-center gap-2`,children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-teal-700`,children:`Management software`}),n?z(`span`,{class:`inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-extrabold ring-1 ring-inset ${Yv(n,O)}`,children:[z(`span`,{"aria-hidden":`true`,class:`flex items-center justify-center`,children:Xv(n,O)}),Jv(n,O)]}):null]}),z(`h2`,{class:`mt-2 mb-0 text-xl font-black text-slate-950 sm:text-2xl`,children:`관리 소프트웨어 업데이트`}),z(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500 xl:whitespace-nowrap`,children:`새 버전을 확인하고 안전하게 설치합니다.`})]})]}),n?z(`div`,{class:`flex shrink-0 flex-col gap-2 sm:flex-row lg:justify-end`,children:[z(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-800 transition hover:bg-slate-50 disabled:cursor-wait disabled:opacity-60`,disabled:D,onClick:s,type:`button`,children:[z(V,{class:`size-4 ${T?`animate-spin`:``}`}),T?`확인 중...`:`업데이트 확인`]}),n.updateCount>0&&!C?z(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:cursor-wait disabled:opacity-60`,disabled:D,onClick:()=>w(!0),type:`button`,children:[E?z(V,{class:`size-4 animate-spin`}):z(Gt,{class:`size-4`}),E?`설치 중...`:`업데이트 설치`]}):null]}):null]}),(t||o)&&z(`div`,{class:`mt-5 flex flex-col gap-3 rounded-xl border px-4 py-3 text-sm font-bold sm:flex-row sm:items-center sm:justify-between ${t?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[z(`span`,{children:t||o}),z(`button`,{class:`shrink-0 self-start rounded-lg px-3 py-1.5 text-xs font-extrabold hover:bg-black/5 sm:self-auto`,onClick:c,type:`button`,children:`닫기`})]}),E?z(`div`,{"aria-busy":`true`,"aria-live":`polite`,class:`mt-5 rounded-xl border border-sky-200 bg-sky-50 p-4 sm:p-5`,children:[z(`div`,{class:`flex items-start gap-3`,children:[z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-sky-700 ring-1 ring-inset ring-sky-200`,children:z(V,{"aria-hidden":`true`,class:`size-5 animate-spin`})}),z(`div`,{class:`min-w-0`,children:[z(`h3`,{class:`m-0 text-sm font-black text-sky-950`,children:`관리 소프트웨어를 업데이트하고 있습니다.`}),z(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-sky-800`,children:`설치가 완료되면 이 화면이 자동으로 갱신됩니다. 작업 중에는 웹 연결이 잠시 끊길 수 있습니다.`})]})]}),z(`div`,{"aria-hidden":`true`,class:`ssh-update-progress-track mt-4`,children:z(`span`,{class:`ssh-update-progress-bar`})})]}):null,i&&!n?z(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 text-sm text-rose-800`,children:[z(`p`,{class:`m-0 font-bold`,children:i}),z(`button`,{class:`mt-3 rounded-lg border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700`,onClick:u,type:`button`,children:`다시 시도`})]}):a&&!n?z(`div`,{class:`mt-5 flex items-center gap-3 rounded-xl bg-slate-50 p-4 text-sm font-bold text-slate-500`,children:[z(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-xl bg-white text-teal-700 ring-1 ring-inset ring-slate-200`,children:z(V,{"aria-hidden":`true`,class:`size-4 animate-spin`})}),z(`span`,{children:`관리 소프트웨어 업데이트 상태를 확인하고 있습니다.`})]}):n?z(v,{children:[n.lastError&&A?z(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 sm:p-5`,children:z(`div`,{class:`flex items-start gap-3`,children:[z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-rose-700 ring-1 ring-inset ring-rose-200`,children:z(U,{class:`size-5`})}),z(`div`,{class:`min-w-0 flex-1`,children:[z(`p`,{class:`m-0 text-sm font-extrabold text-rose-950`,children:A.title}),z(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-rose-800`,children:A.description}),n.lastError.at?z(`p`,{class:`mt-2 mb-0 text-xs font-bold text-rose-700`,children:[`발생 시각 `,Wv(n.lastError.at)]}):null,z(`details`,{class:`mt-3 rounded-lg border border-rose-200 bg-white p-3`,children:[z(`summary`,{class:`cursor-pointer text-xs font-extrabold text-rose-800`,children:`상세 정보 보기`}),z(`div`,{class:`mt-3 grid gap-2 text-xs leading-5 text-slate-600`,children:[z(`p`,{class:`m-0`,children:[`오류 코드 `,z(`strong`,{class:`font-black text-slate-900`,children:n.lastError.code})]}),z(`pre`,{class:`m-0 max-h-40 overflow-auto whitespace-pre-wrap break-words rounded-lg bg-slate-50 p-3 font-mono text-[11px] leading-5 text-slate-700`,children:n.lastError.message})]})]})]})]})}):null,C?z(`div`,{class:`mt-5 flex flex-col gap-3 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:flex-row sm:items-center sm:justify-between`,children:[z(`div`,{class:`min-w-0`,children:[z(`strong`,{class:`block text-sm font-black text-amber-900`,children:`관리 소프트웨어를 지금 업데이트할까요?`}),z(`span`,{class:`mt-1 block text-xs leading-5 text-amber-800`,children:`설치 중 SmartSafeHub 웹 화면 연결이 잠시 끊길 수 있습니다.`})]}),z(`div`,{class:`flex shrink-0 gap-2`,children:[z(`button`,{class:`min-h-10 rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700`,disabled:D,onClick:()=>w(!1),type:`button`,children:`취소`}),z(`button`,{class:`min-h-10 rounded-lg bg-amber-700 px-3 py-2 text-xs font-extrabold text-white disabled:opacity-60`,disabled:D,onClick:()=>{w(!1),l()},type:`button`,children:`설치 시작`})]})]}):null]}):null]}),n?z(`div`,{class:`px-5 pb-5 sm:px-6 sm:pb-6`,children:[z(`h3`,{class:`mb-3 text-sm font-black text-slate-950`,children:`현재 상태`}),z(`dl`,{class:`grid overflow-hidden rounded-xl border border-slate-200 bg-slate-200 sm:grid-cols-2`,children:[z(`div`,{class:`bg-white p-4`,children:[z(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Installed`}),z(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black text-slate-950`,children:j?.installedVersion||`미확인`})]}),z(`div`,{class:`bg-white p-4`,children:[z(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Available`}),z(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black ${j?.updateAvailable||O?`text-amber-700`:`text-slate-950`}`,children:!n.lastCheckAt||k&&!j?.updateAvailable?`미확인`:j?.updateAvailable&&j.availableVersion?j.availableVersion:O?`확인 필요`:`최신 버전`})]}),z(`div`,{class:`bg-white p-4`,children:[z(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Last check`}),z(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-black text-slate-950`,children:z(P_,{fallback:`아직 없음`,timestamp:n.lastCheckAt})})]}),z(`div`,{class:`bg-white p-4`,children:[z(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Auto install`}),z(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-black text-slate-950`,children:n.settings.autoInstall?`켜짐 · ${n.settings.autoInstallTime}`:`꺼짐`})]})]})]}):null,n&&n.updateCount===0&&n.lastCheckAt?O?z(`section`,{class:`mx-5 mb-5 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:mx-6 sm:mb-6 sm:p-5`,"data-section":`software-update-result`,children:z(`div`,{class:`flex gap-3`,children:[z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-amber-700 ring-1 ring-inset ring-amber-200`,children:z(U,{class:`size-5`})}),z(`div`,{children:[z(`h3`,{class:`m-0 text-base font-black text-amber-950`,children:`업데이트 확인이 지연되고 있습니다.`}),z(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-amber-800`,children:[`마지막 업데이트 확인: `,z(P_,{timestamp:n.lastCheckAt}),`. 자동 확인 상태를 점검하거나 업데이트 확인을 실행해 주세요.`]})]})]})}):z(`section`,{class:`mx-5 mb-5 rounded-xl border border-emerald-200 bg-emerald-50 p-4 sm:mx-6 sm:mb-6 sm:p-5`,"data-section":`software-update-result`,children:z(`div`,{class:`flex gap-3`,children:[z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-emerald-700`,children:z(H,{class:`size-5`})}),z(`div`,{children:[z(`h3`,{class:`m-0 text-base font-black text-emerald-950`,children:`최신 버전을 사용 중입니다.`}),z(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-emerald-800`,children:[`마지막 업데이트 확인: `,z(P_,{timestamp:n.lastCheckAt}),`.`]}),te?z(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-emerald-800`,"data-section":`software-firmware-match`,children:[`새 펌웨어에도 동일한 관리 소프트웨어(`,ee,`)가 포함되어 있어 별도로 업데이트할 필요가 없습니다.`]}):null]})]})}):null,n&&n.updateCount===0&&!n.lastCheckAt?z(`section`,{class:`mx-5 mb-5 rounded-xl border border-slate-200 bg-slate-50 p-4 sm:mx-6 sm:mb-6 sm:p-5`,"data-section":`software-update-result`,children:z(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between`,children:[z(`div`,{class:`flex min-w-0 gap-3`,children:[z(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-slate-500 ring-1 ring-inset ring-slate-200`,children:z(V,{class:`size-5`})}),z(`div`,{class:`min-w-0`,children:[z(`h3`,{class:`m-0 text-base font-black text-slate-900`,children:`업데이트 상태를 아직 확인하지 않았습니다.`}),z(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-600`,children:`업데이트 확인을 실행하면 현재 설치 버전과 사용 가능한 최신 버전을 확인합니다.`})]})]}),z(`button`,{class:`inline-flex min-h-10 shrink-0 items-center justify-center gap-2 rounded-xl border border-slate-300 bg-white px-4 py-2 text-sm font-extrabold text-slate-800 transition hover:border-teal-300 hover:text-teal-700 disabled:cursor-wait disabled:opacity-60`,disabled:D,onClick:s,type:`button`,children:[z(V,{class:`size-4`}),`지금 확인`]})]})}):null]}),n?z(v,{children:[z(`section`,{class:`min-w-0 border-t border-slate-200 p-5 sm:p-6 xl:col-start-2 xl:row-start-1 xl:row-span-2 xl:self-stretch xl:border-t-0 xl:border-l`,"data-section":`software-update-settings`,children:[z(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between`,children:[z(`div`,{class:`flex min-w-0 gap-4`,children:[z(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-600`,children:z(It,{class:`size-5`})}),z(`div`,{class:`min-w-0`,children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Settings`}),z(`h3`,{class:`mt-2 mb-0 text-lg font-black text-slate-950`,children:`자동 업데이트`}),z(`p`,{class:`mt-2 mb-0 max-w-3xl text-sm leading-6 text-slate-500`,children:`관리 소프트웨어의 자동 확인과 자동 설치를 설정합니다.`})]})]}),x?z(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 self-start items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[z(U,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]}):null]}),z(`div`,{class:`ssh-software-settings-grid mt-4`,children:[z(`div`,{class:`ssh-software-settings-channel rounded-xl border border-slate-200 p-4 sm:p-5`,children:z(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[z(`div`,{class:`min-w-0`,children:[z(`strong`,{class:`block text-sm font-black text-slate-950`,children:`업데이트 채널`}),z(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:`현재 관리 소프트웨어 업데이트를 확인하는 배포 채널입니다.`})]}),z(`span`,{class:`inline-flex min-h-9 shrink-0 items-center justify-center rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${Kv(n.settings.channel)}`,title:`현재 업데이트 확인 채널`,children:Gv(n.settings.channel)})]})}),z(`div`,{class:`min-w-0 overflow-hidden rounded-xl border border-slate-200 p-4 sm:p-5`,children:[z(`div`,{class:`flex min-w-0 items-start justify-between gap-4`,children:[z(`div`,{class:`min-w-0`,children:z(`strong`,{class:`block text-sm font-black text-slate-950`,children:`자동으로 업데이트 확인`})}),z(Zv,{checked:f,label:`자동 업데이트 확인`,onChange:e=>{p(e),S(ne({checkEnabled:e}))}})]}),z(`div`,{class:`mt-4 block`,children:[z(`span`,{class:`text-xs font-extrabold text-slate-700`,children:`확인 주기`}),z(Vg,{ariaLabel:`업데이트 확인 주기`,className:`mt-2`,disabled:!f,id:`software-update-check-interval`,onChange:e=>{let t=Number(e);h(t),S(ne({checkIntervalSeconds:t}))},options:Hv.map(e=>({value:String(e.value),label:e.label})),value:String(m),variant:`emphasized`})]})]}),z(`div`,{class:`min-w-0 overflow-hidden rounded-xl border border-slate-200 p-4 sm:p-5`,children:[z(`div`,{class:`flex min-w-0 items-start justify-between gap-4`,children:[z(`div`,{class:`min-w-0`,children:z(`strong`,{class:`block text-sm font-black text-slate-950`,children:`자동으로 업데이트 설치`})}),z(Zv,{checked:g,label:`자동 업데이트 설치`,onChange:e=>{_(e),S(ne({autoInstall:e}))}})]}),z(`div`,{class:`mt-4 min-w-0`,children:[z(`span`,{class:`text-xs font-extrabold text-slate-700`,children:`설치 시각`}),z(dv,{ariaLabel:`자동 업데이트 설치 시각`,className:`mt-2`,disabled:!g,id:`software-update-auto-install-time`,onChange:e=>{b(e),S(ne({autoInstallTime:e}))},value:y,variant:`emphasized`})]})]})]}),g?z(`p`,{class:`mt-4 mb-0 rounded-xl bg-amber-50 px-4 py-3 text-xs font-bold leading-5 text-amber-800`,children:`자동 설치 중에는 SmartSafeHub 웹 화면 연결이 잠시 끊길 수 있습니다.`}):null,z(`div`,{class:`mt-5 flex flex-col gap-3 border-t border-slate-100 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[z(`p`,{class:`m-0 text-xs leading-5 text-slate-500`,children:[`마지막 설치: `,Wv(n.lastInstallAt)]}),z(`button`,{class:`inline-flex min-h-11 items-center justify-center rounded-xl bg-slate-900 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-slate-800 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!x||e===`settings`||D,onClick:()=>void re(),type:`button`,children:e===`settings`?`저장 중`:`자동 업데이트 설정 저장`})]})]}),n.updateCount>0?z(`section`,{class:`border-t border-slate-200 p-5 sm:p-6 xl:col-start-1 xl:row-start-2`,"data-section":`software-update-release-notes`,children:[z(`div`,{class:`flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-4`,children:[z(`div`,{children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-teal-700`,children:`Release notes`}),z(`h3`,{class:`mt-2 mb-0 text-lg font-black text-slate-950`,children:`업데이트 내용`}),z(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500`,children:`현재 설치된 버전 이후 포함되는 주요 변경 사항입니다.`})]}),n.releaseNotes.length?z(`span`,{class:`shrink-0 rounded-full bg-slate-100 px-3 py-1.5 text-xs font-extrabold text-slate-600`,children:n.releaseNotes.length===1?`1개 릴리즈`:`${n.releaseNotes.length}개 릴리즈`}):null]}),n.releaseNotes.length?z(`div`,{class:`mt-5 grid gap-3`,children:[n.releaseNotes.map(e=>z(`article`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4 sm:p-5`,children:[z(`div`,{class:`flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between sm:gap-4`,children:[z(`strong`,{class:`break-all text-sm font-black text-slate-950`,children:e.version}),e.date?z(`span`,{class:`text-xs font-bold text-slate-500`,children:e.date}):null]}),e.summary?z(`p`,{class:`mt-3 mb-0 text-sm leading-6 text-slate-700`,children:e.summary}):null,e.sections.length?z(`details`,{class:`mt-4 rounded-lg border border-slate-200 bg-white p-3`,open:n.releaseNotes.length===1,children:[z(`summary`,{class:`cursor-pointer text-xs font-extrabold text-slate-800`,children:`자세한 변경 사항`}),z(`div`,{class:`mt-3 grid gap-4`,children:e.sections.map(t=>z(`section`,{children:[z(`h4`,{class:`m-0 text-xs font-extrabold text-slate-700`,children:t.title}),z(`ul`,{class:`mt-2 mb-0 space-y-1.5 pl-5 text-xs leading-5 text-slate-600`,children:t.items.map((n,r)=>z(`li`,{children:n},`${e.version}-${t.title}-${r}`))})]},`${e.version}-${t.title}`))})]}):null]},e.version)),n.releaseNotesComplete?null:z(`p`,{class:`m-0 rounded-xl bg-amber-50 px-4 py-3 text-xs font-bold leading-5 text-amber-800`,children:`일부 릴리즈 노트를 불러오지 못했습니다. 업데이트 확인과 설치는 계속 사용할 수 있습니다.`})]}):z(`p`,{class:`mt-4 mb-0 rounded-xl bg-slate-50 px-4 py-3 text-sm text-slate-500`,children:`릴리즈 노트를 불러오지 못했습니다. 업데이트 확인과 설치는 계속 사용할 수 있습니다.`})]}):null]}):null]})}function $v({action:e,actionError:t,data:n,error:r,firmware:i,loading:a,message:o,onCheck:s,onDismissFeedback:c,onInstall:l,onRetry:u,onSaveSettings:d}){return z(`section`,{class:`min-w-0 space-y-5`,children:[z(`div`,{children:z(q,{eyebrow:`Firmware`,title:`시스템 펌웨어`,description:`공유기 운영체제의 새 버전을 확인하고 설치합니다.`})}),z(Vv,{action:i.action,actionError:i.actionError,data:i.data,software:n,error:i.error,loading:i.loading,message:i.message,reconnecting:i.reconnecting,uploadProgress:i.uploadProgress,onCheck:()=>void i.check(),onDiscard:i.discard,onDismissFeedback:i.dismissFeedback,onInstall:i.install,onPrepare:()=>void i.prepare(),onRetry:()=>void i.refresh(),onUpload:i.upload}),z(`div`,{class:`pt-2`,children:z(q,{eyebrow:`Software`,title:`관리 소프트웨어`,description:`SmartSafeHub 관리 화면 및 서비스의 업데이트를 확인합니다.`})}),z(Qv,{firmware:i.data,action:e,actionError:t,data:n,error:r,loading:a,message:o,onCheck:s,onDismissFeedback:c,onInstall:l,onRetry:u,onSaveSettings:d})]})}var ey={};ey.QR8bitByte=(e,t)=>{var n=t("QRMode");function r(e){this.mode=n.MODE_8BIT_BYTE,this.data=e}r.prototype={getLength:function(){return this.data.length},write:function(e){for(var t=0;t{function n(){this.buffer=[],this.length=0}n.prototype={get:function(e){var t=Math.floor(e/8);return(this.buffer[t]>>>7-e%8&1)==1},put:function(e,t){for(var n=0;n>>t-n-1&1)==1)},getLengthInBits:function(){return this.length},putBit:function(e){var t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},e.exports=n},ey.QRErrorCorrectLevel=(e,t)=>{e.exports={L:1,M:0,Q:3,H:2}},ey.QRMaskPattern=(e,t)=>{e.exports={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7}},ey.QRMath=(e,t)=>{for(var n={glog:function(e){if(e<1)throw Error(`glog(`+e+`)`);return n.LOG_TABLE[e]},gexp:function(e){for(;e<0;)e+=255;for(;e>=256;)e-=255;return n.EXP_TABLE[e]},EXP_TABLE:Array(256),LOG_TABLE:Array(256)},r=0;r<8;r++)n.EXP_TABLE[r]=1<{e.exports={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8}},ey.QRPolynomial=(e,t)=>{var n=t("QRMath");function r(e,t){if(e.length===void 0)throw Error(e.length+`/`+t);for(var n=0;n{var n=t("QRErrorCorrectLevel");function r(e,t){this.totalCount=e,this.dataCount=t}r.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],r.getRSBlocks=function(e,t){var n=r.getRsBlockTable(e,t);if(n===void 0)throw Error(`bad rs block @ typeNumber:`+e+`/errorCorrectLevel:`+t);for(var i=n.length/3,a=[],o=0;o{var n=t("QRMode"),r=t("QRPolynomial"),i=t("QRMath"),a=t("QRMaskPattern"),o={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(e){for(var t=e<<10;o.getBCHDigit(t)-o.getBCHDigit(o.G15)>=0;)t^=o.G15<=0;)t^=o.G18<>>=1;return t},getPatternPosition:function(e){return o.PATTERN_POSITION_TABLE[e-1]},getMask:function(e,t,n){switch(e){case a.PATTERN000:return(t+n)%2==0;case a.PATTERN001:return t%2==0;case a.PATTERN010:return n%3==0;case a.PATTERN011:return(t+n)%3==0;case a.PATTERN100:return(Math.floor(t/2)+Math.floor(n/3))%2==0;case a.PATTERN101:return t*n%2+t*n%3==0;case a.PATTERN110:return(t*n%2+t*n%3)%2==0;case a.PATTERN111:return(t*n%3+(t+n)%2)%2==0;default:throw Error(`bad maskPattern:`+e)}},getErrorCorrectPolynomial:function(e){for(var t=new r([1],0),n=0;n5&&(n+=3+a-5)}for(r=0;r{var n=t("QR8bitByte"),r=t("QRUtil"),i=t("QRPolynomial"),a=t("QRRSBlock"),o=t("QRBitBuffer");function s(e,t){this.typeNumber=e,this.errorCorrectLevel=t,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}s.prototype={addData:function(e){var t=new n(e);this.dataList.push(t),this.dataCache=null},isDark:function(e,t){if(e<0||this.moduleCount<=e||t<0||this.moduleCount<=t)throw Error(e+`,`+t);return this.modules[e][t]},getModuleCount:function(){return this.moduleCount},make:function(){if(this.typeNumber<1){var e=1;for(e=1;e<40;e++){for(var t=a.getRSBlocks(e,this.errorCorrectLevel),n=new o,i=0,s=0;s=7&&this.setupTypeNumber(e),this.dataCache===null&&(this.dataCache=s.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,t)},setupPositionProbePattern:function(e,t){for(var n=-1;n<=7;n++)if(!(e+n<=-1||this.moduleCount<=e+n))for(var r=-1;r<=7;r++)t+r<=-1||this.moduleCount<=t+r||(0<=n&&n<=6&&(r===0||r===6)||0<=r&&r<=6&&(n===0||n===6)||2<=n&&n<=4&&2<=r&&r<=4?this.modules[e+n][t+r]=!0:this.modules[e+n][t+r]=!1)},getBestMaskPattern:function(){for(var e=0,t=0,n=0;n<8;n++){this.makeImpl(!0,n);var i=r.getLostPoint(this);(n===0||e>i)&&(e=i,t=n)}return t},createMovieClip:function(e,t,n){var r=e.createEmptyMovieClip(t,n),i=1;this.make();for(var a=0;a>i&1)==1,this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=n;for(var a=0;a<18;a++)n=!e&&(t>>a&1)==1,this.modules[a%3+this.moduleCount-8-3][Math.floor(a/3)]=n},setupTypeInfo:function(e,t){for(var n=this.errorCorrectLevel<<3|t,i=r.getBCHTypeInfo(n),a,o=0;o<15;o++)a=!e&&(i>>o&1)==1,o<6?this.modules[o][8]=a:o<8?this.modules[o+1][8]=a:this.modules[this.moduleCount-15+o][8]=a;for(var s=0;s<15;s++)a=!e&&(i>>s&1)==1,s<8?this.modules[8][this.moduleCount-s-1]=a:s<9?this.modules[8][15-s-1+1]=a:this.modules[8][15-s-1]=a;this.modules[this.moduleCount-8][8]=!e},mapData:function(e,t){for(var n=-1,i=this.moduleCount-1,a=7,o=0,s=this.moduleCount-1;s>0;s-=2)for(s===6&&s--;;){for(var c=0;c<2;c++)if(this.modules[i][s-c]===null){var l=!1;o>>a&1)==1),r.getMask(t,i,s-c)&&(l=!l),this.modules[i][s-c]=l,a--,a===-1&&(o++,a=7)}if(i+=n,i<0||this.moduleCount<=i){i-=n,n=-n;break}}}},s.PAD0=236,s.PAD1=17,s.createData=function(e,t,n){for(var i=a.getRSBlocks(e,t),c=new o,l=0;ld*8)throw Error(`code length overflow. (`+c.getLengthInBits()+`>`+d*8+`)`);for(c.getLengthInBits()+4<=d*8&&c.put(0,4);c.getLengthInBits()%8!=0;)c.putBit(!1);for(;!(c.getLengthInBits()>=d*8||(c.put(s.PAD0,8),c.getLengthInBits()>=d*8));)c.put(s.PAD1,8);return s.createBytes(c,i)},s.createBytes=function(e,t){for(var n=0,a=0,o=0,s=Array(t.length),c=Array(t.length),l=0;l=0?m.get(g):0}}for(var _=0,v=0;vString.fromCharCode(e)).join(``),r=new(ny(`index`))(0,ny(`QRErrorCorrectLevel`).M);r.addData(n),r.make();let i=r.getModuleCount();return Array.from({length:i},(e,t)=>Array.from({length:i},(e,n)=>!!r.isDark(t,n)))}function iy(e,t,n){let r=e=>e.replace(/([\\;,:"])/g,`\\$1`);return`WIFI:T:${t===`none`?`nopass`:t===`sae`?`WPA3`:`WPA`};S:${r(e)};P:${r(n)};;`}function ay(e){return`${(e.replace(/[\\/:*?"<>|\x00-\x1f\x7f]/g,`_`).replace(/[. ]+$/g,``).trim()||`Wi-Fi`).slice(0,64)}-QR.png`}function oy(e,t,n=8){let r=(e.length+8)*n;t.fillStyle=`#ffffff`,t.fillRect(0,0,r,r),t.fillStyle=`#000000`,e.forEach((e,r)=>e.forEach((e,i)=>{e&&t.fillRect((i+4)*n,(r+4)*n,n,n)}))}function sy({load:e,onClose:t}){let[n,r]=M(null),[i,a]=M(null),[o,s]=M(null);N(()=>{let t=!0;return e().then(e=>{if(t)try{r({ssid:e.ssid,matrix:ry(iy(e.ssid,e.security,e.password))})}catch{a(`QR 코드를 생성할 수 없습니다.`)}}).catch(()=>{t&&a(`Wi-Fi 정보를 불러오지 못했습니다.`)}),()=>{t=!1,r(null)}},[e]);let c=n?.matrix.length??0;return z(`div`,{class:`fixed inset-0 z-50 flex items-center justify-center bg-slate-950/70 p-4`,role:`presentation`,onClick:e=>{e.target===e.currentTarget&&t()},children:z(`section`,{role:`dialog`,"aria-modal":`true`,"aria-label":`Wi-Fi QR 코드`,class:`w-full max-w-sm rounded-2xl bg-white p-5 text-center text-slate-950 shadow-2xl sm:p-7`,children:[z(`h2`,{class:`m-0 text-xl font-extrabold`,children:`Wi-Fi QR 코드`}),z(`p`,{class:`mt-2 break-all text-sm font-semibold text-slate-600`,children:n?.ssid??`Wi-Fi 정보를 확인하는 중`}),i?z(`p`,{role:`alert`,class:`my-6 text-sm font-bold text-red-700`,children:i}):null,!n&&!i?z(`p`,{class:`my-6 text-sm`,children:`QR 코드를 만드는 중...`}):null,n?z(`div`,{class:`mx-auto my-5 w-full max-w-[288px] rounded-xl border border-slate-200 bg-white p-3`,children:z(`svg`,{class:`block h-auto w-full`,viewBox:`0 0 ${c+8} ${c+8}`,role:`img`,"aria-label":`${n.ssid} Wi-Fi 연결 QR 코드`,"shape-rendering":`crispEdges`,children:[z(`rect`,{width:c+8,height:c+8,fill:`white`}),n.matrix.map((e,t)=>e.map((e,n)=>e?z(`rect`,{x:n+4,y:t+4,width:`1`,height:`1`,fill:`black`},`${t}-${n}`):null))]})}):null,z(`p`,{class:`text-xs leading-5 text-slate-500`,children:[z(`span`,{class:`block`,children:`카메라로 스캔해 Wi-Fi에 연결하세요.`}),z(`span`,{class:`block`,children:`QR 코드에는 비밀번호가 포함됩니다.`})]}),o?z(`p`,{role:`alert`,class:`mt-3 text-sm font-bold text-red-700`,children:o}):null,n?z(`button`,{class:`mt-5 inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl bg-teal-700 px-4 font-extrabold text-white transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200`,onClick:()=>{if(n){s(null);try{let e=(n.matrix.length+8)*8,t=document.createElement(`canvas`);t.width=e,t.height=e;let r=t.getContext(`2d`);if(!r)throw Error(`Canvas is not supported`);oy(n.matrix,r,8);let i=document.createElement(`a`);i.href=t.toDataURL(`image/png`),i.download=ay(n.ssid),i.click()}catch{s(`QR 코드 이미지를 저장하지 못했습니다. 다시 시도해 주세요.`)}}},type:`button`,children:[z(Gt,{class:`size-5`}),`QR 코드 다운로드`]}):null,z(`button`,{class:`mt-2 min-h-11 w-full rounded-xl border border-slate-300 bg-white px-4 font-extrabold text-slate-700 transition hover:bg-slate-50`,onClick:t,type:`button`,children:`닫기`})]})})}function cy({guest:e,busy:t,saving:n,onUpdate:r,onLoadQr:i}){let[a,o]=M(!1),[s,c]=M(!1),[l,u]=M(e.ssid),[d,f]=M(``),[p,m]=M(e.enabled),[h,g]=M(null);if(N(()=>{u(e.ssid),m(e.enabled),f(``),g(null)},[e]),!e.supported)return z(`section`,{class:`mt-5 rounded-2xl border border-slate-200 bg-white p-5 sm:p-6`,children:[z(`h2`,{class:`m-0 text-lg font-extrabold text-slate-900`,children:`게스트 Wi-Fi`}),z(`p`,{class:`mt-2 mb-0 text-sm text-slate-600`,children:`2.4GHz 기본 Wi-Fi 장치를 찾지 못해 게스트 Wi-Fi를 사용할 수 없습니다.`})]});let _=l.trim()!==e.ssid||p!==e.enabled||d.length>0,y=t||_||!e.enabled||!e.passwordConfigured,b=async t=>{t.preventDefault();let n=l.trim(),i=new TextEncoder().encode(n).length;i<1||i>32?g(`Wi-Fi 이름은 UTF-8 기준 1~32바이트로 입력해 주세요.`):d&&!(d.length>=8&&d.length<=63||/^[0-9a-fA-F]{64}$/.test(d))?g(`비밀번호는 8~63자 또는 64자리 16진수여야 합니다.`):p&&!e.passwordConfigured&&!d?g(`게스트 전용 비밀번호를 입력해 주세요.`):window.confirm(`게스트 Wi-Fi 설정을 적용하면 무선 연결이 잠시 끊어질 수 있습니다. 계속하시겠습니까?`)&&(g(null),await r({ssid:n,enabled:p,password:d})&&f(``))};return z(v,{children:[z(`form`,{"aria-label":`게스트 Wi-Fi 설정`,class:`mt-5 rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void b(e),children:[z(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between`,children:[z(`button`,{"aria-controls":`ssh-guest-settings`,"aria-expanded":a,"aria-label":`게스트 Wi-Fi 설정 ${a?`접기`:`펼치기`}`,class:`flex min-w-0 flex-1 items-start gap-3 rounded-xl text-left focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:()=>o(e=>!e),type:`button`,children:[z(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:z(jt,{class:`size-6`})}),z(`span`,{class:`min-w-0 flex-1`,children:[z(`span`,{class:`block text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`2.4 GHz · 분리 네트워크`}),z(`span`,{class:`mt-2 block text-xl font-extrabold tracking-tight text-slate-950`,children:`게스트 Wi-Fi`}),z(`span`,{class:`mt-2 block break-all text-sm text-slate-600`,children:e.ssid})]}),z(an,{class:`mt-3 size-5 shrink-0 text-slate-500 transition-transform ${a?`rotate-180`:``}`})]}),z(`div`,{class:`flex flex-wrap items-center gap-2 sm:justify-end`,children:[_&&z(`span`,{"aria-live":`polite`,class:`inline-flex items-center gap-1 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,children:[z(U,{class:`size-3.5`}),`저장되지 않음`]}),z(`button`,{"aria-label":`게스트 Wi-Fi QR 코드 보기`,class:`inline-flex min-h-10 items-center gap-2 rounded-xl border border-slate-300 bg-white px-3.5 py-2 text-sm font-extrabold text-slate-800 transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:y,onClick:()=>c(!0),title:e.enabled?void 0:`게스트 Wi-Fi를 켜고 저장하면 QR 코드를 사용할 수 있습니다.`,type:`button`,children:[z(Rt,{class:`size-4 shrink-0`}),`QR 코드 보기`]}),z(`span`,{class:`rounded-full px-3 py-1.5 text-xs font-extrabold ${e.enabled?`bg-emerald-50 text-emerald-700`:`bg-slate-100 text-slate-600`}`,children:e.enabled?`사용 중`:`꺼짐`})]})]}),z(`div`,{class:a?``:`hidden`,id:`ssh-guest-settings`,children:[z(`p`,{class:`mt-5 mb-0 text-sm leading-6 text-slate-600`,children:`방문자는 인터넷만 이용하며 내부 네트워크와 공유기 관리 화면에는 접근할 수 없습니다.`}),z(`div`,{class:`mt-5 grid gap-5 lg:grid-cols-2`,children:[z(`label`,{class:`block`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`게스트 Wi-Fi 이름 (SSID)`}),z(`input`,{autocomplete:`off`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 outline-none focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:opacity-60`,disabled:t,maxLength:32,onInput:e=>u(e.currentTarget.value),value:l})]}),z(`label`,{class:`block`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`게스트 Wi-Fi 비밀번호`}),z(`input`,{autocomplete:`new-password`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 outline-none focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:opacity-60`,disabled:t,onInput:e=>f(e.currentTarget.value),placeholder:e.passwordConfigured?`비워 두면 기존 비밀번호 유지`:`8자 이상의 별도 비밀번호 입력`,type:`password`,value:d}),z(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`WPA2/WPA3 혼합 · 기본 Wi-Fi와 다른 비밀번호를 권장합니다.`})]})]}),z(`div`,{class:`mt-5 rounded-xl bg-slate-50 px-4 py-3 text-sm leading-6 text-slate-700`,children:[`내부망 접근 차단 · 게스트 기기 간 통신 차단 · SafeShield DNS 사용`,e.subnet&&z(`span`,{class:`block text-xs text-slate-500`,children:[`게스트 게이트웨이: `,e.subnet]})]}),z(`div`,{class:`mt-5 flex flex-col gap-4 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[z(`label`,{class:`inline-flex min-h-11 items-center gap-3 text-sm font-extrabold text-slate-800`,children:[z(`input`,{checked:p,class:`size-5 accent-teal-700`,disabled:t,onChange:e=>m(e.currentTarget.checked),type:`checkbox`}),`게스트 Wi-Fi 사용`]}),z(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:opacity-60 sm:w-auto`,disabled:t||!_,type:`submit`,children:[z(H,{class:`size-5 ${n?`animate-pulse`:``}`}),n?`적용 중`:`설정 저장`]})]}),h&&z(`p`,{class:`mt-4 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:h})]})]}),s&&z(sy,{load:i,onClose:()=>c(!1)})]})}var ly=[{value:`sae-mixed`,label:`WPA2/WPA3 혼합 (권장)`},{value:`sae`,label:`WPA3-Personal`},{value:`psk2`,label:`WPA2-Personal`},{value:`none`,label:`암호화 없음`}];function uy(e){switch(e.security){case`sae-mixed`:return`WPA2/WPA3 혼합`;case`sae`:return`WPA3-Personal`;case`psk2`:return`WPA2-Personal`;case`none`:return`암호화 없음`;default:return`고급 설정 (${e.securityRaw})`}}function dy(e){return e.length>=8&&e.length<=63||/^[0-9a-fA-F]{64}$/.test(e)}function fy({network:e,busy:t,saving:n,onUpdate:r,onLoadQr:i}){let[a,o]=M(e.ssid),[s,c]=M(e.enabled),[l,u]=M(e.security===`custom`?`keep`:e.security),[d,f]=M(``),[p,m]=M(!1),h=F(()=>i(e.section),[i,e.section]),[g,_]=M(null);N(()=>{o(e.ssid),c(e.enabled),u(e.security===`custom`?`keep`:e.security),f(``),_(null)},[e]);let v=e.security===`custom`&&l===`keep`,y=l===`psk2`||l===`sae-mixed`||l===`sae`,b=e.security===`custom`?`keep`:e.security,x=a.trim()!==e.ssid||s!==e.enabled||l!==b||d.length>0,S=t||x||e.security===`custom`||!e.enabled||e.security!==`none`&&!e.passwordConfigured,C=[...e.security===`custom`?[{value:`keep`,label:`현재 고급 설정 유지 (${e.securityRaw})`}]:[],...ly],w=async t=>{t.preventDefault();let n=a.trim(),i=new TextEncoder().encode(n).length;i<1||i>32?_(`SSID는 UTF-8 기준 1~32바이트로 입력해 주세요.`):d&&!dy(d)?_(`비밀번호는 8~63자 또는 64자리 16진수여야 합니다.`):y&&!e.passwordConfigured&&d.length===0?_(`보안 Wi-Fi를 사용하려면 비밀번호를 입력해 주세요.`):window.confirm(`Wi-Fi 설정을 적용하면 현재 무선 연결이 잠시 끊어질 수 있습니다. 계속하시겠습니까?`)&&(_(null),await r({section:e.section,ssid:n,security:l,password:d,enabled:s})&&f(``))};return z(`form`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void w(e),children:[z(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between`,children:[z(`div`,{class:`flex min-w-0 items-start gap-3`,children:[z(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:z(jt,{class:`size-6`})}),z(`div`,{class:`min-w-0`,children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:e.bandLabel}),z(`h2`,{class:`mt-2 mb-0 break-words text-xl font-extrabold tracking-tight text-slate-950`,children:e.ssid||`이름 없는 Wi-Fi`}),z(`p`,{class:`mt-2 mb-0 text-sm text-slate-600`,children:[`채널 `,e.channel??`자동`,` · 연결 기기 `,e.clientCount,`대`]})]})]}),z(`div`,{class:`flex flex-wrap items-center gap-2 sm:justify-end`,children:[x?z(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[z(U,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]}):null,z(`button`,{"aria-label":`${e.bandLabel} Wi-Fi QR 코드 보기`,class:`inline-flex min-h-10 items-center gap-2 rounded-xl border border-slate-300 bg-white px-3.5 py-2 text-sm font-extrabold text-slate-800 shadow-sm transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:S,onClick:()=>m(!0),type:`button`,children:[z(Rt,{class:`size-4 shrink-0`}),`QR 코드 보기`]}),z(`span`,{class:`inline-flex w-fit items-center gap-2 rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${e.runtimeUp?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}`,children:[z(`span`,{class:`size-2 rounded-full ${e.runtimeUp?`bg-emerald-500`:`bg-slate-400`}`}),e.runtimeUp?`동작 중`:e.enabled?`시작 대기`:`꺼짐`]})]})]}),z(`div`,{class:`mt-6 grid gap-5 lg:grid-cols-2`,children:[z(`label`,{class:`block`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`Wi-Fi 이름 (SSID)`}),z(`input`,{autocomplete:`off`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:t,maxLength:32,onInput:e=>o(e.currentTarget.value),value:a})]}),z(`div`,{class:`block`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`보안 방식`}),z(Vg,{ariaLabel:`${e.bandLabel} Wi-Fi 보안 방식`,className:`mt-2`,disabled:t,id:`wifi-security-${e.section}`,onChange:e=>{let t=e;u(t),(t===`none`||t===`keep`)&&f(``)},options:C,value:l,variant:`emphasized`}),z(`span`,{class:`mt-2 block text-xs text-slate-500`,children:[`현재: `,uy(e)]})]}),z(`label`,{class:`block lg:col-span-2`,children:[z(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`새 비밀번호`}),z(`input`,{autocomplete:`new-password`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:t||l===`none`||v,onInput:e=>f(e.currentTarget.value),placeholder:v?`고급 보안 설정은 기존 LuCI에서 변경합니다`:e.passwordConfigured?`비워 두면 기존 비밀번호를 유지합니다`:`8자 이상의 비밀번호를 입력하세요`,type:`password`,value:d}),z(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`저장된 비밀번호는 일반 설정 조회에 노출되지 않습니다. QR 코드에는 비밀번호가 포함됩니다.`})]})]}),z(`div`,{class:`mt-6 flex flex-col gap-4 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[z(`label`,{class:`inline-flex min-h-11 items-center gap-3 text-sm font-extrabold text-slate-800`,children:[z(`input`,{checked:s,class:`size-5 accent-teal-700`,disabled:t,onChange:e=>c(e.currentTarget.checked),type:`checkbox`}),`이 Wi-Fi 사용`]}),z(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl border-0 bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white shadow-sm transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:t||!x,type:`submit`,children:[z(H,{class:`size-5 ${n?`animate-pulse`:``}`}),n?`적용 중`:`설정 저장`]})]}),p?z(sy,{load:h,onClose:()=>m(!1)}):null,g?z(`p`,{class:`mt-4 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:g}):null]})}function py({feedback:e,onDismiss:t}){return z(`div`,{"aria-live":`polite`,class:`mb-5 flex flex-col gap-3 rounded-2xl border px-4 py-3 text-sm sm:flex-row sm:items-center sm:justify-between ${e.kind===`success`?`border-emerald-200 bg-emerald-50 text-emerald-900`:e.kind===`warning`?`border-amber-200 bg-amber-50 text-amber-900`:`border-red-200 bg-red-50 text-red-900`}`,children:[z(`p`,{class:`m-0 font-bold leading-6`,children:e.message}),z(`button`,{class:`min-h-11 w-full shrink-0 rounded-lg border border-current bg-transparent sm:min-h-9 sm:w-auto px-3 py-1.5 text-xs font-extrabold`,onClick:t,type:`button`,children:`닫기`})]})}function my({data:e,error:t,feedback:n,loading:r,updatingSection:i,onDismissFeedback:a,onRetry:o,onUpdate:s,onUpdateGuest:c,onLoadQr:l,onLoadGuestQr:u}){return r?z(bo,{}):t?z(xo,{message:t,onRetry:o}):e?z(v,{children:[n?z(py,{feedback:n,onDismiss:a}):null,z(`section`,{class:`mb-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-amber-950 sm:p-6`,children:[z(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-amber-700`,children:`연결 주의`}),z(`h2`,{class:`mt-2 mb-0 text-lg font-extrabold`,children:`Wi-Fi 이름이나 비밀번호를 바꾸면 현재 연결이 끊어집니다`}),z(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-amber-900/80`,children:`변경한 Wi-Fi 이름과 비밀번호로 다시 연결하면 SmartSafeHub를 계속 사용할 수 있습니다. VLAN 등 고급 무선 옵션은 기존 LuCI에서 관리합니다.`})]}),z(q,{eyebrow:`Wireless`,title:`기본 Wi-Fi`,description:`무선 네트워크의 이름, 비밀번호, 보안 방식과 QR 코드를 관리합니다.`}),e.networks.length?z(`section`,{"aria-label":`기본 Wi-Fi 설정`,class:`grid gap-5 xl:grid-cols-2`,children:e.networks.map(e=>z(fy,{busy:i!==null,network:e,onUpdate:s,onLoadQr:l,saving:i===e.section},e.section))}):z(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 text-center shadow-sm shadow-slate-900/5 sm:p-8`,children:[z(jt,{class:`mx-auto size-10 text-slate-400`}),z(`h2`,{class:`mt-4 mb-0 text-lg font-extrabold text-slate-950`,children:`관리할 기본 Wi-Fi를 찾지 못했습니다`}),z(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:`기존 LuCI에서 AP 모드의 무선 네트워크를 먼저 구성해 주세요.`})]}),e.guest&&z(v,{children:[z(`div`,{role:`separator`,"aria-label":`기본 Wi-Fi와 게스트 Wi-Fi 구분`,class:`mt-5 w-full border-t border-slate-200`}),z(`div`,{class:`mt-5`,children:z(q,{eyebrow:`Guest network`,title:`방문자용 네트워크`,description:`기본 네트워크와 분리된 게스트 Wi-Fi를 관리합니다.`})}),z(cy,{guest:e.guest,busy:i!==null,saving:i===`ssh_guest`,onUpdate:c,onLoadQr:u})]}),e.guestError&&z(`section`,{class:`mt-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-sm text-amber-900`,role:`status`,children:[`게스트 Wi-Fi 정보를 불러오지 못했습니다. 패키지를 설치한 직후라면 로그아웃 후 다시 로그인해 주세요.`,z(`button`,{class:`ml-3 underline font-bold`,onClick:o,type:`button`,children:`다시 시도`})]})]}):null}function hy({onAdministratorPasswordChanged:e}){let t=ii(),n=ci(),r=Br(),i=Ar(t===`activity`),a=xa(t===`home`||t===`settings`),o=ya(!0),s=ti(!0),c=yi(t===`network`),l=_i(t===`home`||t===`network`),u=hi(t===`iptv`),d=Ba(t===`wifi`),f=Hr(t===`home`,!1),p=Hr(t===`devices`),m=ma(t===`home`||t===`safeshield`),h=aa(t===`home`||t===`safeshield`,t===`safeshield`),g=m,_=h,v=ra(t===`rules`),y=Fa(t===`account`),b=La(t===`account`,y.data?.accountRegistered??null),x=Aa(a.data),S=mi(t===`home`||t===`settings`),C=Sa(t===`settings`),w=ja(t===`settings`);N(()=>{let e=fv();e&&Kn(e).then(e=>{e.applied&&t===`settings`&&w.refresh()}).catch(()=>{})},[]);let T=Ji(m.refresh,h.refresh),E=t===`activity`?i:t===`network`?c:t===`wifi`?d:t===`iptv`?u:t===`devices`?p:t===`safeshield`?m:t===`rules`?v:t===`account`?y:t===`system`?o:a,D;switch(t){case`network`:D=z(`div`,{class:`min-w-0`,children:[z(Dr,{active:n.network===`internet`?`internet`:`lan`,label:`네트워크 설정 메뉴`,tabs:[{id:`internet`,label:`인터넷 연결`,href:`#network`},{id:`lan`,label:`LAN 및 DHCP`,href:`#network/lan`}]}),z(`div`,{"aria-label":`인터넷 연결 설정`,"aria-labelledby":`internet-tab`,class:`min-w-0`,hidden:n.network!==`internet`,id:`internet-panel`,role:`tabpanel`,children:z(b_,{action:c.action,data:c.data,error:c.error,feedback:c.feedback,loading:c.loading,onDismissFeedback:c.dismissFeedback,onReconnect:()=>void c.reconnect(),onRetry:()=>void c.refresh(),onSave:c.save})}),z(`div`,{"aria-label":`내부 네트워크 설정`,"aria-labelledby":`lan-tab`,class:`min-w-0`,hidden:n.network!==`lan`,id:`lan-panel`,role:`tabpanel`,children:z(o_,{action:l.action,data:l.data,error:l.error,feedback:l.feedback,loading:l.loading,onApplyRecommendation:l.applyRecommendation,onDismissFeedback:l.dismissFeedback,onRetry:()=>void l.refresh(),onSave:l.save})})]});break;case`activity`:D=z(yo,{actionError:i.actionError,actionMessage:i.actionMessage,data:i.data,error:i.error,loading:i.loading,onDismissActionFeedback:i.dismissActionFeedback,onRetry:()=>void i.refresh(),onSetCloudSync:e=>void i.setCloudSyncEnabled(e),savingCloudSync:i.savingCloudSync});break;case`wifi`:D=z(my,{data:d.data,error:d.error,feedback:d.feedback,loading:d.loading,onDismissFeedback:d.dismissFeedback,onRetry:()=>void d.refresh(),onUpdate:d.update,onUpdateGuest:d.updateGuest,onLoadQr:lr,onLoadGuestQr:ur,updatingSection:d.updatingSection});break;case`iptv`:D=z(Gg,{data:u.data,error:u.error,feedback:u.feedback,loading:u.loading,onDismissFeedback:u.dismissFeedback,onRetry:()=>void u.refresh(),onSave:u.save,saving:u.saving});break;case`devices`:D=z(No,{data:p.data,error:p.error,loading:p.loading,onRetry:()=>void p.refresh()});break;case`account`:D=z(Pv,{data:y.data,error:y.error,loading:y.loading,pairingBusy:y.pairingBusy,refreshing:y.refreshing,syncError:y.syncError,onRequestPairing:y.requestPairing,onRetry:()=>void y.refresh()});break;case`system`:D=z($v,{action:o.action,actionError:o.actionError,data:o.data,error:o.error,firmware:s,loading:o.loading,message:o.message,onCheck:()=>void o.check(),onDismissFeedback:o.dismissFeedback,onInstall:()=>void o.install(),onRetry:()=>void o.refresh(),onSaveSettings:o.saveSettings});break;case`settings`:D=z(Dv,{activeTab:n.settings,action:x.action,backupAction:r.action,backupError:r.error,backupMessage:r.message,backupRestoreAccepted:r.restoreAccepted,backupUploadProgress:r.uploadProgress,backupValidated:r.validated,data:a.data,error:a.error,feedbackError:x.error,feedbackMessage:x.message,health:S.data,healthActionError:S.actionError,healthActionMessage:S.actionMessage,healthError:S.error,healthLoading:S.loading,healthRunning:S.running,healthSavingReporter:S.savingReporter,loading:a.loading,onBackupDiscard:r.discard,onBackupDownload:()=>void r.download(),onBackupRestore:r.restore,onBackupUpload:r.upload,onDismissBackupFeedback:r.dismissFeedback,onDismissFeedback:x.dismissFeedback,onDismissHealthFeedback:S.dismissActionFeedback,onDismissTimeFeedback:w.dismissSaveFeedback,onDownloadDiagnostics:()=>void x.downloadDiagnostics(),onRunHealth:()=>void S.runDiagnostic(),onSetHealthReporter:e=>void S.setReporterEnabled(e),onReboot:()=>void x.reboot(),onRetry:()=>void Promise.all([a.refresh(),s.refresh(),w.refresh(),C.refresh(),S.refresh()]),onDismissScheduledRebootFeedback:C.dismissSaveFeedback,onSaveScheduledReboot:C.saveSettings,onSaveTimezone:w.saveTimezone,onSyncTime:w.syncTime,onAdministratorPasswordChanged:e,rebootAccepted:x.rebootAccepted,scheduledRebootData:C.data,scheduledRebootError:C.error,scheduledRebootLoading:C.loading,scheduledRebootSaveError:C.saveError,scheduledRebootSaveMessage:C.saveMessage,scheduledRebootSaving:C.saving,timeData:w.data,timeError:w.error,timeLoading:w.loading,timeSaveError:w.saveError,timeSaveMessage:w.saveMessage,timeSaving:w.saving,timeSyncing:w.syncing});break;case`safeshield`:D=z(nv,{action:T.action,actionError:T.error,actionMessage:T.message,data:m.data,error:m.error,loading:m.loading,statistics:h.data,statisticsError:h.error,statisticsLoading:h.loading,statisticsRefreshing:h.refreshing,onDismissFeedback:T.dismissFeedback,onRefreshBlocklist:()=>void T.refreshBlocklist(),onRetry:()=>void m.refresh(),onRetryStatistics:()=>void h.refresh(),onSetEnabled:e=>void T.setEnabled(e),onSetStatisticsEnabled:e=>void T.setStatisticsEnabled(e)});break;case`rules`:D=z(ov,{action:v.action,data:v.data,error:v.error,feedback:v.feedback,loading:v.loading,onAddRule:v.addRule,onDeleteRule:v.deleteRule,onLoadRecommendedRulesStatus:En,onSyncRecommendedRules:Dn,onRevokeRecommendedRule:On,onDismissFeedback:v.dismissFeedback,onRetry:()=>void v.refresh()});break;default:D=z(Sg,{accountRegistered:b,activity:a.data?.activityHistory??null,activityError:a.error,activityLoading:a.loading,data:a.data,devices:f.data,devicesError:f.error,devicesLoading:f.loading,error:a.error,firmware:s.data,firmwareError:s.error,firmwareLoading:s.loading,health:S.data,healthError:S.error,healthLoading:S.loading,lan:l.data,lanError:l.error,lanLoading:l.loading,loading:a.loading,onRetry:()=>void Promise.all([a.refresh(),f.refresh(),m.refresh(),h.refresh(),o.refresh(),s.refresh(),S.refresh(),l.refresh()]),safeshield:g.data,safeshieldError:g.error,safeshieldLoading:g.loading,statistics:_.data,statisticsError:_.error,statisticsLoading:_.loading,statisticsRefreshing:_.refreshing,updates:o.data,updatesError:o.error,updatesLoading:o.loading})}let O=()=>{t===`home`?Promise.all([a.refresh(),f.refresh(),g.refresh(),_.refresh(),o.refresh(),s.refresh(),S.refresh(),l.refresh()]):t===`network`?Promise.all([c.refresh(),l.refresh()]):t===`system`?Promise.all([o.refresh(),s.refresh()]):t===`settings`?Promise.all([a.refresh(),s.refresh(),w.refresh(),C.refresh(),S.refresh()]):t===`safeshield`?Promise.all([m.refresh(),h.refresh()]):E.refresh()},k=+((o.data?.updateCount??0)>0)+ +!!s.data?.updateAvailable;return z(Er,{accountRegistered:b,loading:t===`network`?c.loading||l.loading:E.loading,onRefresh:O,refreshing:E.refreshing||t===`network`&&l.refreshing||t===`home`&&(i.refreshing||f.refreshing||g.refreshing||_.refreshing||o.refreshing||s.refreshing||S.refreshing||l.refreshing)||t===`system`&&s.refreshing||t===`settings`&&(s.refreshing||w.refreshing||C.refreshing||S.refreshing)||t===`safeshield`&&h.refreshing,route:t,updateCount:k,children:D})}function gy({onAdministratorPasswordChanged:e,onPasswordConfigured:t}){let[n,r]=M(`checking`),[i,a]=M(!1),o=F(async()=>{r(`checking`);try{let e=await Dt();a(e.recovery),r(e.configured?`ready`:`required`)}catch{r(`error`)}},[]);return N(()=>{o()},[o]),n===`ready`?z(hy,{onAdministratorPasswordChanged:e}):n===`required`?z(yn,{onCompleted:()=>t(i),recovery:i}):z(`main`,{class:`ssh-initial-setup-probe`,children:z(`div`,{class:`ssh-initial-setup-probe-card`,role:n===`error`?`alert`:`status`,children:[n===`checking`?z(V,{class:`ssh-login-probe-spinner`,"aria-hidden":`true`}):z(At,{"aria-hidden":`true`}),z(`strong`,{children:n===`checking`?`관리자 보안 상태 확인 중`:`관리자 보안 상태를 확인할 수 없습니다`}),z(`span`,{children:n===`checking`?`root 비밀번호 설정 여부를 확인하고 있습니다.`:`공유기 연결을 확인한 뒤 다시 시도해 주세요.`}),n===`error`?z(`button`,{onClick:()=>void o(),type:`button`,children:`다시 시도`}):null]})})}function _y({icon:e,title:t,description:n}){return z(`div`,{class:`ssh-login-feature`,children:[z(`span`,{class:`ssh-login-feature-icon`,"aria-hidden":`true`,children:e}),z(`span`,{class:`ssh-login-feature-copy`,children:[z(`strong`,{children:t}),z(`span`,{children:n})]})]})}function vy({theme:e}){return z(e===`dark`?un:ln,{})}function yy({notice:e,onAuthenticated:t,probing:n=!1}){let r=Qe(Ce,[]),i=P(null),a=P(null),[o,s]=M(`root`),[c,l]=M(``),[u,d]=M(`ready`),[f,p]=M(null),[m,h]=M(e??null),[g,_]=M(!1),[v,y]=M(!1),[b,x]=M(!1),[S,C]=M(fn),w=u===`submitting`,T=S===`dark`?`라이트 모드로 전환`:`다크 모드로 전환`;N(()=>{pn(S),mn(S)},[S]),N(()=>{if(n)return;let e=window.requestAnimationFrame(()=>a.current?.focus());return()=>window.cancelAnimationFrame(e)},[n]),N(()=>{if(h(e??null),!e)return;let t=window.setTimeout(()=>h(null),7e3);return()=>window.clearTimeout(t)},[e]);let E=e=>{x(e.getModifierState?.(`CapsLock`)??!1)};return z(`main`,{class:`ssh-login-page`,"data-theme":S,children:[m?z(`div`,{"aria-atomic":`true`,"aria-live":`assertive`,class:`ssh-login-toast`,role:`alert`,children:[z(At,{"aria-hidden":`true`}),z(`span`,{children:m})]}):null,z(`section`,{class:`ssh-login-brand`,"aria-labelledby":`ssh-login-brand-title`,children:[z(`div`,{class:`ssh-login-brand-orb ssh-login-brand-orb-one`,"aria-hidden":`true`}),z(`div`,{class:`ssh-login-brand-orb ssh-login-brand-orb-two`,"aria-hidden":`true`}),z(`div`,{class:`ssh-login-brand-content`,children:[z(`span`,{class:`ssh-login-brand-mark`,"aria-hidden":`true`,children:z(At,{})}),z(`p`,{class:`ssh-login-eyebrow`,children:`SMART NETWORK PROTECTION`}),z(`h1`,{id:`ssh-login-brand-title`,children:`SmartSafeHub`}),z(`p`,{class:`ssh-login-brand-description`,children:`네트워크와 보안을 하나의 허브에서 편리하게 관리하세요.`}),z(`div`,{class:`ssh-login-features`,"aria-label":`SmartSafeHub 주요 기능`,children:[z(_y,{description:`DNS 기반 광고·피싱·추적 차단과 사용자 보호 정책을 관리합니다.`,icon:z(At,{}),title:`SafeShield 보호`}),z(_y,{description:`Wi-Fi 설정과 현재 연결된 기기의 상태를 한눈에 확인합니다.`,icon:z(Lt,{}),title:`네트워크 관리`}),z(_y,{description:`관리 기능과 인증은 현재 SmartSafeHub 장치에서 직접 처리됩니다.`,icon:z(qt,{}),title:`로컬 우선 관리`})]})]})]}),z(`section`,{class:`ssh-login-panel`,"aria-labelledby":`ssh-login-title`,children:[z(`button`,{"aria-label":T,class:`ssh-login-theme-toggle`,onClick:()=>C(e=>e===`dark`?`light`:`dark`),title:T,type:`button`,children:z(vy,{theme:S})}),z(`div`,{class:`ssh-login-panel-inner`,children:[n?z(`div`,{class:`ssh-login-probe`,role:`status`,"aria-live":`polite`,children:[z(V,{class:`ssh-login-probe-spinner`,"aria-hidden":`true`}),z(`strong`,{children:`SmartSafeHub 연결 확인 중`}),z(`span`,{children:`로그인 세션을 확인하고 있습니다.`})]}):z(`div`,{class:`ssh-login-card`,children:[z(`div`,{class:`ssh-login-card-heading`,children:[z(`span`,{class:`ssh-login-mobile-mark`,"aria-hidden":`true`,children:z(At,{})}),z(`div`,{children:[z(`p`,{class:`ssh-login-kicker`,children:`SMARTSAFEHUB ACCESS`}),z(`h2`,{id:`ssh-login-title`,children:`로그인`}),z(`p`,{class:`ssh-login-subtitle`,children:`공유기 관리자 계정의 사용자 이름과 비밀번호를 입력해 주세요.`})]})]}),f?z(`div`,{class:`ssh-login-alert`,id:`ssh-login-error`,role:`alert`,"aria-live":`polite`,children:f}):null,z(`form`,{class:`ssh-login-form`,onSubmit:async e=>{e.preventDefault();let n=o.trim(),r=c;if(p(null),_(!1),!n||!r&&n!==`root`)p(n?`비밀번호를 입력해 주세요.`:`사용자 이름을 입력해 주세요.`),window.requestAnimationFrame(()=>{n?a.current?.focus():i.current?.focus()});else{d(`submitting`);try{let e=await ke(n,r);if(e){l(``),t(e);return}l(``),_(!0),p(`로그인하지 못했습니다. 계정 정보를 확인해 주세요. 추가 인증이 설정된 장치는 기본 LuCI 로그인에서 계속할 수 있습니다.`),window.requestAnimationFrame(()=>a.current?.focus())}catch{p(`공유기와 통신할 수 없습니다. 네트워크 연결을 확인한 뒤 다시 시도해 주세요.`)}finally{d(`ready`)}}},noValidate:!0,children:[z(`label`,{class:`ssh-login-field`,for:`smartsafehub-username`,children:[z(`span`,{class:`ssh-login-label`,children:`사용자 이름`}),z(`span`,{class:`ssh-login-input-wrap`,children:[z(`span`,{class:`ssh-login-field-icon`,"aria-hidden":`true`,children:z(Pt,{})}),z(`input`,{autoCapitalize:`none`,autoComplete:`username`,disabled:w,id:`smartsafehub-username`,name:`username`,onInput:e=>s(e.currentTarget.value),placeholder:`관리자 계정`,ref:i,required:!0,spellcheck:!1,type:`text`,value:o})]})]}),z(`label`,{class:`ssh-login-field`,for:`smartsafehub-password`,children:[z(`span`,{class:`ssh-login-label`,children:`비밀번호`}),z(`span`,{class:`ssh-login-input-wrap`,children:[z(`span`,{class:`ssh-login-field-icon`,"aria-hidden":`true`,children:z(qt,{})}),z(`input`,{autoComplete:`current-password`,disabled:w,id:`smartsafehub-password`,name:`password`,onBlur:()=>x(!1),onInput:e=>l(e.currentTarget.value),onKeyDown:E,onKeyUp:E,placeholder:`관리자 비밀번호`,ref:a,...v?{type:`text`}:{type:`password`},value:c}),z(`button`,{"aria-label":v?`비밀번호 숨기기`:`비밀번호 표시`,"aria-pressed":v,class:`ssh-login-password-toggle`,disabled:w,onClick:()=>{y(e=>!e),window.requestAnimationFrame(()=>a.current?.focus())},title:v?`비밀번호 숨기기`:`비밀번호 표시`,type:`button`,children:z(v?Xt:Yt,{})})]})]}),o.trim()===`root`&&c.length===0?z(`p`,{class:`ssh-login-password-hint`,children:`초기 설정 전 root 계정은 비밀번호가 비어 있을 수 있습니다.`}):null,b?z(`p`,{class:`ssh-login-caps`,role:`status`,children:`Caps Lock이 켜져 있습니다.`}):null,z(`button`,{class:`ssh-login-submit`,disabled:w,type:`submit`,children:[w?z(V,{class:`ssh-login-submit-spinner`,"aria-hidden":`true`}):null,z(`span`,{children:w?`로그인 중…`:`로그인`})]})]}),z(`div`,{class:`ssh-login-security-note`,children:[z(qt,{"aria-hidden":`true`}),z(`span`,{children:`관리자 비밀번호를 잊었다면 전원이 켜진 상태에서 Reset 버튼을 5~9초 누른 뒤 놓아 비밀번호만 복구할 수 있습니다. 10초 이상 누르면 모든 사용자 설정을 초기화하는 기기 초기화가 실행됩니다.`})]}),g?z(`a`,{class:`ssh-login-fallback`,href:r,children:`기본 LuCI 로그인으로 계속`}):null]}),z(`footer`,{class:`ssh-login-footer`,children:[z(`span`,{children:`SmartSafeHub`}),z(`span`,{"aria-hidden":`true`,children:`·`}),z(`span`,{children:window.location.host})]})]})]})]})}var by=`smartsafehub-entry-root`,xy=`data-smartsafehub-mount`,Sy=`data-smartsafehub-shadow-style`;function Cy(){let e=ye(`/`);new Set([e,e.replace(/\/$/,``),ye(`/smartsafehub`),ye(`/admin/smartsafehub`)]).has(window.location.pathname)&&window.history.replaceState(null,``,`${xe()}${window.location.search}${window.location.hash}`)}function wy(e,t){Ne(),window.__SMARTHUB_BOOTSTRAP__=Object.freeze({sessionId:e,rpcUrl:ye(`/admin/ubus`),assetBase:t.dataset.assetBase??`/luci-static/smartsafehub/`,assetVersion:t.dataset.assetVersion??`0.2.30-r1`,locale:document.documentElement.lang||`ko`})}function Ty(e,t){let n=window.__SMARTHUB_BOOTSTRAP__,r=n?.assetBase??t.dataset.assetBase??`/luci-static/smartsafehub/`,i=n?.assetVersion??t.dataset.assetVersion,a=`${r}${r.endsWith(`/`)?``:`/`}${e}`;return i?`${a}?v=${encodeURIComponent(i)}`:a}function Ey(e,t){let n=e.shadowRoot??e.attachShadow({mode:`open`}),r=n.querySelector(`link[${Sy}]`),i=Ty(`app.css`,e);r?r.getAttribute(`href`)!==i&&(r.href=i):(r=document.createElement(`link`),r.rel=`stylesheet`,r.href=i,r.setAttribute(Sy,``),n.appendChild(r));let a=n.querySelector(`[${xy}]`);return a?a.className!==t&&(a.className=t):(a=document.createElement(`div`),a.className=t,a.setAttribute(xy,``),n.appendChild(a)),a}function Dy(e,t,n){wy(n,e),t.className=`smartsafehub-shadow-root`,se(z(gy,{onAdministratorPasswordChanged:()=>{Oy(e,t,`관리자 비밀번호가 변경되었습니다. 새 비밀번호로 다시 로그인해 주세요.`)},onPasswordConfigured:n=>{Oy(e,t,n?`관리자 비밀번호 복구가 완료되었습니다. 새 비밀번호로 다시 로그인해 주세요.`:`관리자 비밀번호가 설정되었습니다. 새 비밀번호로 다시 로그인해 주세요.`)}}),t)}function Oy(e,t,n){delete window.__SMARTHUB_BOOTSTRAP__,t.className=`smartsafehub-login-shadow-root`,se(z(yy,{notice:n,onAuthenticated:n=>{Dy(e,t,n)}}),t)}async function ky(){mn(fn());let e=document.getElementById(by);if(!e)return;Cy(),e.style.display=`block`,e.style.width=`100%`,e.style.minWidth=`0`,e.style.minHeight=`100dvh`,e.style.maxWidth=`100%`,e.style.isolation=`isolate`;let t=Ey(e,`smartsafehub-login-shadow-root`);window.addEventListener(Ae,()=>{Oy(e,t,je)}),se(z(yy,{onAuthenticated:n=>{Dy(e,t,n)},probing:!0}),t);try{let n=await pe();if(n){Dy(e,t,n);return}}catch{}try{let n=await De();if(n){Dy(e,t,n);return}}catch{}Oy(e,t)}ky(); \ No newline at end of file +`):e}function Rh(e,t){let{element:n,datasetIndex:r,index:i}=t,a=e.getDatasetMeta(r).controller,{label:o,value:s}=a.getLabelAndValue(i);return{chart:e,label:o,parsed:a.getParsed(i),raw:e.data.datasets[r].data[i],formattedValue:s,dataset:a.getDataset(),dataIndex:i,datasetIndex:r,element:n}}function zh(e,t){let n=e.chart.ctx,{body:r,footer:i,title:a}=e,{boxWidth:o,boxHeight:s}=t,c=Au(t.bodyFont),l=Au(t.titleFont),u=Au(t.footerFont),d=a.length,f=i.length,p=r.length,m=ku(t.padding),h=m.height,g=0,_=r.reduce((e,t)=>e+t.before.length+t.lines.length+t.after.length,0);if(_+=e.beforeBody.length+e.afterBody.length,d&&(h+=d*l.lineHeight+(d-1)*t.titleSpacing+t.titleMarginBottom),_){let e=t.displayColors?Math.max(s,c.lineHeight):c.lineHeight;h+=p*e+(_-p)*c.lineHeight+(_-1)*t.bodySpacing}f&&(h+=t.footerMarginTop+f*u.lineHeight+(f-1)*t.footerSpacing);let v=0,y=function(e){g=Math.max(g,n.measureText(e).width+v)};return n.save(),n.font=l.string,Q(e.title,y),n.font=c.string,Q(e.beforeBody.concat(e.afterBody),y),v=t.displayColors?o+2+t.boxPadding:0,Q(r,e=>{Q(e.before,y),Q(e.lines,y),Q(e.after,y)}),v=0,n.font=u.string,Q(e.footer,y),n.restore(),g+=m.width,{width:g,height:h}}function Bh(e,t){let{y:n,height:r}=t;return ne.height-r/2?`bottom`:`center`}function Vh(e,t,n,r){let{x:i,width:a}=r,o=n.caretSize+n.caretPadding;if(e===`left`&&i+a+o>t.width||e===`right`&&i-a-o<0)return!0}function Hh(e,t,n,r){let{x:i,width:a}=n,{width:o,chartArea:{left:s,right:c}}=e,l=`center`;return r===`center`?l=i<=(s+c)/2?`left`:`right`:i<=a/2?l=`left`:i>=o-a/2&&(l=`right`),Vh(l,e,t,n)&&(l=`center`),l}function Uh(e,t,n){let r=n.yAlign||t.yAlign||Bh(e,n);return{xAlign:n.xAlign||t.xAlign||Hh(e,t,n,r),yAlign:r}}function Wh(e,t){let{x:n,width:r}=e;return t===`right`?n-=r:t===`center`&&(n-=r/2),n}function Gh(e,t,n){let{y:r,height:i}=e;return t===`top`?r+=n:r-=t===`bottom`?i+n:i/2,r}function Kh(e,t,n,r){let{caretSize:i,caretPadding:a,cornerRadius:o}=e,{xAlign:s,yAlign:c}=n,l=i+a,{topLeft:u,topRight:d,bottomLeft:f,bottomRight:p}=Ou(o),m=Wh(t,s),h=Gh(t,c,l);return c===`center`?s===`left`?m+=l:s===`right`&&(m-=l):s===`left`?m-=Math.max(u,f)+i:s===`right`&&(m+=Math.max(d,p)+i),{x:vl(m,0,r.width-t.width),y:vl(h,0,r.height-t.height)}}function qh(e,t,n){let r=ku(n.padding);return t===`center`?e.x+e.width/2:t===`right`?e.x+e.width-r.right:e.x+r.left}function Jh(e){return Ih([],Lh(e))}function Yh(e,t,n){return Nu(e,{tooltip:t,tooltipItems:n,type:`tooltip`})}function Xh(e,t){let n=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return n?e.override(n):e}var Zh={beforeTitle:wc,title(e){if(e.length>0){let t=e[0],n=t.chart.data.labels,r=n?n.length:0;if(this&&this.options&&this.options.mode===`dataset`)return t.dataset.label||``;if(t.label)return t.label;if(r>0&&t.dataIndex{let t={before:[],lines:[],after:[]},i=Xh(n,e);Ih(t.before,Lh(Qh(i,`beforeLabel`,this,e))),Ih(t.lines,Qh(i,`label`,this,e)),Ih(t.after,Lh(Qh(i,`afterLabel`,this,e))),r.push(t)}),r}getAfterBody(e,t){return Jh(Qh(t.callbacks,`afterBody`,this,e))}getFooter(e,t){let{callbacks:n}=t,r=Qh(n,`beforeFooter`,this,e),i=Qh(n,`footer`,this,e),a=Qh(n,`afterFooter`,this,e),o=[];return o=Ih(o,Lh(r)),o=Ih(o,Lh(i)),o=Ih(o,Lh(a)),o}_createItems(e){let t=this._active,n=this.chart.data,r=[],i=[],a=[],o=[],s,c;for(s=0,c=t.length;se.filter(t,r,i,n))),e.itemSort&&(o=o.sort((t,r)=>e.itemSort(t,r,n))),Q(o,t=>{let n=Xh(e.callbacks,t);r.push(Qh(n,`labelColor`,this,t)),i.push(Qh(n,`labelPointStyle`,this,t)),a.push(Qh(n,`labelTextColor`,this,t))}),this.labelColors=r,this.labelPointStyles=i,this.labelTextColors=a,this.dataPoints=o,o}update(e,t){let n=this.options.setContext(this.getContext()),r=this._active,i,a=[];if(!r.length)this.opacity!==0&&(i={opacity:0});else{let e=Fh[n.position].call(this,r,this._eventPosition);a=this._createItems(n),this.title=this.getTitle(a,n),this.beforeBody=this.getBeforeBody(a,n),this.body=this.getBody(a,n),this.afterBody=this.getAfterBody(a,n),this.footer=this.getFooter(a,n);let t=this._size=zh(this,n),o=Object.assign({},e,t),s=Uh(this.chart,n,o),c=Kh(n,o,s,this.chart);this.xAlign=s.xAlign,this.yAlign=s.yAlign,i={opacity:1,x:c.x,y:c.y,width:t.width,height:t.height,caretX:e.x,caretY:e.y}}this._tooltipItems=a,this.$context=void 0,i&&this._resolveAnimations().update(this,i),e&&n.external&&n.external.call(this,{chart:this.chart,tooltip:this,replay:t})}drawCaret(e,t,n,r){let i=this.getCaretPosition(e,n,r);t.lineTo(i.x1,i.y1),t.lineTo(i.x2,i.y2),t.lineTo(i.x3,i.y3)}getCaretPosition(e,t,n){let{xAlign:r,yAlign:i}=this,{caretSize:a,cornerRadius:o}=n,{topLeft:s,topRight:c,bottomLeft:l,bottomRight:u}=Ou(o),{x:d,y:f}=e,{width:p,height:m}=t,h,g,_,v,y,b;return i===`center`?(y=f+m/2,r===`left`?(h=d,g=h-a,v=y+a,b=y-a):(h=d+p,g=h+a,v=y-a,b=y+a),_=h):(g=r===`left`?d+Math.max(s,l)+a:r===`right`?d+p-Math.max(c,u)-a:this.caretX,i===`top`?(v=f,y=v-a,h=g-a,_=g+a):(v=f+m,y=v+a,h=g+a,_=g-a),b=v),{x1:h,x2:g,x3:_,y1:v,y2:y,y3:b}}drawTitle(e,t,n){let r=this.title,i=r.length,a,o,s;if(i){let c=jd(n.rtl,this.x,this.width);for(e.x=qh(this,n.titleAlign,n),t.textAlign=c.textAlign(n.titleAlign),t.textBaseline=`middle`,a=Au(n.titleFont),o=n.titleSpacing,t.fillStyle=n.titleColor,t.font=a.string,s=0;se!==0)?(e.beginPath(),e.fillStyle=i.multiKeyBackground,xu(e,{x:t,y:p,w:c,h:s,radius:o}),e.fill(),e.stroke(),e.fillStyle=a.backgroundColor,e.beginPath(),xu(e,{x:n,y:p+1,w:c-2,h:s-2,radius:o}),e.fill()):(e.fillStyle=i.multiKeyBackground,e.fillRect(t,p,c,s),e.strokeRect(t,p,c,s),e.fillStyle=a.backgroundColor,e.fillRect(n,p+1,c-2,s-2))}e.fillStyle=this.labelTextColors[n]}drawBody(e,t,n){let{body:r}=this,{bodySpacing:i,bodyAlign:a,displayColors:o,boxHeight:s,boxWidth:c,boxPadding:l}=n,u=Au(n.bodyFont),d=u.lineHeight,f=0,p=jd(n.rtl,this.x,this.width),m=function(n){t.fillText(n,p.x(e.x+f),e.y+d/2),e.y+=d+i},h=p.textAlign(a),g,_,v,y,b,x,S;for(t.textAlign=a,t.textBaseline=`middle`,t.font=u.string,e.x=qh(this,h,n),t.fillStyle=n.bodyColor,Q(this.beforeBody,m),f=o&&h!==`right`?a===`center`?c/2+l:c+2+l:0,y=0,x=r.length;y0&&t.stroke()}_updateAnimationTarget(e){let t=this.chart,n=this.$animations,r=n&&n.x,i=n&&n.y;if(r||i){let n=Fh[e.position].call(this,this._active,this._eventPosition);if(!n)return;let a=this._size=zh(this,e),o=Object.assign({},n,this._size),s=Uh(t,e,o),c=Kh(e,o,s,t);(r._to!==c.x||i._to!==c.y)&&(this.xAlign=s.xAlign,this.yAlign=s.yAlign,this.width=a.width,this.height=a.height,this.caretX=n.x,this.caretY=n.y,this._resolveAnimations().update(this,c))}}_willRender(){return!!this.opacity}draw(e){let t=this.options.setContext(this.getContext()),n=this.opacity;if(!n)return;this._updateAnimationTarget(t);let r={width:this.width,height:this.height},i={x:this.x,y:this.y};n=Math.abs(n)<.001?0:n;let a=ku(t.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;t.enabled&&o&&(e.save(),e.globalAlpha=n,this.drawBackground(i,e,r,t),Md(e,t.textDirection),i.y+=a.top,this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),Nd(e,t.textDirection),e.restore())}getActiveElements(){return this._active||[]}setActiveElements(e,t){let n=this._active,r=e.map(({datasetIndex:e,index:t})=>{let n=this.chart.getDatasetMeta(e);if(!n)throw Error(`Cannot find a dataset at index `+e);return{datasetIndex:e,element:n.data[t],index:t}}),i=!Mc(n,r),a=this._positionChanged(r,t);(i||a)&&(this._active=r,this._eventPosition=t,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(e,t,n=!0){if(t&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;let r=this.options,i=this._active||[],a=this._getActiveElements(e,i,t,n),o=this._positionChanged(a,e),s=t||!Mc(a,i)||o;return s&&(this._active=a,(r.enabled||r.external)&&(this._eventPosition={x:e.x,y:e.y},this.update(!0,t))),s}_getActiveElements(e,t,n,r){let i=this.options;if(e.type===`mouseout`)return[];if(!r)return t.filter(e=>this.chart.data.datasets[e.datasetIndex]&&this.chart.getDatasetMeta(e.datasetIndex).controller.getParsed(e.index)!==void 0);let a=this.chart.getElementsAtEventForMode(e,i.mode,i,n);return i.reverse&&a.reverse(),a}_positionChanged(e,t){let{caretX:n,caretY:r,options:i}=this,a=Fh[i.position].call(this,e,t);return a!==!1&&(n!==a.x||r!==a.y)}};z($h,`positioners`,Fh);var eg={id:`tooltip`,_element:$h,positioners:Fh,afterInit(e,t,n){n&&(e.tooltip=new $h({chart:e,options:n}))},beforeUpdate(e,t,n){e.tooltip&&e.tooltip.initialize(n)},reset(e,t,n){e.tooltip&&e.tooltip.initialize(n)},afterDraw(e){let t=e.tooltip;if(t&&t._willRender()){let n={tooltip:t};if(e.notifyPlugins(`beforeTooltipDraw`,{...n,cancelable:!0})===!1)return;t.draw(e.ctx),e.notifyPlugins(`afterTooltipDraw`,n)}},afterEvent(e,t){if(e.tooltip){let n=t.replay;e.tooltip.handleEvent(t.event,n,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:`average`,backgroundColor:`rgba(0,0,0,0.8)`,titleColor:`#fff`,titleFont:{weight:`bold`},titleSpacing:2,titleMarginBottom:6,titleAlign:`left`,bodyColor:`#fff`,bodySpacing:2,bodyFont:{},bodyAlign:`left`,footerColor:`#fff`,footerSpacing:2,footerMarginTop:6,footerFont:{weight:`bold`},footerAlign:`left`,padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(e,t)=>t.bodyFont.size,boxWidth:(e,t)=>t.bodyFont.size,multiKeyBackground:`#fff`,displayColors:!0,boxPadding:0,borderColor:`rgba(0,0,0,0)`,borderWidth:0,animation:{duration:400,easing:`easeOutQuart`},animations:{numbers:{type:`number`,properties:[`x`,`y`,`width`,`height`,`caretX`,`caretY`]},opacity:{easing:`linear`,duration:200}},callbacks:Zh},defaultRoutes:{bodyFont:`font`,footerFont:`font`,titleFont:`font`},descriptors:{_scriptable:e=>e!==`filter`&&e!==`itemSort`&&e!==`external`,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:`animation`}},additionalOptionScopes:[`interaction`]},tg=(e,t,n,r)=>(typeof t==`string`?(n=e.push(t)-1,r.unshift({index:n,label:t})):isNaN(t)&&(n=null),n);function ng(e,t,n,r){let i=e.indexOf(t);return i===-1?tg(e,t,n,r):i===e.lastIndexOf(t)?i:n}var rg=(e,t)=>e===null?null:vl(Math.round(e),0,t);function ig(e){let t=this.getLabels();return e>=0&&et.length-1?null:this.getPixelForValue(t[e].value)}getValueForPixel(e){return Math.round(this._startValue+this.getDecimalForPixel(e)*this._valueRange)}getBasePixel(){return this.bottom}};z(ag,`id`,`category`),z(ag,`defaults`,{ticks:{callback:ig}});function og(e,t){let n=[],{bounds:r,step:i,min:a,max:o,precision:s,count:c,maxTicks:l,maxDigits:u,includeBounds:d}=e,f=i||1,p=l-1,{min:m,max:h}=t,g=!Y(a),_=!Y(o),v=!Y(c),y=(h-m)/(u+1),b=il((h-m)/p/f)*f,x,S,C,w;if(b<1e-14&&!g&&!_)return[{value:m},{value:h}];w=Math.ceil(h/b)-Math.floor(m/b),w>p&&(b=il(w*b/p/f)*f),Y(s)||(x=10**s,b=Math.ceil(b*x)/x),r===`ticks`?(S=Math.floor(m/b)*b,C=Math.ceil(h/b)*b):(S=m,C=h),g&&_&&i&&cl((o-a)/i,b/1e3)?(w=Math.round(Math.min((o-a)/b,l)),b=(o-a)/w,S=a,C=o):v?(S=g?a:S,C=_?o:C,w=c-1,b=(C-S)/w):(w=(C-S)/b,w=rl(w,Math.round(w),b/1e3)?Math.round(w):Math.ceil(w));let T=Math.max(fl(b),fl(S));x=10**(Y(s)?T:s),S=Math.round(S*x)/x,C=Math.round(C*x)/x;let E=0;for(g&&(d&&S!==a?(n.push({value:a}),So)break;n.push({value:e})}return _&&d&&C!==o?n.length&&rl(n[n.length-1].value,o,sg(o,y,e))?n[n.length-1].value=o:n.push({value:o}):_&&C!==o||n.push({value:C}),n}function sg(e,t,{horizontal:n,minRotation:r}){let i=ul(r),a=(n?Math.sin(i):Math.cos(i))||.001,o=.75*t*(``+e).length;return Math.min(t/a,o)}var cg=class extends um{constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(e,t){return Y(e)||(typeof e==`number`||e instanceof Number)&&!isFinite(+e)?null:+e}handleTickRangeOptions(){let{beginAtZero:e}=this.options,{minDefined:t,maxDefined:n}=this.getUserBounds(),{min:r,max:i}=this,a=e=>r=t?r:e,o=e=>i=n?i:e;if(e){let e=nl(r),t=nl(i);e<0&&t<0?o(0):e>0&&t>0&&a(0)}if(r===i){let t=i===0?1:Math.abs(i*.05);o(i+t),e||a(r-t)}this.min=r,this.max=i}getTickLimit(){let{maxTicksLimit:e,stepSize:t}=this.options.ticks,n;return t?(n=Math.ceil(this.max/t)-Math.floor(this.min/t)+1,n>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${t} would result generating up to ${n} ticks. Limiting to 1000.`),n=1e3)):(n=this.computeTickLimit(),e=e||11),e&&(n=Math.min(e,n)),n}computeTickLimit(){return 1/0}buildTicks(){let e=this.options,t=e.ticks,n=this.getTickLimit();n=Math.max(2,n);let r=og({maxTicks:n,bounds:e.bounds,min:e.min,max:e.max,precision:t.precision,step:t.stepSize,count:t.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:t.minRotation||0,includeBounds:t.includeBounds!==!1},this._range||this);return e.bounds===`ticks`&&ll(r,this,`value`),e.reverse?(r.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),r}configure(){let e=this.ticks,t=this.min,n=this.max;if(super.configure(),this.options.offset&&e.length){let r=(n-t)/Math.max(e.length-1,1)/2;t-=r,n+=r}this._startValue=t,this._endValue=n,this._valueRange=n-t}getLabelForValue(e){return Yl(e,this.chart.options.locale,this.options.ticks.format)}},lg=class extends cg{determineDataLimits(){let{min:e,max:t}=this.getMinMax(!0);this.min=Dc(e)?e:0,this.max=Dc(t)?t:1,this.handleTickRangeOptions()}computeTickLimit(){let e=this.isHorizontal(),t=e?this.width:this.height,n=ul(this.options.ticks.minRotation),r=(e?Math.sin(n):Math.cos(n))||.001,i=this._resolveTickFontOptions(0);return Math.ceil(t/Math.min(40,i.lineHeight/r))}getPixelForValue(e){return e===null?NaN:this.getPixelForDecimal((e-this._startValue)/this._valueRange)}getValueForPixel(e){return this._startValue+this.getDecimalForPixel(e)*this._valueRange}};z(lg,`id`,`linear`),z(lg,`defaults`,{ticks:{callback:Ql.formatters.numeric}});var ug=e=>Math.floor(tl(e)),dg=(e,t)=>10**(ug(e)+t);function fg(e){return e/10**ug(e)==1}function pg(e,t,n){let r=10**n,i=Math.floor(e/r);return Math.ceil(t/r)-i}function mg(e,t){let n=ug(t-e);for(;pg(e,t,n)>10;)n++;for(;pg(e,t,n)<10;)n--;return Math.min(n,ug(e))}function hg(e,{min:t,max:n}){t=Oc(e.min,t);let r=[],i=ug(t),a=mg(t,n),o=a<0?10**Math.abs(a):1,s=10**a,c=i>a?10**i:0,l=Math.round((t-c)*o)/o,u=Math.floor((t-c)/s/10)*s*10,d=Math.floor((l-u)/10**a),f=Oc(e.min,Math.round((c+u+d*10**a)*o)/o);for(;f=10?d=d<15?15:20:d++,d>=20&&(a++,d=2,o=a>=0?1:o),f=Math.round((c+u+d*10**a)*o)/o;let p=Oc(e.max,f);return r.push({value:p,major:fg(p),significand:d}),r}var gg=class extends um{constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(e,t){let n=cg.prototype.parse.apply(this,[e,t]);if(n===0)this._zero=!0;else return Dc(n)&&n>0?n:null}determineDataLimits(){let{min:e,max:t}=this.getMinMax(!0);this.min=Dc(e)?Math.max(0,e):null,this.max=Dc(t)?Math.max(0,t):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Dc(this._userMin)&&(this.min=e===dg(this.min,0)?dg(this.min,-1):dg(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){let{minDefined:e,maxDefined:t}=this.getUserBounds(),n=this.min,r=this.max,i=t=>n=e?n:t,a=e=>r=t?r:e;n===r&&(n<=0?(i(1),a(10)):(i(dg(n,-1)),a(dg(r,1)))),n<=0&&i(dg(r,-1)),r<=0&&a(dg(n,1)),this.min=n,this.max=r}buildTicks(){let e=this.options,t=hg({min:this._userMin,max:this._userMax},this);return e.bounds===`ticks`&&ll(t,this,`value`),e.reverse?(t.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),t}getLabelForValue(e){return e===void 0?`0`:Yl(e,this.chart.options.locale,this.options.ticks.format)}configure(){let e=this.min;super.configure(),this._startValue=tl(e),this._valueRange=tl(this.max)-tl(e)}getPixelForValue(e){return(e===void 0||e===0)&&(e=this.min),e===null||isNaN(e)?NaN:this.getPixelForDecimal(e===this.min?0:(tl(e)-this._startValue)/this._valueRange)}getValueForPixel(e){let t=this.getDecimalForPixel(e);return 10**(this._startValue+t*this._valueRange)}};z(gg,`id`,`logarithmic`),z(gg,`defaults`,{ticks:{callback:Ql.formatters.logarithmic,major:{enabled:!0}}});function _g(e){let t=e.ticks;if(t.display&&e.display){let e=ku(t.backdropPadding);return Z(t.font&&t.font.size,iu.font.size)+e.height}return 0}function vg(e,t,n){return n=Ec(n)?n:[n],{w:su(e,t.string,n),h:n.length*t.lineHeight}}function yg(e,t,n,r,i){return e===r||e===i?{start:t-n/2,end:t+n/2}:ei?{start:t-n,end:t}:{start:t,end:t+n}}function bg(e){let t={l:e.left+e._padding.left,r:e.right-e._padding.right,t:e.top+e._padding.top,b:e.bottom-e._padding.bottom},n=Object.assign({},t),r=[],i=[],a=e._pointLabels.length,o=e.options.pointLabels,s=o.centerPointLabels?$/a:0;for(let c=0;ct.r&&(s=(r.end-t.r)/a,e.r=Math.max(e.r,t.r+s)),i.startt.b&&(c=(i.end-t.b)/o,e.b=Math.max(e.b,t.b+c))}function Sg(e,t,n){let r=e.drawingArea,{extra:i,additionalAngle:a,padding:o,size:s}=n,c=e.getPointPosition(t,r+i+o,a),l=Math.round(dl(gl(c.angle+Qc))),u=Dg(c.y,s.h,l),d=Tg(l),f=Eg(c.x,s.w,d);return{visible:!0,x:c.x,y:u,textAlign:d,left:f,top:u,right:f+s.w,bottom:u+s.h}}function Cg(e,t){if(!t)return!0;let{left:n,top:r,right:i,bottom:a}=e;return!(fu({x:n,y:r},t)||fu({x:n,y:a},t)||fu({x:i,y:r},t)||fu({x:i,y:a},t))}function wg(e,t,n){let r=[],i=e._pointLabels.length,a=e.options,{centerPointLabels:o,display:s}=a.pointLabels,c={extra:_g(a)/2,additionalAngle:o?$/i:0},l;for(let a=0;a270||n<90)&&(e-=t),e}function Og(e,t,n){let{left:r,top:i,right:a,bottom:o}=n,{backdropColor:s}=t;if(!Y(s)){let n=Ou(t.borderRadius),c=ku(t.backdropPadding);e.fillStyle=s;let l=r-c.left,u=i-c.top,d=a-r+c.width,f=o-i+c.height;Object.values(n).some(e=>e!==0)?(e.beginPath(),xu(e,{x:l,y:u,w:d,h:f,radius:n}),e.fill()):e.fillRect(l,u,d,f)}}function kg(e,t){let{ctx:n,options:{pointLabels:r}}=e;for(let i=t-1;i>=0;i--){let t=e._pointLabelItems[i];if(!t.visible)continue;let a=r.setContext(e.getPointLabelContext(i));Og(n,a,t);let o=Au(a.font),{x:s,y:c,textAlign:l}=t;bu(n,e._pointLabels[i],s,c+o.lineHeight/2,o,{color:a.color,textAlign:l,textBaseline:`middle`})}}function Ag(e,t,n,r){let{ctx:i}=e;if(n)i.arc(e.xCenter,e.yCenter,t,0,Jc);else{let n=e.getPointPosition(0,t);i.moveTo(n.x,n.y);for(let a=1;a{let n=jc(this.options.pointLabels.callback,[e,t],this);return n||n===0?n:``}).filter((e,t)=>this.chart.getDataVisibility(t))}fit(){let e=this.options;e.display&&e.pointLabels.display?bg(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(e,t,n,r){this.xCenter+=Math.floor((e-t)/2),this.yCenter+=Math.floor((n-r)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(e,t,n,r))}getIndexAngle(e){let t=Jc/(this._pointLabels.length||1),n=this.options.startAngle||0;return gl(e*t+ul(n))}getDistanceFromCenterForValue(e){if(Y(e))return NaN;let t=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-e)*t:(e-this.min)*t}getValueForDistanceFromCenter(e){if(Y(e))return NaN;let t=e/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-t:this.min+t}getPointLabelContext(e){let t=this._pointLabels||[];if(e>=0&&e{if(t!==0||t===0&&this.min<0){s=this.getDistanceFromCenterForValue(e.value);let n=this.getContext(t),o=r.setContext(n),c=i.setContext(n);jg(this,o,s,a,c)}}),n.display){for(e.save(),o=a-1;o>=0;o--){let r=n.setContext(this.getPointLabelContext(o)),{color:i,lineWidth:a}=r;a&&i&&(e.lineWidth=a,e.strokeStyle=i,e.setLineDash(r.borderDash),e.lineDashOffset=r.borderDashOffset,s=this.getDistanceFromCenterForValue(t.reverse?this.min:this.max),c=this.getPointPosition(o,s),e.beginPath(),e.moveTo(this.xCenter,this.yCenter),e.lineTo(c.x,c.y),e.stroke())}e.restore()}}drawBorder(){}drawLabels(){let e=this.ctx,t=this.options,n=t.ticks;if(!n.display)return;let r=this.getIndexAngle(0),i,a;e.save(),e.translate(this.xCenter,this.yCenter),e.rotate(r),e.textAlign=`center`,e.textBaseline=`middle`,this.ticks.forEach((r,o)=>{if(o===0&&this.min>=0&&!t.reverse)return;let s=n.setContext(this.getContext(o)),c=Au(s.font);if(i=this.getDistanceFromCenterForValue(this.ticks[o].value),s.showLabelBackdrop){e.font=c.string,a=e.measureText(r.label).width,e.fillStyle=s.backdropColor;let t=ku(s.backdropPadding);e.fillRect(-a/2-t.left,-i-c.size/2-t.top,a+t.width,c.size+t.height)}bu(e,r.label,0,-i,c,{color:s.color,strokeColor:s.textStrokeColor,strokeWidth:s.textStrokeWidth})}),e.restore()}drawTitle(){}};z(Ng,`id`,`radialLinear`),z(Ng,`defaults`,{display:!0,animate:!0,position:`chartArea`,angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Ql.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(e){return e},padding:5,centerPointLabels:!1}}),z(Ng,`defaultRoutes`,{"angleLines.color":`borderColor`,"pointLabels.color":`color`,"ticks.color":`color`}),z(Ng,`descriptors`,{angleLines:{_fallback:`grid`}});var Pg={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Fg=Object.keys(Pg);function Ig(e,t){return e-t}function Lg(e,t){if(Y(t))return null;let n=e._adapter,{parser:r,round:i,isoWeekday:a}=e._parseOpts,o=t;return typeof r==`function`&&(o=r(o)),Dc(o)||(o=typeof r==`string`?n.parse(o,r):n.parse(o)),o===null?null:(i&&(o=i===`week`&&(sl(a)||a===!0)?n.startOf(o,`isoWeek`,a):n.startOf(o,i)),+o)}function Rg(e,t,n,r){let i=Fg.length;for(let a=Fg.indexOf(e);a=Fg.indexOf(n);a--){let n=Fg[a];if(Pg[n].common&&e._adapter.diff(i,r,n)>=t-1)return n}return Fg[n?Fg.indexOf(n):0]}function Bg(e){for(let t=Fg.indexOf(e)+1,n=Fg.length;t=t?n[r]:n[i];e[a]=!0}}function Hg(e,t,n,r){let i=e._adapter,a=+i.startOf(t[0].value,r),o=t[t.length-1].value,s,c;for(s=a;s<=o;s=+i.add(s,1,r))c=n[s],c>=0&&(t[c].major=!0);return t}function Ug(e,t,n){let r=[],i={},a=t.length,o,s;for(o=0;o+e.value))}initOffsets(e=[]){let t=0,n=0,r,i;this.options.offset&&e.length&&(r=this.getDecimalForValue(e[0]),t=e.length===1?1-r:(this.getDecimalForValue(e[1])-r)/2,i=this.getDecimalForValue(e[e.length-1]),n=e.length===1?i:(i-this.getDecimalForValue(e[e.length-2]))/2);let a=e.length<3?.5:.25;t=vl(t,0,a),n=vl(n,0,a),this._offsets={start:t,end:n,factor:1/(t+1+n)}}_generate(){let e=this._adapter,t=this.min,n=this.max,r=this.options,i=r.time,a=i.unit||Rg(i.minUnit,t,n,this._getLabelCapacity(t)),o=Z(r.ticks.stepSize,1),s=a===`week`&&i.isoWeekday,c=sl(s)||s===!0,l={},u=t,d,f;if(c&&(u=+e.startOf(u,`isoWeek`,s)),u=+e.startOf(u,c?`day`:a),e.diff(n,t,a)>1e5*o)throw Error(t+` and `+n+` are too far apart with stepSize of `+o+` `+a);let p=r.ticks.source===`data`&&this.getDataTimestamps();for(d=u,f=0;d+e)}getLabelForValue(e){let t=this._adapter,n=this.options.time;return n.tooltipFormat?t.format(e,n.tooltipFormat):t.format(e,n.displayFormats.datetime)}format(e,t){let n=this.options.time.displayFormats,r=this._unit,i=t||n[r];return this._adapter.format(e,i)}_tickFormatFunction(e,t,n,r){let i=this.options,a=i.ticks.callback;if(a)return jc(a,[e,t,n],this);let o=i.time.displayFormats,s=this._unit,c=this._majorUnit,l=s&&o[s],u=c&&o[c],d=n[t],f=c&&u&&d&&d.major;return this._adapter.format(e,r||(f?u:l))}generateTickLabels(e){let t,n,r;for(t=0,n=e.length;t0?o:1}getDataTimestamps(){let e=this._cache.data||[],t,n;if(e.length)return e;let r=this.getMatchingVisibleMetas();if(this._normalized&&r.length)return this._cache.data=r[0].controller.getAllParsedValues(this);for(t=0,n=r.length;t=e[r].pos&&t<=e[i].pos&&({lo:r,hi:i}=Sl(e,`pos`,t)),{pos:a,time:s}=e[r],{pos:o,time:c}=e[i]):(t>=e[r].time&&t<=e[i].time&&({lo:r,hi:i}=Sl(e,`time`,t)),{time:a,pos:s}=e[r],{time:o,pos:c}=e[i]);let l=o-a;return l?s+(c-s)*(t-a)/l:s}var Kg=class extends Wg{constructor(e){super(e),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){let e=this._getTimestampsForTable(),t=this._table=this.buildLookupTable(e);this._minPos=Gg(t,this.min),this._tableRange=Gg(t,this.max)-this._minPos,super.initOffsets(e)}buildLookupTable(e){let{min:t,max:n}=this,r=[],i=[],a,o,s,c,l;for(a=0,o=e.length;a=t&&c<=n&&r.push(c);if(r.length<2)return[{time:t,pos:0},{time:n,pos:1}];for(a=0,o=r.length;ae-t)}_getTimestampsForTable(){let e=this._cache.all||[];if(e.length)return e;let t=this.getDataTimestamps(),n=this.getLabelTimestamps();return e=t.length&&n.length?this.normalize(t.concat(n)):t.length?t:n,e=this._cache.all=e,e}getDecimalForValue(e){return(Gg(this._table,e)-this._minPos)/this._tableRange}getValueForPixel(e){let t=this._offsets,n=this.getDecimalForPixel(e)/t.factor-t.end;return Gg(this._table,n*this._tableRange+this._minPos,!0)}};z(Kg,`id`,`timeseries`),z(Kg,`defaults`,Wg.defaults),Qm.register(Rf,Ph,ag,lg,eg);var qg=new Intl.DateTimeFormat(`ko-KR`,{hour:`2-digit`,hour12:!1}),Jg=`#94a3b8`,Yg=`rgba(148, 163, 184, 0.18)`,Xg=`#0d9488`,Zg=`#0f766e`;function Qg(e){return qg.format(new Date(e*1e3))}function $g(e){return e.map((t,n)=>n%3==0||n===e.length-1?Qg(t.bucketStart):``)}function e_({buckets:e}){let t=L(null),n=L(null),r=L(e);return r.current=e,I(()=>{let e=t.current;if(!e)return;let i=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,a=window.getComputedStyle(e).fontFamily,o={animation:!i&&{duration:500,easing:`easeOutQuart`},maintainAspectRatio:!1,responsive:!0,interaction:{intersect:!1,mode:`index`},plugins:{legend:{display:!1},tooltip:{displayColors:!1,callbacks:{title:e=>{let t=e[0]?.dataIndex??-1,n=r.current[t];return n?Qg(n.bucketStart):``},label:e=>`차단 ${J(Number(e.raw??0))}`,afterLabel:e=>{let t=r.current[e.dataIndex];return t?`DNS 요청 ${J(t.queries)}`:``}}}},scales:{x:{border:{display:!1},grid:{display:!1},ticks:{autoSkip:!1,color:Jg,font:{family:a,size:11,weight:700},maxRotation:0,minRotation:0}},y:{beginAtZero:!0,border:{display:!1},grid:{color:Yg},ticks:{color:Jg,font:{family:a,size:11,weight:700},maxTicksLimit:4,precision:0}}}};return n.current=new Qm(e,{type:`bar`,data:{labels:$g(r.current),datasets:[{data:r.current.map(e=>e.blocked),backgroundColor:Xg,hoverBackgroundColor:Zg,borderRadius:4,borderSkipped:!1,barPercentage:.82,categoryPercentage:.9,maxBarThickness:24}]},options:o}),()=>{n.current?.destroy(),n.current=null}},[]),I(()=>{let t=n.current;t&&(t.data.labels=$g(e),t.data.datasets[0].data=e.map(e=>e.blocked),t.update())},[e]),H(`div`,{class:`mt-5 h-44 sm:h-52`,children:H(`canvas`,{"aria-label":`최근 24시간 시간대별 SafeShield 차단 요청`,ref:t,role:`img`,children:`최근 24시간 시간대별 SafeShield 차단 요청 차트`})})}var t_=3600,n_=24;function r_(e,t){return e<=0?`0.0%`:`${(t/e*100).toFixed(1)}%`}function i_(e){let t=e.hourly[e.hourly.length-1];if(t?.bucketStart)return t.bucketStart;let n=e.updatedAt>0?e.updatedAt:Math.floor(Date.now()/1e3);return Math.floor(n/t_)*t_}function a_(e){let t=new Map(e.hourly.map(e=>[e.bucketStart,e])),n=i_(e)-23*t_;return Array.from({length:n_},(e,r)=>{let i=n+r*t_;return t.get(i)??{bucketStart:i,queries:0,blocked:0}})}function o_({children:e}){return H(`div`,{class:`mt-5 flex min-h-52 items-center justify-center rounded-xl border border-slate-200 bg-slate-50 px-5 text-center`,children:H(`p`,{class:`m-0 max-w-lg text-sm font-semibold leading-6 text-slate-500`,children:e})})}function s_({data:e,error:t,loading:n,nowTimestamp:r,refreshing:i}){let a;if(n&&!e)a=H(o_,{children:`SafeShield 보호 활동을 불러오는 중입니다.`});else if(t&&!e)a=H(o_,{children:`SafeShield 보호 활동을 불러오지 못했습니다. SafeShield 페이지에서 상태를 확인해 주세요.`});else if(!e||!e.available)a=H(o_,{children:`현재 SafeShield에서 차단 통계를 제공하지 않습니다. 통계 기능을 확인해 주세요.`});else if(!e.enabled)a=H(o_,{children:`통계 수집이 꺼져 있습니다. SafeShield 페이지에서 통계를 켜면 최근 24시간 활동이 표시됩니다.`});else{let t=a_(e),n=t.reduce((e,t)=>({queries:e.queries+t.queries,blocked:e.blocked+t.blocked}),{queries:0,blocked:0});a=H(b,{children:[H(`dl`,{class:`mt-5 grid gap-3 sm:grid-cols-3`,children:[H(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3`,children:[H(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:`DNS 요청`}),H(`dd`,{class:`mt-1 mb-0 ml-0 text-lg font-black text-slate-950`,children:J(n.queries)})]}),H(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3`,children:[H(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:`차단`}),H(`dd`,{class:`mt-1 mb-0 ml-0 text-lg font-black text-teal-700`,children:J(n.blocked)})]}),H(`div`,{class:`rounded-xl bg-slate-50 px-4 py-3`,children:[H(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:`차단율`}),H(`dd`,{class:`mt-1 mb-0 ml-0 text-lg font-black text-slate-950`,children:r_(n.queries,n.blocked)})]})]}),H(e_,{buckets:t})]})}return H(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[H(`div`,{class:`min-w-0`,children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`SafeShield activity`}),H(`div`,{class:`mt-2 flex min-w-0 items-center justify-between gap-3`,children:[H(`h3`,{class:`m-0 min-w-0 text-xl font-black text-slate-950`,children:`최근 24시간 보호 활동`}),H(`a`,{class:`shrink-0 whitespace-nowrap text-xs font-extrabold text-teal-700 no-underline hover:text-teal-800`,href:`#safeshield`,children:`상세 통계 →`})]}),e?.updatedAt?H(`p`,{class:`mt-2 mb-0 text-[0.68rem] font-semibold text-slate-400`,title:jo(e.updatedAt),children:i?`갱신 중…`:`집계: ${Mo(e.updatedAt,r)}`}):null]}),a,t&&e?H(`p`,{class:`mt-3 mb-0 text-xs font-bold text-amber-700`,children:`최근 통계 갱신에 실패해 마지막 정상 데이터를 표시하고 있습니다.`}):null]})}var c_=7200;function l_(e,t=Math.floor(Date.now()/1e3)){return!e||!e.settings.checkEnabled||e.phase===`checking`||!e.lastCheckAt?!1:Math.max(0,t-e.lastCheckAt)>Math.max(e.settings.checkIntervalSeconds*2,c_)}var u_=2*Math.PI*39;function d_(e){return e===`healthy`?`bg-emerald-50 text-emerald-700 ring-emerald-200`:e===`warning`?`bg-amber-50 text-amber-800 ring-amber-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function f_({detail:e,eyebrow:t,href:n,icon:r,linkLabel:i=`자세히 보기 →`,meta:a,metaState:o,metaWarning:s=!1,state:c=`neutral`,value:l}){let u=H(b,{children:[H(`div`,{class:`flex items-start justify-between gap-4`,children:[H(`p`,{class:`m-0 text-[0.68rem] font-black uppercase tracking-[0.16em] text-slate-500`,children:t}),H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl ring-1 ring-inset ${d_(c)}`,children:r})]}),H(`p`,{class:`mt-4 mb-0 break-words text-2xl font-black tracking-tight text-slate-950`,children:l}),H(`p`,{class:`mt-2 mb-0 min-h-10 text-sm font-medium leading-5 text-slate-500`,children:e}),a?H(`p`,{class:`mt-3 mb-0 text-xs font-bold ${o===`healthy`?`text-emerald-700`:o===`warning`||s?`text-amber-700`:`text-slate-400`}`,children:a}):null,n?H(`span`,{class:`mt-4 inline-flex text-xs font-extrabold text-teal-700`,children:i}):null]}),d=`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 transition`;return n?H(`a`,{class:`${d} no-underline hover:border-slate-300 hover:shadow-md`,href:n,children:u}):H(`article`,{class:d,children:u})}var p_=6e4;function m_(e,t){return!e||!Number.isFinite(e)||e<=0?null:Math.max(0,t-e)}function h_(e,t,n,r){return!t||t<=0?`${e}: ${r}`:H(`span`,{title:jo(t),children:[e,`: `,Mo(t,n)]})}function g_(e){if(!e)return null;switch(e.toLowerCase()){case`dhcp`:return`DHCP`;case`static`:return`Static`;case`pppoe`:return`PPPoE`;default:return e.toUpperCase()}}function __(e){if(!e)return!1;let t=e.split(`.`).map(e=>Number(e));if(t.length!==4||t.some(e=>!Number.isInteger(e)||e<0||e>255))return!1;let[n,r]=t;return n===void 0||r===void 0?!1:n===10||n===172&&r>=16&&r<=31||n===192&&r===168}function v_({label:e,value:t}){return H(`div`,{class:`flex min-w-0 items-start justify-between gap-4 border-b border-slate-100 py-3 last:border-b-0`,children:[H(`dt`,{class:`text-sm font-semibold text-slate-500`,children:e}),H(`dd`,{class:`m-0 min-w-0 max-w-[68%] break-words text-right text-sm font-extrabold text-slate-950`,children:t})]})}function y_(e){return e===`initializing`?{badge:`bg-teal-100 text-teal-800`,icon:`text-teal-700`,label:`준비 중`,panel:`border-teal-200 bg-teal-50`}:e===`critical`?{badge:`bg-rose-100 text-rose-800`,icon:`text-rose-700`,label:`이상`,panel:`border-rose-200 bg-rose-50/70`}:e===`warning`?{badge:`bg-amber-100 text-amber-800`,icon:`text-amber-700`,label:`주의`,panel:`border-amber-200 bg-amber-50/70`}:e===`unknown`?{badge:`bg-slate-200 text-slate-700`,icon:`text-slate-500`,label:`확인 불가`,panel:`border-slate-200 bg-slate-50`}:{badge:`bg-emerald-100 text-emerald-800`,icon:`text-emerald-700`,label:`정상`,panel:`border-emerald-200 bg-emerald-50/70`}}function b_({data:e,error:t,loading:n,nowTimestamp:r}){let i=!!(e&&e.generatedAt>0),a=y_(i&&e?e.overall:`unknown`),o=i&&e?e.checks.filter(e=>e.status!==`ok`):[],s=o.slice(0,2),c=Math.max(0,o.length-s.length);return H(`div`,{class:`mt-5 border-t border-slate-200 pt-5`,children:[H(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[H(`div`,{class:`flex items-center gap-2`,children:[H(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:`장치 진단`}),i?H(`span`,{class:`rounded-full px-2.5 py-1 text-[11px] font-extrabold ${a.badge}`,children:a.label}):null]}),H(`a`,{class:`text-xs font-extrabold text-teal-700 no-underline hover:text-teal-900`,href:`#settings`,children:`상세 보기 →`})]}),t&&!i?H(`div`,{class:`mt-3 rounded-xl border border-amber-200 bg-amber-50/70 px-4 py-3`,children:H(`div`,{class:`flex items-start gap-2`,children:[H(W,{class:`mt-0.5 size-4 shrink-0 text-amber-700`}),H(`div`,{class:`min-w-0`,children:[H(`p`,{class:`m-0 text-sm font-extrabold text-slate-900`,children:`진단 상태를 확인하지 못했습니다.`}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`설정에서 장치 진단 상태를 다시 확인해 주세요.`})]})]})}):i&&e?H(`div`,{class:`mt-3 rounded-xl border px-4 py-3 ${a.panel}`,children:[H(`div`,{class:`flex min-w-0 items-start gap-3`,children:[e.overall===`ok`?H(wn,{class:`mt-0.5 size-5 shrink-0 ${a.icon}`}):e.overall===`initializing`?H(pn,{class:`mt-0.5 size-5 shrink-0 ${a.icon}`}):H(W,{class:`mt-0.5 size-5 shrink-0 ${a.icon}`}),H(`div`,{class:`min-w-0 flex-1`,children:[H(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:e.summary.message}),H(`p`,{class:`mt-1 mb-0 text-xs font-semibold leading-5 text-slate-500`,children:[`마지막 진단: `,Mo(e.generatedAt,r),` · 검사 항목:`,` `,e.summary.total,`개`]})]})]}),s.length>0?H(`div`,{class:`mt-3 grid gap-2 sm:grid-cols-2`,children:s.map(e=>H(`div`,{class:`min-w-0 rounded-lg border border-white/80 bg-white/70 px-3 py-2`,children:[H(`p`,{class:`m-0 text-xs font-extrabold text-slate-900`,children:e.label}),H(`p`,{class:`mt-1 mb-0 line-clamp-2 text-xs leading-5 text-slate-500`,children:e.message})]},e.id))}):null,c>0?H(`p`,{class:`mt-2 mb-0 text-xs font-extrabold text-slate-600`,children:[`외 `,c,`건의 확인 항목이 있습니다.`]}):null]}):H(`div`,{class:`mt-3 rounded-xl border border-slate-200 bg-slate-50 px-4 py-3`,children:[H(`p`,{class:`m-0 text-sm font-extrabold text-slate-900`,children:n?`진단 상태를 확인하고 있습니다.`:`아직 생성된 진단 결과가 없습니다.`}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`진단 결과가 생성되면 현재 장치 상태를 이곳에 요약해서 표시합니다.`})]})]})}function x_(e,t,n){if(t&&!e)return{detail:`보호 상태를 확인하고 있습니다.`,state:`neutral`,value:`확인 중`};if(n&&!e)return{detail:`SafeShield 상태를 불러오지 못했습니다.`,state:`warning`,value:`확인 필요`};if(!e||!e.available)return{detail:`SafeShield 서비스를 사용할 수 없습니다.`,state:`warning`,value:`사용 불가`};if(!e.enabled||e.status===`disabled`)return{detail:`DNS 보호가 비활성화되어 있습니다.`,state:`neutral`,value:`꺼짐`};if(e.status===`running`)return{detail:`차단 목록을 갱신하고 있습니다.`,state:`neutral`,value:`갱신 중`};if(!(e.active&&e.runtime.dnsmasqRunning&&e.runtime.dnsRuntimeOk&&e.health.overall!==`error`&&e.issueCounts.errors===0))return{detail:e.runtime.lastErrorCode?`최근 오류: ${e.runtime.lastErrorCode}`:`DNS 보호 상태를 확인해 주세요.`,state:`warning`,value:`확인 필요`};let r=e.entitlement.plan?.trim(),i=e.blocklist.validLineCount>0?`${J(e.blocklist.validLineCount)}개 차단 규칙`:`차단 목록 적용됨`;return{detail:r?`${i} · ${r.toUpperCase()}`:i,state:`healthy`,value:`보호 중`}}function S_({accountRegistered:e,activity:t,activityError:n,activityLoading:r,data:i,devices:a,devicesError:o,devicesLoading:s,error:c,firmware:l,firmwareError:u,firmwareLoading:d,health:f,healthError:p,healthLoading:m,lan:h,lanError:g,lanLoading:_,loading:v,onRetry:y,safeshield:b,safeshieldError:x,safeshieldLoading:S,statistics:C,statisticsError:w,statisticsLoading:T,statisticsRefreshing:E,updates:D,updatesError:O,updatesLoading:k}){let A=Qe(()=>i?Lo(i.runtime.memory):null,[i]),[j,M]=F(()=>Math.floor(Date.now()/1e3));if(I(()=>{let e=window.setInterval(()=>{M(Math.floor(Date.now()/1e3))},p_);return()=>window.clearInterval(e)},[]),v&&!i)return H(vs,{});if(c&&!i)return H(ys,{message:c,onRetry:y});if(!i)return null;let N=A?Math.round(A.percent):0,P=is(i.runtime.storage),ee=P?(P.availableRatio*u_).toFixed(2):`0`,te=x_(b,S,x),ne=D?.packages.find(e=>e.name===`luci-app-smartsafehub`)??D?.packages[0]??null,re=!!(D&&D.updateCount>0),ie=D?re?`${D.updateCount}개 업데이트`:D.lastCheckAt?`최신 상태`:`확인 전`:O?`확인 필요`:`확인 중`,ae=ne?re&&ne.availableVersion?`${ne.installedVersion} → ${ne.availableVersion}`:`설치 버전 ${ne.installedVersion}`:O?`업데이트 상태를 불러오지 못했습니다.`:k?`업데이트 상태를 확인하고 있습니다.`:`업데이트 상태를 확인할 수 없습니다.`,oe=a?`${J(a.totals.online)}대`:s?`확인 중`:`확인 필요`,se=a?`Wi-Fi ${J(a.totals.wireless)}대 · 유선/기타 ${J(a.totals.ethernet)}대`:o||`연결 기기 요약을 불러오고 있습니다.`,ce=g_(i.network.protocol),le=i.network.available?i.network.ipv4Address?`WAN ${i.network.ipv4Address}${ce?` · ${ce}`:``}`:ce?`${ce} · WAN 주소를 받지 못했습니다.`:`WAN 주소를 받지 못했습니다.`:`WAN 인터페이스를 찾을 수 없습니다.`,ue=!!h?.conflict.detected,de=!i.network.up||ue||g!==null&&!h?`warning`:h?`healthy`:`neutral`,fe=ue?`네트워크 충돌`:i.network.up?`정상 연결`:`연결 확인`,pe=i.network.up?ue?`⚠ LAN 대역과 충돌합니다`:_&&!h?`네트워크 대역 확인 중`:g&&!h?`네트워크 대역을 확인하지 못했습니다.`:h?`✓ 네트워크 충돌 없음`:`네트워크 대역 확인 필요`:`WAN 연결 상태를 확인해 주세요.`,me=!i.network.up||ue||g!==null&&!h?`warning`:h?`healthy`:`neutral`,he=i.network.ipv4Address?__(i.network.ipv4Address)?`${i.network.ipv4Address} · 사설 네트워크`:i.network.ipv4Address:`할당되지 않음`,ge=m_(b?.timestamps.lastSuccess,j),_e=b?Math.max(b.timestamps.refreshIntervalS*2,86400):null,ve=!!(b?.enabled&&b.status!==`running`&&ge!==null&&_e!==null&&ge>_e),ye=l_(D,j),be=!!l?.current.metadataAvailable,xe=d&&!l?`확인 중`:u&&!l?`확인 필요`:be?l?.current.releaseVersion?`SmartSafeHub ${l.current.releaseVersion}`:`SmartSafeHub 펌웨어`:`${i.software.distribution} ${i.software.version}`,Se=d&&!l?`확인 중`:u&&!l?`확인 필요`:be&&l?.current.buildId||i.software.revision,Ce=be?`빌드 ID`:`리비전`;return H(`div`,{class:`min-w-0 space-y-6`,children:[H(`section`,{"aria-labelledby":`dashboard-overview-title`,children:[H(q,{description:`인터넷, SafeShield, 연결 기기와 소프트웨어 상태를 한눈에 확인합니다.`,eyebrow:`Overview`,id:`dashboard-overview-title`,title:`시스템 개요`}),H(`div`,{class:`grid min-w-0 gap-4 sm:grid-cols-2 xl:grid-cols-4`,children:[H(f_,{detail:le,eyebrow:`Internet`,href:`#network`,icon:H(dn,{class:`size-5`}),linkLabel:ue?`해결하기 →`:`자세히 보기 →`,meta:pe,metaState:me,state:de,value:fe}),H(f_,{detail:te.detail,eyebrow:`SafeShield`,href:`#safeshield`,icon:H(Yt,{class:`size-5`}),meta:h_(ve?`차단 목록 갱신 지연`:`차단 목록 갱신`,b?.timestamps.lastSuccess,j,S?`확인 중`:`기록 없음`),metaWarning:ve,state:te.state===`healthy`&&ve?`warning`:te.state,value:te.value}),H(f_,{detail:se,eyebrow:`Connected devices`,href:`#devices`,icon:H(Zt,{class:`size-5`}),meta:h_(`목록 확인`,a?.generatedAt,j,s?`확인 중`:`기록 없음`),state:a?`healthy`:o?`warning`:`neutral`,value:oe}),H(f_,{detail:ae,eyebrow:`Software update`,href:`#system`,icon:H(on,{class:`size-5`}),meta:D&&!D.settings.checkEnabled?h_(`자동 확인 꺼짐 · 마지막 확인`,D.lastCheckAt,j,`확인 기록 없음`):h_(ye?`업데이트 확인 지연`:`마지막 확인`,D?.lastCheckAt,j,k?`확인 중`:`아직 없음`),metaWarning:ye,state:O||ye||re?`warning`:D?.lastCheckAt?`healthy`:`neutral`,value:ie})]}),e===!1?H(`div`,{class:`ssh-dashboard-account-banner mt-4 flex flex-col gap-4 rounded-2xl border p-4 sm:flex-row sm:items-center sm:justify-between sm:p-5`,role:`status`,children:[H(`div`,{class:`flex min-w-0 items-start gap-3`,children:[H(`span`,{class:`ssh-dashboard-account-banner-icon grid size-10 shrink-0 place-items-center rounded-xl`,"aria-hidden":`true`,children:H($t,{class:`size-5`})}),H(`div`,{class:`min-w-0`,children:[H(`div`,{class:`flex flex-wrap items-center gap-2`,children:[H(`p`,{class:`ssh-dashboard-account-banner-title m-0 font-bold`,children:`SmartSafeHub 계정을 연결해 주세요`}),H(`span`,{class:`ssh-dashboard-account-banner-badge rounded-full px-2 py-0.5 text-[0.7rem] font-bold`,children:`연결 필요`})]}),H(`p`,{class:`ssh-dashboard-account-banner-description mt-1 mb-0 text-sm leading-relaxed`,children:`계정을 연결하면 웹사이트에서 기기를 관리하고 구독 정보를 확인할 수 있습니다. DNS 보호는 연결하지 않아도 계속 작동합니다.`})]})]}),H(`a`,{href:`#account`,class:`ssh-dashboard-account-banner-action inline-flex min-h-10 shrink-0 items-center justify-center rounded-xl px-4 py-2 text-sm font-bold no-underline transition-colors focus-visible:outline-2 focus-visible:outline-offset-2`,children:`계정 연결하기 →`})]}):null]}),H(`section`,{"aria-labelledby":`dashboard-activity-title`,children:[H(q,{description:`최근 SafeShield 차단 활동과 현재 네트워크 연결 구성을 함께 확인합니다.`,eyebrow:`Activity`,id:`dashboard-activity-title`,title:`네트워크 보호 활동`}),H(`div`,{class:`grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1.55fr)_minmax(18rem,0.65fr)]`,children:[H(s_,{data:C,error:w,loading:T,nowTimestamp:j,refreshing:E}),H(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[H(`div`,{class:`flex items-start justify-between gap-4`,children:[H(`div`,{children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Network`}),H(`h3`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:`연결 상태`})]}),H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl ${i.network.up&&!ue?`bg-emerald-50 text-emerald-700`:`bg-amber-50 text-amber-800`}`,children:H(dn,{class:`size-5`})})]}),H(`dl`,{class:`mt-4 mb-0`,children:[H(v_,{label:`인터넷`,value:ue?`네트워크 충돌`:i.network.up?`정상 연결`:`연결 확인`}),H(v_,{label:`WAN IP`,value:he}),H(v_,{label:`프로토콜`,value:ce||`확인되지 않음`}),H(v_,{label:`상위 네트워크`,value:h?.wan.subnet||(_?`확인 중`:g?`확인 필요`:`확인되지 않음`)}),H(v_,{label:`LAN 네트워크`,value:h?.lan.subnet||(_?`확인 중`:g?`확인 필요`:`확인되지 않음`)}),H(v_,{label:`대역 충돌`,value:h?H(`span`,{class:h.conflict.detected?`text-amber-700`:`text-emerald-700`,children:h.conflict.detected?`충돌 감지`:`없음`}):_?`확인 중`:`확인 필요`})]}),H(`a`,{class:`mt-5 inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-slate-200 bg-slate-50 px-4 py-2 text-sm font-extrabold text-slate-700 no-underline transition hover:border-teal-200 hover:bg-teal-50 hover:text-teal-800`,href:`#network`,children:`네트워크 보기`})]})]})]}),H(`section`,{"aria-labelledby":`dashboard-recent-activity-title`,children:[H(q,{action:H(`a`,{class:`inline-flex whitespace-nowrap text-xs font-extrabold text-teal-700 no-underline hover:text-teal-900`,href:`#activity`,children:`전체 보기 →`}),description:`인터넷, 보호, 업데이트와 진단에서 실제 상태가 바뀐 시점을 확인합니다.`,eyebrow:`History`,id:`dashboard-recent-activity-title`,title:`최근 활동`}),H(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:r||n&&!t?H(Qo,{error:n,loading:r}):H(Zo,{compact:!0,events:(t?.events??[]).slice(0,3)})})]}),H(`section`,{"aria-labelledby":`dashboard-system-title`,children:[H(q,{description:`메모리, 디스크, 시스템 부하와 장치 정보를 빠르게 점검합니다.`,eyebrow:`System`,id:`dashboard-system-title`,title:`시스템 상태`}),H(`div`,{class:`grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1.45fr)_minmax(20rem,0.75fr)]`,children:[H(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[H(`div`,{class:`flex flex-wrap items-start justify-between gap-4`,children:[H(`div`,{children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Runtime`}),H(`h3`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:`리소스 사용량`})]}),H(`span`,{class:`inline-flex items-center gap-2 rounded-full px-3 py-1.5 text-xs font-black ring-1 ring-inset ${N>=90?`bg-amber-50 text-amber-800 ring-amber-200`:`bg-emerald-50 text-emerald-700 ring-emerald-200`}`,children:[H(`span`,{class:`size-2 rounded-full ${N>=90?`bg-amber-500`:`bg-emerald-500`}`}),N>=90?`메모리 확인`:`정상 실행`]})]}),H(`div`,{class:`mt-5 grid min-w-0 grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-4`,children:[H(`div`,{class:`flex min-w-0 flex-col rounded-xl border border-slate-200 bg-slate-50 p-3 sm:p-4`,children:[H(`div`,{class:`flex items-center gap-2 text-slate-500`,children:[H(mn,{class:`size-4`}),H(`span`,{class:`text-xs font-extrabold`,children:`메모리`})]}),H(`div`,{class:`flex min-h-0 flex-1 flex-col justify-center py-1`,children:[H(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:[N,`%`]}),H(`p`,{class:`mt-1 mb-0 text-xs font-semibold text-slate-500`,children:[A?Oo(A.used):`-`,` /`,` `,Oo(i.runtime.memory.total)]}),H(`div`,{"aria-label":`메모리 사용률 ${N}%`,class:`mt-3 h-1.5 overflow-hidden rounded-full bg-slate-200`,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":N,children:H(`div`,{class:`h-full rounded-full transition-[width] duration-300 ${N>=90?`bg-amber-500`:`bg-teal-600`}`,style:{width:`${Math.min(100,N)}%`}})})]})]}),H(`div`,{class:`ssh-dashboard-storage-card flex min-w-0 flex-col rounded-xl border border-slate-200 bg-slate-50 p-3 sm:p-4`,"data-level":P?.level??`unavailable`,children:[H(`div`,{class:`flex items-center gap-2 text-slate-500`,children:[H(vn,{class:`size-4`}),H(`span`,{class:`text-xs font-extrabold`,children:`디스크`})]}),H(`div`,{class:`mt-1 flex justify-center`,role:`img`,"aria-label":P?`디스크 여유 공간 ${P.availablePercent}%, ${P.availableText} 남음, 사용 ${P.usedText} / 전체 ${P.totalText}`:`디스크 저장 공간 확인 불가`,children:H(`div`,{class:`ssh-apps-storage-ring relative grid size-[76px] shrink-0 place-items-center`,"data-level":P?.level??`unavailable`,children:[H(`svg`,{"aria-hidden":`true`,class:`size-[76px]`,viewBox:`0 0 96 96`,children:[H(`circle`,{class:`ssh-apps-storage-track`,cx:`48`,cy:`48`,r:`39`}),P&&P.availableRatio>0?H(`circle`,{class:`ssh-apps-storage-free`,cx:`48`,cy:`48`,r:`39`,"stroke-dasharray":`${ee} ${u_.toFixed(2)}`}):null]}),H(`div`,{class:`absolute inset-0 flex items-center justify-center text-center`,children:H(`strong`,{class:`text-base leading-none font-black text-slate-950`,children:P?`${P.availablePercent}%`:`—`})})]})}),H(`p`,{class:`ssh-apps-storage-available mt-1 mb-0 text-center text-xs font-extrabold text-teal-700`,children:P?`${P.availableText} 남음`:`저장 공간 확인 불가`}),P?H(`p`,{class:`mt-1 mb-0 text-center text-[11px] leading-4 font-semibold text-slate-500`,title:`앱 설치 가능 공간을 기준으로 계산하며 파일시스템 예약 공간이 사용량에 포함될 수 있습니다.`,children:[`사용 `,P.usedText,` / 전체 `,P.totalText]}):null]}),H(`div`,{class:`flex min-w-0 flex-col rounded-xl border border-slate-200 bg-slate-50 p-3 sm:p-4`,children:[H(`div`,{class:`flex items-center gap-2 text-slate-500`,children:[H(Xt,{class:`size-4`}),H(`span`,{class:`text-xs font-extrabold`,children:`시스템 부하`})]}),H(`div`,{class:`flex min-h-0 flex-1 flex-col justify-center py-1`,children:[H(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:ko(i.runtime.load[0])}),H(`p`,{class:`mt-1 mb-0 text-xs font-semibold text-slate-500`,children:[`5분 `,ko(i.runtime.load[1]),` · 15분`,` `,ko(i.runtime.load[2])]})]})]}),H(`div`,{class:`flex min-w-0 flex-col rounded-xl border border-slate-200 bg-slate-50 p-3 sm:p-4`,children:[H(`div`,{class:`flex items-center gap-2 text-slate-500`,children:[H(pn,{class:`size-4`}),H(`span`,{class:`text-xs font-extrabold`,children:`실행 시간`})]}),H(`div`,{class:`flex min-h-0 flex-1 flex-col justify-center py-1`,children:[H(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:Do(i.runtime.uptime)}),H(`p`,{class:`mt-1 mb-0 text-xs font-semibold text-slate-500`,children:[`부팅 `,Ao(i.runtime.localtime,i.runtime.uptime)]})]})]})]}),H(b_,{data:f,error:p,loading:m,nowTimestamp:j})]}),H(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[H(`div`,{class:`flex items-start justify-between gap-4`,children:[H(`div`,{children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Device`}),H(`h3`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:`장치 정보`})]}),H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:H(Xt,{class:`size-5`})})]}),H(`dl`,{class:`mt-4 mb-0`,children:[H(v_,{label:`모델`,value:i.device.model}),H(v_,{label:`호스트 이름`,value:i.device.hostname}),H(v_,{label:`펌웨어`,value:H(`span`,{title:be?l?.current.releaseVersion?`SmartSafeHub 펌웨어 ${l.current.releaseVersion}`:`SmartSafeHub 커스텀 펌웨어`:u||void 0,children:xe})}),H(v_,{label:Ce,value:Se}),H(v_,{label:`커널`,value:i.software.kernel}),H(v_,{label:`WAN IP`,value:i.network.ipv4Address||`할당되지 않음`})]})]})]})]})]})}var C_=Object.assign;function w_(e,t){for(var n in e)if(n!=`__source`&&e[n]!==t[n])return!0;for(var r in t)if(r!=`__source`&&!(r in e))return!0;return!1}var T_=/^(-|f[lo].*[^se]$|g.{5,}[^ps]$|z|o[pr]|(W.{5})?[lL]i.*(t|mp)$|an|(bo|s).{4}Im|sca|m.{6}[ds]|ta|c.*[st]$|wido|ini|asp|fill|st)/;function E_(e,t){function n(e){var n=this.props.ref;return n!=e.ref&&n&&(typeof n==`function`?n(null):n.current=null),t?!t(this.props,e)||n!=e.ref:w_(this.props,e)}function r(t){return this.shouldComponentUpdate=n,v(e,t)}return r.displayName=`Memo(`+(e.displayName||e.name)+`)`,r.prototype.isReactComponent=!0,r.type=e,r}function D_(e,t){var n=le(e,t);return n.containerInfo=t,n}var O_=Symbol.for(`react.element`),k_=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(?!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,A_=/[A-Z0-9]/g,j_=typeof document<`u`,M_=function(e){return/fil|che|rad/.test(e)};x.prototype.isReactComponent=!0,[`componentWillMount`,`componentWillReceiveProps`,`componentWillUpdate`].forEach(function(e){Object.defineProperty(x.prototype,e,{configurable:!0,get:function(){return this[`UNSAFE_`+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})});var N_=e.event;e.event=function(e){return N_&&(e=N_(e)),e.persist=function(){},e.isPropagationStopped=function(){return this.cancelBubble},e.isDefaultPrevented=function(){return this.defaultPrevented},e.nativeEvent=e};var P_={configurable:!0,get:function(){return this.class}},F_=e.vnode;e.vnode=function(e){if(typeof e.type==`string`)(function(e){var t=e.props,n=e.type,r={},i=n.indexOf(`-`)==-1;for(var a in t){var o=t[a];if(!(a==`value`&&`defaultValue`in t&&o==null||j_&&a==`children`&&n==`noscript`||a==`class`||a==`className`)){if(a==`style`&&o&&o.constructor==Object){var s=void 0;for(var c in o)typeof o[c]!=`number`||T_.test(c)||(s||(s=o=C_({},o)),o[c]+=`px`)}else if(a==`defaultValue`&&`value`in t&&t.value==null)a=`value`;else if(a==`download`&&!0===o)o=``;else if(a==`translate`&&o===`no`)o=!1;else if(a[0]==`o`&&a[1]==`n`){var l=a.toLowerCase();l==`ondoubleclick`?a=`ondblclick`:l!=`onchange`||n!=`input`&&n!=`textarea`||M_(t.type)?l==`onfocus`?a=`onfocusin`:l==`onblur`&&(a=`onfocusout`):l=a=`oninput`,l==`oninput`&&r[a=l]&&(a=`oninputCapture`)}else i&&k_.test(a)?a=a.replace(A_,`-$&`).toLowerCase():o===null&&(o=void 0);r[a]=o}}n==`select`&&(r.multiple&&Array.isArray(r.value)&&(r.value=k(t.children).forEach(function(e){e.props.selected=r.value.indexOf(e.props.value)!=-1})),r.defaultValue!=null&&(r.value=k(t.children).forEach(function(e){e.props.selected=r.multiple?r.defaultValue.indexOf(e.props.value)!=-1:r.defaultValue==e.props.value}))),t.class&&!t.className?(r.class=t.class,Object.defineProperty(r,"className",P_)):t.className&&(r.class=r.className=t.className),e.props=r})(e);else if(typeof e.type==`function`&&(`ref`in e.props&&`prototype`in e.type&&e.type.prototype.render&&(e.ref=e.props.ref,delete e.props.ref),e.type.defaultProps)){var t=C_({},e.props);for(var n in e.type.defaultProps)t[n]===void 0&&(t[n]=e.type.defaultProps[n]);e.props=t}e.ref&&!(`ref`in e.props)&&Object.defineProperty(e.props,"ref",{value:e.ref,configurable:!0,writable:!0}),e.$$typeof=O_,F_&&F_(e)};var I_=8,L_=256,R_=8;function z_(e){return e.findIndex(e=>!e.disabled)}function B_(e){for(let t=e.length-1;t>=0;--t)if(!e[t]?.disabled)return t;return-1}function V_(e,t,n){if(e.length===0)return-1;let r=t;for(let t=0;te.value===t&&!e.disabled);return n>=0?n:z_(e)}function U_({ariaLabel:e,className:t=``,disabled:n=!1,id:r,onChange:i,options:a,value:o,variant:s=`default`}){let c=$e(),l=r??`ssh-custom-select-${c}`,u=`${l}-menu`,d=L(null),f=L(null),p=L(null),m=L([]),[h,g]=F(!1),[_,v]=F(()=>H_(a,o)),[y,b]=F(`bottom`),[x,S]=F(L_),[C,w]=F({}),[T,E]=F(null),D=Qe(()=>a.find(e=>e.value===o)??a[0]??null,[a,o]),O=()=>{let e=f.current;if(!e)return;let t=e.getBoundingClientRect(),n=Math.min(L_,Math.max(44,a.length*42+12)),r=window.innerHeight-t.bottom-R_,i=t.top-R_,o=rr?`top`:`bottom`,s=Math.min(t.width,Math.max(0,window.innerWidth-16)),c=Math.max(R_,Math.min(t.left,window.innerWidth-s-R_)),l=o===`bottom`?r:i;b(o),S(Math.max(44,Math.min(L_,Math.floor(l)))),w({left:`${c}px`,width:`${s}px`,...o===`bottom`?{top:`${t.bottom+I_}px`}:{bottom:`${window.innerHeight-t.top+I_}px`}})},k=(e=!1)=>{g(!1),e&&window.requestAnimationFrame(()=>f.current?.focus())},A=e=>{e<0||(v(e),window.requestAnimationFrame(()=>m.current[e]?.focus()))},j=e=>{let t=a[e];t&&!t.disabled&&(i(t.value),g(!1),window.requestAnimationFrame(()=>f.current?.focus()))},M=e=>{n||a.length===0||(O(),g(!0),A(e??H_(a,o)))};I(()=>{let e=d.current?.closest(`.ssh-app`);if(e){E(e);return}let t=d.current?.getRootNode();t instanceof ShadowRoot?E(t):typeof document<`u`&&E(document.body)},[]),I(()=>{v(H_(a,o)),m.current=m.current.slice(0,a.length)},[a,o]),I(()=>{if(!h)return;O();let e=e=>{let t=e.composedPath();d.current&&t.includes(d.current)||p.current&&t.includes(p.current)||k()},t=e=>{e.key===`Escape`&&(e.preventDefault(),k(!0))},n=()=>O();return document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t),window.addEventListener(`resize`,n),window.addEventListener(`scroll`,n,!0),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t),window.removeEventListener(`resize`,n),window.removeEventListener(`scroll`,n,!0)}},[h,a.length]),I(()=>{n&&h&&k()},[n,h]);let N=s===`emphasized`?`min-h-11 border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100`:`min-h-11 border border-slate-300 bg-slate-50 px-3 py-2.5 text-sm font-bold text-slate-900 focus:border-teal-500 focus:ring-2 focus:ring-teal-100`,P=h?H(`div`,{"aria-label":`${e} 목록`,class:`ssh-custom-select-menu fixed z-[1000] overflow-hidden rounded-xl border border-slate-200 bg-white p-1.5 shadow-xl shadow-slate-950/10`,id:u,ref:p,role:`listbox`,style:C,children:H(`div`,{class:`overflow-y-auto overscroll-contain`,style:{maxHeight:`${x}px`},children:a.map((e,t)=>{let n=e.value===o;return H(`button`,{"aria-selected":n,class:`flex min-h-10 w-full items-center justify-between gap-3 rounded-lg px-3 py-2.5 text-left text-sm font-bold transition ${n?`bg-teal-50 text-teal-800`:`text-slate-700 hover:bg-slate-50`} ${e.disabled?`cursor-not-allowed opacity-50`:``}`,disabled:e.disabled,onClick:()=>j(t),onFocus:()=>v(t),onKeyDown:e=>{switch(e.key){case`ArrowDown`:e.preventDefault(),A(V_(a,t,1));break;case`ArrowUp`:e.preventDefault(),A(V_(a,t,-1));break;case`Home`:e.preventDefault(),A(z_(a));break;case`End`:e.preventDefault(),A(B_(a));break;case`Enter`:case` `:e.preventDefault(),j(t);break;case`Escape`:e.preventDefault(),k(!0);break;case`Tab`:g(!1)}},ref:e=>{m.current[t]=e},role:`option`,tabIndex:_===t?0:-1,type:`button`,children:[H(`span`,{class:`min-w-0 truncate`,children:e.label}),n?H(`span`,{"aria-hidden":`true`,class:`size-2 shrink-0 rounded-full bg-teal-500`}):null]},e.value)})})}):null;return H(`div`,{class:`relative ${t}`,ref:d,children:[H(`button`,{"aria-controls":u,"aria-expanded":h,"aria-haspopup":`listbox`,"aria-label":e,class:`ssh-custom-select-trigger flex w-full cursor-pointer items-center justify-between gap-3 rounded-xl text-left outline-none transition disabled:cursor-not-allowed disabled:bg-slate-100 disabled:text-slate-400 disabled:opacity-60 ${N}`,disabled:n,id:l,onClick:()=>{h?k():(O(),g(!0))},onKeyDown:e=>{switch(e.key){case`ArrowDown`:e.preventDefault(),M(h?V_(a,_,1):H_(a,o));break;case`ArrowUp`:e.preventDefault(),M(h?V_(a,_,-1):H_(a,o));break;case`Home`:e.preventDefault(),M(z_(a));break;case`End`:e.preventDefault(),M(B_(a));break;case`Enter`:case` `:e.preventDefault(),h?k():M();break;case`Escape`:h&&(e.preventDefault(),k())}},ref:f,type:`button`,children:[H(`span`,{class:`min-w-0 truncate`,children:D?.label??`선택하세요`}),H(jn,{"aria-hidden":`true`,class:`size-4 shrink-0 text-slate-400 transition-transform ${h?`rotate-180`:``}`})]}),P&&T?D_(P,T):null,H(`span`,{class:`sr-only`,"aria-live":`polite`,children:y===`top`?`선택 목록이 위쪽에 열렸습니다.`:``})]})}var W_=[{value:`skb`,label:`SK Broadband`},{value:`lgu`,label:`LG U+`}];function G_(e){return e===`lgu`?`LG U+`:`SK Broadband`}function K_({active:e,label:t,value:n}){return H(`div`,{class:`rounded-xl border border-slate-200 bg-white p-4`,children:[H(`div`,{class:`flex items-center justify-between gap-3`,children:[H(`p`,{class:`m-0 text-xs font-extrabold text-slate-500`,children:t}),H(`span`,{class:`size-2.5 shrink-0 rounded-full ${e?`bg-emerald-500`:`bg-slate-300`}`,"aria-hidden":`true`})]}),H(`p`,{class:`mt-2 mb-0 text-sm font-black text-slate-950`,children:n})]})}function q_({data:e,error:t,feedback:n,loading:r,onDismissFeedback:i,onRetry:a,onSave:o,saving:s}){let[c,l]=F(!1),[u,d]=F(`skb`);if(I(()=>{e&&(l(e.enabled),d(e.provider))},[e]),r&&!e)return H(vs,{});if(t&&!e)return H(ys,{message:t,onRetry:a});if(!e)return H(ys,{message:`IPTV 설정을 확인할 수 없습니다.`,onRetry:a});let f=c!==e.enabled||u!==e.provider,p=!e.enabled||e.running&&e.igmpSnooping;return H(`div`,{class:`space-y-5`,children:[H(`section`,{class:`rounded-2xl border border-amber-200 bg-amber-50 p-5 sm:p-6`,children:H(`div`,{class:`flex items-start gap-4`,children:[H(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-amber-100 text-amber-800`,children:H(W,{class:`size-5`})}),H(`div`,{class:`min-w-0 flex-1`,children:[H(`div`,{class:`flex flex-wrap items-center gap-2`,children:[H(`h2`,{class:`m-0 text-base font-black text-amber-950`,children:`IPTV 실험 기능`}),H(`span`,{class:`rounded-full border border-amber-300 bg-amber-100 px-2 py-0.5 text-[10px] font-black uppercase tracking-[0.12em] text-amber-800`,children:`Beta`})]}),H(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-amber-900/80`,children:`현재 SK Broadband와 LG U+를 지원하며 두 통신사에는 동일한 멀티캐스트 IPTV 프로파일을 적용합니다. KT IPTV는 별도 네트워크 방식이 필요해 아직 지원하지 않습니다.`})]})]})}),n?H(`section`,{"aria-live":`polite`,class:`rounded-2xl border p-4 ${n.kind===`success`?`border-emerald-200 bg-emerald-50 text-emerald-900`:`border-red-200 bg-red-50 text-red-900`}`,children:H(`div`,{class:`flex items-start justify-between gap-3`,children:[H(`p`,{class:`m-0 text-sm font-bold leading-6`,children:n.message}),H(`button`,{class:`shrink-0 text-xs font-extrabold underline underline-offset-2`,onClick:i,type:`button`,children:`닫기`})]})}):null,H(q,{eyebrow:`IPTV`,title:`IPTV 설정`,description:`통신사 환경에 맞는 멀티캐스트 중계 기능을 관리합니다.`}),H(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[H(`div`,{class:`flex min-w-0 items-start gap-3`,children:[H(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:H(fn,{class:`size-5`})}),H(`div`,{class:`min-w-0 flex-1`,children:[H(`div`,{class:`flex min-w-0 flex-wrap items-center justify-between gap-2`,children:[H(`h2`,{class:`m-0 text-lg font-black text-slate-950`,children:`IPTV`}),H(`div`,{class:`flex shrink-0 items-center gap-2`,children:[f?H(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[H(W,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]}):null,H(`button`,{"aria-checked":c,"aria-label":`IPTV 사용`,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border-0 transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 ${c?`bg-teal-700`:`bg-slate-300`} disabled:cursor-not-allowed disabled:opacity-60`,disabled:s||!e.available,onClick:()=>l(e=>!e),role:`switch`,type:`button`,children:H(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${c?`left-6`:`left-1`}`})})]})]}),H(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-600`,children:`WAN의 멀티캐스트 방송을 LAN 셋톱박스로 전달합니다.`})]})]}),H(`div`,{class:`mt-6 grid gap-5 lg:grid-cols-[minmax(0,1fr)_minmax(0,1fr)]`,children:[H(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[H(`div`,{class:`flex flex-wrap items-start justify-between gap-2`,children:[H(`div`,{children:[H(`label`,{class:`block text-xs font-extrabold text-slate-600`,htmlFor:`iptv-provider`,children:`통신사`}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`IPTV를 제공하는 회선 사업자를 선택하세요.`})]}),H(`span`,{class:`rounded-full border border-teal-200 bg-teal-50 px-2.5 py-1 text-[10px] font-black text-teal-700`,children:`멀티캐스트 방식`})]}),H(U_,{ariaLabel:`IPTV 통신사`,className:`mt-3`,disabled:s||!c,id:`iptv-provider`,onChange:e=>d(e),options:W_,value:u}),H(`div`,{class:`mt-3 flex items-start gap-2 rounded-lg border border-slate-200 bg-white p-3`,children:[H(wn,{"aria-hidden":`true`,class:`mt-0.5 size-4 shrink-0 text-teal-700`}),H(`p`,{class:`m-0 text-xs leading-5 text-slate-600`,children:[G_(u),`에는 현재 SK Broadband/LG U+ 공통 IGMP Proxy 프로파일을 적용합니다. KT는 추후 별도 IPTV 프로파일로 지원할 예정입니다.`]})]})]}),H(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[H(`div`,{class:`flex items-center justify-between gap-3`,children:[H(`p`,{class:`m-0 text-xs font-extrabold text-slate-500`,children:`현재 지원 프로파일`}),H(`span`,{class:`text-xs font-extrabold text-slate-500`,children:`SKB · LG U+`})]}),H(`p`,{class:`mt-2 mb-0 text-sm font-black text-slate-950`,children:`WAN → IGMP Proxy → LAN`}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-600`,children:`WAN을 upstream, LAN을 downstream으로 사용하고 LAN bridge에는 IGMP snooping을 함께 활성화해 필요하지 않은 포트와 Wi-Fi로 멀티캐스트가 불필요하게 퍼지는 것을 줄입니다.`})]})]}),e.available?null:H(`div`,{class:`mt-5 rounded-xl border border-red-200 bg-red-50 p-4 text-sm font-bold leading-6 text-red-900`,children:`IGMP Proxy 패키지를 찾지 못했습니다. 현재 펌웨어에 igmpproxy 패키지가 포함되어 있는지 확인해 주세요.`}),H(`div`,{class:`mt-6 flex flex-wrap items-center justify-between gap-3 border-t border-slate-200 pt-5`,children:[H(`p`,{class:`m-0 text-xs leading-5 text-slate-500`,children:`설정을 적용하면 네트워크 서비스가 잠시 다시 로드될 수 있습니다.`}),H(`button`,{class:`inline-flex min-h-11 items-center justify-center rounded-xl border-0 bg-teal-700 px-5 py-2.5 text-sm font-black text-white shadow-sm transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:s||!e.available||!f&&!c,onClick:()=>void o({enabled:c,provider:u}),type:`button`,children:s?`적용 중…`:f?`변경사항 적용`:`설정 다시 적용`})]})]}),H(q,{eyebrow:`Runtime`,title:`IPTV 동작 상태`,description:`마지막으로 적용한 IPTV 설정과 중계 서비스의 실행 상태를 확인합니다.`}),H(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:[H(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[H(`p`,{class:`m-0 text-xs leading-5 text-slate-500`,children:`적용된 IPTV 중계 서비스와 멀티캐스트 전달 상태입니다.`}),H(`span`,{class:`inline-flex items-center gap-1.5 rounded-full px-3 py-1 text-xs font-black ${p?`bg-emerald-100 text-emerald-800`:`bg-amber-100 text-amber-800`}`,children:[H(wn,{class:`size-4`}),p?e.enabled?`정상`:`꺼짐`:`확인 필요`]})]}),f?H(`div`,{class:`mt-4 flex items-start gap-2 rounded-xl border border-amber-200 bg-amber-50 p-3 text-xs font-bold leading-5 text-amber-900`,children:[H(W,{"aria-hidden":`true`,class:`mt-0.5 size-4 shrink-0`}),`아래 동작 상태는 마지막으로 적용된 설정 기준입니다. 변경사항을 적용하면 새 설정으로 갱신됩니다.`]}):null,H(`div`,{class:`mt-5 grid gap-3 sm:grid-cols-2 lg:grid-cols-4`,children:[H(K_,{active:e.enabled&&e.running,label:`IGMP Proxy`,value:e.enabled?e.running?`동작 중`:`중지됨`:`꺼짐`}),H(K_,{active:e.enabled&&e.igmpSnooping,label:`IGMP Snooping`,value:e.igmpSnooping?`켜짐`:`꺼짐`}),H(K_,{active:e.enabled,label:`Upstream`,value:e.upstreamNetwork.toUpperCase()}),H(K_,{active:e.enabled,label:`Downstream`,value:e.lanBridge??e.downstreamNetwork.toUpperCase()})]})]})]})}function J_(e){let t=e.split(`.`);return[t[0]??``,t[1]??``,t[2]??``,t[3]??``]}function Y_(e){return e.replace(/\D/g,``).slice(0,3)}function X_(e){return e.every(e=>e===``)?``:e.join(`.`)}function Z_({disabled:e=!1,label:t,value:n,onChange:r}){let i=J_(n),a=(e,t)=>{let n=[...i];n[e]=Y_(t),r(X_(n))};return H(`div`,{class:`ssh-ipv4-segments mt-2 min-h-11`,"aria-label":`${t} 입력`,children:i.map((n,r)=>H(`div`,{class:`ssh-ipv4-segment`,children:[H(`input`,{"aria-label":`${t} ${r+1}번째 옥텟`,autocomplete:`off`,class:`min-h-11 w-full min-w-0 max-w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-1.5 py-2.5 text-center text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100 sm:px-2`,disabled:e,inputMode:`numeric`,maxLength:3,onInput:e=>a(r,e.currentTarget.value),pattern:`[0-9]*`,spellcheck:!1,value:n}),r{if(!/^(0|[1-9][0-9]{0,2})$/.test(e))return!1;let t=Number(e);return t>=0&&t<=255})}function tv(e){let t=J_(e);return t.slice(0,3).some(e=>e===``||Number(e)>255)?null:t.slice(0,3).join(`.`)}function nv(e){return J_(e)[3]}function rv(e){let t=tv(e.lan.address),n=nv(e.dhcp.start??``),r=nv(e.dhcp.end??``);return{ipAddress:e.lan.address,prefixLength:e.lan.prefixLength,dhcpEnabled:e.dhcp.enabled,dhcpStart:t&&n?`${t}.${n}`:e.dhcp.start??``,dhcpEnd:t&&r?`${t}.${r}`:e.dhcp.end??``,leaseTime:e.dhcp.leaseTime}}function iv({disabled:e,label:t,lanAddress:n,value:r,onChange:i}){let a=tv(n),o=a?.split(`.`)??[``,``,``],s=nv(r),c=e=>{let t=Y_(e);i(a&&t!==``?`${a}.${t}`:t)};return H(`label`,{class:`block`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:t}),H(`div`,{class:`ssh-ipv4-segments mt-2 min-h-11`,"aria-label":`${t} 입력`,children:[o.map((e,t)=>H(`div`,{class:`ssh-ipv4-segment`,children:[H(`span`,{class:`grid min-h-11 w-full min-w-0 max-w-full place-items-center rounded-xl border border-slate-200 bg-slate-100 px-1.5 py-2.5 text-center text-sm font-bold text-slate-500 sm:px-2`,children:e||`—`}),H(`span`,{"aria-hidden":`true`,class:`ssh-ipv4-separator text-sm font-black text-slate-400`,children:`.`})]},t)),H(`div`,{class:`ssh-ipv4-segment`,children:H(`input`,{"aria-label":`${t} 마지막 옥텟`,autocomplete:`off`,class:`min-h-11 w-full min-w-0 max-w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-1.5 py-2.5 text-center text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100 sm:px-2`,disabled:e||!a,inputMode:`numeric`,maxLength:3,onInput:e=>c(e.currentTarget.value),pattern:`[0-9]*`,spellcheck:!1,value:s})})]}),H(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`앞 3개 주소는 공유기 IP 주소와 동일하게 유지됩니다.`})]})}function av(e){return`${window.location.protocol}//${e}${window.location.pathname}${window.location.search}${window.location.hash}`}function ov({feedback:e,onDismiss:t}){return H(`div`,{"aria-live":`polite`,class:`mb-5 rounded-2xl border px-4 py-4 text-sm ${e.kind===`success`?`border-emerald-200 bg-emerald-50 text-emerald-900`:e.kind===`warning`?`border-amber-200 bg-amber-50 text-amber-950`:`border-red-200 bg-red-50 text-red-900`}`,children:[H(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[H(`p`,{class:`m-0 font-bold leading-6`,children:e.message}),H(`button`,{class:`min-h-10 shrink-0 rounded-lg border border-current bg-transparent px-3 py-1.5 text-xs font-extrabold`,onClick:t,type:`button`,children:`닫기`})]}),e.newAddress?H(`a`,{class:`mt-3 inline-flex min-h-10 items-center rounded-lg border border-current px-3 py-2 font-extrabold underline underline-offset-2`,href:av(e.newAddress),children:[`새 공유기 주소 `,e.newAddress,`로 연결`]}):null]})}function sv({data:e}){let t=e.conflict.detected;return H(`section`,{class:`grid gap-4 lg:grid-cols-3`,"aria-label":`내부 네트워크 상태`,children:[H(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[H(`span`,{class:`grid size-10 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:H(Xt,{class:`size-5`})}),H(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`SmartSafeHub LAN`}),H(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:e.lan.subnet}),H(`p`,{class:`mt-1 mb-0 text-sm font-semibold text-slate-600`,children:[`공유기 주소 `,e.lan.address]})]}),H(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[H(`span`,{class:`grid size-10 place-items-center rounded-xl bg-slate-100 text-slate-700`,children:H(dn,{class:`size-5`})}),H(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`상위 네트워크`}),H(`p`,{class:`mt-2 mb-0 text-xl font-black text-slate-950`,children:e.wan.subnet??`확인 전`}),H(`p`,{class:`mt-1 mb-0 text-sm font-semibold text-slate-600`,children:e.wan.connected?`WAN ${e.wan.address??`주소 확인 중`}`:`WAN 연결 후 자동으로 확인합니다.`})]}),H(`article`,{class:`rounded-2xl border p-5 shadow-sm shadow-slate-900/5 ${t?`border-red-200 bg-red-50 text-red-950`:`border-emerald-200 bg-emerald-50 text-emerald-950`}`,children:[H(`span`,{class:`grid size-10 place-items-center rounded-xl ${t?`bg-red-100 text-red-700`:`bg-emerald-100 text-emerald-700`}`,children:H(t?W:wn,{class:`size-5`})}),H(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] opacity-70`,children:`대역 충돌`}),H(`p`,{class:`mt-2 mb-0 text-lg font-black`,children:t?`주소 대역이 겹칩니다`:`충돌이 감지되지 않았습니다`}),H(`p`,{class:`mt-1 mb-0 text-sm font-semibold leading-6 opacity-80`,children:t?`상위 네트워크 ${e.conflict.wanSubnet??``}와 다른 LAN 대역이 필요합니다.`:e.wan.connected?`현재 WAN과 LAN이 서로 다른 IPv4 대역을 사용합니다.`:`WAN이 연결되면 상위 네트워크와의 충돌 여부를 확인합니다.`})]})]})}function cv({action:e,data:t,error:n,feedback:r,loading:i,onApplyRecommendation:a,onDismissFeedback:o,onRetry:s,onSave:c}){let[l,u]=F(``),[d,f]=F(24),[p,m]=F(!0),[h,g]=F(``),[_,v]=F(``),[y,x]=F(`12h`),[S,C]=F(!1),[w,T]=F(null),E=(e={})=>{if(!t)return!1;let n=rv(t);return(e.ipAddress??l).trim()!==n.ipAddress||(e.prefixLength??d)!==n.prefixLength||(e.dhcpEnabled??p)!==n.dhcpEnabled||(e.dhcpStart??h).trim()!==n.dhcpStart||(e.dhcpEnd??_).trim()!==n.dhcpEnd||(e.leaseTime??y)!==n.leaseTime},D=e=>{let t=tv(e);if(u(e),!t){C(E({ipAddress:e}));return}let n=nv(h),r=nv(_),i=n?`${t}.${n}`:``,a=r?`${t}.${r}`:``;g(i),v(a),C(E({ipAddress:e,dhcpStart:i,dhcpEnd:a}))},O=e=>{g(e),C(E({dhcpStart:e}))},k=e=>{v(e),C(E({dhcpEnd:e}))},A=e=>{f(e),C(E({prefixLength:e}))},j=e=>{x(e),C(E({leaseTime:e}))},M=e=>{m(e),C(E({dhcpEnabled:e}))};I(()=>{if(!t||S)return;let e=rv(t);u(e.ipAddress),f(e.prefixLength),m(e.dhcpEnabled),g(e.dhcpStart),v(e.dhcpEnd),x(e.leaseTime),T(null)},[t,S]);let N=Qe(()=>{let e=[...Q_];return e.includes(d)||(e.push(d),e.sort((e,t)=>e-t)),e},[d]),P=Qe(()=>{let e=[...$_];return e.some(([e])=>e===y)||e.push([y,`현재 설정 (${y})`]),e},[y]);if(i)return H(vs,{});if(n)return H(ys,{message:n,onRetry:s});if(!t)return null;let ee=e!==null,te=async e=>{e.preventDefault(),ev(l)?!ev(h)||!ev(_)?T(`DHCP 시작/종료 주소를 올바른 IPv4 형식으로 입력해 주세요.`):window.confirm(`내부 네트워크 설정을 적용하면 연결된 기기가 새 DHCP 정보를 받는 동안 잠시 연결이 끊길 수 있습니다. 계속하시겠습니까?`)&&(T(null),await c({ipAddress:l.trim(),prefixLength:d,dhcpEnabled:p,dhcpStart:h.trim(),dhcpEnd:_.trim(),leaseTime:y})&&C(!1)):T(`공유기 주소를 올바른 IPv4 형식으로 입력해 주세요.`)},ne=async()=>{t.recommendation&&window.confirm(`상위 네트워크와 겹치지 않는 ${t.recommendation.subnet} 대역으로 자동 변경합니다. 현재 연결이 잠시 끊길 수 있습니다. 계속하시겠습니까?`)&&(T(null),await a()&&C(!1))};return H(b,{children:[r?H(ov,{feedback:r,onDismiss:o}):null,H(q,{eyebrow:`Overview`,title:`내부 네트워크 상태`,description:`LAN 주소와 DHCP 할당 상태를 확인합니다.`}),H(sv,{data:t}),t.conflict.detected?H(`section`,{class:`mt-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-amber-950 sm:p-6`,children:H(`div`,{class:`flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between`,children:[H(`div`,{class:`min-w-0`,children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-amber-700`,children:`자동 충돌 해결`}),H(`h2`,{class:`mt-2 mb-0 text-lg font-black`,children:`안전한 LAN 대역으로 변경할 수 있습니다`}),H(`p`,{class:`mt-2 mb-0 text-sm font-semibold leading-6 text-amber-900/80`,children:t.recommendation?`${t.recommendation.subnet} · DHCP ${t.recommendation.dhcpStart} ~ ${t.recommendation.dhcpEnd}`:`현재 활성 네트워크와 겹치지 않는 추천 대역을 찾지 못했습니다. 아래에서 직접 설정해 주세요.`})]}),t.recommendation?H(`button`,{class:`inline-flex min-h-11 shrink-0 items-center justify-center gap-2 rounded-xl border-0 bg-amber-700 px-5 py-2.5 text-sm font-extrabold text-white transition hover:bg-amber-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-amber-200 disabled:cursor-wait disabled:opacity-60`,disabled:ee,onClick:()=>void ne(),type:`button`,children:[H(wn,{class:`size-5 ${e===`auto`?`animate-pulse`:``}`}),e===`auto`?`변경 중`:`추천 대역으로 자동 변경`]}):null]})}):null,H(`div`,{class:`mt-7`,children:H(q,{eyebrow:`Local network`,title:`LAN 및 DHCP 설정`,description:`상위 공유기와 다른 주소 대역을 사용해야 안정적으로 라우팅할 수 있습니다.`})}),H(`form`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void te(e),children:[S?H(`div`,{class:`mb-5 flex justify-end`,children:H(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 self-start items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[H(W,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]})}):null,H(`div`,{class:`grid gap-5 lg:grid-cols-2`,children:[H(`div`,{class:`block`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`공유기 IP 주소`}),H(Z_,{disabled:ee,label:`공유기 IP 주소`,onChange:D,value:l})]}),H(`div`,{class:`block`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`현재 LAN 대역`}),H(`div`,{class:`mt-2 min-h-11 rounded-xl border border-slate-200 bg-slate-50 px-4 py-3 text-sm font-bold text-slate-700`,children:t.lan.subnet}),H(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`서브넷 마스크는 아래 고급 설정에서 변경할 수 있습니다.`})]}),H(iv,{disabled:ee,label:`DHCP 시작 주소`,lanAddress:l,onChange:O,value:h}),H(iv,{disabled:ee,label:`DHCP 종료 주소`,lanAddress:l,onChange:k,value:_})]}),H(`details`,{class:`mt-6 rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[H(`summary`,{class:`cursor-pointer text-sm font-black text-slate-900`,children:`고급 DHCP 설정`}),H(`div`,{class:`mt-5 grid gap-5 lg:grid-cols-2`,children:[H(`div`,{class:`block`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`서브넷 마스크`}),H(U_,{ariaLabel:`서브넷 마스크`,className:`mt-2`,disabled:ee,id:`lan-prefix-length`,onChange:e=>A(Number(e)),options:N.map(e=>({value:String(e),label:`/${e} · ${e===t.lan.prefixLength?t.lan.netmask:`CIDR /${e}`}`})),value:String(d),variant:`emphasized`}),H(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`일반 가정용 네트워크는 /24 사용을 권장합니다.`})]}),H(`div`,{class:`block`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`DHCP 임대 시간`}),H(U_,{ariaLabel:`DHCP 임대 시간`,className:`mt-2`,disabled:ee,id:`lan-dhcp-lease-time`,onChange:j,options:P.map(([e,t])=>({value:e,label:t})),value:y,variant:`emphasized`})]}),H(`label`,{class:`inline-flex min-h-11 items-center gap-3 text-sm font-extrabold text-slate-800 lg:col-span-2`,children:[H(`input`,{checked:p,class:`size-5 accent-teal-700`,disabled:ee,onChange:e=>M(e.currentTarget.checked),type:`checkbox`}),`SmartSafeHub DHCP 서버 사용`]}),H(`p`,{class:`m-0 text-xs font-semibold leading-5 text-slate-500 lg:col-span-2`,children:`DHCP를 끄면 SmartSafeHub에 연결되는 장치에 IP 주소를 자동으로 할당하지 않습니다. 별도의 DHCP 서버를 사용하는 고급 구성에서만 비활성화하세요.`})]})]}),w?H(`p`,{class:`mt-5 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:w}):null,H(`div`,{class:`mt-6 flex flex-col gap-3 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[H(`p`,{class:`m-0 text-xs font-semibold leading-5 text-slate-500`,children:`주소가 바뀌면 현재 관리 페이지 연결이 종료되며 새 IP를 받아 다시 접속해야 합니다.`}),H(`button`,{class:`inline-flex min-h-11 w-full shrink-0 items-center justify-center gap-2 rounded-xl border-0 bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white shadow-sm transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:ee||!S,type:`submit`,children:[H(wn,{class:`size-5 ${e===`saving`?`animate-pulse`:``}`}),e===`saving`?`저장 중`:`설정 저장`]})]})]})]})}var lv=[`dhcp`,`pppoe`,`static`],uv=`1.1.1.1`,dv=Array.from({length:33},(e,t)=>t);function fv(e){return lv.includes(e)}function pv(e){switch(e){case`dhcp`:return`자동 IP (DHCP)`;case`pppoe`:return`PPPoE`;case`static`:return`고정 IPv4`;default:return e?e.toUpperCase():`확인 전`}}function mv(e){return{protocol:e.configuration.protocol,pppoeUsername:e.configuration.pppoe.username,pppoePassword:``,staticAddress:e.configuration.static.address??``,staticPrefixLength:e.configuration.static.prefixLength??24,staticGateway:e.configuration.static.gateway??``,dnsPrimary:e.configuration.static.dns[0]??``,dnsSecondary:e.configuration.static.dns[1]??``}}function hv(e){return e.trim()}function gv(e,t){let n=mv(t);return e.protocol===n.protocol?e.protocol===`dhcp`||!fv(e.protocol)?!1:e.protocol===`pppoe`?hv(e.pppoeUsername)!==n.pppoeUsername||e.pppoePassword.length>0:hv(e.staticAddress)!==n.staticAddress||e.staticPrefixLength!==n.staticPrefixLength||hv(e.staticGateway)!==n.staticGateway||hv(e.dnsPrimary)!==n.dnsPrimary||hv(e.dnsSecondary)!==n.dnsSecondary:!0}function _v(e){let t=e.trim().split(`.`);return t.length===4&&t.every(e=>{if(!/^(0|[1-9][0-9]{0,2})$/.test(e))return!1;let t=Number(e);return t>=0&&t<=255})}function vv(e){let t=e;return Array.from({length:4},()=>{if(t>=8)return t-=8,255;if(t<=0)return 0;let e=256-2**(8-t);return t=0,e}).join(`.`)}function yv(e){if(!Number.isFinite(e)||e<=0)return`연결 시간 확인 전`;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}일 ${n}시간 연결됨`:n>0?`${n}시간 ${r}분 연결됨`:`${Math.max(1,r)}분 연결됨`}function bv({feedback:e,onDismiss:t}){return H(`div`,{"aria-live":`polite`,class:`mb-5 rounded-2xl border px-4 py-4 text-sm ${e.kind===`success`?`border-emerald-200 bg-emerald-50 text-emerald-900`:e.kind===`warning`?`border-amber-200 bg-amber-50 text-amber-950`:`border-red-200 bg-red-50 text-red-900`}`,children:H(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[H(`p`,{class:`m-0 font-bold leading-6`,children:e.message}),H(`button`,{class:`min-h-10 shrink-0 rounded-lg border border-current bg-transparent px-3 py-1.5 text-xs font-extrabold`,onClick:t,type:`button`,children:`닫기`})]})})}function xv({data:e,busy:t,onReconnect:n}){let r=e.status,i=r.connected;return H(`section`,{class:`grid gap-4 lg:grid-cols-3`,"aria-label":`인터넷 연결 상태`,children:[H(`article`,{class:`rounded-2xl border p-5 shadow-sm shadow-slate-900/5 ${i?`border-emerald-200 bg-emerald-50 text-emerald-950`:`border-amber-200 bg-amber-50 text-amber-950`}`,children:[H(`div`,{class:`flex items-start justify-between gap-3`,children:[H(`span`,{class:`grid size-10 place-items-center rounded-xl ${i?`bg-emerald-100 text-emerald-700`:`bg-amber-100 text-amber-700`}`,children:H(i?wn:W,{class:`size-5`})}),H(`button`,{class:`inline-flex min-h-10 items-center justify-center gap-2 rounded-xl border border-current bg-transparent px-3 py-2 text-xs font-extrabold transition disabled:cursor-wait disabled:opacity-60`,disabled:t,onClick:n,type:`button`,children:[H(hn,{class:`size-4 ${t?`animate-spin`:``}`}),`재연결`]})]}),H(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] opacity-70`,children:`인터넷 상태`}),H(`p`,{class:`mt-2 mb-0 text-xl font-black`,children:r.pending?`연결 중`:i?`연결됨`:`연결 안 됨`}),H(`p`,{class:`mt-1 mb-0 text-sm font-semibold leading-6 opacity-80`,children:[pv(r.protocol??e.configuration.protocol),` · `,yv(r.uptimeSeconds)]})]}),H(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[H(`span`,{class:`grid size-10 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:H(dn,{class:`size-5`})}),H(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`WAN IPv4`}),H(`p`,{class:`mt-2 mb-0 break-all text-xl font-black text-slate-950`,children:r.address?`${r.address}${r.prefixLength===null?``:`/${r.prefixLength}`}`:`주소 없음`}),H(`p`,{class:`mt-1 mb-0 text-sm font-semibold text-slate-600`,children:r.device?`인터페이스 ${r.device}`:`인터페이스 확인 전`})]}),H(`article`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5`,children:[H(`span`,{class:`grid size-10 place-items-center rounded-xl bg-slate-100 text-slate-700`,children:H(Xt,{class:`size-5`})}),H(`p`,{class:`mt-4 mb-0 text-xs font-extrabold uppercase tracking-[0.14em] text-slate-500`,children:`Gateway · DNS`}),H(`p`,{class:`mt-2 mb-0 break-all text-base font-black text-slate-950`,children:r.gateway??`Gateway 확인 전`}),H(`p`,{class:`mt-1 mb-0 break-all text-sm font-semibold leading-6 text-slate-600`,children:r.dns.length>0?r.dns.join(` · `):`DNS 확인 전`})]})]})}function Sv({action:e,data:t,error:n,feedback:r,loading:i,onDismissFeedback:a,onReconnect:o,onRetry:s,onSave:c}){let[l,u]=F({protocol:`dhcp`,pppoeUsername:``,pppoePassword:``,staticAddress:``,staticPrefixLength:24,staticGateway:``,dnsPrimary:``,dnsSecondary:``}),[d,f]=F(!1),[p,m]=F(!1),[h,g]=F(null);I(()=>{t&&!d&&(u(mv(t)),g(null))},[t,d]);let _=Qe(()=>{let e=[{value:`dhcp`,label:`자동 IP (DHCP)`},{value:`pppoe`,label:`PPPoE`},{value:`static`,label:`고정 IPv4`}];return t&&!t.configuration.supported&&e.unshift({value:t.configuration.protocol,label:`현재 설정 (${t.configuration.protocol})`}),e},[t]);if(i)return H(vs,{});if(n)return H(ys,{message:n,onRetry:s});if(!t)return null;let v=e!==null,y=e=>{u(n=>{let r={...n,...e};return f(gv(r,t)),r}),g(null)},x=async e=>{if(e.preventDefault(),!fv(l.protocol))g(`DHCP, PPPoE 또는 고정 IPv4 중 하나를 선택해 주세요.`);else{if(l.protocol===`pppoe`){if(!hv(l.pppoeUsername)){g(`PPPoE 사용자명을 입력해 주세요.`);return}if((t.configuration.protocol!==`pppoe`||!t.configuration.pppoe.passwordConfigured)&&l.pppoePassword.length===0){g(`PPPoE 연결을 시작하려면 비밀번호를 입력해 주세요.`);return}}if(l.protocol===`static`){if(!_v(l.staticAddress)){g(`고정 IPv4 주소를 올바르게 입력해 주세요.`);return}if(!_v(l.staticGateway)){g(`기본 게이트웨이를 올바르게 입력해 주세요.`);return}if(!_v(l.dnsPrimary)){g(`기본 DNS 서버를 올바르게 입력해 주세요.`);return}if(hv(l.dnsSecondary)&&!_v(l.dnsSecondary)){g(`보조 DNS 서버를 올바르게 입력해 주세요.`);return}}window.confirm(`인터넷 연결 설정을 적용하면 WAN 연결이 다시 시작되어 인터넷이 잠시 끊길 수 있습니다. 계속하시겠습니까?`)&&await c({protocol:l.protocol,pppoeUsername:hv(l.pppoeUsername),pppoePassword:l.pppoePassword,pppoePasswordChanged:l.pppoePassword.length>0,staticAddress:hv(l.staticAddress),staticPrefixLength:l.staticPrefixLength,staticGateway:hv(l.staticGateway),dnsPrimary:hv(l.dnsPrimary),dnsSecondary:hv(l.dnsSecondary)})&&(u(e=>({...e,pppoePassword:``})),f(!1))}};return H(b,{children:[r?H(bv,{feedback:r,onDismiss:a}):null,H(q,{eyebrow:`Overview`,title:`인터넷 연결 상태`,description:`WAN 연결 상태와 네트워크 정보를 확인합니다.`}),H(xv,{data:t,busy:v,onReconnect:()=>{window.confirm(`WAN 연결을 다시 시작합니다. 인터넷이 잠시 끊길 수 있습니다. 계속하시겠습니까?`)&&o()}}),t.configuration.supported?null:H(`section`,{class:`mt-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-amber-950 sm:p-6`,children:H(`div`,{class:`flex items-start gap-3`,children:[H(W,{class:`mt-0.5 size-5 shrink-0 text-amber-700`}),H(`div`,{children:[H(`h2`,{class:`m-0 text-base font-black`,children:`현재 WAN 방식은 직접 관리하지 않습니다`}),H(`p`,{class:`mt-2 mb-0 text-sm font-semibold leading-6 text-amber-900/80`,children:[`현재 설정은 `,t.configuration.protocol,`입니다. 아래에서 DHCP, PPPoE 또는 고정 IPv4를 선택해 저장하면 해당 방식으로 전환합니다.`]})]})]})}),H(`div`,{class:`mt-7`,children:H(q,{eyebrow:`Internet`,title:`인터넷 연결 설정`,description:`통신사 또는 상위 네트워크 환경에 맞는 WAN 연결 방식을 선택합니다.`})}),H(`form`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void x(e),children:[d?H(`div`,{class:`mb-5 flex justify-end`,children:H(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 self-start items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[H(W,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]})}):null,H(`div`,{children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`연결 방식`}),H(U_,{ariaLabel:`WAN 연결 방식`,className:`mt-2 max-w-xl`,disabled:v,id:`wan-protocol`,onChange:e=>y(e===`static`&&!hv(l.dnsSecondary)?{protocol:e,dnsSecondary:uv}:{protocol:e}),options:_,value:l.protocol,variant:`emphasized`}),H(`span`,{class:`mt-2 block text-xs font-semibold leading-5 text-slate-500`,children:`대부분의 가정용 인터넷과 상위 공유기 연결은 자동 IP(DHCP)를 사용합니다.`})]}),l.protocol===`pppoe`?H(`div`,{class:`mt-6 grid gap-5 lg:grid-cols-2`,children:[H(`label`,{class:`block`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`PPPoE 사용자명`}),H(`input`,{autocomplete:`username`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:v,onInput:e=>y({pppoeUsername:e.currentTarget.value}),spellcheck:!1,value:l.pppoeUsername})]}),H(`label`,{class:`block`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`PPPoE 비밀번호`}),H(`span`,{class:`relative mt-2 block`,children:[H(`input`,{autocomplete:`new-password`,class:`min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 pr-12 text-sm font-semibold text-slate-950 shadow-inner outline-none transition focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:v,onInput:e=>y({pppoePassword:e.currentTarget.value}),placeholder:t.configuration.protocol===`pppoe`&&t.configuration.pppoe.passwordConfigured?`변경할 때만 입력`:`PPPoE 비밀번호`,...p?{type:`text`}:{type:`password`},value:l.pppoePassword}),H(`button`,{"aria-label":p?`비밀번호 숨기기`:`비밀번호 표시`,class:`absolute inset-y-0 right-1 grid w-10 place-items-center rounded-lg border-0 bg-transparent text-slate-500`,disabled:v,onClick:()=>m(e=>!e),type:`button`,children:H(p?Sn:xn,{class:`size-5`})})]}),H(`span`,{class:`mt-2 block text-xs text-slate-500`,children:t.configuration.protocol===`pppoe`&&t.configuration.pppoe.passwordConfigured?`비워 두면 현재 저장된 비밀번호를 그대로 사용합니다.`:`통신사에서 제공한 PPPoE 비밀번호를 입력해 주세요.`})]})]}):null,l.protocol===`static`?H(`div`,{class:`mt-6 grid gap-5 lg:grid-cols-2`,children:[H(`label`,{class:`block`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`IPv4 주소`}),H(Z_,{disabled:v,label:`IPv4 주소`,onChange:e=>y({staticAddress:e}),value:l.staticAddress})]}),H(`div`,{class:`block`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`서브넷 마스크`}),H(U_,{ariaLabel:`WAN 서브넷 마스크`,className:`mt-2`,disabled:v,id:`wan-static-prefix-length`,onChange:e=>y({staticPrefixLength:Number(e)}),options:dv.map(e=>({value:String(e),label:`/${e} · ${vv(e)}`})),value:String(l.staticPrefixLength),variant:`emphasized`})]}),H(`label`,{class:`block`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`기본 게이트웨이`}),H(Z_,{disabled:v,label:`기본 게이트웨이`,onChange:e=>y({staticGateway:e}),value:l.staticGateway})]}),H(`label`,{class:`block`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`기본 DNS`}),H(Z_,{disabled:v,label:`기본 DNS`,onChange:e=>y({dnsPrimary:e}),value:l.dnsPrimary})]}),H(`label`,{class:`block lg:col-start-2`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`보조 DNS (선택)`}),H(Z_,{disabled:v,label:`보조 DNS`,onChange:e=>y({dnsSecondary:e}),value:l.dnsSecondary})]})]}):null,l.protocol===`dhcp`?H(`div`,{class:`mt-6 rounded-xl border border-slate-200 bg-slate-50 px-4 py-4 text-sm font-semibold leading-6 text-slate-600`,children:`상위 공유기 또는 통신사 장비에서 IP 주소, 기본 게이트웨이와 DNS 정보를 자동으로 받습니다. 별도의 계정이나 고정 주소가 없다면 이 방식을 사용하세요.`}):null,h?H(`p`,{class:`mt-5 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:h}):null,H(`div`,{class:`mt-6 flex flex-col gap-3 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[H(`p`,{class:`m-0 text-xs font-semibold leading-5 text-slate-500`,children:`설정 저장 후 WAN만 다시 연결하며 LAN 관리 페이지와 내부 네트워크 설정은 유지됩니다.`}),H(`button`,{class:`inline-flex min-h-11 w-full shrink-0 items-center justify-center gap-2 rounded-xl border-0 bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white shadow-sm transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:v||!d,type:`submit`,children:[H(wn,{class:`size-5 ${e===`saving`?`animate-pulse`:``}`}),e===`saving`?`저장 중`:`설정 저장`]})]})]})]})}var Cv=3,wv=10;function Tv(e,t){return e<=0?`0.0%`:`${(t/e*100).toFixed(1)}%`}function Ev(e){return e.id===`other`?`기타 기기`:e.hostname?e.hostname:e.identified?`이름 없는 기기`:`미식별 기기`}function Dv(e){return[...e].sort((e,t)=>e.id===`other`?1:t.id===`other`?-1:t.blocked-e.blocked||t.queries-e.queries||Ev(e).localeCompare(Ev(t),`ko`))}function Ov({devices:e,deviceLimit:t,truncated:n}){let r=Dv(e),[i,a]=F(!1),[o,s]=F(1),c=Math.max(1,Math.ceil(r.length/wv)),l=Math.min(o,c),u=(l-1)*wv,d=Math.min(u+wv,r.length),f=i?r.slice(u,d):r.slice(0,Cv),p=r.length>Cv;return I(()=>{s(e=>Math.min(e,c))},[c]),H(`div`,{class:`mt-6 rounded-2xl border border-slate-100 bg-slate-50/70 p-4 sm:p-5`,children:[H(`div`,{class:`flex flex-wrap items-start justify-between gap-3`,children:[H(`div`,{children:[H(`div`,{class:`flex flex-wrap items-center gap-2`,children:[H(`p`,{class:`m-0 text-xs font-bold text-slate-500`,children:`기기별 통계`}),p&&!i?H(`span`,{class:`inline-flex items-center rounded-full bg-teal-50 px-2 py-1 text-[10px] font-extrabold tracking-wide text-teal-700 ring-1 ring-teal-100`,children:`차단 TOP 3`}):null]}),H(`h3`,{class:`mt-1 mb-0 text-base font-extrabold text-slate-950`,children:`어떤 기기에서 차단되었는지 확인`}),H(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-500`,children:`DHCP 정보가 있는 기기는 MAC 주소를 기준으로 식별하며, 기기별 숫자만 현재 부팅 세션 동안 메모리에 집계합니다.`})]}),H(`div`,{class:`flex flex-wrap items-center justify-end gap-2`,children:[H(`span`,{class:`inline-flex items-center gap-2 rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-slate-600 ring-1 ring-slate-200`,children:[H(Zt,{class:`size-4 text-teal-700`}),J(r.length),`개 항목`]}),p?H(`button`,{"aria-controls":`safeshield-device-statistics-list`,"aria-expanded":i,class:`rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-teal-700 ring-1 ring-slate-200 transition hover:bg-slate-50`,onClick:()=>{a(e=>!e),s(1)},type:`button`,children:i?`간단히 보기 ↑`:`전체 ${J(r.length)}개 기기 보기 ↓`}):null]})]}),r.length===0?H(`p`,{class:`mt-4 mb-0 rounded-xl bg-white p-4 text-sm leading-6 text-slate-500 ring-1 ring-slate-100`,children:`아직 기기별 DNS 통계가 없습니다. 클라이언트에서 DNS 요청이 발생하면 다음 통계 갱신 시 표시됩니다.`}):H(`div`,{class:`mt-4 grid gap-3`,id:`safeshield-device-statistics-list`,children:f.map(e=>H(`article`,{class:`grid gap-4 rounded-xl bg-white p-4 ring-1 ring-slate-100 sm:grid-cols-[minmax(0,1fr)_auto] sm:items-center`,children:[H(`div`,{class:`min-w-0`,children:H(`div`,{class:`flex min-w-0 flex-wrap items-center gap-2`,children:[H(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-lg bg-teal-50 text-teal-700`,children:H(Zt,{class:`size-4`})}),H(`div`,{class:`min-w-0`,children:[H(`h4`,{class:`m-0 truncate text-sm font-extrabold text-slate-950`,children:Ev(e)}),H(`p`,{class:`mt-1 mb-0 break-all text-xs text-slate-500`,children:[e.ip||`IP 미확인`,e.mac?` · ${e.mac}`:``]})]}),H(`span`,{class:`rounded-full px-2 py-1 text-[11px] font-extrabold ${e.identified?`bg-emerald-50 text-emerald-700`:`bg-slate-100 text-slate-600`}`,children:e.id===`other`?`합산`:e.identified?`DHCP 식별`:`IP 임시 식별`})]})}),H(`dl`,{class:`m-0 grid grid-cols-3 gap-2 text-right`,children:[H(`div`,{class:`min-w-20`,children:[H(`dt`,{class:`text-[11px] font-bold text-slate-400`,children:`DNS 요청`}),H(`dd`,{class:`mt-1 mb-0 ml-0 text-sm font-extrabold text-slate-900`,children:J(e.queries)})]}),H(`div`,{class:`min-w-20`,children:[H(`dt`,{class:`text-[11px] font-bold text-slate-400`,children:`차단`}),H(`dd`,{class:`mt-1 mb-0 ml-0 text-sm font-extrabold text-teal-700`,children:J(e.blocked)})]}),H(`div`,{class:`min-w-20`,children:[H(`dt`,{class:`text-[11px] font-bold text-slate-400`,children:`차단율`}),H(`dd`,{class:`mt-1 mb-0 ml-0 text-sm font-extrabold text-slate-900`,children:Tv(e.queries,e.blocked)})]})]})]},e.id))}),p&&!i?H(`p`,{class:`mt-3 mb-0 text-xs font-semibold leading-5 text-slate-500`,children:[`전체 `,J(r.length),`개 기기 중 차단 수 기준 상위 `,Cv,`개를 표시하고 있습니다.`]}):null,i&&r.length>wv?H(`nav`,{"aria-label":`기기별 통계 페이지`,class:`mt-4 flex flex-wrap items-center justify-between gap-3`,children:[H(`p`,{class:`m-0 text-xs font-semibold text-slate-500`,children:[J(u+1),`–`,J(d),` /`,` `,J(r.length),`개`]}),H(`div`,{class:`flex items-center gap-2`,children:[H(`button`,{class:`rounded-lg bg-white px-3 py-2 text-xs font-extrabold text-slate-700 ring-1 ring-slate-200 transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50`,disabled:l<=1,onClick:()=>s(e=>Math.max(1,e-1)),type:`button`,children:`이전`}),H(`span`,{"aria-current":`page`,class:`min-w-20 text-center text-xs font-extrabold text-slate-600`,children:[J(l),` / `,J(c)]}),H(`button`,{class:`rounded-lg bg-white px-3 py-2 text-xs font-extrabold text-slate-700 ring-1 ring-slate-200 transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50`,disabled:l>=c,onClick:()=>s(e=>Math.min(c,e+1)),type:`button`,children:`다음`})]})]}):null,n?H(`p`,{class:`mt-4 mb-0 rounded-xl border border-amber-200 bg-amber-50 p-3 text-xs font-semibold leading-5 text-amber-800`,children:[`개별 통계는 최대 `,J(t),`개 기기까지 추적합니다. 한도를 초과한 기기의 요청은 기타 기기로 합산됩니다.`]}):null]})}var kv=3600,Av=24;function jv(e,t){return e<=0?`0.0%`:`${(t/e*100).toFixed(1)}%`}function Mv(e){let t=e.hourly[e.hourly.length-1];if(t?.bucketStart)return t.bucketStart;let n=e.updatedAt>0?e.updatedAt:Math.floor(Date.now()/1e3);return Math.floor(n/kv)*kv}function Nv(e){let t=new Map(e.hourly.map(e=>[e.bucketStart,e])),n=Mv(e)-23*kv;return Array.from({length:Av},(e,r)=>{let i=n+r*kv;return t.get(i)??{bucketStart:i,queries:0,blocked:0}})}function Pv({emphasized:e=!1,label:t,value:n}){return H(`div`,{class:`rounded-xl bg-slate-50 p-4 sm:p-5`,children:[H(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.12em] text-slate-400`,children:t}),H(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight ${e?`text-teal-700`:`text-slate-950`}`,children:n})]})}function Fv({action:e,data:t,error:n,loading:r,onRetry:i,onSetEnabled:a,refreshing:o}){if(r&&t===null)return H(b,{children:[H(q,{eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청과 차단 현황을 확인합니다.`}),H(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:H(`p`,{class:`m-0 text-sm font-bold text-slate-500`,children:`차단 통계를 불러오는 중입니다…`})})]});if(n&&t===null)return H(b,{children:[H(q,{eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청과 차단 현황을 확인합니다.`}),H(`section`,{class:`rounded-2xl border border-amber-200 bg-amber-50 p-5 sm:p-6`,children:[H(`p`,{class:`m-0 text-sm font-extrabold text-amber-950`,children:`차단 통계를 불러오지 못했습니다.`}),H(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-amber-800`,children:n}),H(`button`,{class:`mt-4 inline-flex min-h-9 items-center justify-center rounded-xl border border-amber-300 bg-white px-3 py-2 text-xs font-extrabold text-amber-900 transition hover:bg-amber-100 focus:outline-none focus-visible:ring-4 focus-visible:ring-amber-100`,onClick:i,type:`button`,children:`다시 시도`})]})]});if(!t)return H(b,{children:[H(q,{eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청과 차단 현황을 확인합니다.`}),H(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:H(`p`,{class:`m-0 text-sm leading-6 text-slate-600`,children:`현재 SafeShield에서 통계 데이터를 제공하지 않습니다. SafeShield 0.3.15 버전 이상이 설치되어 있고, 통계 수집이 활성화되어 있는지 확인해 주세요.`})})]});let s=Nv(t),c=s[s.length-1],l=s.reduce((e,t)=>({queries:e.queries+t.queries,blocked:e.blocked+t.blocked}),{queries:0,blocked:0}),u=e===`statistics-enable`||e===`statistics-disable`,d=e===`statistics-enable`||e!==`statistics-disable`&&t.enabled,f=u?d?`활성화하는 중…`:`비활성화하는 중…`:t.enabled?t.collectorRunning?`활성화 · 수집 중`:`활성화 · 시작 중`:`비활성화`;return H(b,{children:[H(q,{action:H(`div`,{class:`flex items-center gap-3 rounded-xl border border-slate-100 bg-slate-50 px-3 py-2.5`,children:[H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-500`,children:H(vn,{class:`size-5`})}),H(`div`,{class:`text-right`,children:[H(`p`,{class:`m-0 text-[0.68rem] font-bold text-slate-400`,children:`통계 수집`}),H(`p`,{class:`mt-1 mb-0 text-xs font-extrabold ${u||d?`text-emerald-700`:`text-slate-500`}`,role:`status`,children:f})]}),H(`button`,{"aria-checked":d,"aria-label":d?`차단 통계 수집 끄기`:`차단 통계 수집 켜기`,class:`ssh-switch-control relative inline-flex shrink-0 items-center rounded-full border-0 p-0 transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 ${u?`cursor-wait opacity-80`:`disabled:cursor-not-allowed disabled:opacity-50`} ${d?`bg-teal-600`:`bg-slate-300`}`,disabled:e!==null,onClick:()=>a(!t.enabled),role:`switch`,type:`button`,children:H(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 grid place-items-center shadow-sm transition-all ${d?`left-6`:`left-1`}`,children:u?H(hn,{"aria-hidden":`true`,class:`size-3 animate-spin text-teal-600`}):null})})]}),eyebrow:`Activity`,title:`최근 24시간 보호 활동`,description:`DNS 요청 원본은 저장하지 않고 숫자만 로컬 메모리에 집계합니다.`}),H(`section`,{"aria-busy":u,class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 ${u?`cursor-wait`:``}`,children:[t.enabled?null:H(`div`,{class:`mb-4 rounded-xl border border-slate-200 bg-slate-50 px-4 py-3 text-sm leading-6 text-slate-600`,children:`통계 수집이 꺼져 있습니다. 활성화하면 DNS 요청 원본은 저장하지 않고 요청 수와 차단 수만 로컬 메모리에 집계합니다.`}),H(`dl`,{class:`mt-2 grid gap-3 sm:grid-cols-2 xl:grid-cols-4`,children:[H(Pv,{label:`최근 24시간 DNS 요청`,value:J(l.queries)}),H(Pv,{emphasized:!0,label:`최근 24시간 차단`,value:J(l.blocked)}),H(Pv,{label:`최근 24시간 차단율`,value:jv(l.queries,l.blocked)}),H(Pv,{label:`현재 시간 차단`,value:J(c?.blocked??0)})]}),H(`div`,{class:`mt-5 rounded-xl bg-slate-50/70 p-4 sm:p-5`,children:[H(`div`,{class:`flex flex-wrap items-end justify-between gap-3`,children:[H(`div`,{children:[H(`p`,{class:`m-0 text-xs font-bold text-slate-500`,children:`최근 24시간`}),H(`h3`,{class:`mt-1 mb-0 text-base font-extrabold text-slate-950`,children:`시간대별 차단 요청`})]}),H(`span`,{class:`text-xs font-bold text-slate-500`,children:o?`갱신 중…`:`마지막 집계 ${jo(t.updatedAt)}`})]}),H(e_,{buckets:s})]}),H(Ov,{deviceLimit:t.deviceLimit,devices:t.devices,truncated:t.devicesTruncated}),H(`div`,{class:`mt-5 flex flex-wrap gap-x-5 gap-y-2 border-t border-slate-100 pt-4 text-xs leading-5 text-slate-500`,children:[H(`span`,{children:[`수집 누적 DNS 요청 `,J(t.totals.queries)]}),H(`span`,{children:[`수집 누적 차단 `,J(t.totals.blocked)]}),H(`span`,{children:[`수집 시작 `,jo(t.startedAt)]}),H(`span`,{children:[`보존 `,J(t.retentionHours),`시간`]}),t.volatile?H(`span`,{children:`재부팅 시 초기화되는 메모리 통계`}):null]}),n?H(`p`,{class:`mt-3 mb-0 text-xs font-bold text-amber-700`,children:`최근 자동 갱신에 실패했습니다. 현재 표시된 마지막 정상 통계를 유지합니다.`}):null]})]})}function Iv({timestamp:e,fallback:t=`기록 없음`}){let[n,r]=F(()=>Date.now()/1e3),i=typeof e==`number`&&Number.isFinite(e)&&e>0&&e<=864e10;if(I(()=>{if(!i)return;r(Date.now()/1e3);let e=window.setInterval(()=>r(Date.now()/1e3),6e4);return()=>window.clearInterval(e)},[e,i]),!i||e==null)return H(`span`,{children:t});let a=jo(e);return H(`span`,{class:`inline-flex max-w-full flex-wrap items-center gap-1`,children:[H(`time`,{class:`min-w-0`,dateTime:new Date(e*1e3).toISOString(),title:a,children:No(e,n)}),H(`details`,{class:`group inline-flex max-w-full flex-wrap items-center gap-1 align-middle`,children:[H(`summary`,{"aria-label":`정확한 날짜 및 시간 확인`,class:`inline-flex size-6 cursor-pointer list-none items-center justify-center rounded-full text-slate-400 transition hover:text-teal-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-teal-500 [&::-webkit-details-marker]:hidden`,title:`정확한 날짜 및 시간 확인`,children:H(`svg`,{"aria-hidden":`true`,class:`size-3.5`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,viewBox:`0 0 24 24`,children:[H(`circle`,{cx:`12`,cy:`12`,r:`9`}),H(`path`,{d:`M12 11v5m0-8h.01`,strokeLinecap:`round`})]})}),H(`span`,{class:`hidden max-w-full break-words rounded-md bg-slate-100 px-2 py-1 text-xs font-semibold text-slate-700 group-open:inline-block`,children:a})]})]})}var Lv=`https://www.smartsafehub.com/pricing/`;function Rv({value:e,trueLabel:t=`정상`,falseLabel:n=`확인 필요`}){return H(`span`,{class:`inline-flex items-center gap-2 text-sm font-extrabold ${e?`text-emerald-700`:`text-slate-500`}`,children:[H(`span`,{class:`size-2 rounded-full ${e?`bg-emerald-500`:`bg-slate-300`}`}),e?t:n]})}function zv(e){return!e.enabled||e.status===`disabled`?`disabled`:e.status===`running`?`refreshing`:e.status===`error`||e.health.overall===`error`||e.issueCounts.errors>0?`error`:e.status===`paused`?`paused`:e.active&&e.runtime.dnsmasqRunning&&e.runtime.dnsRuntimeOk?`protecting`:`attention`}function Bv(e){return!e.enabled||e.status===`disabled`?`비활성화`:e.active&&e.runtime.dnsmasqRunning&&e.runtime.dnsRuntimeOk?`보호 중`:e.status===`paused`?`일시 중지`:`확인 필요`}function Vv(e){let t=zv(e);return t===`error`&&Bv(e)===`보호 중`&&e.runtime.lastErrorCode?`갱신 실패`:{disabled:`비활성화`,refreshing:`갱신 중`,protecting:`보호 중`,paused:`일시 중지`,error:`오류`,attention:`확인 필요`}[t]}function Hv(e){return e?`자동 최적화`:`확인되지 않음`}function Uv(e){let t=Po(e);return t===null?`확인되지 않음`:H(Iv,{timestamp:t})}function Wv(e){let t=zv(e);return t===`protecting`?e.blocklist.validLineCount>0?`${J(e.blocklist.validLineCount)}개 도메인 차단 규칙으로 DNS를 보호하고 있습니다.`:e.blocklist.installed?`차단 목록이 설치되어 있으며 DNS 보호가 정상적으로 동작하고 있습니다.`:`SafeShield 서비스와 DNS 런타임이 정상적으로 동작하고 있습니다.`:t===`refreshing`?`차단 목록을 최신 상태로 갱신하고 있습니다.`:t===`disabled`?`SafeShield DNS 보호가 비활성화되어 있습니다.`:t===`paused`?`SafeShield 작업이 일시 중지되어 있습니다.`:t===`error`?Bv(e)===`보호 중`?`기존 DNS 보호는 유지되고 있지만 최근 차단 목록 갱신을 완료하지 못했습니다.`:`SafeShield 보호 상태에 문제가 발생했습니다. 아래 오류 내용을 확인해 주세요.`:e.active?e.runtime.dnsmasqRunning?e.runtime.dnsRuntimeOk?e.summary.message:`SafeShield DNS 런타임 상태를 확인해야 합니다.`:`dnsmasq가 실행 중이 아니어서 DNS 보호 상태를 확인해야 합니다.`:`SafeShield가 활성화되어 있지만 서비스가 실행 중이 아닙니다.`}function Gv(e){return{ok:`정상`,warning:`경고`,error:`오류`,unavailable:`사용 불가`}[e]??e}function Kv({data:e}){let t=zv(e);return H(`span`,{class:`inline-flex items-center rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${t===`error`?`bg-red-50 text-red-700 ring-red-200`:t===`disabled`?`bg-slate-100 text-slate-700 ring-slate-200`:t===`refreshing`?`bg-blue-50 text-blue-700 ring-blue-200`:t===`paused`||t===`attention`?`bg-amber-50 text-amber-800 ring-amber-200`:`bg-emerald-50 text-emerald-700 ring-emerald-200`}`,children:Vv(e)})}function qv({failed:e,step:t,total:n}){let r=2*Math.PI*17,i=r*.22,a=r-i;return H(`span`,{"aria-label":e?`갱신 실패 · ${t}/${n} 단계`:`갱신 ${t}/${n} 단계`,class:`ssh-safeshield-refresh-donut`,"data-state":e?`error`:`active`,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":n,"aria-valuenow":t,children:[H(`svg`,{"aria-hidden":`true`,class:e?`ssh-safeshield-refresh-loader-svg ssh-safeshield-refresh-loader-svg-error`:`ssh-safeshield-refresh-loader-svg`,viewBox:`0 0 48 48`,children:[H(`circle`,{class:`ssh-safeshield-refresh-loader-track`,cx:`24`,cy:`24`,fill:`none`,r:17,stroke:`currentColor`,strokeWidth:2.5}),e?null:H(`circle`,{class:`ssh-safeshield-refresh-loader-arc`,cx:`24`,cy:`24`,fill:`none`,r:17,stroke:`currentColor`,strokeDasharray:`${i} ${a}`,strokeLinecap:`round`,strokeWidth:3.5})]}),H(`span`,{class:`ssh-safeshield-refresh-donut-label`,children:e?`!`:`${t}/${n}`})]})}function Jv({data:e}){let t=Ga(e.status,e.stage),n=zv(e)===`error`;if(!t&&!n)return null;let r=Ka(e.stage),i=n?Ja(e.runtime.lastErrorCode,e.stage):null;return H(`div`,{"aria-live":n?`assertive`:`polite`,class:`ssh-safeshield-refresh`,"data-state":n?`error`:`active`,role:n?`alert`:`status`,children:[H(qv,{failed:n,step:r.number,total:r.total}),H(`div`,{class:`ssh-safeshield-refresh-copy`,children:[H(`p`,{class:`ssh-safeshield-refresh-kicker`,children:n?`갱신 실패 · ${r.number}/${r.total}`:`갱신 ${r.number}/${r.total}`}),H(`p`,{class:`ssh-safeshield-refresh-title`,children:n?`${r.label} 단계에서 문제가 발생했습니다.`:r.label}),H(`p`,{class:`ssh-safeshield-refresh-description`,children:i??r.description}),n&&e.runtime.lastErrorCode?H(`p`,{class:`ssh-safeshield-refresh-error-code`,children:[`오류 코드: `,H(`code`,{children:e.runtime.lastErrorCode})]}):null]})]})}function Yv({label:e,value:t}){return H(`div`,{class:`bg-white px-5 py-4 sm:px-6`,children:[H(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.14em] text-slate-400`,children:e}),H(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-extrabold text-slate-950`,title:typeof t==`string`?t:void 0,children:t})]})}function Xv(e){return e?.trim().toUpperCase()||`FREE`}function Zv(e){return e===`FREE`?`free`:e===`PRO`?`pro`:e===`ULTIMATE`?`ultimate`:`paid`}function Qv({compact:e=!1,plan:t}){let n=Zv(t),r=n!==`free`;return H(`span`,{class:`ssh-safeshield-plan-badge`,"data-compact":e?`true`:`false`,"data-tier":n,title:r?`${t} 멤버십`:`무료 플랜`,children:[H(`span`,{"aria-hidden":`true`,class:`ssh-safeshield-plan-badge-mark`,children:r?`✦`:`•`}),H(`span`,{children:t})]})}function $v({plan:e}){let t=Zv(e)===`free`;return H(`div`,{class:`bg-white px-5 py-4 sm:px-6`,children:[H(`dt`,{class:`text-[0.68rem] font-black uppercase tracking-[0.14em] text-slate-400`,children:`Plan`}),H(`dd`,{class:`mt-2 mb-0 ml-0 flex min-w-0 flex-wrap items-center gap-2`,children:[H(Qv,{plan:e}),t?H(`span`,{class:`ssh-safeshield-plan-caption`,children:`기본 플랜`}):null]})]})}function ey(){return H(`div`,{class:`ssh-safeshield-upgrade-card`,children:[H(`span`,{"aria-hidden":`true`,class:`ssh-safeshield-upgrade-mark`,children:`✦`}),H(`div`,{class:`ssh-safeshield-upgrade-copy`,children:[H(`div`,{class:`ssh-safeshield-upgrade-meta`,children:[H(`span`,{children:`SmartSafeHub Membership`}),H(`span`,{class:`ssh-safeshield-upgrade-soon`,children:`Coming soon`})]}),H(`strong`,{children:`더 강력한 보호 기능을 준비하고 있습니다.`}),H(`span`,{children:`프리미엄 보호와 확장된 관리 기능을 미리 확인해 보세요.`})]}),H(`a`,{class:`ssh-safeshield-upgrade-action`,href:Lv,rel:`noopener noreferrer`,target:`_blank`,children:[`요금제 보기`,H(`span`,{"aria-hidden":`true`,children:`→`})]})]})}function ty({children:e,eyebrow:t,icon:n,title:r}){return H(`article`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:p-4 2xl:p-5`,children:[H(`div`,{class:`flex min-w-0 items-start justify-between gap-4 xl:gap-2`,children:[H(`div`,{children:[H(`p`,{class:`m-0 text-[0.68rem] font-black uppercase tracking-[0.16em] text-slate-400`,children:t}),H(`h3`,{class:`mt-2 mb-0 text-lg font-black tracking-tight text-slate-950 xl:text-base 2xl:text-lg`,children:r})]}),H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-500 xl:size-9 2xl:size-10`,children:n})]}),H(`dl`,{class:`mt-5 mb-0 grid gap-3`,children:e})]})}function ny({label:e,value:t}){return H(`div`,{class:`flex min-w-0 items-center justify-between gap-2 border-b border-slate-100 pb-3 last:border-b-0 last:pb-0`,children:[H(`dt`,{class:`text-sm font-semibold text-slate-500`,children:e}),H(`dd`,{class:`m-0 min-w-0 break-words text-right text-sm font-extrabold text-slate-950`,children:t})]})}function ry({error:e,message:t,onDismiss:n}){if(!e&&!t)return null;let r=e!==null;return H(`div`,{"aria-live":r?`assertive`:`polite`,class:`mt-4 flex flex-col items-start gap-3 rounded-2xl border px-4 py-3 text-sm sm:flex-row sm:justify-between ${r?`border-red-200 bg-red-50 text-red-900`:`border-emerald-200 bg-emerald-50 text-emerald-900`}`,role:r?`alert`:`status`,children:[H(`div`,{class:`flex min-w-0 items-start gap-3`,children:[H(r?W:wn,{class:`mt-0.5 size-5 shrink-0`}),H(`p`,{class:`m-0 font-semibold leading-6`,children:e??t})]}),H(`button`,{"aria-label":`알림 닫기`,class:`shrink-0 rounded-lg border-0 bg-transparent px-2 py-1 font-black text-current opacity-60 transition hover:opacity-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-current`,onClick:n,type:`button`,children:`×`})]})}function iy({action:e,actionError:t,actionMessage:n,data:r,error:i,loading:a,statistics:o,statisticsError:s,statisticsLoading:c,statisticsRefreshing:l,onDismissFeedback:u,onRefreshBlocklist:d,onRetry:f,onRetryStatistics:p,onSetEnabled:m,onSetStatisticsEnabled:h}){let[g,_]=F(null);if(I(()=>{r?.available&&r.blocklist.validLineCount>0&&!Ga(r.status,r.stage)&&_(r.blocklist.validLineCount)},[r?.available,r?.blocklist.validLineCount,r?.stage,r?.status]),a)return H(vs,{});if(i)return H(ys,{message:i,onRetry:f});if(!r)return H(vs,{});if(!r.available)return H(`section`,{class:`rounded-2xl border border-amber-200 bg-amber-50 p-5 sm:p-6`,children:[H(`span`,{class:`grid size-11 place-items-center rounded-xl bg-amber-100 text-amber-800`,children:H(W,{class:`size-6`})}),H(`h2`,{class:`mt-5 mb-0 text-xl font-extrabold text-amber-950`,children:`SafeShield 상태 API를 찾을 수 없습니다`}),H(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-amber-900`,children:`safeshield 패키지와 rpcd ucode 플러그인이 설치되어 있는지 확인해 주세요.`})]});let v=r.enabled,y=Xv(r.entitlement.plan),x=r.status===`running`,S=e!==null,C=(Ga(r.status,r.stage)||zv(r)===`error`)&&r.blocklist.validLineCount===0&&g!==null?g:r.blocklist.validLineCount,w=v?e===`disable`?`끄는 중…`:`보호 끄기`:e===`enable`?`켜는 중…`:`보호 켜기`;function T(){(!v||window.confirm(`보호를 끄면, 현재 차단 목록이 제거되어 위험에 노출될 수 있습니다. 그래도 계속하시겠습니까?`))&&m(!v)}return H(b,{children:[H(q,{eyebrow:`Protection`,title:`SafeShield 보호 상태`,description:`DNS 보호 상태와 적용 중인 차단 목록을 확인합니다.`}),H(`section`,{class:`mb-8 grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1.08fr)_minmax(0,0.92fr)] xl:items-stretch`,children:[H(`article`,{"aria-label":`보호 상태 요약`,class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:h-full`,children:[H(`div`,{class:`flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between xl:flex-col 2xl:flex-row`,children:[H(`div`,{class:`flex min-w-0 items-start gap-3`,children:[H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:H(Yt,{class:`size-5`})}),H(`div`,{class:`min-w-0`,children:[H(`div`,{class:`flex flex-wrap items-center gap-2`,children:[H(`h3`,{class:`m-0 text-base font-black text-slate-950`,children:`현재 보호 상태`}),H(Kv,{data:r})]}),H(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:Wv(r)})]})]}),H(`div`,{class:`flex w-full flex-col gap-2 sm:w-auto sm:flex-row sm:flex-wrap xl:justify-end`,children:[H(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border px-4 py-2.5 text-sm font-extrabold transition focus:outline-none focus-visible:ring-4 disabled:cursor-not-allowed disabled:opacity-50 ${r.enabled?`border-red-200 bg-white text-red-700 hover:border-red-300 hover:bg-red-50 focus-visible:ring-red-100`:`border-teal-700 bg-teal-700 text-white hover:border-teal-800 hover:bg-teal-800 focus-visible:ring-teal-100`}`,disabled:S||x,onClick:T,type:`button`,children:[H(gn,{class:`size-4 ${e===`enable`||e===`disable`?`animate-pulse`:``}`}),w]}),H(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border border-slate-200 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-700 transition hover:border-teal-300 hover:bg-teal-50 hover:text-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!r.enabled||S||x,onClick:d,type:`button`,children:[H(_n,{class:`size-4 ${e===`refresh`||x?`animate-bounce`:``}`}),e===`refresh`?`시작 중…`:x?`갱신 중…`:r.status===`error`?`다시 갱신`:`지금 갱신`]})]})]}),H(Jv,{data:r}),H(`dl`,{class:`mt-5 mb-0 grid min-w-0 grid-cols-2 overflow-hidden rounded-xl border border-slate-200 bg-slate-200`,children:[H(Yv,{label:`SafeShield`,value:r.version??`확인되지 않음`}),H(Yv,{label:`Blocklist`,value:`${J(C)}개 도메인`}),H(Yv,{label:`Last refresh`,value:H(Iv,{timestamp:r.timestamps.lastSuccess})}),H($v,{plan:y})]}),y===`FREE`?H(ey,{}):null]}),H(`section`,{"aria-label":`보호 데이터 요약`,class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:h-full`,children:[H(`div`,{class:`flex flex-wrap items-center justify-between gap-3`,children:[H(`div`,{class:`flex min-w-0 items-center gap-3`,children:[H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-500`,children:H(vn,{class:`size-5`})}),H(`div`,{children:[H(`p`,{class:`m-0 text-[0.65rem] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Protection data`}),H(`h3`,{class:`mt-1 mb-0 text-sm font-black text-slate-950`,children:`보호 데이터`})]})]}),H(`span`,{"aria-label":`보호 데이터 상태: ${r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?`최신`:`확인 필요`}`,class:`inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-xs font-extrabold ${r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?`bg-emerald-50 text-emerald-700`:`bg-amber-50 text-amber-700`}`,children:[r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?H(wn,{class:`size-3.5 shrink-0`}):H(W,{class:`size-3.5 shrink-0`}),r.artifact.resolved&&r.blocklist.installed&&r.blocklist.verificationOk?`최신`:`확인 필요`]})]}),H(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-500`,children:`SafeShield가 기기 성능에 맞춰 사용하는 보호 목록의 구성과 최신 상태를 확인합니다.`}),H(`dl`,{class:`mt-3 mb-0 grid grid-cols-1 gap-2 sm:grid-cols-2`,children:[H(`div`,{class:`min-w-0 rounded-lg border border-slate-200 bg-white px-3 py-2.5`,children:[H(`dt`,{class:`text-xs font-bold text-slate-500`,children:`기기 최적화`}),H(`dd`,{class:`mt-1 mb-0 text-sm font-extrabold text-slate-950`,children:Hv(r.artifact.tier)})]}),H(`div`,{class:`min-w-0 rounded-lg border border-slate-200 bg-white px-3 py-2.5`,children:[H(`dt`,{class:`text-xs font-bold text-slate-500`,children:`마지막 업데이트`}),H(`dd`,{class:`mt-1 mb-0 text-sm font-extrabold leading-5 text-slate-950`,children:Uv(r.artifact.version)})]})]}),H(`section`,{"aria-label":`보호 데이터 세부 정보`,class:`mt-3 border-t border-slate-200 pt-3`,children:[H(`h4`,{class:`m-0 text-xs font-extrabold text-slate-600`,children:`세부 정보`}),H(`dl`,{class:`mt-3 mb-0 grid gap-2`,children:[H(ny,{label:`데이터 프로필`,value:r.artifact.tier||`확인되지 않음`}),H(ny,{label:`데이터 버전`,value:r.artifact.version||`확인되지 않음`})]})]})]})]}),H(ry,{error:t,message:n,onDismiss:u}),H(Fv,{action:e,data:o,error:s,loading:c,onRetry:p,onSetEnabled:h,refreshing:l}),H(`section`,{class:`mt-7`,children:[H(q,{description:`DNS 보호 런타임, 차단 목록, 갱신 일정과 상태 점검 결과를 한곳에서 확인합니다.`,eyebrow:`Protection details`,title:`보호 구성`}),H(`div`,{class:`grid min-w-0 grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4`,children:[H(ty,{eyebrow:`Runtime`,icon:H(wn,{class:`size-5`}),title:`DNS 보호 런타임`,children:[H(ny,{label:`SafeShield 서비스`,value:H(Rv,{falseLabel:`중지됨`,trueLabel:`동작 중`,value:r.active})}),H(ny,{label:`DNS 서비스`,value:H(Rv,{falseLabel:`중지됨`,value:r.runtime.dnsmasqRunning})}),H(ny,{label:`SafeShield DNS 연동`,value:H(Rv,{value:r.runtime.dnsRuntimeOk})}),H(ny,{label:`차단 목록 갱신`,value:H(Rv,{falseLabel:`중지됨`,value:r.runtime.refreshdRunning})})]}),H(ty,{eyebrow:`Blocklist`,icon:H(vn,{class:`size-5`}),title:`차단 목록`,children:[H(ny,{label:`적용 규칙`,value:`${J(r.blocklist.validLineCount)}개 도메인`}),H(ny,{label:`파일 크기`,value:Oo(r.blocklist.fileSizeKb*1024)}),H(ny,{label:`설치 상태`,value:H(Rv,{falseLabel:`미설치`,trueLabel:`설치됨`,value:r.blocklist.installed})}),H(ny,{label:`검증 상태`,value:H(Rv,{falseLabel:`확인 필요`,value:r.blocklist.verificationOk})})]}),H(ty,{eyebrow:`Refresh schedule`,icon:H(Cn,{class:`size-5`}),title:`차단 목록 갱신`,children:[H(ny,{label:`마지막 성공`,value:H(Iv,{timestamp:r.timestamps.lastSuccess})}),H(ny,{label:`다음 갱신`,value:jo(r.timestamps.nextRefreshAt)}),H(ny,{label:`갱신 주기`,value:Io(r.timestamps.refreshIntervalS)}),H(ny,{label:`최근 결과`,value:r.runtime.lastResult||(x?`갱신 중`:`확인되지 않음`)})]}),H(ty,{eyebrow:`Health`,icon:H(Yt,{class:`size-5`}),title:`상태 점검`,children:[H(ny,{label:`전체 상태`,value:Gv(r.health.overall)}),H(ny,{label:`경고`,value:H(`span`,{class:`text-amber-700`,children:J(r.issueCounts.warnings)})}),H(ny,{label:`오류`,value:H(`span`,{class:`text-red-700`,children:J(r.issueCounts.errors)})}),H(ny,{label:`최근 오류 코드`,value:r.runtime.lastErrorCode||`없음`})]})]})]})]})}function ay(e,t,n,r){let i=t?e.filter(e=>e.includes(t)):e;if(!n)return{filteredRules:i,manualRules:i,managedRules:[]};let a=[],o=[];for(let e of i)(r.has(e)?o:a).push(e);return{filteredRules:i,manualRules:a,managedRules:o}}function oy(e,t){return t?e.filter(e=>e.title.toLowerCase().includes(t)||e.domains.some(e=>e.includes(t))):e}function sy(e,t){return e===t||e.length===t.length&&e.every((e,n)=>e===t[n])}function cy(e,t){return e===t||e.length===t.length&&e.every((e,n)=>{let r=t[n];return r!==void 0&&e.id===r.id&&e.title===r.title&&sy(e.domains,r.domains)})}function ly(e,t){return{domains:sy(e.domains,t.domains)?e.domains:t.domains,rules:cy(e.rules,t.rules)?e.rules:t.rules}}var uy=[],dy=[];function fy(e){return e.trim().toLowerCase().replace(/\.+$/,``)}function py(e){return e.length===0||e.length>253||!e.includes(`.`)||!/^[a-z0-9.-]+$/.test(e)?!1:e.split(`.`).every(e=>e.length>0&&e.length<=63&&/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(e))}var my=E_(function({action:e,kind:t,onAddRule:n,onDeleteRule:r,rules:i,recommendedDomainSet:a,recommendedKnown:o,recommendedRules:s,onRequestRevoke:c,revokeBusy:l}){let[u,d]=F(``),[f,p]=F(``),[m,h]=F(null),[g,_]=F(!0),[v,y]=F(null),b=t===`allow`,x=e!==null,S=Qe(()=>f.trim().toLowerCase(),[f]),C=S.length>0,{filteredRules:w,manualRules:T,managedRules:E}=Qe(()=>ay(i,S,b&&o,a),[i,S,b,o,a]),D=Qe(()=>b?oy(s,S):[],[b,s,S]),O=C||(v??(s.length||E.length)<=3),k=C||g;async function A(e){e.preventDefault();let r=fy(u);py(r)?(h(null),await n(t,r,()=>{d(e=>fy(e)===r?``:e)})):h(`example.com 형식의 도메인을 입력해 주세요. URL, IP 주소, 와일드카드는 사용할 수 없습니다.`)}let j=b?{badge:`bg-emerald-100 text-emerald-800`,button:`border-emerald-700 bg-emerald-700 text-white hover:border-emerald-800 hover:bg-emerald-800 focus-visible:ring-emerald-100`,icon:`bg-emerald-50 text-emerald-700`,label:`허용 목록`,description:`직접 허용하거나 웹사이트 추천으로 추가된 도메인을 관리합니다.`,empty:`등록된 허용 도메인이 없습니다.`}:{badge:`bg-red-100 text-red-800`,button:`border-red-700 bg-red-700 text-white hover:border-red-800 hover:bg-red-800 focus-visible:ring-red-100`,icon:`bg-red-50 text-red-700`,label:`차단 목록`,description:`SafeShield 기본 목록에 없더라도 직접 차단할 도메인을 등록합니다.`,empty:`등록된 차단 도메인이 없습니다.`};function M(n){let i=b&&o&&a.has(n),s=!b||o?i?`추천 규칙`:`직접 추가`:null,c=e?.operation===`delete`&&e.action===t&&e.domain===n;return H(`li`,{class:`flex min-w-0 items-center justify-between gap-3 px-3.5 py-3`,children:[H(`div`,{class:`flex min-w-0 flex-1 flex-wrap items-center gap-2`,children:H(`code`,{class:`min-w-0 break-all font-mono text-sm font-semibold text-slate-800`,children:n})}),i?H(`span`,{class:`shrink-0 rounded-full bg-teal-50 px-2.5 py-1 text-[11px] font-bold text-teal-800`,title:`추천 규칙의 적용과 해제는 웹사이트에서 관리합니다.`,children:`웹사이트 관리`}):H(`button`,{"aria-label":`${n} ${j.label}에서 삭제`,class:`inline-flex size-9 shrink-0 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-500 transition hover:border-red-200 hover:bg-red-50 hover:text-red-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-red-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:x||i,onClick:()=>void r(t,n),title:s===`직접 추가`?`직접 추가한 규칙 삭제`:`삭제`,type:`button`,children:H(En,{class:`size-4 ${c?`animate-pulse`:``}`})})]},n)}return H(`article`,{class:`min-w-0 overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm shadow-slate-900/5`,children:[H(`div`,{class:`border-b border-slate-200 p-4 sm:p-6`,children:[H(`div`,{class:`flex min-w-0 items-start gap-3`,children:[H(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl ${j.icon}`,children:H(b?wn:Yt,{class:`size-6`})}),H(`div`,{class:`min-w-0`,children:[H(`div`,{class:`flex flex-wrap items-center gap-2`,children:[H(`h2`,{class:`m-0 text-xl font-extrabold tracking-tight text-slate-950`,children:j.label}),H(`span`,{class:`rounded-full px-2.5 py-1 text-xs font-extrabold ${j.badge}`,children:i.length})]}),H(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:j.description})]})]}),H(`form`,{class:`mt-5`,onSubmit:A,children:[H(`label`,{class:`block text-xs font-extrabold text-slate-600`,for:`${t}-domain`,children:`새 도메인`}),H(`div`,{class:`mt-2 flex flex-col gap-2 sm:flex-row`,children:[H(`input`,{"aria-describedby":m?`${t}-domain-error`:void 0,"aria-invalid":m?!0:void 0,autocomplete:`off`,class:`min-h-11 min-w-0 flex-1 rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:x,id:`${t}-domain`,onInput:e=>d(e.currentTarget.value),placeholder:`example.com`,spellcheck:!1,type:`text`,value:u}),H(`button`,{class:`inline-flex min-h-11 w-full shrink-0 items-center justify-center gap-2 rounded-xl border px-4 py-2.5 text-sm font-extrabold transition focus:outline-none focus-visible:ring-4 disabled:cursor-not-allowed disabled:opacity-50 sm:w-auto ${j.button}`,disabled:x||u.trim().length===0,type:`submit`,children:[H(Tn,{class:`size-4`}),e?.operation===`add`&&e.action===t?`추가 중…`:`추가`]})]}),m?H(`p`,{class:`mt-2 mb-0 text-xs font-semibold leading-5 text-red-700`,id:`${t}-domain-error`,children:m}):null]})]}),H(`div`,{class:`p-4 sm:p-6`,children:[H(`label`,{class:`relative block`,for:`${t}-search`,children:[H(`span`,{class:`sr-only`,children:[j.label,` 검색`]}),H(`span`,{class:`pointer-events-none absolute inset-y-0 left-0 flex w-11 items-center justify-center text-slate-400`,children:H(Dn,{class:`size-4`})}),H(`input`,{class:`min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 py-2.5 pr-4 pl-11 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100`,id:`${t}-search`,onInput:e=>p(e.currentTarget.value),placeholder:`${j.label} 검색`,type:`search`,value:f})]}),b&&o?H(`div`,{class:`mt-4 overflow-hidden rounded-xl border border-slate-200`,children:[H(`section`,{"aria-label":`직접 추가한 허용 규칙`,children:[H(`button`,{"aria-controls":`allow-manual-domains`,"aria-expanded":k,class:`flex min-h-14 w-full items-center justify-between gap-3 ssh-rule-group-toggle bg-slate-50 px-4 py-3 text-left focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>_(!k),type:`button`,children:[H(`span`,{class:`min-w-0 text-sm font-extrabold text-slate-800`,children:[`직접 추가한 규칙 `,H(`span`,{class:`ml-1 rounded-full bg-white px-2 py-0.5 text-xs font-bold text-slate-600`,children:[T.length,C?`개 검색됨`:`개`]})]}),H(`span`,{"aria-hidden":`true`,class:`shrink-0 text-sm font-bold text-slate-500`,children:k?`접기 −`:`펼치기 +`})]}),H(`div`,{hidden:!k,id:`allow-manual-domains`,children:T.length?H(`ul`,{class:`m-0 max-h-[20rem] list-none divide-y divide-slate-200 overflow-y-auto p-0`,children:T.map(M)}):H(`p`,{class:`m-0 px-4 py-5 text-sm text-slate-500`,children:C?`검색 결과가 없습니다.`:`직접 추가한 허용 도메인이 없습니다.`})})]}),H(`section`,{"aria-label":`웹사이트 추천 규칙`,class:`border-t border-slate-200`,children:[H(`button`,{"aria-controls":`allow-recommended-domains`,"aria-expanded":O,class:`flex min-h-14 w-full items-center justify-between gap-3 ssh-rule-group-toggle bg-slate-50 px-4 py-3 text-left focus-visible:outline-2 focus-visible:outline-teal-500`,onClick:()=>y(!O),type:`button`,children:[H(`span`,{class:`min-w-0 text-sm font-extrabold text-slate-800`,children:[`추천 규칙 `,H(`span`,{class:`ml-1 rounded-full bg-white px-2 py-0.5 text-xs font-bold text-teal-800`,children:[!C&&s.length?s.length:E.length,C?`개 검색됨`:`개`]})]}),H(`span`,{"aria-hidden":`true`,class:`shrink-0 text-sm font-bold text-slate-500`,children:O?`접기 −`:`펼치기 +`})]}),H(`div`,{hidden:!O,id:`allow-recommended-domains`,children:[D.length?H(`ul`,{class:`m-0 max-h-[22rem] list-none divide-y divide-slate-200 overflow-y-auto p-0`,children:D.map(e=>H(`li`,{class:`flex min-w-0 flex-wrap items-center justify-between gap-3 px-3.5 py-3`,children:[H(`div`,{class:`min-w-0 flex-1`,children:[H(`strong`,{class:`block break-words text-sm text-slate-900`,children:e.title}),H(`div`,{class:`mt-1 flex flex-wrap gap-1.5`,children:e.domains.map(e=>H(`code`,{class:`break-all text-xs text-slate-600`,children:e},e))})]}),c?H(`button`,{class:`shrink-0 rounded-lg border border-red-200 px-3 py-2 text-xs font-bold text-red-700 hover:bg-red-50 disabled:opacity-50`,disabled:l||x,onClick:()=>c(e),type:`button`,children:`적용 해제`}):H(`span`,{class:`text-xs text-slate-500`,children:`웹사이트 관리`})]},e.id))}):E.length?H(`ul`,{class:`m-0 max-h-[20rem] list-none divide-y divide-slate-200 overflow-y-auto p-0`,children:E.map(M)}):H(`p`,{class:`m-0 px-4 py-5 text-sm text-slate-500`,children:C?`검색 결과가 없습니다.`:`추천으로 추가된 허용 도메인이 없습니다.`}),C?null:H(`p`,{class:`m-0 border-t border-slate-100 px-4 py-3 text-xs leading-5 text-slate-500`,children:`추천 규칙은 이 공유기에서 적용 해제할 수 있습니다. 새 규칙의 적용은 SmartSafeHub 웹사이트에서 관리해 주세요.`})]})]})]}):H(`div`,{class:`mt-4 max-h-[28rem] overflow-y-auto rounded-xl border border-slate-200`,children:w.length?H(`ul`,{class:`m-0 list-none divide-y divide-slate-200 p-0`,children:w.map(M)}):H(`div`,{class:`px-5 py-10 text-center`,children:[H(On,{class:`mx-auto size-8 text-slate-300`}),H(`p`,{class:`mt-3 mb-0 text-sm font-bold text-slate-600`,children:C?`검색 결과가 없습니다.`:j.empty})]})})]})]})});function hy({action:e,data:t,error:n,feedback:r,loading:i,onAddRule:a,onDeleteRule:o,onDismissFeedback:s,onRetry:c,onLoadRecommendedRulesStatus:l,onSyncRecommendedRules:u,onRevokeRecommendedRule:d}){let[f,p]=F(null),[m,h]=F(!1),[g,_]=F(!1),[v,y]=F(null),[x,S]=F(!1),[C,w]=F(!1),[T,E]=F(!1),D=L(null),O=L(null),k=L(null),A=L(c);A.current=c;let[j,M]=F(null),[N,P]=F(null),ee=f?.domains??uy,te=f?.rules??dy,ne=Qe(()=>new Set(ee),[ee]),re=R(e=>{p(t=>{if(!t)return e;let{domains:n,rules:r}=ly(t,e);return{...e,domains:n,rules:r}}),h(!0);let t=JSON.stringify([e.revision,e.domains]),n=!1;return e.syncStatus===`confirmed`&&k.current!==t&&(O.current!==null&&(A.current(),n=!0),k.current=t),O.current=t,D.current!==null&&e.revokeOperation?.phase===`failed`&&e.revokeOperation.argument===String(D.current)&&(D.current=null,w(!1),E(!1),P(`추천 규칙 적용 해제를 완료하지 못했습니다. 연결 상태를 확인하고 다시 시도해 주세요.`)),e.syncStatus===`confirmed`&&D.current===null&&e.revokeOperation?.phase!==`failed`&&P(null),D.current!==null&&e.syncStatus===`confirmed`&&!e.rules.some(e=>e.id===D.current)&&(D.current=null,w(!1),E(!1),P(null),M(`추천 규칙 적용 해제를 확인했습니다.`)),n},[]);I(()=>{if(!l)return;let e=l,t=!0,n=!1;function r(){n||g||x||(n=!0,e().then(e=>{t&&re(e)}).catch(()=>{}).finally(()=>{n=!1}))}r();let i=window.setInterval(r,15e3),a=()=>r(),o=()=>{document.hidden||r()};return window.addEventListener(`focus`,a),document.addEventListener(`visibilitychange`,o),()=>{t=!1,window.clearInterval(i),window.removeEventListener(`focus`,a),document.removeEventListener(`visibilitychange`,o)}},[l,g,x,re]),I(()=>{if(!C)return;let e=window.setTimeout(()=>E(!0),6e4);return()=>window.clearTimeout(e)},[C]);async function ie(){if(!(!u||g||x)){_(!0),P(null),M(null);try{let e=await u(),t=re(e);M(e.syncStatus===`confirmed`?`서버에서 규칙을 가져와 SafeShield 허용 목록을 확인했습니다.`:`추천 규칙 상태를 확인 중입니다. 진행 결과는 자동으로 갱신됩니다.`),e.syncStatus===`confirmed`&&!t&&c()}catch{P(`추천 규칙을 동기화하지 못했습니다. 서버 연결 및 기기 등록 상태를 확인해 주세요.`)}finally{_(!1)}}}async function ae(){if(!v||x||!d)return;let e=v.id;D.current=e,S(!0),w(!0),E(!1),P(null),M(null);try{let t=await d(e);re(t),y(null),D.current!==null&&M(`적용 해제 요청을 처리했습니다. 공유기의 허용 목록을 확인하고 있습니다.`)}catch{y(null),P(`적용 해제 결과를 아직 확인하지 못했습니다. 공유기의 상태를 자동으로 다시 확인합니다.`);try{let e=await l?.();e&&re(e)}catch{}}finally{S(!1)}}let oe=f?.syncStage,se=f?.syncStatus===`pending`,ce=f?.syncStatus===`delayed`,le=f?.syncStatus===`failed`,ue=oe===`server_sync`?`서버 동기화 중`:oe===`safeshield_refreshing`?`SafeShield 갱신 중`:oe===`applying`?`추천 규칙 적용 중`:oe===`verifying`?`허용 목록 확인 중`:ce?`재확인 지연`:le?`동기화 실패`:se?`동기화 대기`:`허용 목록 확인`,de=oe===`safeshield_refreshing`&&se?`SafeShield가 보호 목록을 갱신하고 있습니다. 갱신이 끝나면 추천 규칙을 자동으로 다시 확인합니다.`:oe===`applying`&&se?`추천 규칙을 SafeShield 허용 목록에 반영하고 있습니다.`:oe===`verifying`&&se?`SafeShield 허용 목록에서 추천 규칙 반영 결과를 확인하고 있습니다.`:oe===`server_sync`&&se?`SmartSafeHub 서버에서 최신 추천 규칙을 확인하고 있습니다.`:ce?`서버 응답이 지연되고 있습니다. 이미 확인한 허용 규칙은 유지되며 자동으로 다시 시도합니다.`:le?f?.syncReason===`auth_rejected`?`SmartSafeHub 기기 인증이 거부되었습니다. 공유기 계정 연결 상태를 확인해 주세요.`:f?.syncReason===`api_rejected`?`서버가 추천 규칙 요청을 거부했습니다. Hub API 배포 상태를 확인해 주세요.`:f?.syncReason===`invalid_response`?`서버 응답을 확인할 수 없습니다. 규칙은 유지되며 다음 동기화에서 다시 확인합니다.`:`추천 규칙 반영을 완료하지 못했습니다. 다음 자동 동기화에서 다시 시도합니다.`:se?`추천 규칙의 적용 결과를 기다리고 있습니다.`:null,fe=C&&D.current!==null?{tone:`amber`,label:T?`적용 해제 처리 지연`:`적용 해제 확인 중`,description:T?`적용 해제 확인이 지연되고 있습니다. SafeShield 갱신 중이라면 완료 후 자동으로 재확인합니다.`:de??`적용 해제 상태를 확인하고 있습니다. 확인되면 목록과 상태가 자동 갱신됩니다.`}:se||ce||le?{tone:le?`red`:`amber`,label:ue,description:de??``}:N?{tone:`red`,label:`상태 확인 필요`,description:N}:f?.syncWarning?{tone:`amber`,label:`서버 재확인 지연`,description:`이미 확인한 허용 규칙은 유지되며 자동으로 다시 시도합니다.`}:j?{tone:`green`,label:`허용 목록 확인`,description:j}:null;return i&&!t?H(vs,{}):n&&!t?H(ys,{message:n,onRetry:c}):t?H(b,{children:[v?H(`div`,{class:`fixed inset-0 z-50 flex items-center justify-center bg-slate-950/70 p-4`,role:`presentation`,onClick:()=>{x||y(null)},children:H(`section`,{"aria-labelledby":`recommended-revoke-title`,"aria-modal":`true`,class:`w-full max-w-md rounded-2xl border border-slate-200 bg-white p-5 shadow-xl`,onClick:e=>e.stopPropagation(),role:`dialog`,children:[H(`h2`,{class:`m-0 text-lg font-extrabold text-slate-950`,id:`recommended-revoke-title`,children:`추천 규칙 적용 해제`}),H(`p`,{class:`mt-3 text-sm text-slate-700`,children:[H(`strong`,{children:v.title}),` 규칙을 이 공유기에서 해제할까요?`]}),H(`p`,{class:`mt-2 text-xs leading-5 text-slate-600`,children:[`포함된 도메인 `,v.domains.length,`개를 다시 확인합니다. 직접 추가한 허용 규칙과 다른 추천 규칙에 필요한 도메인은 유지됩니다.`]}),H(`div`,{class:`mt-5 flex justify-end gap-2`,children:[H(`button`,{class:`rounded-lg border border-slate-200 px-4 py-2 text-sm font-bold text-slate-700 disabled:cursor-wait disabled:opacity-50`,disabled:x,onClick:()=>y(null),type:`button`,children:`취소`}),H(`button`,{class:`inline-flex min-w-24 items-center justify-center gap-2 rounded-lg bg-red-700 px-4 py-2 text-sm font-bold text-white transition hover:bg-red-800 disabled:cursor-progress disabled:bg-red-700 disabled:opacity-80`,"aria-busy":x,disabled:x,onClick:()=>void ae(),type:`button`,children:[x?H(`svg`,{class:`size-4 animate-spin`,"aria-hidden":`true`,viewBox:`0 0 24 24`,fill:`none`,children:[H(`circle`,{cx:`12`,cy:`12`,r:`9`,stroke:`currentColor`,"stroke-width":`3`,opacity:`0.25`}),H(`path`,{d:`M21 12a9 9 0 0 0-9-9`,stroke:`currentColor`,"stroke-width":`3`,"stroke-linecap":`round`})]}):null,H(`span`,{role:`status`,children:x?`해제 중…`:`적용 해제`})]})]})]})}):null,H(q,{eyebrow:`Local overrides`,title:`사용자 도메인 규칙`,description:`허용 목록은 오탐을 해제하고, 차단 목록은 원하는 도메인을 SafeShield 보호 목록에 추가합니다.`}),H(`section`,{"aria-label":`규칙 개수 요약`,class:`min-w-0`,children:H(`dl`,{class:`m-0 grid grid-cols-1 gap-3 sm:grid-cols-3`,children:[H(`div`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white px-5 py-4 shadow-sm shadow-slate-900/5`,children:[H(`dt`,{class:`text-sm font-extrabold text-emerald-700`,children:`허용 도메인`}),H(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight text-slate-950`,children:[t.counts.allow,H(`span`,{class:`ml-1 text-sm font-bold text-slate-500`,children:`개`})]}),H(`p`,{class:`mt-1 mb-0 text-xs text-slate-500`,children:`차단하지 않도록 등록한 도메인`})]}),H(`div`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white px-5 py-4 shadow-sm shadow-slate-900/5`,children:[H(`dt`,{class:`text-sm font-extrabold text-red-700`,children:`차단 도메인`}),H(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight text-slate-950`,children:[t.counts.block,H(`span`,{class:`ml-1 text-sm font-bold text-slate-500`,children:`개`})]}),H(`p`,{class:`mt-1 mb-0 text-xs text-slate-500`,children:`추가로 차단하도록 등록한 도메인`})]}),H(`div`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white px-5 py-4 shadow-sm shadow-slate-900/5`,children:[H(`dt`,{class:`text-sm font-extrabold text-slate-600`,children:`전체 등록 규칙`}),H(`dd`,{class:`mt-2 mb-0 ml-0 text-2xl font-black tracking-tight text-slate-950`,children:[t.counts.total,H(`span`,{class:`ml-1 text-sm font-bold text-slate-500`,children:`개`})]}),H(`p`,{class:`mt-1 mb-0 text-xs text-slate-500`,children:`허용 및 차단 규칙의 합계`})]})]})}),H(`div`,{class:`mt-7`,children:H(q,{eyebrow:`Recommendations`,title:`추천 사용자 규칙`,description:`웹사이트에서 선택한 권장 허용 규칙의 동기화 상태를 확인하고 관리합니다.`})}),H(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-5`,"aria-label":`추천 사용자 규칙`,children:[H(`div`,{class:`flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between`,children:[H(`div`,{class:`min-w-0 flex-1`,children:[H(`div`,{class:`flex flex-wrap items-center gap-2`,children:[H(`span`,{class:`grid size-8 place-items-center rounded-lg bg-teal-50 text-teal-700`,children:H(wn,{class:`size-4`})}),H(`h3`,{class:`m-0 text-base font-extrabold text-slate-950`,children:`동기화 상태`}),l?H(`span`,{"aria-live":`polite`,class:`rounded-full px-2.5 py-1 text-xs font-bold ${f?.syncStatus===`confirmed`?`bg-emerald-100 text-emerald-800`:f?.syncStatus===`failed`?`bg-red-100 text-red-800`:`bg-amber-100 text-amber-800`}`,children:f?.syncStatus===`confirmed`?`허용 목록 확인`:ue}):null]}),H(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:`웹사이트에서 선택한 허용 규칙을 약 30초마다 확인합니다. 적용 해제는 이 공유기에서도 할 수 있습니다.`}),H(`div`,{class:`mt-2 flex flex-wrap items-center gap-x-4 gap-y-1 text-xs font-semibold text-slate-600`,children:[H(`span`,{children:[`추천으로 추가 `,H(`strong`,{class:`text-teal-800`,children:[m?ee.length:`—`,`개 도메인`]})]}),f?.syncStatus===`confirmed`?H(`span`,{children:[`허용 확인 `,H(`strong`,{class:`text-emerald-800`,children:[f.confirmedDomains.length,`개`]})]}):null,f?.lastCheckedAt?H(`span`,{children:[f.syncWarning?`최근 재확인 시도`:`최근 확인`,`: `,H(Iv,{timestamp:f.lastCheckedAt})]}):null]})]}),H(`div`,{class:`flex w-full flex-wrap gap-2 sm:w-auto lg:shrink-0`,children:[u?H(`button`,{class:`inline-flex min-h-10 flex-1 items-center justify-center rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-800 transition hover:bg-slate-50 disabled:cursor-wait disabled:opacity-60 sm:flex-none`,disabled:g,onClick:()=>void ie(),type:`button`,children:g?`동기화 중…`:`지금 동기화`}):null,H(`a`,{class:`inline-flex min-h-10 flex-1 items-center justify-center rounded-xl border border-teal-700 bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 sm:flex-none`,href:`https://www.smartsafehub.com/dashboard/recommended-rules/`,target:`_blank`,rel:`noopener noreferrer`,children:`추천 규칙 보기 ↗`})]})]}),fe?H(`div`,{"aria-live":`polite`,class:`mt-3 flex items-start gap-2 rounded-xl px-3 py-2.5 text-sm ${fe.tone===`red`?`bg-red-50 text-red-800`:fe.tone===`green`?`bg-emerald-50 text-emerald-800`:`bg-amber-50 text-amber-800`}`,role:`status`,children:[H(`span`,{"aria-hidden":`true`,class:`mt-1 size-2 shrink-0 rounded-full ${fe.tone===`red`?`bg-red-500`:fe.tone===`green`?`bg-emerald-500`:`bg-amber-500`}`}),H(`div`,{class:`min-w-0`,children:[H(`strong`,{children:fe.label}),H(`p`,{class:`mt-1 mb-0 leading-5`,children:fe.description})]})]}):null,H(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`추천 규칙 동기화는 SafeShield 차단 목록 갱신과 별개입니다. 허용 목록 확인은 DNS 처리나 서비스 재생 성공을 보장하지 않습니다.`})]}),t.applyLocalOverrides?null:H(`section`,{class:`mt-4 flex items-start gap-3 rounded-2xl border border-amber-200 bg-amber-50 p-4`,role:`alert`,children:[H(W,{class:`mt-0.5 size-5 shrink-0 text-amber-700`}),H(`div`,{children:[H(`p`,{class:`m-0 text-sm font-extrabold text-amber-950`,children:`로컬 규칙 적용이 꺼져 있습니다`}),H(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-amber-800`,children:`규칙은 저장되지만 SafeShield의 apply_local_overrides 설정을 켜기 전까지 DNS에 반영되지 않습니다.`})]})]}),t.safeshieldEnabled?null:H(`section`,{class:`mt-4 flex items-start gap-3 rounded-2xl border border-slate-200 bg-slate-100 p-4`,role:`status`,children:[H(Yt,{class:`mt-0.5 size-5 shrink-0 text-slate-600`}),H(`div`,{children:[H(`p`,{class:`m-0 text-sm font-extrabold text-slate-950`,children:`SafeShield가 비활성화되어 있습니다`}),H(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-600`,children:`규칙을 미리 저장할 수 있으며, SafeShield를 켜고 차단 목록을 갱신하면 적용됩니다.`})]})]}),r?H(`section`,{"aria-live":`polite`,class:`mt-4 flex flex-col items-start gap-3 rounded-2xl border border-teal-200 bg-teal-50 sm:flex-row sm:justify-between p-4`,children:[H(`div`,{class:`flex min-w-0 items-start gap-3`,children:[H(wn,{class:`mt-0.5 size-5 shrink-0 text-teal-700`}),H(`p`,{class:`m-0 text-sm font-semibold leading-6 text-teal-950`,children:r})]}),H(`button`,{class:`shrink-0 rounded-lg border-0 bg-transparent px-2 py-1 text-xs font-extrabold text-teal-800 hover:bg-teal-100`,onClick:s,type:`button`,children:`닫기`})]}):null,n&&t?H(`section`,{"aria-live":`assertive`,class:`mt-4 flex items-start gap-3 rounded-2xl border border-red-200 bg-red-50 p-4`,children:[H(W,{class:`mt-0.5 size-5 shrink-0 text-red-700`}),H(`p`,{class:`m-0 text-sm font-semibold leading-6 text-red-900`,children:n})]}):null,H(`section`,{class:`mt-5 grid gap-5 xl:grid-cols-2`,children:[H(my,{action:e,kind:`allow`,onAddRule:a,onDeleteRule:o,rules:t.allow,recommendedDomainSet:ne,recommendedKnown:m,recommendedRules:te,...d?{onRequestRevoke:y}:{},revokeBusy:x}),H(my,{action:e,kind:`block`,onAddRule:a,onDeleteRule:o,rules:t.block,recommendedDomainSet:ne,recommendedKnown:m,recommendedRules:te,revokeBusy:x})]})]}):H(ys,{message:`사용자 규칙 응답이 비어 있습니다.`,onRetry:c})}function gy(e,t){return V(`smartsafehub`,`system_root_password_change`,{current_password:e,new_password:t})}var _y=Array.from({length:24},(e,t)=>{let n=String(t).padStart(2,`0`);return{value:n,label:`${n}시`}}),vy=Array.from({length:60},(e,t)=>{let n=String(t).padStart(2,`0`);return{value:n,label:`${n}분`}});function yy(e){let t=/^([01]\d|2[0-3]):([0-5]\d)$/.exec(e);return{hour:t?.[1]??`03`,minute:t?.[2]??`00`}}function by({ariaLabel:e,className:t=``,disabled:n=!1,id:r,onChange:i,value:a,variant:o=`default`}){let{hour:s,minute:c}=yy(a),l=(e,t)=>{i(`${e}:${t}`)};return H(`div`,{"aria-label":e,class:`ssh-time-select ${t}`.trim(),"data-time-select":r,role:`group`,children:[H(U_,{ariaLabel:`${e} 시`,disabled:n,id:`${r}-hour`,onChange:e=>l(e,c),options:_y,value:s,variant:o}),H(U_,{ariaLabel:`${e} 분`,disabled:n,id:`${r}-minute`,onChange:e=>l(s,e),options:vy,value:c,variant:o})]})}function xy(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||null}catch{return null}}function Sy(e){return H(`article`,{class:`h-full min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 ${e.className??``}`,children:[H(`div`,{class:`flex min-w-0 items-start justify-between gap-3`,children:[H(`div`,{class:`flex min-w-0 items-start gap-4`,children:[H(`div`,{class:`flex size-11 shrink-0 items-center justify-center rounded-xl bg-slate-100 text-slate-600`,children:e.icon}),H(`div`,{class:`min-w-0`,children:[H(`div`,{class:`flex flex-wrap items-center gap-2`,children:[H(`h2`,{class:`m-0 text-lg font-black text-slate-950`,children:e.title}),e.titleActions]}),H(`p`,{class:`mt-1.5 mb-0 text-sm leading-6 text-slate-500`,children:e.description})]})]}),e.headerActions?H(`div`,{class:`shrink-0`,children:e.headerActions}):null]}),H(`div`,{class:`mt-5`,children:e.children})]})}function Cy(e){let[t,n]=F(``),[r,i]=F(e.data?.localtime??0),a=xy();I(()=>{e.data?.zonename&&n(e.data.zonename)},[e.data?.zonename]),I(()=>{let t=e.data?.localtime??0,n=Date.now();if(i(t),!Number.isFinite(t)||t<=0)return;let r=window.setInterval(()=>{i(t+Math.floor((Date.now()-n)/1e3))},1e3);return()=>window.clearInterval(r)},[e.data?.localtime]);let o=e.data?Object.keys(e.data.timezones).sort((e,t)=>e.localeCompare(t)):[],s=Fo(r,e.data?.zonename??`UTC`),c=a!==null&&e.data?.timezones[a]!==void 0,l=e.data!==null&&t.length>0&&t!==e.data.zonename;return H(b,{children:[H(Sy,{description:`공유기의 기준 시간대를 설정합니다. 로그, 통계, 자동 설치와 예약 재부팅 시각도 이 시간대를 기준으로 동작합니다.`,icon:H(pn,{class:`size-5`}),title:`시간 및 시간대`,children:[(e.saveError||e.saveMessage)&&H(`div`,{class:`mb-5 flex min-w-0 items-start justify-between gap-3 rounded-xl border px-4 py-3 text-sm font-bold ${e.saveError?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[H(`span`,{class:`min-w-0`,children:e.saveError||e.saveMessage}),H(`button`,{class:`shrink-0 rounded-lg px-2 py-1 text-xs font-extrabold hover:bg-black/5`,onClick:e.onDismissFeedback,type:`button`,children:`닫기`})]}),e.error&&!e.data?H(`div`,{class:`rounded-xl border border-rose-200 bg-rose-50 p-4`,children:[H(`p`,{class:`m-0 text-sm font-bold text-rose-800`,children:e.error}),H(`button`,{class:`mt-3 inline-flex min-h-10 items-center rounded-xl border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700 transition hover:bg-rose-100`,onClick:e.onRetry,type:`button`,children:`다시 불러오기`})]}):H(b,{children:[H(`div`,{class:`grid min-w-0 grid-cols-1 gap-3 sm:grid-cols-2`,children:[H(`div`,{class:`rounded-xl bg-slate-50 p-4`,children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.12em] text-slate-500`,children:`현재 시간`}),H(`p`,{class:`mt-2 mb-0 text-sm font-extrabold leading-6 text-slate-900`,children:s}),H(`p`,{class:`mt-1 mb-0 break-words text-xs leading-5 text-slate-500`,children:e.data?.zonename??`시간대 확인 중`})]}),H(`div`,{class:`rounded-xl bg-slate-50 p-4`,children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.12em] text-slate-500`,children:`시간 동기화`}),H(`p`,{class:`mt-2 mb-0 text-sm font-extrabold ${e.data?.ntpEnabled?`text-emerald-700`:`text-amber-700`}`,children:e.data?.ntpEnabled?`자동 동기화 설정됨`:`자동 동기화 꺼짐`}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`장치의 기본 NTP 설정 상태입니다.`}),H(`button`,{class:`mt-3 inline-flex min-h-9 items-center justify-center gap-2 rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700 transition hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!e.data?.ntpEnabled||e.saving||e.syncing,onClick:()=>void e.onSync(),type:`button`,children:e.syncing?`동기화 요청 중`:`지금 동기화`})]})]}),H(`div`,{class:`mt-5`,children:[H(`label`,{class:`mb-2 block text-sm font-extrabold text-slate-800`,for:`smartsafehub-timezone`,children:`시간대`}),H(U_,{ariaLabel:`시간대`,disabled:e.loading||e.saving||e.syncing||!e.data,id:`smartsafehub-timezone`,onChange:n,options:e.data?o.map(e=>({value:e,label:e})):[{value:``,label:`시간대 불러오는 중`}],value:t}),H(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-500`,children:`시간대를 변경하면 시스템에 즉시 적용되며 자동 설치와 예약 재부팅 일정도 새 기준 시간으로 다시 계산합니다.`})]}),H(`div`,{class:`mt-4 flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:justify-end`,children:[c&&a!==t&&H(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-700 transition hover:bg-slate-50 disabled:opacity-60 sm:w-auto`,disabled:e.saving||e.syncing,onClick:()=>n(a),type:`button`,children:`브라우저 시간대 사용`}),H(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center rounded-xl bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:cursor-not-allowed disabled:opacity-50 sm:w-auto`,disabled:!l||e.saving||e.syncing,onClick:()=>void e.onSave(t),type:`button`,children:e.saving?`시간대 저장 중`:`시간대 저장`})]})]})]}),H(`div`,{class:`min-w-0 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6`,children:H(Fy,{data:e.scheduledRebootData,error:e.scheduledRebootError,loading:e.scheduledRebootLoading,onDismissFeedback:e.onDismissScheduledRebootFeedback,onRetry:e.onRetry,onSave:e.onSaveScheduledReboot,saveError:e.scheduledRebootSaveError,saveMessage:e.scheduledRebootSaveMessage,saving:e.scheduledRebootSaving})})]})}function wy(e){return e===`initializing`?{badge:`bg-teal-100 text-teal-800`,panel:`border-teal-200 bg-teal-50`,label:`준비 중`}:e===`critical`?{badge:`bg-rose-100 text-rose-800`,panel:`border-rose-200 bg-rose-50`,label:`이상`}:e===`warning`?{badge:`bg-amber-100 text-amber-800`,panel:`border-amber-200 bg-amber-50`,label:`주의`}:e===`unknown`?{badge:`bg-slate-200 text-slate-700`,panel:`border-slate-200 bg-slate-50`,label:`확인 불가`}:{badge:`bg-emerald-100 text-emerald-800`,panel:`border-emerald-200 bg-emerald-50`,label:`정상`}}function Ty(e){if(!e.enabled)return`보고 중지됨`;switch(e.lastResult){case`reported`:return`정상 보고`;case`initializing`:return e.lastReportAt>0?`상태 갱신 중`:`첫 보고 진행 중`;case`failed`:return`최근 보고 실패`;case`idle`:return`다음 보고 대기`;case`ineligible`:return`멤버십 확인 필요`;case`disabled`:case`never`:return`첫 보고 준비 중`;default:return`보고 준비 중`}}function Ey(e){return e.lastReportAt>0?Mo(e.lastReportAt):e.enabled?`첫 보고 대기 중`:`보고 기록 없음`}function Dy(e){let t=e?.plan?.trim().toUpperCase(),n=e?.entitlementStatus?.trim().toLowerCase();return t&&(n===`trial`||n===`trialing`)?`${t} · 체험`:t||`유료 · Trial`}function Oy(e){let t=e.data,n=wy(t?.overall??`unknown`),r=t?.checks.filter(e=>e.status!==`ok`)??[],i=r.length>0?r.slice(0,4):t?.checks.filter(e=>[`system.memory`,`network.wan`,`service.dnsmasq`,`safeshield.runtime`].includes(e.id))??[],a=t?.reporter,o=a?.enabled===!0,s=a?.eligible===!0||o,c=e.savingReporter?o?`원격 상태 보고를 켜고 있습니다.`:`원격 상태 보고를 끄고 있습니다.`:o?`원격 상태 보고가 켜져 있습니다.`:`원격 상태 보고가 꺼져 있습니다.`,l=o?`장치 상태가 바뀌면 즉시 보고하고, 정상 상태에서도 주기적으로 SmartSafeHub 서버에 보고합니다.`:`로컬 진단은 계속 동작하지만 장치 상태는 SmartSafeHub 서버에 자동으로 전송되지 않습니다.`;return H(b,{children:[H(Sy,{description:`SmartSafeHub가 장치 상태를 직접 점검하고 이상 항목을 알려줍니다.`,icon:H(_n,{class:`size-5`}),title:`장치 진단`,children:[(e.actionError||e.actionMessage)&&H(`div`,{class:`mb-4 flex items-start justify-between gap-3 rounded-xl border px-4 py-3 text-sm font-bold ${e.actionError?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[H(`span`,{children:e.actionError||e.actionMessage}),H(`button`,{class:`shrink-0 rounded-lg px-2 py-1 text-xs font-extrabold hover:bg-black/5`,onClick:e.onDismissFeedback,type:`button`,children:`닫기`})]}),e.error&&!t?H(`div`,{class:`rounded-xl border border-rose-200 bg-rose-50 p-4`,children:[H(`p`,{class:`m-0 text-sm font-bold text-rose-800`,children:e.error}),H(`button`,{class:`mt-3 inline-flex min-h-10 items-center rounded-xl border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700 transition hover:bg-rose-100`,onClick:e.onRetry,type:`button`,children:`다시 불러오기`})]}):H(b,{children:[H(`div`,{class:`rounded-xl border p-4 ${n.panel}`,children:H(`div`,{class:`flex flex-wrap items-start justify-between gap-3`,children:[H(`div`,{class:`flex min-w-0 items-start gap-3`,children:[H(`span`,{class:`mt-0.5 shrink-0`,children:t?.overall===`ok`?H(wn,{class:`size-5 text-emerald-700`}):t?.overall===`initializing`?H(pn,{class:`size-5 text-teal-700`}):H(W,{class:`size-5 text-amber-700`})}),H(`div`,{class:`min-w-0`,children:[H(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:t?.summary.message??`장치 상태를 확인하고 있습니다.`}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-600`,children:[`마지막 진단 : `,t?Mo(t.generatedAt):`확인 중`]})]})]}),H(`span`,{class:`rounded-full px-2.5 py-1 text-xs font-extrabold ${n.badge}`,children:n.label})]})}),t&&H(`div`,{class:`mt-4 grid grid-cols-3 gap-2`,children:[H(`div`,{class:`rounded-xl bg-slate-50 p-3`,children:[H(`p`,{class:`m-0 text-[11px] font-extrabold text-slate-500`,children:`진단 항목`}),H(`p`,{class:`mt-1 mb-0 text-lg font-black text-slate-950`,children:t.summary.total})]}),H(`div`,{class:`rounded-xl bg-slate-50 p-3`,children:[H(`p`,{class:`m-0 text-[11px] font-extrabold text-slate-500`,children:`주의`}),H(`p`,{class:`mt-1 mb-0 text-lg font-black text-amber-700`,children:t.summary.warning})]}),H(`div`,{class:`rounded-xl bg-slate-50 p-3`,children:[H(`p`,{class:`m-0 text-[11px] font-extrabold text-slate-500`,children:`이상`}),H(`p`,{class:`mt-1 mb-0 text-lg font-black text-rose-700`,children:t.summary.critical})]})]}),i.length>0&&H(`div`,{class:`mt-4 space-y-2`,children:i.map(e=>{let t=wy(e.status);return H(`div`,{class:`flex min-w-0 items-start justify-between gap-3 rounded-xl border border-slate-200 px-3 py-2.5`,children:[H(`div`,{class:`min-w-0`,children:[H(`p`,{class:`m-0 text-xs font-extrabold text-slate-900`,children:e.label}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:e.message})]}),H(`span`,{class:`shrink-0 rounded-full px-2 py-1 text-[11px] font-extrabold ${t.badge}`,children:t.label})]},e.id)})}),H(`div`,{class:`mt-4 flex flex-col gap-2 sm:flex-row`,children:[H(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center rounded-xl bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:e.running||e.loading,onClick:e.onRun,type:`button`,children:e.running?`진단 중`:`지금 진단`}),H(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-800 transition hover:bg-slate-50 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:e.downloadBusy,onClick:e.onDownload,type:`button`,children:e.downloadBusy?`진단 정보 생성 중`:`진단 정보 다운로드`})]}),H(`p`,{class:`mt-3 mb-0 text-xs leading-5 text-slate-500`,children:`다운로드 파일에는 호스트명, WAN IP와 Wi-Fi SSID 같은 네트워크 식별 정보가 포함될 수 있으므로 외부 전달 전에 내용을 확인해 주세요.`})]})]}),H(`div`,{class:`grid min-w-0 content-start gap-4`,children:[H(Sy,{description:`장치의 최소 상태 정보와 이상 코드만 서버로 전송합니다. 직접 켜고 언제든지 끌 수 있습니다.`,icon:H(Yt,{class:`size-5`}),title:`원격 상태 보고`,titleActions:H(`span`,{class:`inline-flex rounded-full bg-slate-100 px-2.5 py-1 text-[11px] font-extrabold uppercase tracking-[0.08em] text-slate-600`,children:Dy(a)}),headerActions:H(`button`,{"aria-checked":a?.enabled===!0,"aria-label":`원격 상태 보고 사용`,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${a?.enabled?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:!t||e.savingReporter||!s,onClick:()=>e.onSetReporter(!(a?.enabled??!1)),role:`switch`,type:`button`,children:H(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${a?.enabled?`left-6`:`left-1`}`})}),children:H(`div`,{class:`min-w-0`,children:a?.eligible?H(`div`,{class:`rounded-xl bg-slate-50 p-4`,children:[H(`div`,{class:`mb-4 flex items-start gap-3 rounded-xl border p-3 ${o?`border-emerald-200 bg-emerald-50`:`border-slate-200 bg-white`}`,children:[H(`span`,{class:`mt-0.5 shrink-0`,children:o?H(wn,{class:`size-5 text-emerald-700`}):H(gn,{class:`size-5 text-slate-500`})}),H(`div`,{class:`min-w-0 flex-1`,children:[H(`div`,{class:`flex flex-wrap items-center gap-2`,children:[H(`p`,{class:`m-0 text-sm font-black text-slate-950`,children:c}),H(`span`,{class:`rounded-full px-2 py-0.5 text-[10px] font-extrabold ${e.savingReporter?`bg-slate-200 text-slate-700`:o?`bg-emerald-100 text-emerald-800`:`bg-slate-200 text-slate-700`}`,children:e.savingReporter?`설정 중`:o?`켜짐`:`꺼짐`})]}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-600`,children:l})]})]}),H(`div`,{class:`grid grid-cols-1 gap-3 sm:grid-cols-2`,children:[H(`div`,{children:[H(`p`,{class:`m-0 text-[11px] font-extrabold text-slate-500`,children:`최근 전송 상태`}),H(`p`,{class:`mt-1 mb-0 text-sm font-black text-slate-900`,children:e.savingReporter?`설정 반영 중`:Ty(a)})]}),H(`div`,{children:[H(`p`,{class:`m-0 text-[11px] font-extrabold text-slate-500`,children:`마지막 서버 보고`}),H(`p`,{class:`mt-1 mb-0 text-sm font-black text-slate-900`,children:Ey(a)})]})]}),a.enabled&&a.lastErrorCode&&H(`p`,{class:`mt-3 mb-0 text-xs font-bold text-rose-700`,children:[`최근 보고 오류 : `,a.lastErrorCode]})]}):H(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[H(`p`,{class:`m-0 text-sm font-extrabold text-slate-900`,children:`원격 상태 보고는 유료 멤버십 또는 체험 기간에 사용할 수 있습니다.`}),H(`a`,{class:`mt-3 inline-flex text-xs font-extrabold text-teal-700 hover:text-teal-800`,href:`https://www.smartsafehub.com/pricing/`,rel:`noopener noreferrer`,target:`_blank`,children:`멤버십 알아보기`})]})})}),H(Sy,{description:`진단에 필요한 최소한의 상태 정보만 전송하며, 네트워크 식별 정보와 이용 내용은 보내지 않습니다.`,icon:H(Yt,{class:`size-5`}),title:`개인정보 보호`,children:H(`div`,{class:`grid grid-cols-1 gap-3 sm:grid-cols-2`,children:[H(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-3.5`,children:[H(`div`,{class:`flex items-center gap-2`,children:[H(`span`,{class:`flex size-7 shrink-0 items-center justify-center rounded-lg bg-white text-slate-600`,children:H(vn,{class:`size-4`})}),H(`p`,{class:`m-0 text-sm font-black text-slate-900`,children:`전송되는 정보`})]}),H(`div`,{class:`mt-3 space-y-3`,children:[H(`div`,{children:[H(`p`,{class:`m-0 text-[11px] font-extrabold text-slate-500`,children:`기기 상태 수치`}),H(`p`,{class:`mt-1 mb-0 text-xs font-semibold leading-5 text-slate-700`,children:`메모리 · 부하 · 저장 공간`})]}),H(`div`,{children:[H(`p`,{class:`m-0 text-[11px] font-extrabold text-slate-500`,children:`진단 정보`}),H(`p`,{class:`mt-1 mb-0 text-xs font-semibold leading-5 text-slate-700`,children:`진단 상태 · 이상 코드 · 보고 시각`})]})]})]}),H(`div`,{class:`rounded-xl border border-teal-200 bg-teal-50 p-3.5`,children:[H(`div`,{class:`flex items-center gap-2`,children:[H(`span`,{class:`flex size-7 shrink-0 items-center justify-center rounded-lg bg-white text-teal-700`,children:H(Yt,{class:`size-4`})}),H(`p`,{class:`m-0 text-sm font-black text-slate-900`,children:`전송하지 않는 정보`})]}),H(`div`,{class:`mt-3 space-y-3`,children:[H(`div`,{children:[H(`p`,{class:`m-0 text-[11px] font-extrabold text-teal-800`,children:`개인 식별 · 네트워크 정보`}),H(`p`,{class:`mt-1 mb-0 text-xs font-semibold leading-5 text-slate-700`,children:`호스트명 · WAN IP · Wi-Fi SSID/MAC`})]}),H(`div`,{children:[H(`p`,{class:`m-0 text-[11px] font-extrabold text-teal-800`,children:`이용 내용 및 원문 데이터`}),H(`p`,{class:`mt-1 mb-0 text-xs font-semibold leading-5 text-slate-700`,children:`DNS 요청 내용 · 시스템 로그 원문`})]})]})]})]})})]})]})}function ky(e){let[t,n]=F(!1);return H(`label`,{class:`block min-w-0`,for:e.id,children:[H(`span`,{class:`mb-2 block text-sm font-extrabold text-slate-800`,children:e.label}),H(`span`,{class:`relative block min-w-0`,children:[H(`input`,{autoComplete:e.autoComplete,class:`ssh-password-input min-h-11 w-full rounded-xl border border-slate-300 bg-white px-3 py-2.5 pr-12 text-sm font-bold text-slate-900 outline-none transition focus:border-teal-500 focus:ring-2 focus:ring-teal-100 disabled:cursor-wait disabled:opacity-60`,disabled:e.disabled,id:e.id,name:e.name,onInput:t=>e.onInput(t.currentTarget.value),placeholder:e.placeholder,...t?{type:`text`}:{type:`password`},value:e.value}),H(`button`,{"aria-label":t?`${e.label} 숨기기`:`${e.label} 표시`,"aria-pressed":t,class:`absolute inset-y-0 right-1 my-auto flex size-9 items-center justify-center rounded-lg text-slate-500 transition hover:bg-slate-100 hover:text-slate-800 disabled:opacity-50`,disabled:e.disabled,onClick:()=>n(e=>!e),title:t?`비밀번호 숨기기`:`비밀번호 표시`,type:`button`,children:H(t?Sn:xn,{class:`size-4`})})]})]})}function Ay(e){return H(`li`,{class:`flex min-w-0 items-center gap-1.5 text-xs font-bold ${e.met?`text-emerald-700`:`text-slate-500`}`,children:[H(wn,{class:`size-3.5 shrink-0`,"aria-hidden":`true`}),H(`span`,{children:e.label})]})}function jy(e){let[t,n]=F(``),[r,i]=F(``),[a,o]=F(``),[s,c]=F(!1),[l,u]=F(null),d=Vn(r),f=Hn(d),p=a.length>0&&r===a,m=t.length>0&&r.length>0&&t!==r,h=!s&&m&&f&&p,g=async()=>{if(u(null),!t)u(`현재 관리자 비밀번호를 입력해 주세요.`);else if(!f)u(`새 비밀번호는 8자 이상이며 영문과 숫자를 각각 하나 이상 포함해야 합니다.`);else if(t===r)u(`새 관리자 비밀번호는 현재 비밀번호와 다르게 설정해 주세요.`);else if(r!==a)u(`새 비밀번호 확인 값이 일치하지 않습니다.`);else{c(!0);try{await gy(t,r),n(``),i(``),o(``);try{await Oe()}catch{}c(!1),e.onChanged()}catch(e){u(K(e,`관리자 비밀번호를 변경하지 못했습니다. 잠시 후 다시 시도해 주세요.`)),c(!1)}}};return H(Sy,{description:`현재 비밀번호를 확인한 뒤 공유기 관리자 비밀번호를 변경합니다. 변경이 완료되면 새 비밀번호로 다시 로그인해야 합니다.`,icon:H(yn,{class:`size-5`}),title:`관리자 비밀번호`,children:H(`form`,{class:`space-y-4`,noValidate:!0,onSubmit:e=>{e.preventDefault(),g()},children:[l&&H(`div`,{"aria-live":`polite`,class:`rounded-xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm font-bold text-rose-800`,role:`alert`,children:l}),H(ky,{autoComplete:`current-password`,disabled:s,id:`smartsafehub-current-admin-password`,label:`현재 비밀번호`,name:`current-password`,onInput:n,placeholder:`현재 관리자 비밀번호`,value:t}),H(ky,{autoComplete:`new-password`,disabled:s,id:`smartsafehub-new-admin-password`,label:`새 비밀번호`,name:`new-password`,onInput:i,placeholder:`새 관리자 비밀번호`,value:r}),H(`ul`,{"aria-label":`새 비밀번호 요구 사항`,class:`m-0 grid list-none grid-cols-1 gap-2 p-0 sm:grid-cols-3`,children:[H(Ay,{label:`8자 이상`,met:d.length}),H(Ay,{label:`영문자 포함`,met:d.letter}),H(Ay,{label:`숫자 포함`,met:d.number})]}),H(`div`,{class:`pt-2`,children:H(ky,{autoComplete:`new-password`,disabled:s,id:`smartsafehub-confirm-admin-password`,label:`새 비밀번호 확인`,name:`confirm-password`,onInput:o,placeholder:`새 관리자 비밀번호 다시 입력`,value:a})}),a.length>0&&H(`p`,{"aria-live":`polite`,class:`m-0 text-xs font-bold ${p?`text-emerald-700`:`text-rose-700`}`,role:`status`,children:p?`새 비밀번호가 일치합니다.`:`새 비밀번호 확인 값이 일치하지 않습니다.`}),r.length>0&&t===r&&H(`p`,{class:`m-0 text-xs font-bold text-amber-700`,children:`새 비밀번호는 현재 비밀번호와 다르게 설정해 주세요.`}),H(`div`,{class:`pt-2`,children:H(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-3 text-xs leading-5 text-slate-600`,children:`비밀번호는 현재 공유기에 직접 적용되며 외부 서버로 전송되지 않습니다. 변경 후 현재 로그인 세션은 종료됩니다.`})}),H(`div`,{class:`rounded-xl border border-amber-200 bg-amber-50 p-3 text-xs leading-5 text-amber-900`,children:[H(`strong`,{class:`block font-extrabold`,children:`비밀번호를 잊었을 때`}),`전원이 켜진 상태에서 Reset 버튼을 5~9초 누른 뒤 놓으면 관리자 비밀번호만 복구할 수 있습니다. 네트워크, Wi-Fi와 SafeShield 설정은 유지됩니다. 10초 이상 누르면 모든 사용자 설정을 초기화하는 기기 초기화가 실행됩니다.`]}),H(`div`,{class:`flex justify-end`,children:H(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center rounded-xl bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:cursor-not-allowed disabled:opacity-50 sm:w-auto`,disabled:!h,type:`submit`,children:s?`비밀번호 변경 중`:`비밀번호 변경`})})]})})}function My(e){let t=L(null),[n,r]=F(null),[i,a]=F(!1),o=e.action!==null;I(()=>{e.validated||a(!1)},[e.validated]);let s=()=>{!o&&!e.restoreAccepted&&t.current?.click()},c=async()=>{n&&await e.onUpload(n)&&(r(null),t.current&&(t.current.value=``))};return H(Sy,{description:`펌웨어 업데이트나 복구 전에 현재 OpenWrt 설정을 표준 백업 파일로 저장하고, 필요할 때 검증 후 복원합니다.`,icon:H(vn,{class:`size-5`}),title:`설정 백업 및 복원`,children:[(e.error||e.message)&&H(`div`,{class:`mb-5 flex min-w-0 items-start justify-between gap-3 rounded-xl border px-4 py-3 text-sm font-bold ${e.error?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[H(`span`,{class:`min-w-0`,children:e.error||e.message}),!e.restoreAccepted&&H(`button`,{class:`shrink-0 rounded-lg px-2 py-1 text-xs font-extrabold hover:bg-black/5`,onClick:e.onDismissFeedback,type:`button`,children:`닫기`})]}),H(`div`,{class:`grid min-w-0 grid-cols-1 gap-3`,children:[H(`div`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4 sm:p-5`,children:[H(`p`,{class:`m-0 text-sm font-black text-slate-900`,children:`현재 설정 백업`}),H(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-600`,children:`네트워크, Wi-Fi, SmartSafeHub와 SafeShield 등 OpenWrt가 관리하는 설정을 표준 백업 파일로 저장합니다.`}),H(`button`,{class:`mt-4 inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:o||e.restoreAccepted,onClick:e.onDownload,type:`button`,children:[H(_n,{class:`size-4`}),e.action===`download`?`백업 생성 중`:`설정 백업 다운로드`]}),H(`p`,{class:`mt-3 mb-0 text-xs font-bold leading-5 text-amber-700`,children:`백업에는 Wi-Fi 비밀번호, 관리자 설정, VPN 키나 기기 인증 정보 같은 민감한 값이 포함될 수 있으므로 안전한 위치에 보관해 주세요.`})]}),H(`div`,{class:`rounded-xl border border-slate-200 bg-white p-4 sm:p-5`,children:[H(`p`,{class:`m-0 text-sm font-black text-slate-900`,children:`설정 복원`}),H(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-600`,children:`SmartSafeHub 또는 OpenWrt 백업을 업로드하고 검증한 뒤 복원합니다. 최대 16MB까지 사용할 수 있습니다.`}),e.validated?H(`div`,{class:`mt-4 rounded-xl border border-emerald-200 bg-emerald-50 p-4`,children:[H(`div`,{class:`flex min-w-0 flex-col gap-1 sm:flex-row sm:items-center sm:justify-between`,children:H(`div`,{class:`min-w-0`,children:[H(`p`,{class:`m-0 break-words text-sm font-extrabold text-emerald-900`,children:e.validated.filename}),H(`p`,{class:`mt-1 mb-0 text-xs font-bold text-emerald-700`,children:[Oo(e.validated.sizeBytes),` · 검증 완료`]})]})}),i?H(`div`,{class:`mt-4 rounded-xl border border-rose-200 bg-white p-4`,children:[H(`p`,{class:`m-0 text-sm font-black text-rose-900`,children:`현재 설정을 백업 파일의 내용으로 덮어쓰시겠습니까?`}),H(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-rose-700`,children:`LAN 주소, Wi-Fi, 관리자 접속 정보가 바뀌어 현재 연결이 끊길 수 있습니다. 복원 직후 공유기가 자동으로 재부팅됩니다. 같은 장치와 호환되는 백업만 사용해 주세요.`}),H(`div`,{class:`mt-4 flex flex-col gap-3 sm:flex-row sm:flex-wrap`,children:[H(`button`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-slate-300 bg-white px-4 py-2 text-sm font-extrabold text-slate-700 transition hover:bg-slate-50 disabled:opacity-60 sm:w-auto`,disabled:o,onClick:()=>a(!1),type:`button`,children:`취소`}),H(`button`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl bg-rose-700 px-4 py-2 text-sm font-extrabold text-white transition hover:bg-rose-800 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:o,onClick:()=>void e.onRestore(),type:`button`,children:e.action===`restore`?`설정 복원 중`:`설정 복원 및 재부팅`})]})]}):H(`div`,{class:`mt-4 flex flex-col gap-3 sm:flex-row sm:flex-wrap`,children:[H(`button`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-slate-300 bg-white px-4 py-2 text-sm font-extrabold text-slate-700 transition hover:bg-slate-50 disabled:opacity-60 sm:w-auto`,disabled:o||e.restoreAccepted,onClick:()=>void e.onDiscard(),type:`button`,children:e.action===`discard`?`파일 삭제 중`:`파일 삭제`}),H(`button`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl bg-amber-600 px-4 py-2 text-sm font-extrabold text-white transition hover:bg-amber-700 disabled:opacity-60 sm:w-auto`,disabled:o||e.restoreAccepted,onClick:()=>a(!0),type:`button`,children:`복원 준비`})]})]}):H(b,{children:[H(`input`,{accept:`.tar.gz,.tgz,application/gzip,application/x-gzip`,class:`sr-only`,disabled:o||e.restoreAccepted,onChange:e=>r(e.currentTarget.files?.[0]??null),ref:t,type:`file`}),H(`button`,{class:`mt-4 flex min-h-11 w-full items-center justify-between gap-3 rounded-xl border border-dashed border-slate-300 bg-slate-50 px-4 py-3 text-left text-sm font-bold text-slate-700 transition hover:border-teal-400 hover:bg-teal-50 disabled:cursor-wait disabled:opacity-60`,disabled:o||e.restoreAccepted,onClick:s,type:`button`,children:[H(`span`,{class:`min-w-0 truncate`,children:n?.name??`복원할 백업 파일 선택`}),H(`span`,{class:`shrink-0 text-xs font-extrabold text-teal-700`,children:`찾아보기`})]}),n&&H(`div`,{class:`mt-3 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[H(`span`,{class:`text-xs font-bold text-slate-500`,children:Oo(n.size)}),H(`button`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-teal-300 bg-white px-4 py-2 text-sm font-extrabold text-teal-800 transition hover:bg-teal-50 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:o||e.restoreAccepted,onClick:()=>void c(),type:`button`,children:e.action===`upload`?`업로드 중 ${Math.round(e.uploadProgress??0)}%`:e.action===`validate`?`백업 검증 중`:`업로드 및 검증`})]})]})]})]})]})}function Ny(e){return H(Sy,{description:`공유기 재부팅과 SmartSafeHub에서 제공하지 않는 고급 관리 도구를 한곳에서 제공합니다.`,...e.className===void 0?{}:{className:e.className},icon:H(sn,{class:`size-5`}),title:`시스템 도구`,children:H(`div`,{class:`space-y-3`,children:[H(`section`,{"aria-labelledby":`router-reboot-heading`,class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[H(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[H(`div`,{class:`flex min-w-0 items-start gap-3`,children:[H(`span`,{class:`flex size-9 shrink-0 items-center justify-center rounded-lg bg-rose-50 text-rose-700`,children:H(gn,{class:`size-4`})}),H(`div`,{class:`min-w-0`,children:[H(`p`,{class:`m-0 text-sm font-black text-rose-950`,id:`router-reboot-heading`,children:`공유기 재부팅`}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`재부팅 중에는 인터넷과 Wi-Fi 연결이 잠시 중단됩니다.`})]})]}),!e.confirmingReboot&&H(`button`,{class:`inline-flex min-h-10 w-full shrink-0 items-center justify-center rounded-xl border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700 transition hover:bg-rose-50 disabled:opacity-60 sm:w-auto`,disabled:e.action!==null||e.rebootAccepted,onClick:e.onConfirmReboot,type:`button`,children:`재부팅`})]}),e.confirmingReboot&&H(`div`,{class:`mt-3 rounded-xl border border-rose-200 bg-rose-50 p-3`,children:[H(`p`,{class:`m-0 text-xs font-extrabold leading-5 text-rose-900`,children:`지금 공유기를 재부팅하시겠습니까? 저장되지 않은 LuCI 설정이 있다면 먼저 저장해 주세요.`}),H(`div`,{class:`mt-3 flex flex-col gap-2 sm:flex-row sm:flex-wrap`,children:[H(`button`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700 transition hover:bg-slate-50 sm:w-auto`,disabled:e.action!==null,onClick:e.onCancelReboot,type:`button`,children:`취소`}),H(`button`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl bg-rose-700 px-3 py-2 text-xs font-extrabold text-white transition hover:bg-rose-800 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:e.action!==null,onClick:e.onReboot,type:`button`,children:e.action===`reboot`?`재부팅 요청 중`:`지금 재부팅`})]})]})]}),H(`section`,{"aria-labelledby":`advanced-tools-heading`,class:`rounded-xl border border-slate-200 bg-slate-50 p-4`,children:[H(`div`,{class:`min-w-0`,children:[H(`p`,{class:`m-0 text-sm font-black text-slate-900`,id:`advanced-tools-heading`,children:`고급 도구`}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:`SmartSafeHub에서 아직 제공하지 않는 상세 시스템 설정이나 원본 로그가 필요할 때 사용합니다.`})]}),H(`div`,{class:`mt-3 flex flex-col gap-2 sm:flex-row sm:flex-wrap`,children:[H(`a`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-800 no-underline transition hover:bg-slate-50 sm:w-auto`,href:e.advancedSystemUrl,children:`LuCI 고급 설정 열기`}),H(`a`,{class:`inline-flex min-h-10 w-full items-center justify-center rounded-xl border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-800 no-underline transition hover:bg-slate-50 sm:w-auto`,href:e.logsUrl,children:`시스템 로그 열기`})]})]})]})})}var Py=[{value:`mon`,label:`월요일`},{value:`tue`,label:`화요일`},{value:`wed`,label:`수요일`},{value:`thu`,label:`목요일`},{value:`fri`,label:`금요일`},{value:`sat`,label:`토요일`},{value:`sun`,label:`일요일`}];function Fy(e){let[t,n]=F(!1),[r,i]=F(`weekly`),[a,o]=F(`sun`),[s,c]=F(`04:00`);I(()=>{e.data&&(n(e.data.enabled),i(e.data.frequency),o(e.data.dayOfWeek),c(e.data.time))},[e.data?.dayOfWeek,e.data?.enabled,e.data?.frequency,e.data?.time]);let l=e.data!==null&&(t!==e.data.enabled||r!==e.data.frequency||a!==e.data.dayOfWeek||s!==e.data.time),u=Py.find(e=>e.value===a),d=t?r===`daily`?`매일 ${s}`:`매주 ${u?.label??`일요일`} ${s}`:`예약 재부팅 꺼짐`;return H(`section`,{"aria-labelledby":`scheduled-reboot-heading`,class:`min-w-0`,children:[H(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between`,children:[H(`div`,{class:`flex min-w-0 items-start gap-3`,children:[H(`span`,{class:`flex size-11 shrink-0 items-center justify-center rounded-xl bg-slate-100 text-slate-600`,children:H(Cn,{class:`size-5`})}),H(`div`,{class:`min-w-0`,children:[H(`h2`,{class:`m-0 text-lg font-black text-slate-950`,id:`scheduled-reboot-heading`,children:`예약 재부팅`}),H(`p`,{class:`mt-1.5 mb-0 text-sm leading-6 text-slate-500`,children:`공유기를 정해진 시간에 자동으로 재부팅합니다. 기본값은 꺼짐이며 필요한 장치에서만 사용하세요.`})]})]}),H(`div`,{class:`flex shrink-0 flex-wrap items-center justify-between gap-3 sm:justify-end`,children:[l&&H(`span`,{"aria-live":`polite`,class:`inline-flex items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[H(W,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]}),H(`span`,{class:`text-xs font-extrabold text-slate-500`,children:t?`사용 중`:`꺼짐`}),H(`button`,{"aria-checked":t,"aria-label":`예약 재부팅 사용`,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${t?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:e.loading||e.saving||!e.data,onClick:()=>n(e=>!e),role:`switch`,type:`button`,children:H(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${t?`left-6`:`left-1`}`})})]})]}),(e.saveError||e.saveMessage)&&H(`div`,{class:`mt-4 flex min-w-0 items-start justify-between gap-3 rounded-xl border px-4 py-3 text-sm font-bold ${e.saveError?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[H(`span`,{class:`min-w-0`,children:e.saveError||e.saveMessage}),H(`button`,{class:`shrink-0 rounded-lg px-2 py-1 text-xs font-extrabold hover:bg-black/5`,onClick:e.onDismissFeedback,type:`button`,children:`닫기`})]}),e.error&&!e.data?H(`div`,{class:`mt-4 rounded-xl border border-rose-200 bg-rose-50 p-4`,children:[H(`p`,{class:`m-0 text-sm font-bold text-rose-800`,children:e.error}),H(`button`,{class:`mt-3 inline-flex min-h-10 items-center rounded-xl border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700 transition hover:bg-rose-100`,onClick:e.onRetry,type:`button`,children:`다시 불러오기`})]}):H(b,{children:[H(`div`,{class:`mt-4 grid min-w-0 grid-cols-1 gap-4 md:grid-cols-3`,children:[H(`div`,{children:[H(`label`,{class:`mb-2 block text-sm font-extrabold text-slate-800`,for:`scheduled-reboot-frequency`,children:`주기`}),H(U_,{ariaLabel:`예약 재부팅 주기`,disabled:!t||e.saving||!e.data,id:`scheduled-reboot-frequency`,onChange:e=>i(e),options:[{value:`weekly`,label:`매주`},{value:`daily`,label:`매일`}],value:r})]}),H(`div`,{children:[H(`label`,{class:`mb-2 block text-sm font-extrabold text-slate-800`,for:`scheduled-reboot-day`,children:`요일`}),H(U_,{ariaLabel:`예약 재부팅 요일`,disabled:!t||r!==`weekly`||e.saving||!e.data,id:`scheduled-reboot-day`,onChange:e=>o(e),options:Py.map(e=>({value:e.value,label:e.label})),value:a})]}),H(`div`,{children:[H(`label`,{class:`mb-2 block text-sm font-extrabold text-slate-800`,for:`scheduled-reboot-time-hour`,children:`재부팅 시간`}),H(by,{ariaLabel:`예약 재부팅 시간`,disabled:!t||e.saving||!e.data,id:`scheduled-reboot-time`,onChange:c,value:s})]})]}),H(`div`,{class:`mt-4 flex flex-col gap-3 rounded-xl bg-slate-50 p-4 sm:flex-row sm:items-end sm:justify-between`,children:[H(`div`,{class:`min-w-0`,children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.12em] text-slate-500`,children:`예약 일정`}),H(`p`,{class:`mt-1.5 mb-0 text-sm font-extrabold text-slate-900`,children:d}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-slate-500`,children:[e.data?.timezone??`장치 시간대`,` 기준 · 업데이트 작업 중이면 15분 단위로 최대 2시간 연기합니다.`]})]}),H(`button`,{class:`inline-flex min-h-11 w-full shrink-0 items-center justify-center rounded-xl bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:cursor-not-allowed disabled:opacity-50 sm:w-auto`,disabled:!l||e.saving||!e.data,onClick:()=>void e.onSave({enabled:t,frequency:r,dayOfWeek:a,time:s}),type:`button`,children:e.saving?`예약 저장 중`:`예약 저장`})]})]})]})}function Iy({activeTab:e,action:t,backupAction:n,backupError:r,backupMessage:i,backupRestoreAccepted:a,backupUploadProgress:o,backupValidated:s,data:c,error:l,feedbackError:u,feedbackMessage:d,health:f,healthActionError:p,healthActionMessage:m,healthError:h,healthLoading:g,healthRunning:_,healthSavingReporter:v,loading:y,rebootAccepted:b,scheduledRebootData:x,scheduledRebootError:S,scheduledRebootLoading:C,scheduledRebootSaveError:w,scheduledRebootSaveMessage:T,scheduledRebootSaving:E,timeData:D,timeError:O,timeLoading:k,timeSaveError:A,timeSaveMessage:j,timeSaving:M,timeSyncing:N,onBackupDiscard:P,onBackupDownload:ee,onBackupRestore:te,onBackupUpload:ne,onDismissBackupFeedback:re,onDismissFeedback:ie,onDismissHealthFeedback:ae,onDismissTimeFeedback:oe,onDownloadDiagnostics:se,onRunHealth:ce,onSetHealthReporter:le,onReboot:ue,onRetry:de,onDismissScheduledRebootFeedback:fe,onSaveScheduledReboot:pe,onSaveTimezone:me,onSyncTime:he,onAdministratorPasswordChanged:ge}){let[_e,ve]=F(!1),ye=be(`/admin/system`),xe=be(`/admin/status/logs`);return H(`section`,{class:`min-w-0 space-y-7`,children:[(u||d)&&H(`div`,{class:`flex min-w-0 flex-col gap-3 rounded-xl border px-4 py-3 text-sm font-bold sm:flex-row sm:items-center sm:justify-between ${u?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[H(`span`,{class:`min-w-0`,children:u||d}),!b&&H(`button`,{class:`shrink-0 self-start rounded-lg px-3 py-1.5 text-xs font-extrabold hover:bg-black/5 sm:self-auto`,onClick:ie,type:`button`,children:`닫기`})]}),H(li,{active:e,label:`설정 메뉴`,tabs:[{id:`diagnostics`,label:`진단 및 지원`,href:`#settings`},{id:`time`,label:`시간 및 예약`,href:`#settings/time`},{id:`management`,label:`관리 및 복구`,href:`#settings/management`}]}),H(`section`,{"aria-labelledby":`diagnostics-tab`,class:`min-w-0`,hidden:e!==`diagnostics`,id:`diagnostics-panel`,role:`tabpanel`,children:[l&&!c?H(`div`,{class:`mb-4 rounded-xl border border-amber-200 bg-amber-50 p-4 text-sm font-semibold text-amber-900`,role:`status`,children:[H(`p`,{class:`m-0`,children:[`시스템 정보를 불러오지 못해 진단 파일 다운로드가 제한될 수 있습니다. `,l]}),H(`button`,{class:`mt-2 rounded-lg border border-current px-3 py-1.5 text-xs font-extrabold`,onClick:de,type:`button`,children:`다시 시도`})]}):y&&!c?H(`p`,{class:`mb-4 text-sm font-semibold text-slate-500`,role:`status`,children:`진단 파일에 필요한 시스템 정보를 확인하고 있습니다.`}):null,H(q,{eyebrow:`Device health`,title:`진단 및 지원`,description:`장치 진단과 원격 상태 보고를 확인하고 개인정보 보호 정책을 관리합니다.`}),H(`div`,{class:`grid min-w-0 grid-cols-1 gap-4 lg:grid-cols-2`,children:H(Oy,{actionError:p,actionMessage:m,data:f,downloadBusy:t===`diagnostics`,error:h,loading:g,onDismissFeedback:ae,onDownload:se,onRetry:de,onRun:ce,onSetReporter:le,running:_,savingReporter:v})})]}),H(`section`,{"aria-labelledby":`time-tab`,class:`min-w-0`,hidden:e!==`time`,id:`time-panel`,role:`tabpanel`,children:[H(q,{eyebrow:`Device settings`,title:`시간 및 예약`,description:`시간 기준과 예약 재부팅을 SmartSafeHub에서 직접 관리합니다.`}),H(`div`,{class:`grid min-w-0 grid-cols-1 gap-4 lg:grid-cols-2`,children:H(Cy,{data:D,error:O,loading:k,onDismissFeedback:oe,onDismissScheduledRebootFeedback:fe,onRetry:de,onSave:me,onSaveScheduledReboot:pe,onSync:he,saveError:A,saveMessage:j,saving:M,scheduledRebootData:x,scheduledRebootError:S,scheduledRebootLoading:C,scheduledRebootSaveError:w,scheduledRebootSaveMessage:T,scheduledRebootSaving:E,syncing:N})})]}),H(`section`,{"aria-labelledby":`management-tab`,class:`min-w-0`,hidden:e!==`management`,id:`management-panel`,role:`tabpanel`,children:[H(q,{eyebrow:`System management`,title:`시스템 관리`,description:`관리자 비밀번호, 설정 백업·복원과 공유기 시스템 도구를 한곳에서 관리합니다.`}),H(`div`,{class:`grid min-w-0 grid-cols-1 gap-4 lg:grid-cols-2`,children:[H(jy,{onChanged:ge}),H(My,{action:n,error:r,message:i,onDiscard:P,onDismissFeedback:re,onDownload:ee,onRestore:te,onUpload:ne,restoreAccepted:a,uploadProgress:o,validated:s}),H(Ny,{action:t,className:`lg:col-span-2`,advancedSystemUrl:ye,confirmingReboot:_e,logsUrl:xe,onCancelReboot:()=>ve(!1),onConfirmReboot:()=>ve(!0),onReboot:ue,rebootAccepted:b})]})]})]})}var Ly=`https://www.smartsafehub.com/dashboard/devices/`;async function Ry(e){if(navigator.clipboard?.writeText)try{await navigator.clipboard.writeText(e);return}catch{}let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`readonly`,``),t.style.position=`fixed`,t.style.inset=`0 auto auto -9999px`,t.style.opacity=`0`,document.body.appendChild(t),t.select(),t.setSelectionRange(0,e.length);let n=document.execCommand(`copy`);if(t.remove(),!n)throw Error(`clipboard_copy_failed`)}function zy(e){return(e||`free`).toUpperCase()}function By(e){return e===`FREE`?`free`:e===`PRO`?`pro`:e===`ULTIMATE`?`ultimate`:`paid`}function Vy({plan:e}){let t=By(e),n=t!==`free`;return H(`span`,{class:`ssh-safeshield-plan-badge`,"data-compact":`false`,"data-tier":t,title:n?`${e} 멤버십`:`무료 플랜`,children:[H(`span`,{"aria-hidden":`true`,class:`ssh-safeshield-plan-badge-mark`,children:n?`✦`:`•`}),H(`span`,{children:e})]})}function Hy(e){if(!e.pairingCode||!e.pairingExpiresAt)return!1;let t=Date.parse(e.pairingExpiresAt);return Number.isFinite(t)&&t<=Date.now()}function Uy({data:e,error:t,loading:n,pairingBusy:r,refreshing:i,syncError:a,onRequestPairing:o,onRetry:s,demo:c=!1,onDemoAction:l}){let[u,d]=F(null),[f,p]=F(!1);if(I(()=>{if(!f)return;let e=window.setTimeout(()=>p(!1),1800);return()=>window.clearTimeout(e)},[f]),n&&!e)return H(vs,{});if(t&&!e)return H(ys,{message:t,onRetry:s});let m=e,h=m?.accountRegistered===!0,g=zy(m?.plan??null),_=m?Hy(m):!1,v=!h&&!_?m?.pairingCode:null,y=r||m?.pairingOperation?.phase===`starting`||m?.pairingOperation?.phase===`running`;async function b(){d(null),p(!1);try{await o()}catch{d(`계정 연결 코드를 발급하지 못했습니다. 잠시 후 다시 시도해 주세요.`)}}async function x(){if(v)try{await Ry(v),d(null),p(!0)}catch{p(!1),d(`연결 코드를 복사하지 못했습니다. 코드를 직접 선택해 복사해 주세요.`)}}return H(`div`,{class:`min-w-0`,children:[H(q,{eyebrow:`Account connection`,title:`기기 계정 연결`,description:`계정에 연결하면 웹사이트에서 기기를 관리하고 Cloud 기능과 구독 권한을 사용할 수 있습니다.`}),H(`div`,{class:`grid items-start gap-5 xl:items-stretch xl:grid-cols-[minmax(0,1.2fr)_minmax(18rem,0.8fr)]`,children:[H(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:h-full`,children:h?H(`div`,{children:[H(`div`,{class:`flex items-center gap-3`,children:[H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-full bg-emerald-100 text-emerald-700`,children:H(wn,{class:`size-5`})}),H(`div`,{children:[H(`p`,{class:`m-0 text-base font-black text-slate-950`,children:`SmartSafeHub 계정에 연결됨`}),H(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-600`,children:`이 기기가 계정과 정상적으로 연결되어 있습니다. 연결 코드는 더 이상 필요하지 않습니다.`})]})]}),c?H(`button`,{class:`mt-5 inline-flex min-h-11 items-center justify-center rounded-xl border border-emerald-700 bg-emerald-700 px-4 py-2 text-sm font-extrabold text-white transition hover:bg-emerald-800`,onClick:l,type:`button`,children:`웹사이트에서 기기 관리`}):H(`a`,{class:`mt-5 inline-flex min-h-11 items-center justify-center rounded-xl border border-emerald-700 bg-emerald-700 px-4 py-2 text-sm font-extrabold text-white no-underline transition hover:bg-emerald-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-emerald-100`,href:Ly,rel:`noopener noreferrer`,target:`_blank`,children:`웹사이트에서 기기 관리`}),H(`p`,{class:`mt-4 mb-0 border-t border-slate-100 pt-4 text-xs font-semibold leading-5 text-slate-500`,children:`웹사이트에서 기기 등록을 해제하면 공유기도 다음 계정 상태 동기화에서 자동으로 연결 해제를 반영합니다.`})]}):H(`div`,{children:[H(`div`,{children:[H(`div`,{class:`flex flex-wrap items-center justify-between gap-2`,children:[H(`p`,{class:`m-0 text-sm font-black text-slate-900`,children:`계정 연결 코드`}),H(`span`,{class:`inline-flex items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-[0.7rem] font-black text-amber-800`,children:[H(pn,{class:`size-3.5`}),`10분 동안 유효`]})]}),H(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-500`,children:`코드를 발급한 뒤 smartsafehub.com에 로그인하여 기기를 연결하세요.`})]}),v?H(`div`,{class:`mt-4 flex flex-col gap-3 rounded-2xl border border-teal-200 bg-teal-50 p-4 sm:flex-row sm:items-center sm:justify-between`,role:`group`,"aria-label":`계정 연결 코드`,children:[H(`div`,{class:`min-w-0`,children:[H(`span`,{class:`block text-[0.7rem] font-black text-teal-700`,children:`연결 코드`}),H(`code`,{class:`mt-1 block select-all break-all font-mono text-2xl font-black tracking-[0.14em] text-slate-950`,children:v})]}),H(`button`,{"aria-label":`계정 연결 코드 복사`,class:`inline-flex min-h-11 shrink-0 items-center justify-center gap-2 rounded-xl border border-teal-300 bg-white px-4 text-sm font-black text-teal-800 transition hover:bg-teal-100 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:()=>void x(),type:`button`,children:[H(f?wn:bn,{class:`size-4`}),H(`span`,{"aria-live":`polite`,children:f?`복사됨`:`복사`})]})]}):_?H(`p`,{class:`mt-4 mb-0 rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm font-bold text-amber-800`,children:`이전 연결 코드가 만료되었습니다. 새 코드를 발급해 주세요.`}):null,H(`button`,{class:`mt-4 inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl border border-teal-700 bg-teal-700 px-4 py-2 text-sm font-black text-white transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:y,onClick:()=>void b(),type:`button`,children:[y?H(hn,{class:`size-4 animate-spin`}):null,y?`발급 중…`:v?`새 코드 발급`:`연결 코드 발급`]}),m?.pairingOperation?.phase===`failed`?H(`p`,{class:`mt-3 mb-0 text-sm font-semibold text-red-700`,children:`연결 코드 발급에 실패했습니다. 다시 시도해 주세요.`}):null,u?H(`p`,{class:`mt-3 mb-0 text-sm font-semibold text-red-700`,children:u}):null]})}),H(`aside`,{class:`rounded-2xl border border-slate-200 bg-white p-5 shadow-sm shadow-slate-900/5 sm:p-6 xl:h-full`,children:[H(`p`,{class:`m-0 text-[0.68rem] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Device status`}),H(`h2`,{class:`mt-2 mb-0 text-lg font-black tracking-tight text-slate-950`,children:`연결 상태`}),H(`dl`,{class:`mt-5 mb-0 grid gap-4`,children:[H(`div`,{class:`flex items-center justify-between gap-4 border-b border-slate-100 pb-4`,children:[H(`dt`,{class:`text-sm font-bold text-slate-500`,children:`계정`}),H(`dd`,{class:`m-0 text-sm font-black ${h?`text-emerald-700`:`text-slate-700`}`,children:h?`연결됨`:`연결 필요`})]}),H(`div`,{class:`flex items-center justify-between gap-4 border-b border-slate-100 pb-4`,children:[H(`dt`,{class:`text-sm font-bold text-slate-500`,children:`요금제`}),H(`dd`,{class:`m-0 flex min-w-0 flex-wrap items-center justify-end gap-2`,children:[H(Vy,{plan:g}),g===`FREE`?H(`span`,{class:`ssh-safeshield-plan-caption`,children:`기본 플랜`}):null]})]}),H(`div`,{class:`flex items-center justify-between gap-4`,children:[H(`dt`,{class:`text-sm font-bold text-slate-500`,children:`마지막 확인`}),H(`dd`,{class:`m-0 text-sm font-black text-slate-700`,children:Mo(m?.lastSuccessAt??0)})]})]}),i?H(`p`,{class:`mt-5 mb-0 text-xs font-bold text-teal-700`,children:`최신 상태를 확인하고 있습니다…`}):null,a?h?H(`p`,{class:`mt-5 mb-0 text-xs font-semibold leading-5 text-slate-500`,children:`최신 상태 확인이 지연되고 있습니다. 마지막으로 확인된 연결 상태를 표시합니다.`}):H(`p`,{class:`mt-5 mb-0 rounded-xl border border-amber-200 bg-amber-50 px-3 py-2 text-xs font-bold leading-5 text-amber-800`,children:[a,` 로컬에 저장된 마지막 상태를 표시합니다.`]}):null]})]})]})}function Wy(e,t){if(!e||!t)return`unknown`;if(e===t)return`same`;let n=/^(\d+)\.(\d+)\.(\d+)(?:-r(\d+))?$/,r=n.exec(e),i=n.exec(t);if(!r||!i)return`different`;for(let e=1;e<=4;e+=1){let t=BigInt(r[e]||`0`),n=BigInt(i[e]||`0`);if(t>n)return`newer`;if(t=1048576?`${(e/1048576).toFixed(1)} MB`:`${(e/1024).toFixed(1)} KB`}function Ky(e){switch(e.phase){case`checking`:return`확인 중`;case`downloading`:return`다운로드 중`;case`verifying`:return`검증 중`;case`ready`:return`설치 준비 완료`;case`flashing`:return`설치 중`;case`error`:return`확인 필요`;default:return e.updateAvailable?`업데이트 가능`:e.lastCheckAt?`최신 상태`:`확인 전`}}function qy(e){return e.phase===`error`?`bg-rose-50 text-rose-700 ring-rose-200`:e.phase===`checking`||e.phase===`downloading`||e.phase===`verifying`||e.phase===`flashing`?`bg-sky-50 text-sky-700 ring-sky-200`:e.phase===`ready`||e.updateAvailable?`bg-amber-50 text-amber-800 ring-amber-200`:e.lastCheckAt?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function Jy(e){return e.phase===`checking`||e.phase===`downloading`||e.phase===`verifying`||e.phase===`flashing`?H(hn,{class:`size-3.5 animate-spin`}):e.phase===`error`?H(W,{class:`size-3.5`}):e.phase===`ready`||e.updateAvailable?H(_n,{class:`size-3.5`}):e.lastCheckAt?H(wn,{class:`size-3.5`}):H(pn,{class:`size-3.5`})}function Yy({checked:e,disabled:t,onChange:n}){return H(`button`,{"aria-checked":e,"aria-label":`현재 설정 유지`,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${e?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:t,onClick:()=>n(!e),role:`switch`,type:`button`,children:H(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${e?`left-6`:`left-1`}`})})}function Xy({action:e,actionError:t,data:n,software:r,error:i,loading:a,message:o,reconnecting:s,uploadProgress:c,onCheck:l,onDiscard:u,onDismissFeedback:d,onInstall:f,onPrepare:p,onRetry:m,onUpload:h}){let g=L(null),[_,v]=F(null),[y,x]=F(!0),[S,C]=F(!1);I(()=>{n?.prepared&&x(n.prepared.allowBackup)},[n?.prepared]);let w=e!==null||n?.phase===`checking`||n?.phase===`downloading`||n?.phase===`verifying`||n?.phase===`flashing`,T=n?.phase===`ready`?n.prepared:null,E=e===`check`||n?.phase===`checking`,D=e===`prepare`||n?.phase===`downloading`||n?.phase===`verifying`,O=e===`upload`||e===`validate-upload`,k=n?.release?.bundledSoftware?.smartsafehub??null,A=r?.packages.find(e=>e.name===`luci-app-smartsafehub`)?.installedVersion??null,j=Wy(k,A),M=async()=>{_&&await h(_)&&(v(null),g.current&&(g.current.value=``))};return H(`article`,{class:`min-w-0 overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm shadow-slate-900/5`,"data-component":`firmware-update-card`,children:[H(`div`,{class:`p-5 sm:p-6`,children:[H(`div`,{class:`flex flex-col gap-5 lg:flex-row lg:items-start lg:justify-between`,children:[H(`div`,{class:`flex min-w-0 gap-4`,children:[H(`span`,{class:`grid size-12 shrink-0 place-items-center rounded-2xl bg-sky-50 text-sky-700`,children:H(Xt,{class:`size-6`})}),H(`div`,{class:`min-w-0`,children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-sky-700`,children:`Firmware update`}),H(`h2`,{class:`mt-2 mb-0 text-xl font-black text-slate-950 sm:text-2xl`,children:`펌웨어 업데이트`}),H(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500 lg:whitespace-nowrap`,children:`시스템 펌웨어를 확인하고 설치합니다. 온라인·수동 설치는 안전성 검증 후 진행됩니다.`})]})]}),n?H(`div`,{class:`flex shrink-0 flex-col gap-2 sm:flex-row lg:justify-end`,children:[H(`span`,{class:`inline-flex min-h-11 items-center justify-center gap-1.5 rounded-xl px-3 py-2 text-xs font-extrabold ring-1 ring-inset ${qy(n)}`,children:[Jy(n),Ky(n)]}),H(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-800 transition hover:bg-slate-50 disabled:cursor-wait disabled:opacity-60`,disabled:w||T!==null,onClick:l,type:`button`,children:[H(hn,{class:`size-4 ${E?`animate-spin`:``}`}),E?`확인 중...`:`펌웨어 확인`]}),n.updateAvailable&&!T?H(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl bg-sky-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-sky-800 disabled:cursor-wait disabled:opacity-60`,disabled:w,onClick:p,type:`button`,children:[D?H(hn,{class:`size-4 animate-spin`}):H(_n,{class:`size-4`}),D?`준비 중...`:`다운로드 및 검증`]}):null]}):null]}),t||o?H(`div`,{class:`mt-5 flex flex-col gap-3 rounded-xl border px-4 py-3 text-sm font-bold sm:flex-row sm:items-center sm:justify-between ${t?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[H(`span`,{children:t||o}),H(`button`,{class:`shrink-0 self-start rounded-lg px-3 py-1.5 text-xs font-extrabold hover:bg-black/5 sm:self-auto`,onClick:d,type:`button`,children:`닫기`})]}):null,s||n?.phase===`flashing`?H(`div`,{class:`mt-5 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:p-5`,role:`status`,children:H(`div`,{class:`flex gap-3`,children:[H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-amber-700 ring-1 ring-inset ring-amber-200`,children:H(hn,{class:`size-5 animate-spin`})}),H(`div`,{children:[H(`strong`,{class:`block text-sm font-black text-amber-950`,children:`펌웨어를 설치하고 재부팅하고 있습니다.`}),H(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-amber-800`,children:`전원을 끄지 마세요. 현재 주소에서 공유기가 다시 응답하면 SmartSafeHub가 자동으로 새로고침됩니다.`})]})]})}):null,i&&!n?H(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 text-sm text-rose-800`,children:[H(`p`,{class:`m-0 font-bold`,children:i}),H(`button`,{class:`mt-3 rounded-lg border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700`,onClick:m,type:`button`,children:`다시 시도`})]}):a&&!n?H(`div`,{class:`mt-5 flex items-center gap-3 rounded-xl bg-slate-50 p-4 text-sm font-bold text-slate-500`,children:[H(hn,{class:`size-4 animate-spin`}),`펌웨어 상태를 확인하고 있습니다.`]}):n?H(b,{children:[n.lastError?H(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 sm:p-5`,children:H(`div`,{class:`flex gap-3`,children:[H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-rose-700 ring-1 ring-inset ring-rose-200`,children:H(W,{class:`size-5`})}),H(`div`,{class:`min-w-0 flex-1`,children:[H(`strong`,{class:`block text-sm font-black text-rose-950`,children:`펌웨어 작업을 완료하지 못했습니다.`}),H(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-rose-800`,children:n.lastError.message}),H(`details`,{class:`mt-3 rounded-lg border border-rose-200 bg-white p-3`,children:[H(`summary`,{class:`cursor-pointer text-xs font-extrabold text-rose-800`,children:`상세 정보 보기`}),H(`p`,{class:`mt-2 mb-0 break-all font-mono text-[11px] text-slate-600`,children:n.lastError.code})]})]})]})}):null,n.current.metadataAvailable?null:H(`div`,{class:`mt-5 rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-xs leading-5 text-amber-900`,children:[H(`strong`,{class:`block font-extrabold`,children:`현재 펌웨어의 버전 정보를 완전히 확인할 수 없습니다.`}),H(`span`,{class:`mt-1 block text-amber-800`,children:`새 펌웨어를 설치하면 이후부터 정확한 설치 버전을 자동으로 확인할 수 있습니다.`}),H(`details`,{class:`mt-2`,children:[H(`summary`,{class:`cursor-pointer font-extrabold text-amber-800`,children:`기술 상세 보기`}),H(`p`,{class:`mt-2 mb-0 break-all font-mono text-[11px] leading-5 text-amber-800`,children:`SmartSafeHub build ID metadata is missing. Future images should include /usr/share/smartsafehub/firmware.json.`})]})]}),H(`dl`,{class:`mt-5 grid overflow-hidden rounded-xl border border-slate-200 bg-slate-200 sm:grid-cols-2 xl:grid-cols-4`,children:[H(`div`,{class:`bg-white p-4`,children:[H(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Device`}),H(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black text-slate-950`,children:n.current.deviceCode||n.current.boardName||`미확인`})]}),H(`div`,{class:`bg-white p-4`,children:[H(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Current version`}),H(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black text-slate-950`,children:n.current.releaseVersion||`미확인`}),n.current.buildId?H(`span`,{class:`mt-1 block break-all text-[11px] leading-5 text-slate-400`,children:[`빌드 ID `,n.current.buildId]}):n.current.openwrtVersion?H(`span`,{class:`mt-1 block text-[11px] leading-5 text-slate-400`,children:[`OpenWrt `,n.current.openwrtVersion]}):null]}),H(`div`,{class:`bg-white p-4`,children:[H(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Available version`}),H(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black ${n.updateAvailable?`text-amber-700`:`text-slate-950`}`,children:n.lastCheckAt?n.release?.version?`${n.release.version}${n.updateAvailable?``:` · 최신`}`:n.updateAvailable?`새 펌웨어`:`최신 버전`:`미확인`}),n.release?.buildId?H(`span`,{class:`mt-1 block break-all text-[11px] leading-5 text-slate-400`,children:[`빌드 ID `,n.release.buildId]}):null]}),H(`div`,{class:`bg-white p-4`,children:[H(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Last check`}),H(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-black text-slate-950`,children:H(Iv,{fallback:`아직 없음`,timestamp:n.lastCheckAt})})]})]})]}):null,n?.updateAvailable&&n.release?H(`section`,{class:`mt-5 rounded-xl border border-sky-200 bg-sky-50/60 p-4 sm:p-5`,"data-section":`available-firmware`,children:[H(`div`,{class:`flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-4`,children:[H(`div`,{children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-sky-700`,children:`Available firmware`}),H(`h3`,{class:`mt-2 mb-0 text-lg font-black text-slate-950`,children:`새 펌웨어가 있습니다.`}),H(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:[`펌웨어 `,n.release.version||`미확인`,` · `,Gy(n.release.sysupgrade.sizeBytes),` · `,(n.release.channel||n.settings.channel)===`beta`?`Beta`:`Stable`]})]}),H(`div`,{class:`flex shrink-0 flex-wrap items-center justify-start gap-2 sm:justify-end`,children:[H(`span`,{class:`rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-sky-700 ring-1 ring-inset ring-sky-200`,children:n.release.version||`Latest`}),k?H(`span`,{class:`inline-flex items-center gap-1.5 rounded-full bg-white px-3 py-1.5 text-xs font-extrabold text-slate-700 ring-1 ring-inset ring-sky-200`,"data-section":`firmware-bundled-software-chip`,children:[H(`span`,{class:`text-[11px] uppercase tracking-[0.12em] text-slate-500`,children:`관리 SW`}),H(`span`,{class:`text-slate-950`,children:k})]}):null]})]}),k?H(`div`,{class:`mt-4 rounded-xl border border-sky-100 bg-white p-4`,"data-section":`firmware-bundled-software`,children:[H(`div`,{class:`flex flex-wrap items-center justify-between gap-2`,children:[H(`span`,{class:`text-xs font-extrabold text-slate-800`,children:`포함된 관리 소프트웨어`}),H(`div`,{class:`flex flex-wrap items-center gap-2`,children:[H(`span`,{class:`text-sm font-black text-slate-950`,children:k}),j===`same`?H(`span`,{class:`rounded-full bg-emerald-50 px-2.5 py-1 text-[11px] font-extrabold text-emerald-700 ring-1 ring-inset ring-emerald-200`,children:`현재 버전과 동일`}):null]})]}),H(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-slate-600`,children:j===`same`?`관리 소프트웨어는 이미 같은 버전입니다. 펌웨어 업데이트는 시스템 구성 요소를 갱신합니다.`:j===`older`?`현재 설치된 관리 소프트웨어(${A})보다 이전 버전이 포함되어 있습니다. 펌웨어 설치 전 버전을 확인해 주세요.`:j===`newer`?`현재 설치된 관리 소프트웨어(${A})보다 새 버전이 포함되어 있습니다.`:A?`현재 설치 버전 ${A} · 펌웨어 포함 버전 ${k}`:`이 펌웨어에 포함된 관리 소프트웨어 버전입니다.`})]}):null,n.release.releaseNotes.length?H(`ul`,{class:`mt-4 mb-0 space-y-2 rounded-xl bg-white p-4 pl-9 text-sm leading-6 text-slate-700 ring-1 ring-inset ring-sky-100`,children:n.release.releaseNotes.map((e,t)=>H(`li`,{children:e},`${t}-${e}`))}):null]}):null,T?H(`section`,{class:`mt-5 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:p-5`,"data-section":`prepared-firmware`,children:H(`div`,{class:`flex gap-4`,children:[H(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-white text-amber-700 ring-1 ring-inset ring-amber-200`,children:H(wn,{class:`size-5`})}),H(`div`,{class:`min-w-0 flex-1`,children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-amber-700`,children:`Verified image`}),H(`h3`,{class:`mt-2 mb-0 text-lg font-black text-amber-950`,children:`설치할 펌웨어가 준비되었습니다.`}),H(`p`,{class:`mt-2 mb-0 break-all text-sm leading-6 text-amber-900`,children:[T.filename||`firmware.bin`,` · `,Gy(T.sizeBytes)]}),T.sha256?H(`p`,{class:`mt-2 mb-0 break-all font-mono text-[11px] leading-5 text-amber-800`,children:[`SHA-256 `,T.sha256]}):null,H(`div`,{class:`mt-5 flex items-start justify-between gap-4 rounded-xl border border-amber-200 bg-white p-4`,children:[H(`div`,{children:[H(`strong`,{class:`block text-sm font-black text-slate-950`,children:`현재 설정 유지`}),H(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:`Wi-Fi, SafeShield, SmartSafeHub 설정을 유지합니다.`}),T.allowBackup?null:H(`span`,{class:`mt-2 block text-xs font-bold text-rose-700`,children:`이 이미지는 설정 유지 업그레이드를 지원하지 않습니다.`})]}),H(Yy,{checked:y,disabled:!T.allowBackup,onChange:x})]}),S?H(`div`,{class:`mt-4 rounded-xl border border-rose-200 bg-rose-50 p-4`,children:[H(`strong`,{class:`block text-sm font-black text-rose-950`,children:`펌웨어 설치를 시작할까요?`}),H(`p`,{class:`mt-1 mb-0 text-xs leading-5 text-rose-800`,children:`설치 중 전원을 끄면 장치가 복구 불가능한 상태가 될 수 있습니다. 이미지 검증은 설치 직전에 다시 수행됩니다.`}),H(`div`,{class:`mt-4 flex flex-wrap justify-end gap-2`,children:[H(`button`,{class:`min-h-10 rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700`,onClick:()=>C(!1),type:`button`,children:`취소`}),H(`button`,{class:`min-h-10 rounded-lg bg-rose-700 px-3 py-2 text-xs font-extrabold text-white`,onClick:()=>{C(!1),f(y)},type:`button`,children:`설치 시작`})]})]}):H(`div`,{class:`mt-4 flex flex-wrap justify-end gap-2`,children:[H(`button`,{class:`min-h-10 rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700`,disabled:e===`discard`,onClick:()=>void u(),type:`button`,children:`파일 삭제`}),H(`button`,{class:`inline-flex min-h-10 items-center gap-2 rounded-lg bg-rose-700 px-4 py-2 text-xs font-extrabold text-white`,onClick:()=>C(!0),type:`button`,children:[H(on,{class:`size-4`}),`펌웨어 설치`]})]})]})]})}):null]}),H(`details`,{class:`group mx-5 mb-5 rounded-xl border border-slate-200 bg-slate-50/70 sm:mx-6 sm:mb-6`,"data-layout":`firmware-card-subsection`,"data-section":`manual-firmware`,children:[H(`summary`,{class:`flex cursor-pointer list-none items-center justify-between gap-4 px-4 py-4 sm:px-5 [&::-webkit-details-marker]:hidden`,children:[H(`div`,{class:`flex min-w-0 items-center gap-3`,children:[H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-slate-600 ring-1 ring-inset ring-slate-200`,children:H(_n,{class:`size-5 rotate-180`})}),H(`div`,{class:`min-w-0`,children:[H(`strong`,{class:`block text-sm font-black text-slate-950`,children:`수동 펌웨어 설치`}),H(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:`펌웨어 파일(.bin)을 직접 업로드하여 검증한 뒤 설치합니다.`})]})]}),H(`span`,{class:`shrink-0 rounded-full bg-white px-3 py-1.5 text-[11px] font-extrabold text-slate-600 ring-1 ring-inset ring-slate-200 group-open:hidden`,children:`열기`}),H(`span`,{class:`hidden shrink-0 rounded-full bg-white px-3 py-1.5 text-[11px] font-extrabold text-slate-600 ring-1 ring-inset ring-slate-200 group-open:inline-flex`,children:`닫기`})]}),H(`div`,{class:`border-t border-slate-200 px-5 pb-5 pt-3 sm:px-6`,children:[H(`p`,{class:`mt-0 mb-4 text-xs leading-5 text-slate-500 lg:whitespace-nowrap`,children:"이 장치에 맞는 Sysupgrade 이미지(.bin)만 사용하세요. 업로드한 파일은 이미지 검증과 `sysupgrade --test`를 모두 통과해야 설치할 수 있으며 강제 설치는 제공하지 않습니다."}),H(`div`,{class:`rounded-xl border border-slate-200 bg-white p-4 sm:p-5`,"data-layout":`firmware-file-picker`,children:[H(`input`,{accept:`.bin,application/octet-stream`,"aria-label":`펌웨어 파일 선택`,class:`sr-only`,disabled:w||T!==null,onChange:e=>v(e.currentTarget.files?.[0]??null),ref:g,type:`file`}),H(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between`,children:[H(`div`,{class:`flex min-w-0 items-center gap-3`,children:[H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-slate-50 text-slate-500 ring-1 ring-inset ring-slate-200`,children:H(_n,{class:`size-5 rotate-180`})}),H(`div`,{class:`min-w-0`,children:[H(`strong`,{class:`block truncate text-sm font-black text-slate-900`,children:_?_.name:`펌웨어 파일을 선택하세요`}),H(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:_?`${Gy(_.size)} · Sysupgrade 이미지 (.bin)`:`이 장치에 맞는 Sysupgrade 이미지 (.bin)를 선택합니다.`})]})]}),H(`div`,{class:`flex shrink-0 flex-wrap gap-2 sm:justify-end`,children:[H(`button`,{class:`inline-flex min-h-10 items-center justify-center rounded-lg border border-slate-300 bg-white px-3.5 py-2 text-xs font-extrabold text-slate-700 transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50`,disabled:w||T!==null,onClick:()=>g.current?.click(),type:`button`,children:_?`다른 파일 선택`:`파일 선택`}),H(`button`,{class:`inline-flex min-h-10 items-center justify-center gap-2 rounded-lg bg-slate-900 px-3.5 py-2 text-xs font-extrabold text-white transition hover:bg-slate-800 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!_||w||T!==null,onClick:()=>void M(),type:`button`,children:[O?H(hn,{class:`size-4 animate-spin`}):H(_n,{class:`size-4 rotate-180`}),O?`처리 중...`:`업로드 및 검증`]})]})]}),c===null?null:H(`div`,{class:`mt-4 border-t border-slate-100 pt-4`,children:[H(`div`,{class:`mb-2 flex items-center justify-between gap-3 text-xs font-bold text-slate-600`,children:[H(`span`,{children:`업로드 중`}),H(`span`,{children:[c,`%`]})]}),H(`div`,{class:`h-2 overflow-hidden rounded-full bg-slate-200`,children:H(`div`,{class:`h-full rounded-full bg-sky-600 transition-[width]`,style:{width:`${Math.max(0,Math.min(100,c))}%`}})})]})]})]})]})]})}var Zy=[{value:3600,label:`1시간마다`},{value:21600,label:`6시간마다`},{value:43200,label:`12시간마다`},{value:86400,label:`24시간마다`}],Qy=`luci-app-smartsafehub`;function $y(e){return e?new Date(e*1e3).toLocaleString(`ko-KR`,{dateStyle:`medium`,timeStyle:`short`}):`아직 없음`}function eb(e){return e===`stable`?`Stable`:e===`beta`?`Beta`:`미확인`}function tb(e){return e===`stable`?`bg-emerald-50 text-emerald-700 ring-emerald-200`:e===`beta`?`bg-amber-50 text-amber-700 ring-amber-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function nb(e){return e.code===`UPDATES_INDEX_REFRESH_FAILED`?{title:`패키지 저장소를 확인하지 못했습니다.`,description:`OpenWrt 패키지 저장소 동기화 또는 네트워크 상태가 일시적으로 불안정할 수 있습니다. 잠시 후 업데이트 확인을 다시 실행해 주세요.`}:e.code===`UPDATES_INSTALL_FAILED`?{title:`관리 소프트웨어 업데이트 설치에 실패했습니다.`,description:`패키지 설치가 완료되지 않았습니다. 네트워크 연결과 저장 공간을 확인한 뒤 다시 시도해 주세요.`}:{title:`최근 업데이트 작업을 완료하지 못했습니다.`,description:`잠시 후 다시 시도해 주세요. 문제가 반복되면 상세 정보를 확인해 주세요.`}}function rb(e,t){return e.phase===`checking`?`업데이트 확인 중`:e.phase===`installing`?`업데이트 설치 중`:e.phase===`error`?`확인 필요`:e.updateCount>0?`업데이트 가능`:t?`업데이트 확인 지연`:e.lastCheckAt?`최신 상태`:`확인 전`}function ib(e,t){return e.phase===`error`?`bg-rose-50 text-rose-700 ring-rose-200`:e.phase===`checking`||e.phase===`installing`?`bg-sky-50 text-sky-700 ring-sky-200`:e.updateCount>0||t?`bg-amber-50 text-amber-800 ring-amber-200`:e.lastCheckAt?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}function ab(e,t){return e.phase===`checking`||e.phase===`installing`?H(hn,{class:`size-3.5 shrink-0 animate-spin`}):e.phase===`error`?H(W,{class:`size-3.5 shrink-0`}):e.updateCount>0?H(_n,{class:`size-3.5 shrink-0`}):t?H(W,{class:`size-3.5 shrink-0`}):e.lastCheckAt?H(wn,{class:`size-3.5 shrink-0`}):H(pn,{class:`size-3.5 shrink-0`})}function ob({checked:e,disabled:t=!1,label:n,onChange:r}){return H(`button`,{"aria-checked":e,"aria-label":n,class:`ssh-switch-control relative inline-flex shrink-0 rounded-full border transition focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50 ${e?`border-teal-600 bg-teal-600`:`border-slate-300 bg-slate-200`}`,disabled:t,onClick:()=>r(!e),role:`switch`,type:`button`,children:H(`span`,{"aria-hidden":`true`,class:`ssh-switch-thumb absolute top-1 shadow-sm transition-[left] ${e?`left-6`:`left-1`}`})})}function sb({action:e,actionError:t,data:n,firmware:r,error:i,loading:a,message:o,onCheck:s,onDismissFeedback:c,onInstall:l,onRetry:u,onSaveSettings:d}){let[f,p]=F(!0),[m,h]=F(21600),[g,_]=F(!1),[v,y]=F(`03:00`),[x,S]=F(!1),[C,w]=F(!1);I(()=>{n&&!x&&(p(n.settings.checkEnabled),h(n.settings.checkIntervalSeconds),_(n.settings.autoInstall),y(n.settings.autoInstallTime))},[n,x]);let T=e===`check`||n?.phase===`checking`,E=e===`install`||n?.phase===`installing`,D=T||E,O=l_(n),k=n?.phase===`error`&&n.lastError?.code===`UPDATES_INDEX_REFRESH_FAILED`,A=n?.lastError?nb(n.lastError):null,j=n?.packages.find(e=>e.name===Qy)??n?.packages[0]??null,M=r?.updateAvailable?r.release?.bundledSoftware?.smartsafehub:null,N=!(!n?.lastCheckAt||n.updateCount!==0||O||j?.name!==Qy)&&Wy(M,j?.installedVersion)===`same`,P=(e={})=>n?(e.checkEnabled??f)!==n.settings.checkEnabled||(e.checkIntervalSeconds??m)!==n.settings.checkIntervalSeconds||(e.autoInstall??g)!==n.settings.autoInstall||(e.autoInstallTime??v)!==n.settings.autoInstallTime:!1,ee=async()=>{await d({checkEnabled:f,checkIntervalSeconds:m,autoInstall:g,autoInstallTime:v})&&S(!1)};return H(`article`,{class:`min-w-0 overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm shadow-slate-900/5 ${n?`grid xl:grid-cols-[minmax(0,0.95fr)_minmax(0,1.05fr)]`:``}`,"data-component":`management-software-update-card`,"data-layout":`management-software-sections`,children:[H(`section`,{class:`min-w-0 xl:col-start-1 xl:row-start-1`,"data-section":`software-update-status`,children:[H(`div`,{class:`p-5 sm:p-6`,children:[H(`div`,{class:`flex flex-col gap-5 lg:flex-row lg:items-start lg:justify-between`,children:[H(`div`,{class:`flex min-w-0 gap-4`,children:[H(`span`,{class:`grid size-12 shrink-0 place-items-center rounded-2xl bg-teal-50 text-teal-700`,children:H(on,{class:`size-6`})}),H(`div`,{class:`min-w-0`,children:[H(`div`,{class:`flex flex-wrap items-center gap-2`,children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-teal-700`,children:`Management software`}),n?H(`span`,{class:`inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-extrabold ring-1 ring-inset ${ib(n,O)}`,children:[H(`span`,{"aria-hidden":`true`,class:`flex items-center justify-center`,children:ab(n,O)}),rb(n,O)]}):null]}),H(`h2`,{class:`mt-2 mb-0 text-xl font-black text-slate-950 sm:text-2xl`,children:`관리 소프트웨어 업데이트`}),H(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500 xl:whitespace-nowrap`,children:`새 버전을 확인하고 안전하게 설치합니다.`})]})]}),n?H(`div`,{class:`flex shrink-0 flex-col gap-2 sm:flex-row lg:justify-end`,children:[H(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-extrabold text-slate-800 transition hover:bg-slate-50 disabled:cursor-wait disabled:opacity-60`,disabled:D,onClick:s,type:`button`,children:[H(hn,{class:`size-4 ${T?`animate-spin`:``}`}),T?`확인 중...`:`업데이트 확인`]}),n.updateCount>0&&!C?H(`button`,{class:`inline-flex min-h-11 items-center justify-center gap-2 rounded-xl bg-teal-700 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:cursor-wait disabled:opacity-60`,disabled:D,onClick:()=>w(!0),type:`button`,children:[E?H(hn,{class:`size-4 animate-spin`}):H(_n,{class:`size-4`}),E?`설치 중...`:`업데이트 설치`]}):null]}):null]}),(t||o)&&H(`div`,{class:`mt-5 flex flex-col gap-3 rounded-xl border px-4 py-3 text-sm font-bold sm:flex-row sm:items-center sm:justify-between ${t?`border-rose-200 bg-rose-50 text-rose-800`:`border-emerald-200 bg-emerald-50 text-emerald-800`}`,children:[H(`span`,{children:t||o}),H(`button`,{class:`shrink-0 self-start rounded-lg px-3 py-1.5 text-xs font-extrabold hover:bg-black/5 sm:self-auto`,onClick:c,type:`button`,children:`닫기`})]}),E?H(`div`,{"aria-busy":`true`,"aria-live":`polite`,class:`mt-5 rounded-xl border border-sky-200 bg-sky-50 p-4 sm:p-5`,children:[H(`div`,{class:`flex items-start gap-3`,children:[H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-sky-700 ring-1 ring-inset ring-sky-200`,children:H(hn,{"aria-hidden":`true`,class:`size-5 animate-spin`})}),H(`div`,{class:`min-w-0`,children:[H(`h3`,{class:`m-0 text-sm font-black text-sky-950`,children:`관리 소프트웨어를 업데이트하고 있습니다.`}),H(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-sky-800`,children:`설치가 완료되면 이 화면이 자동으로 갱신됩니다. 작업 중에는 웹 연결이 잠시 끊길 수 있습니다.`})]})]}),H(`div`,{"aria-hidden":`true`,class:`ssh-update-progress-track mt-4`,children:H(`span`,{class:`ssh-update-progress-bar`})})]}):null,i&&!n?H(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 text-sm text-rose-800`,children:[H(`p`,{class:`m-0 font-bold`,children:i}),H(`button`,{class:`mt-3 rounded-lg border border-rose-300 bg-white px-3 py-2 text-xs font-extrabold text-rose-700`,onClick:u,type:`button`,children:`다시 시도`})]}):a&&!n?H(`div`,{class:`mt-5 flex items-center gap-3 rounded-xl bg-slate-50 p-4 text-sm font-bold text-slate-500`,children:[H(`span`,{class:`grid size-9 shrink-0 place-items-center rounded-xl bg-white text-teal-700 ring-1 ring-inset ring-slate-200`,children:H(hn,{"aria-hidden":`true`,class:`size-4 animate-spin`})}),H(`span`,{children:`관리 소프트웨어 업데이트 상태를 확인하고 있습니다.`})]}):n?H(b,{children:[n.lastError&&A?H(`div`,{class:`mt-5 rounded-xl border border-rose-200 bg-rose-50 p-4 sm:p-5`,children:H(`div`,{class:`flex items-start gap-3`,children:[H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-rose-700 ring-1 ring-inset ring-rose-200`,children:H(W,{class:`size-5`})}),H(`div`,{class:`min-w-0 flex-1`,children:[H(`p`,{class:`m-0 text-sm font-extrabold text-rose-950`,children:A.title}),H(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-rose-800`,children:A.description}),n.lastError.at?H(`p`,{class:`mt-2 mb-0 text-xs font-bold text-rose-700`,children:[`발생 시각 `,$y(n.lastError.at)]}):null,H(`details`,{class:`mt-3 rounded-lg border border-rose-200 bg-white p-3`,children:[H(`summary`,{class:`cursor-pointer text-xs font-extrabold text-rose-800`,children:`상세 정보 보기`}),H(`div`,{class:`mt-3 grid gap-2 text-xs leading-5 text-slate-600`,children:[H(`p`,{class:`m-0`,children:[`오류 코드 `,H(`strong`,{class:`font-black text-slate-900`,children:n.lastError.code})]}),H(`pre`,{class:`m-0 max-h-40 overflow-auto whitespace-pre-wrap break-words rounded-lg bg-slate-50 p-3 font-mono text-[11px] leading-5 text-slate-700`,children:n.lastError.message})]})]})]})]})}):null,C?H(`div`,{class:`mt-5 flex flex-col gap-3 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:flex-row sm:items-center sm:justify-between`,children:[H(`div`,{class:`min-w-0`,children:[H(`strong`,{class:`block text-sm font-black text-amber-900`,children:`관리 소프트웨어를 지금 업데이트할까요?`}),H(`span`,{class:`mt-1 block text-xs leading-5 text-amber-800`,children:`설치 중 SmartSafeHub 웹 화면 연결이 잠시 끊길 수 있습니다.`})]}),H(`div`,{class:`flex shrink-0 gap-2`,children:[H(`button`,{class:`min-h-10 rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-extrabold text-slate-700`,disabled:D,onClick:()=>w(!1),type:`button`,children:`취소`}),H(`button`,{class:`min-h-10 rounded-lg bg-amber-700 px-3 py-2 text-xs font-extrabold text-white disabled:opacity-60`,disabled:D,onClick:()=>{w(!1),l()},type:`button`,children:`설치 시작`})]})]}):null]}):null]}),n?H(`div`,{class:`px-5 pb-5 sm:px-6 sm:pb-6`,children:[H(`h3`,{class:`mb-3 text-sm font-black text-slate-950`,children:`현재 상태`}),H(`dl`,{class:`grid overflow-hidden rounded-xl border border-slate-200 bg-slate-200 sm:grid-cols-2`,children:[H(`div`,{class:`bg-white p-4`,children:[H(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Installed`}),H(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black text-slate-950`,children:j?.installedVersion||`미확인`})]}),H(`div`,{class:`bg-white p-4`,children:[H(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Available`}),H(`dd`,{class:`mt-2 mb-0 ml-0 break-all text-sm font-black ${j?.updateAvailable||O?`text-amber-700`:`text-slate-950`}`,children:!n.lastCheckAt||k&&!j?.updateAvailable?`미확인`:j?.updateAvailable&&j.availableVersion?j.availableVersion:O?`확인 필요`:`최신 버전`})]}),H(`div`,{class:`bg-white p-4`,children:[H(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Last check`}),H(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-black text-slate-950`,children:H(Iv,{fallback:`아직 없음`,timestamp:n.lastCheckAt})})]}),H(`div`,{class:`bg-white p-4`,children:[H(`dt`,{class:`text-[11px] font-black uppercase tracking-[0.16em] text-slate-400`,children:`Auto install`}),H(`dd`,{class:`mt-2 mb-0 ml-0 text-sm font-black text-slate-950`,children:n.settings.autoInstall?`켜짐 · ${n.settings.autoInstallTime}`:`꺼짐`})]})]})]}):null,n&&n.updateCount===0&&n.lastCheckAt?O?H(`section`,{class:`mx-5 mb-5 rounded-xl border border-amber-200 bg-amber-50 p-4 sm:mx-6 sm:mb-6 sm:p-5`,"data-section":`software-update-result`,children:H(`div`,{class:`flex gap-3`,children:[H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-amber-700 ring-1 ring-inset ring-amber-200`,children:H(W,{class:`size-5`})}),H(`div`,{children:[H(`h3`,{class:`m-0 text-base font-black text-amber-950`,children:`업데이트 확인이 지연되고 있습니다.`}),H(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-amber-800`,children:[`마지막 업데이트 확인: `,H(Iv,{timestamp:n.lastCheckAt}),`. 자동 확인 상태를 점검하거나 업데이트 확인을 실행해 주세요.`]})]})]})}):H(`section`,{class:`mx-5 mb-5 rounded-xl border border-emerald-200 bg-emerald-50 p-4 sm:mx-6 sm:mb-6 sm:p-5`,"data-section":`software-update-result`,children:H(`div`,{class:`flex gap-3`,children:[H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-emerald-700`,children:H(wn,{class:`size-5`})}),H(`div`,{children:[H(`h3`,{class:`m-0 text-base font-black text-emerald-950`,children:`최신 버전을 사용 중입니다.`}),H(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-emerald-800`,children:[`마지막 업데이트 확인: `,H(Iv,{timestamp:n.lastCheckAt}),`.`]}),N?H(`p`,{class:`mt-2 mb-0 text-xs leading-5 text-emerald-800`,"data-section":`software-firmware-match`,children:[`새 펌웨어에도 동일한 관리 소프트웨어(`,M,`)가 포함되어 있어 별도로 업데이트할 필요가 없습니다.`]}):null]})]})}):null,n&&n.updateCount===0&&!n.lastCheckAt?H(`section`,{class:`mx-5 mb-5 rounded-xl border border-slate-200 bg-slate-50 p-4 sm:mx-6 sm:mb-6 sm:p-5`,"data-section":`software-update-result`,children:H(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between`,children:[H(`div`,{class:`flex min-w-0 gap-3`,children:[H(`span`,{class:`grid size-10 shrink-0 place-items-center rounded-xl bg-white text-slate-500 ring-1 ring-inset ring-slate-200`,children:H(hn,{class:`size-5`})}),H(`div`,{class:`min-w-0`,children:[H(`h3`,{class:`m-0 text-base font-black text-slate-900`,children:`업데이트 상태를 아직 확인하지 않았습니다.`}),H(`p`,{class:`mt-1 mb-0 text-sm leading-6 text-slate-600`,children:`업데이트 확인을 실행하면 현재 설치 버전과 사용 가능한 최신 버전을 확인합니다.`})]})]}),H(`button`,{class:`inline-flex min-h-10 shrink-0 items-center justify-center gap-2 rounded-xl border border-slate-300 bg-white px-4 py-2 text-sm font-extrabold text-slate-800 transition hover:border-teal-300 hover:text-teal-700 disabled:cursor-wait disabled:opacity-60`,disabled:D,onClick:s,type:`button`,children:[H(hn,{class:`size-4`}),`지금 확인`]})]})}):null]}),n?H(b,{children:[H(`section`,{class:`min-w-0 border-t border-slate-200 p-5 sm:p-6 xl:col-start-2 xl:row-start-1 xl:row-span-2 xl:self-stretch xl:border-t-0 xl:border-l`,"data-section":`software-update-settings`,children:[H(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between`,children:[H(`div`,{class:`flex min-w-0 gap-4`,children:[H(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-600`,children:H(sn,{class:`size-5`})}),H(`div`,{class:`min-w-0`,children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`Settings`}),H(`h3`,{class:`mt-2 mb-0 text-lg font-black text-slate-950`,children:`자동 업데이트`}),H(`p`,{class:`mt-2 mb-0 max-w-3xl text-sm leading-6 text-slate-500`,children:`관리 소프트웨어의 자동 확인과 자동 설치를 설정합니다.`})]})]}),x?H(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 self-start items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[H(W,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]}):null]}),H(`div`,{class:`ssh-software-settings-grid mt-4`,children:[H(`div`,{class:`ssh-software-settings-channel rounded-xl border border-slate-200 p-4 sm:p-5`,children:H(`div`,{class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[H(`div`,{class:`min-w-0`,children:[H(`strong`,{class:`block text-sm font-black text-slate-950`,children:`업데이트 채널`}),H(`span`,{class:`mt-1 block text-xs leading-5 text-slate-500`,children:`현재 관리 소프트웨어 업데이트를 확인하는 배포 채널입니다.`})]}),H(`span`,{class:`inline-flex min-h-9 shrink-0 items-center justify-center rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${tb(n.settings.channel)}`,title:`현재 업데이트 확인 채널`,children:eb(n.settings.channel)})]})}),H(`div`,{class:`min-w-0 overflow-hidden rounded-xl border border-slate-200 p-4 sm:p-5`,children:[H(`div`,{class:`flex min-w-0 items-start justify-between gap-4`,children:[H(`div`,{class:`min-w-0`,children:H(`strong`,{class:`block text-sm font-black text-slate-950`,children:`자동으로 업데이트 확인`})}),H(ob,{checked:f,label:`자동 업데이트 확인`,onChange:e=>{p(e),S(P({checkEnabled:e}))}})]}),H(`div`,{class:`mt-4 block`,children:[H(`span`,{class:`text-xs font-extrabold text-slate-700`,children:`확인 주기`}),H(U_,{ariaLabel:`업데이트 확인 주기`,className:`mt-2`,disabled:!f,id:`software-update-check-interval`,onChange:e=>{let t=Number(e);h(t),S(P({checkIntervalSeconds:t}))},options:Zy.map(e=>({value:String(e.value),label:e.label})),value:String(m),variant:`emphasized`})]})]}),H(`div`,{class:`min-w-0 overflow-hidden rounded-xl border border-slate-200 p-4 sm:p-5`,children:[H(`div`,{class:`flex min-w-0 items-start justify-between gap-4`,children:[H(`div`,{class:`min-w-0`,children:H(`strong`,{class:`block text-sm font-black text-slate-950`,children:`자동으로 업데이트 설치`})}),H(ob,{checked:g,label:`자동 업데이트 설치`,onChange:e=>{_(e),S(P({autoInstall:e}))}})]}),H(`div`,{class:`mt-4 min-w-0`,children:[H(`span`,{class:`text-xs font-extrabold text-slate-700`,children:`설치 시각`}),H(by,{ariaLabel:`자동 업데이트 설치 시각`,className:`mt-2`,disabled:!g,id:`software-update-auto-install-time`,onChange:e=>{y(e),S(P({autoInstallTime:e}))},value:v,variant:`emphasized`})]})]})]}),g?H(`p`,{class:`mt-4 mb-0 rounded-xl bg-amber-50 px-4 py-3 text-xs font-bold leading-5 text-amber-800`,children:`자동 설치 중에는 SmartSafeHub 웹 화면 연결이 잠시 끊길 수 있습니다.`}):null,H(`div`,{class:`mt-5 flex flex-col gap-3 border-t border-slate-100 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[H(`p`,{class:`m-0 text-xs leading-5 text-slate-500`,children:[`마지막 설치: `,$y(n.lastInstallAt)]}),H(`button`,{class:`inline-flex min-h-11 items-center justify-center rounded-xl bg-slate-900 px-4 py-2.5 text-sm font-extrabold text-white transition hover:bg-slate-800 disabled:cursor-not-allowed disabled:opacity-50`,disabled:!x||e===`settings`||D,onClick:()=>void ee(),type:`button`,children:e===`settings`?`저장 중`:`자동 업데이트 설정 저장`})]})]}),n.updateCount>0?H(`section`,{class:`border-t border-slate-200 p-5 sm:p-6 xl:col-start-1 xl:row-start-2`,"data-section":`software-update-release-notes`,children:[H(`div`,{class:`flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-4`,children:[H(`div`,{children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-teal-700`,children:`Release notes`}),H(`h3`,{class:`mt-2 mb-0 text-lg font-black text-slate-950`,children:`업데이트 내용`}),H(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-500`,children:`현재 설치된 버전 이후 포함되는 주요 변경 사항입니다.`})]}),n.releaseNotes.length?H(`span`,{class:`shrink-0 rounded-full bg-slate-100 px-3 py-1.5 text-xs font-extrabold text-slate-600`,children:n.releaseNotes.length===1?`1개 릴리즈`:`${n.releaseNotes.length}개 릴리즈`}):null]}),n.releaseNotes.length?H(`div`,{class:`mt-5 grid gap-3`,children:[n.releaseNotes.map(e=>H(`article`,{class:`rounded-xl border border-slate-200 bg-slate-50 p-4 sm:p-5`,children:[H(`div`,{class:`flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between sm:gap-4`,children:[H(`strong`,{class:`break-all text-sm font-black text-slate-950`,children:e.version}),e.date?H(`span`,{class:`text-xs font-bold text-slate-500`,children:e.date}):null]}),e.summary?H(`p`,{class:`mt-3 mb-0 text-sm leading-6 text-slate-700`,children:e.summary}):null,e.sections.length?H(`details`,{class:`mt-4 rounded-lg border border-slate-200 bg-white p-3`,open:n.releaseNotes.length===1,children:[H(`summary`,{class:`cursor-pointer text-xs font-extrabold text-slate-800`,children:`자세한 변경 사항`}),H(`div`,{class:`mt-3 grid gap-4`,children:e.sections.map(t=>H(`section`,{children:[H(`h4`,{class:`m-0 text-xs font-extrabold text-slate-700`,children:t.title}),H(`ul`,{class:`mt-2 mb-0 space-y-1.5 pl-5 text-xs leading-5 text-slate-600`,children:t.items.map((n,r)=>H(`li`,{children:n},`${e.version}-${t.title}-${r}`))})]},`${e.version}-${t.title}`))})]}):null]},e.version)),n.releaseNotesComplete?null:H(`p`,{class:`m-0 rounded-xl bg-amber-50 px-4 py-3 text-xs font-bold leading-5 text-amber-800`,children:`일부 릴리즈 노트를 불러오지 못했습니다. 업데이트 확인과 설치는 계속 사용할 수 있습니다.`})]}):H(`p`,{class:`mt-4 mb-0 rounded-xl bg-slate-50 px-4 py-3 text-sm text-slate-500`,children:`릴리즈 노트를 불러오지 못했습니다. 업데이트 확인과 설치는 계속 사용할 수 있습니다.`})]}):null]}):null]})}function cb({action:e,actionError:t,data:n,error:r,firmware:i,loading:a,message:o,onCheck:s,onDismissFeedback:c,onInstall:l,onRetry:u,onSaveSettings:d}){return H(`section`,{class:`min-w-0 space-y-5`,children:[H(`div`,{children:H(q,{eyebrow:`Firmware`,title:`시스템 펌웨어`,description:`공유기 운영체제의 새 버전을 확인하고 설치합니다.`})}),H(Xy,{action:i.action,actionError:i.actionError,data:i.data,software:n,error:i.error,loading:i.loading,message:i.message,reconnecting:i.reconnecting,uploadProgress:i.uploadProgress,onCheck:()=>void i.check(),onDiscard:i.discard,onDismissFeedback:i.dismissFeedback,onInstall:i.install,onPrepare:()=>void i.prepare(),onRetry:()=>void i.refresh(),onUpload:i.upload}),H(`div`,{class:`pt-2`,children:H(q,{eyebrow:`Software`,title:`관리 소프트웨어`,description:`SmartSafeHub 관리 화면 및 서비스의 업데이트를 확인합니다.`})}),H(sb,{firmware:i.data,action:e,actionError:t,data:n,error:r,loading:a,message:o,onCheck:s,onDismissFeedback:c,onInstall:l,onRetry:u,onSaveSettings:d})]})}var lb={};lb.QR8bitByte=(e,t)=>{var n=t("QRMode");function r(e){this.mode=n.MODE_8BIT_BYTE,this.data=e}r.prototype={getLength:function(){return this.data.length},write:function(e){for(var t=0;t{function n(){this.buffer=[],this.length=0}n.prototype={get:function(e){var t=Math.floor(e/8);return(this.buffer[t]>>>7-e%8&1)==1},put:function(e,t){for(var n=0;n>>t-n-1&1)==1)},getLengthInBits:function(){return this.length},putBit:function(e){var t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},e.exports=n},lb.QRErrorCorrectLevel=(e,t)=>{e.exports={L:1,M:0,Q:3,H:2}},lb.QRMaskPattern=(e,t)=>{e.exports={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7}},lb.QRMath=(e,t)=>{for(var n={glog:function(e){if(e<1)throw Error(`glog(`+e+`)`);return n.LOG_TABLE[e]},gexp:function(e){for(;e<0;)e+=255;for(;e>=256;)e-=255;return n.EXP_TABLE[e]},EXP_TABLE:Array(256),LOG_TABLE:Array(256)},r=0;r<8;r++)n.EXP_TABLE[r]=1<{e.exports={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8}},lb.QRPolynomial=(e,t)=>{var n=t("QRMath");function r(e,t){if(e.length===void 0)throw Error(e.length+`/`+t);for(var n=0;n{var n=t("QRErrorCorrectLevel");function r(e,t){this.totalCount=e,this.dataCount=t}r.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],r.getRSBlocks=function(e,t){var n=r.getRsBlockTable(e,t);if(n===void 0)throw Error(`bad rs block @ typeNumber:`+e+`/errorCorrectLevel:`+t);for(var i=n.length/3,a=[],o=0;o{var n=t("QRMode"),r=t("QRPolynomial"),i=t("QRMath"),a=t("QRMaskPattern"),o={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(e){for(var t=e<<10;o.getBCHDigit(t)-o.getBCHDigit(o.G15)>=0;)t^=o.G15<=0;)t^=o.G18<>>=1;return t},getPatternPosition:function(e){return o.PATTERN_POSITION_TABLE[e-1]},getMask:function(e,t,n){switch(e){case a.PATTERN000:return(t+n)%2==0;case a.PATTERN001:return t%2==0;case a.PATTERN010:return n%3==0;case a.PATTERN011:return(t+n)%3==0;case a.PATTERN100:return(Math.floor(t/2)+Math.floor(n/3))%2==0;case a.PATTERN101:return t*n%2+t*n%3==0;case a.PATTERN110:return(t*n%2+t*n%3)%2==0;case a.PATTERN111:return(t*n%3+(t+n)%2)%2==0;default:throw Error(`bad maskPattern:`+e)}},getErrorCorrectPolynomial:function(e){for(var t=new r([1],0),n=0;n5&&(n+=3+a-5)}for(r=0;r{var n=t("QR8bitByte"),r=t("QRUtil"),i=t("QRPolynomial"),a=t("QRRSBlock"),o=t("QRBitBuffer");function s(e,t){this.typeNumber=e,this.errorCorrectLevel=t,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}s.prototype={addData:function(e){var t=new n(e);this.dataList.push(t),this.dataCache=null},isDark:function(e,t){if(e<0||this.moduleCount<=e||t<0||this.moduleCount<=t)throw Error(e+`,`+t);return this.modules[e][t]},getModuleCount:function(){return this.moduleCount},make:function(){if(this.typeNumber<1){var e=1;for(e=1;e<40;e++){for(var t=a.getRSBlocks(e,this.errorCorrectLevel),n=new o,i=0,s=0;s=7&&this.setupTypeNumber(e),this.dataCache===null&&(this.dataCache=s.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,t)},setupPositionProbePattern:function(e,t){for(var n=-1;n<=7;n++)if(!(e+n<=-1||this.moduleCount<=e+n))for(var r=-1;r<=7;r++)t+r<=-1||this.moduleCount<=t+r||(0<=n&&n<=6&&(r===0||r===6)||0<=r&&r<=6&&(n===0||n===6)||2<=n&&n<=4&&2<=r&&r<=4?this.modules[e+n][t+r]=!0:this.modules[e+n][t+r]=!1)},getBestMaskPattern:function(){for(var e=0,t=0,n=0;n<8;n++){this.makeImpl(!0,n);var i=r.getLostPoint(this);(n===0||e>i)&&(e=i,t=n)}return t},createMovieClip:function(e,t,n){var r=e.createEmptyMovieClip(t,n),i=1;this.make();for(var a=0;a>i&1)==1,this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=n;for(var a=0;a<18;a++)n=!e&&(t>>a&1)==1,this.modules[a%3+this.moduleCount-8-3][Math.floor(a/3)]=n},setupTypeInfo:function(e,t){for(var n=this.errorCorrectLevel<<3|t,i=r.getBCHTypeInfo(n),a,o=0;o<15;o++)a=!e&&(i>>o&1)==1,o<6?this.modules[o][8]=a:o<8?this.modules[o+1][8]=a:this.modules[this.moduleCount-15+o][8]=a;for(var s=0;s<15;s++)a=!e&&(i>>s&1)==1,s<8?this.modules[8][this.moduleCount-s-1]=a:s<9?this.modules[8][15-s-1+1]=a:this.modules[8][15-s-1]=a;this.modules[this.moduleCount-8][8]=!e},mapData:function(e,t){for(var n=-1,i=this.moduleCount-1,a=7,o=0,s=this.moduleCount-1;s>0;s-=2)for(s===6&&s--;;){for(var c=0;c<2;c++)if(this.modules[i][s-c]===null){var l=!1;o>>a&1)==1),r.getMask(t,i,s-c)&&(l=!l),this.modules[i][s-c]=l,a--,a===-1&&(o++,a=7)}if(i+=n,i<0||this.moduleCount<=i){i-=n,n=-n;break}}}},s.PAD0=236,s.PAD1=17,s.createData=function(e,t,n){for(var i=a.getRSBlocks(e,t),c=new o,l=0;ld*8)throw Error(`code length overflow. (`+c.getLengthInBits()+`>`+d*8+`)`);for(c.getLengthInBits()+4<=d*8&&c.put(0,4);c.getLengthInBits()%8!=0;)c.putBit(!1);for(;!(c.getLengthInBits()>=d*8||(c.put(s.PAD0,8),c.getLengthInBits()>=d*8));)c.put(s.PAD1,8);return s.createBytes(c,i)},s.createBytes=function(e,t){for(var n=0,a=0,o=0,s=Array(t.length),c=Array(t.length),l=0;l=0?m.get(g):0}}for(var _=0,v=0;vString.fromCharCode(e)).join(``),r=new(db(`index`))(0,db(`QRErrorCorrectLevel`).M);r.addData(n),r.make();let i=r.getModuleCount();return Array.from({length:i},(e,t)=>Array.from({length:i},(e,n)=>!!r.isDark(t,n)))}function pb(e,t,n){let r=e=>e.replace(/([\\;,:"])/g,`\\$1`);return`WIFI:T:${t===`none`?`nopass`:t===`sae`?`WPA3`:`WPA`};S:${r(e)};P:${r(n)};;`}function mb(e){return`${(e.replace(/[\\/:*?"<>|\x00-\x1f\x7f]/g,`_`).replace(/[. ]+$/g,``).trim()||`Wi-Fi`).slice(0,64)}-QR.png`}function hb(e,t,n=8){let r=(e.length+8)*n;t.fillStyle=`#ffffff`,t.fillRect(0,0,r,r),t.fillStyle=`#000000`,e.forEach((e,r)=>e.forEach((e,i)=>{e&&t.fillRect((i+4)*n,(r+4)*n,n,n)}))}function gb({load:e,onClose:t}){let[n,r]=F(null),[i,a]=F(null),[o,s]=F(null);I(()=>{let t=!0;return e().then(e=>{if(t)try{r({ssid:e.ssid,matrix:fb(pb(e.ssid,e.security,e.password))})}catch{a(`QR 코드를 생성할 수 없습니다.`)}}).catch(()=>{t&&a(`Wi-Fi 정보를 불러오지 못했습니다.`)}),()=>{t=!1,r(null)}},[e]);let c=n?.matrix.length??0;return H(`div`,{class:`fixed inset-0 z-50 flex items-center justify-center bg-slate-950/70 p-4`,role:`presentation`,onClick:e=>{e.target===e.currentTarget&&t()},children:H(`section`,{role:`dialog`,"aria-modal":`true`,"aria-label":`Wi-Fi QR 코드`,class:`w-full max-w-sm rounded-2xl bg-white p-5 text-center text-slate-950 shadow-2xl sm:p-7`,children:[H(`h2`,{class:`m-0 text-xl font-extrabold`,children:`Wi-Fi QR 코드`}),H(`p`,{class:`mt-2 break-all text-sm font-semibold text-slate-600`,children:n?.ssid??`Wi-Fi 정보를 확인하는 중`}),i?H(`p`,{role:`alert`,class:`my-6 text-sm font-bold text-red-700`,children:i}):null,!n&&!i?H(`p`,{class:`my-6 text-sm`,children:`QR 코드를 만드는 중...`}):null,n?H(`div`,{class:`mx-auto my-5 w-full max-w-[288px] rounded-xl border border-slate-200 bg-white p-3`,children:H(`svg`,{class:`block h-auto w-full`,viewBox:`0 0 ${c+8} ${c+8}`,role:`img`,"aria-label":`${n.ssid} Wi-Fi 연결 QR 코드`,"shape-rendering":`crispEdges`,children:[H(`rect`,{width:c+8,height:c+8,fill:`white`}),n.matrix.map((e,t)=>e.map((e,n)=>e?H(`rect`,{x:n+4,y:t+4,width:`1`,height:`1`,fill:`black`},`${t}-${n}`):null))]})}):null,H(`p`,{class:`text-xs leading-5 text-slate-500`,children:[H(`span`,{class:`block`,children:`카메라로 스캔해 Wi-Fi에 연결하세요.`}),H(`span`,{class:`block`,children:`QR 코드에는 비밀번호가 포함됩니다.`})]}),o?H(`p`,{role:`alert`,class:`mt-3 text-sm font-bold text-red-700`,children:o}):null,n?H(`button`,{class:`mt-5 inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl bg-teal-700 px-4 font-extrabold text-white transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200`,onClick:()=>{if(n){s(null);try{let e=(n.matrix.length+8)*8,t=document.createElement(`canvas`);t.width=e,t.height=e;let r=t.getContext(`2d`);if(!r)throw Error(`Canvas is not supported`);hb(n.matrix,r,8);let i=document.createElement(`a`);i.href=t.toDataURL(`image/png`),i.download=mb(n.ssid),i.click()}catch{s(`QR 코드 이미지를 저장하지 못했습니다. 다시 시도해 주세요.`)}}},type:`button`,children:[H(_n,{class:`size-5`}),`QR 코드 다운로드`]}):null,H(`button`,{class:`mt-2 min-h-11 w-full rounded-xl border border-slate-300 bg-white px-4 font-extrabold text-slate-700 transition hover:bg-slate-50`,onClick:t,type:`button`,children:`닫기`})]})})}function _b({guest:e,busy:t,saving:n,onUpdate:r,onLoadQr:i}){let[a,o]=F(!1),[s,c]=F(!1),[l,u]=F(e.ssid),[d,f]=F(``),[p,m]=F(e.enabled),[h,g]=F(null);if(I(()=>{u(e.ssid),m(e.enabled),f(``),g(null)},[e]),!e.supported)return H(`section`,{class:`mt-5 rounded-2xl border border-slate-200 bg-white p-5 sm:p-6`,children:[H(`h2`,{class:`m-0 text-lg font-extrabold text-slate-900`,children:`게스트 Wi-Fi`}),H(`p`,{class:`mt-2 mb-0 text-sm text-slate-600`,children:`2.4GHz 기본 Wi-Fi 장치를 찾지 못해 게스트 Wi-Fi를 사용할 수 없습니다.`})]});let _=l.trim()!==e.ssid||p!==e.enabled||d.length>0,v=t||_||!e.enabled||!e.passwordConfigured,y=async t=>{t.preventDefault();let n=l.trim(),i=new TextEncoder().encode(n).length;i<1||i>32?g(`Wi-Fi 이름은 UTF-8 기준 1~32바이트로 입력해 주세요.`):d&&!(d.length>=8&&d.length<=63||/^[0-9a-fA-F]{64}$/.test(d))?g(`비밀번호는 8~63자 또는 64자리 16진수여야 합니다.`):p&&!e.passwordConfigured&&!d?g(`게스트 전용 비밀번호를 입력해 주세요.`):window.confirm(`게스트 Wi-Fi 설정을 적용하면 무선 연결이 잠시 끊어질 수 있습니다. 계속하시겠습니까?`)&&(g(null),await r({ssid:n,enabled:p,password:d})&&f(``))};return H(b,{children:[H(`form`,{"aria-label":`게스트 Wi-Fi 설정`,class:`mt-5 rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void y(e),children:[H(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between`,children:[H(`button`,{"aria-controls":`ssh-guest-settings`,"aria-expanded":a,"aria-label":`게스트 Wi-Fi 설정 ${a?`접기`:`펼치기`}`,class:`flex min-w-0 flex-1 items-start gap-3 rounded-xl text-left focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100`,onClick:()=>o(e=>!e),type:`button`,children:[H(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:H(Xt,{class:`size-6`})}),H(`span`,{class:`min-w-0 flex-1`,children:[H(`span`,{class:`block text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:`2.4 GHz · 분리 네트워크`}),H(`span`,{class:`mt-2 block text-xl font-extrabold tracking-tight text-slate-950`,children:`게스트 Wi-Fi`}),H(`span`,{class:`mt-2 block break-all text-sm text-slate-600`,children:e.ssid})]}),H(jn,{class:`mt-3 size-5 shrink-0 text-slate-500 transition-transform ${a?`rotate-180`:``}`})]}),H(`div`,{class:`flex flex-wrap items-center gap-2 sm:justify-end`,children:[_&&H(`span`,{"aria-live":`polite`,class:`inline-flex items-center gap-1 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,children:[H(W,{class:`size-3.5`}),`저장되지 않음`]}),H(`button`,{"aria-label":`게스트 Wi-Fi QR 코드 보기`,class:`inline-flex min-h-10 items-center gap-2 rounded-xl border border-slate-300 bg-white px-3.5 py-2 text-sm font-extrabold text-slate-800 transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:v,onClick:()=>c(!0),title:e.enabled?void 0:`게스트 Wi-Fi를 켜고 저장하면 QR 코드를 사용할 수 있습니다.`,type:`button`,children:[H(ln,{class:`size-4 shrink-0`}),`QR 코드 보기`]}),H(`span`,{class:`rounded-full px-3 py-1.5 text-xs font-extrabold ${e.enabled?`bg-emerald-50 text-emerald-700`:`bg-slate-100 text-slate-600`}`,children:e.enabled?`사용 중`:`꺼짐`})]})]}),H(`div`,{class:a?``:`hidden`,id:`ssh-guest-settings`,children:[H(`p`,{class:`mt-5 mb-0 text-sm leading-6 text-slate-600`,children:`방문자는 인터넷만 이용하며 내부 네트워크와 공유기 관리 화면에는 접근할 수 없습니다.`}),H(`div`,{class:`mt-5 grid gap-5 lg:grid-cols-2`,children:[H(`label`,{class:`block`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`게스트 Wi-Fi 이름 (SSID)`}),H(`input`,{autocomplete:`off`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 outline-none focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:opacity-60`,disabled:t,maxLength:32,onInput:e=>u(e.currentTarget.value),value:l})]}),H(`label`,{class:`block`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`게스트 Wi-Fi 비밀번호`}),H(`input`,{autocomplete:`new-password`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 outline-none focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:opacity-60`,disabled:t,onInput:e=>f(e.currentTarget.value),placeholder:e.passwordConfigured?`비워 두면 기존 비밀번호 유지`:`8자 이상의 별도 비밀번호 입력`,type:`password`,value:d}),H(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`WPA2/WPA3 혼합 · 기본 Wi-Fi와 다른 비밀번호를 권장합니다.`})]})]}),H(`div`,{class:`mt-5 rounded-xl bg-slate-50 px-4 py-3 text-sm leading-6 text-slate-700`,children:[`내부망 접근 차단 · 게스트 기기 간 통신 차단 · SafeShield DNS 사용`,e.subnet&&H(`span`,{class:`block text-xs text-slate-500`,children:[`게스트 게이트웨이: `,e.subnet]})]}),H(`div`,{class:`mt-5 flex flex-col gap-4 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[H(`label`,{class:`inline-flex min-h-11 items-center gap-3 text-sm font-extrabold text-slate-800`,children:[H(`input`,{checked:p,class:`size-5 accent-teal-700`,disabled:t,onChange:e=>m(e.currentTarget.checked),type:`checkbox`}),`게스트 Wi-Fi 사용`]}),H(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white transition hover:bg-teal-800 disabled:opacity-60 sm:w-auto`,disabled:t||!_,type:`submit`,children:[H(wn,{class:`size-5 ${n?`animate-pulse`:``}`}),n?`적용 중`:`설정 저장`]})]}),h&&H(`p`,{class:`mt-4 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:h})]})]}),s&&H(gb,{load:i,onClose:()=>c(!1)})]})}var vb=[{value:`sae-mixed`,label:`WPA2/WPA3 혼합 (권장)`},{value:`sae`,label:`WPA3-Personal`},{value:`psk2`,label:`WPA2-Personal`},{value:`none`,label:`암호화 없음`}];function yb(e){switch(e.security){case`sae-mixed`:return`WPA2/WPA3 혼합`;case`sae`:return`WPA3-Personal`;case`psk2`:return`WPA2-Personal`;case`none`:return`암호화 없음`;default:return`고급 설정 (${e.securityRaw})`}}function bb(e){return e.length>=8&&e.length<=63||/^[0-9a-fA-F]{64}$/.test(e)}function xb({network:e,busy:t,saving:n,onUpdate:r,onLoadQr:i}){let[a,o]=F(e.ssid),[s,c]=F(e.enabled),[l,u]=F(e.security===`custom`?`keep`:e.security),[d,f]=F(``),[p,m]=F(!1),h=R(()=>i(e.section),[i,e.section]),[g,_]=F(null);I(()=>{o(e.ssid),c(e.enabled),u(e.security===`custom`?`keep`:e.security),f(``),_(null)},[e]);let v=e.security===`custom`&&l===`keep`,y=l===`psk2`||l===`sae-mixed`||l===`sae`,b=e.security===`custom`?`keep`:e.security,x=a.trim()!==e.ssid||s!==e.enabled||l!==b||d.length>0,S=t||x||e.security===`custom`||!e.enabled||e.security!==`none`&&!e.passwordConfigured,C=[...e.security===`custom`?[{value:`keep`,label:`현재 고급 설정 유지 (${e.securityRaw})`}]:[],...vb],w=async t=>{t.preventDefault();let n=a.trim(),i=new TextEncoder().encode(n).length;i<1||i>32?_(`SSID는 UTF-8 기준 1~32바이트로 입력해 주세요.`):d&&!bb(d)?_(`비밀번호는 8~63자 또는 64자리 16진수여야 합니다.`):y&&!e.passwordConfigured&&d.length===0?_(`보안 Wi-Fi를 사용하려면 비밀번호를 입력해 주세요.`):window.confirm(`Wi-Fi 설정을 적용하면 현재 무선 연결이 잠시 끊어질 수 있습니다. 계속하시겠습니까?`)&&(_(null),await r({section:e.section,ssid:n,security:l,password:d,enabled:s})&&f(``))};return H(`form`,{class:`rounded-2xl border border-slate-200 bg-white p-4 shadow-sm shadow-slate-900/5 sm:p-6`,onSubmit:e=>void w(e),children:[H(`div`,{class:`flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between`,children:[H(`div`,{class:`flex min-w-0 items-start gap-3`,children:[H(`span`,{class:`grid size-11 shrink-0 place-items-center rounded-xl bg-teal-50 text-teal-700`,children:H(Xt,{class:`size-6`})}),H(`div`,{class:`min-w-0`,children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-slate-500`,children:e.bandLabel}),H(`h2`,{class:`mt-2 mb-0 break-words text-xl font-extrabold tracking-tight text-slate-950`,children:e.ssid||`이름 없는 Wi-Fi`}),H(`p`,{class:`mt-2 mb-0 text-sm text-slate-600`,children:[`채널 `,e.channel??`자동`,` · 연결 기기 `,e.clientCount,`대`]})]})]}),H(`div`,{class:`flex flex-wrap items-center gap-2 sm:justify-end`,children:[x?H(`span`,{"aria-live":`polite`,class:`inline-flex shrink-0 items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-1 text-xs font-extrabold text-amber-800`,role:`status`,children:[H(W,{"aria-hidden":`true`,class:`size-3.5 shrink-0`}),`저장되지 않음`]}):null,H(`button`,{"aria-label":`${e.bandLabel} Wi-Fi QR 코드 보기`,class:`inline-flex min-h-10 items-center gap-2 rounded-xl border border-slate-300 bg-white px-3.5 py-2 text-sm font-extrabold text-slate-800 shadow-sm transition hover:border-teal-300 hover:text-teal-700 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-100 disabled:cursor-not-allowed disabled:opacity-50`,disabled:S,onClick:()=>m(!0),type:`button`,children:[H(ln,{class:`size-4 shrink-0`}),`QR 코드 보기`]}),H(`span`,{class:`inline-flex w-fit items-center gap-2 rounded-full px-3 py-1.5 text-xs font-extrabold ring-1 ring-inset ${e.runtimeUp?`bg-emerald-50 text-emerald-700 ring-emerald-200`:`bg-slate-100 text-slate-600 ring-slate-200`}`,children:[H(`span`,{class:`size-2 rounded-full ${e.runtimeUp?`bg-emerald-500`:`bg-slate-400`}`}),e.runtimeUp?`동작 중`:e.enabled?`시작 대기`:`꺼짐`]})]})]}),H(`div`,{class:`mt-6 grid gap-5 lg:grid-cols-2`,children:[H(`label`,{class:`block`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`Wi-Fi 이름 (SSID)`}),H(`input`,{autocomplete:`off`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:t,maxLength:32,onInput:e=>o(e.currentTarget.value),value:a})]}),H(`div`,{class:`block`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`보안 방식`}),H(U_,{ariaLabel:`${e.bandLabel} Wi-Fi 보안 방식`,className:`mt-2`,disabled:t,id:`wifi-security-${e.section}`,onChange:e=>{let t=e;u(t),(t===`none`||t===`keep`)&&f(``)},options:C,value:l,variant:`emphasized`}),H(`span`,{class:`mt-2 block text-xs text-slate-500`,children:[`현재: `,yb(e)]})]}),H(`label`,{class:`block lg:col-span-2`,children:[H(`span`,{class:`text-sm font-extrabold text-slate-800`,children:`새 비밀번호`}),H(`input`,{autocomplete:`new-password`,class:`mt-2 min-h-11 w-full rounded-xl border-2 border-slate-300 bg-slate-50 px-4 py-2.5 text-sm font-semibold text-slate-950 shadow-inner outline-none transition placeholder:text-slate-400 focus:border-teal-500 focus:bg-white focus:ring-4 focus:ring-teal-100 disabled:cursor-not-allowed disabled:bg-slate-100`,disabled:t||l===`none`||v,onInput:e=>f(e.currentTarget.value),placeholder:v?`고급 보안 설정은 기존 LuCI에서 변경합니다`:e.passwordConfigured?`비워 두면 기존 비밀번호를 유지합니다`:`8자 이상의 비밀번호를 입력하세요`,type:`password`,value:d}),H(`span`,{class:`mt-2 block text-xs text-slate-500`,children:`저장된 비밀번호는 일반 설정 조회에 노출되지 않습니다. QR 코드에는 비밀번호가 포함됩니다.`})]})]}),H(`div`,{class:`mt-6 flex flex-col gap-4 border-t border-slate-200 pt-5 sm:flex-row sm:items-center sm:justify-between`,children:[H(`label`,{class:`inline-flex min-h-11 items-center gap-3 text-sm font-extrabold text-slate-800`,children:[H(`input`,{checked:s,class:`size-5 accent-teal-700`,disabled:t,onChange:e=>c(e.currentTarget.checked),type:`checkbox`}),`이 Wi-Fi 사용`]}),H(`button`,{class:`inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-xl border-0 bg-teal-700 px-5 py-2.5 text-sm font-extrabold text-white shadow-sm transition hover:bg-teal-800 focus:outline-none focus-visible:ring-4 focus-visible:ring-teal-200 disabled:cursor-wait disabled:opacity-60 sm:w-auto`,disabled:t||!x,type:`submit`,children:[H(wn,{class:`size-5 ${n?`animate-pulse`:``}`}),n?`적용 중`:`설정 저장`]})]}),p?H(gb,{load:h,onClose:()=>m(!1)}):null,g?H(`p`,{class:`mt-4 mb-0 rounded-xl bg-red-50 px-4 py-3 text-sm font-bold text-red-800`,children:g}):null]})}function Sb({feedback:e,onDismiss:t}){return H(`div`,{"aria-live":`polite`,class:`mb-5 flex flex-col gap-3 rounded-2xl border px-4 py-3 text-sm sm:flex-row sm:items-center sm:justify-between ${e.kind===`success`?`border-emerald-200 bg-emerald-50 text-emerald-900`:e.kind===`warning`?`border-amber-200 bg-amber-50 text-amber-900`:`border-red-200 bg-red-50 text-red-900`}`,children:[H(`p`,{class:`m-0 font-bold leading-6`,children:e.message}),H(`button`,{class:`min-h-11 w-full shrink-0 rounded-lg border border-current bg-transparent sm:min-h-9 sm:w-auto px-3 py-1.5 text-xs font-extrabold`,onClick:t,type:`button`,children:`닫기`})]})}function Cb({data:e,error:t,feedback:n,loading:r,updatingSection:i,onDismissFeedback:a,onRetry:o,onUpdate:s,onUpdateGuest:c,onLoadQr:l,onLoadGuestQr:u}){return r?H(vs,{}):t?H(ys,{message:t,onRetry:o}):e?H(b,{children:[n?H(Sb,{feedback:n,onDismiss:a}):null,H(`section`,{class:`mb-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-amber-950 sm:p-6`,children:[H(`p`,{class:`m-0 text-xs font-extrabold uppercase tracking-[0.16em] text-amber-700`,children:`연결 주의`}),H(`h2`,{class:`mt-2 mb-0 text-lg font-extrabold`,children:`Wi-Fi 이름이나 비밀번호를 바꾸면 현재 연결이 끊어집니다`}),H(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-amber-900/80`,children:`변경한 Wi-Fi 이름과 비밀번호로 다시 연결하면 SmartSafeHub를 계속 사용할 수 있습니다. VLAN 등 고급 무선 옵션은 기존 LuCI에서 관리합니다.`})]}),H(q,{eyebrow:`Wireless`,title:`기본 Wi-Fi`,description:`무선 네트워크의 이름, 비밀번호, 보안 방식과 QR 코드를 관리합니다.`}),e.networks.length?H(`section`,{"aria-label":`기본 Wi-Fi 설정`,class:`grid gap-5 xl:grid-cols-2`,children:e.networks.map(e=>H(xb,{busy:i!==null,network:e,onUpdate:s,onLoadQr:l,saving:i===e.section},e.section))}):H(`section`,{class:`rounded-2xl border border-slate-200 bg-white p-5 text-center shadow-sm shadow-slate-900/5 sm:p-8`,children:[H(Xt,{class:`mx-auto size-10 text-slate-400`}),H(`h2`,{class:`mt-4 mb-0 text-lg font-extrabold text-slate-950`,children:`관리할 기본 Wi-Fi를 찾지 못했습니다`}),H(`p`,{class:`mt-2 mb-0 text-sm leading-6 text-slate-600`,children:`기존 LuCI에서 AP 모드의 무선 네트워크를 먼저 구성해 주세요.`})]}),e.guest&&H(b,{children:[H(`div`,{role:`separator`,"aria-label":`기본 Wi-Fi와 게스트 Wi-Fi 구분`,class:`mt-5 w-full border-t border-slate-200`}),H(`div`,{class:`mt-5`,children:H(q,{eyebrow:`Guest network`,title:`방문자용 네트워크`,description:`기본 네트워크와 분리된 게스트 Wi-Fi를 관리합니다.`})}),H(_b,{guest:e.guest,busy:i!==null,saving:i===`ssh_guest`,onUpdate:c,onLoadQr:u})]}),e.guestError&&H(`section`,{class:`mt-5 rounded-2xl border border-amber-200 bg-amber-50 p-5 text-sm text-amber-900`,role:`status`,children:[`게스트 Wi-Fi 정보를 불러오지 못했습니다. 패키지를 설치한 직후라면 로그아웃 후 다시 로그인해 주세요.`,H(`button`,{class:`ml-3 underline font-bold`,onClick:o,type:`button`,children:`다시 시도`})]})]}):null}function wb({onAdministratorPasswordChanged:e}){let t=Bi(),n=Wi(),r=Si(),i=fi(t===`activity`),a=ui({active:t===`apps`,fallbackError:`검증된 앱 목록을 불러오지 못했습니다.`,loader:sr,pollInterval:e=>e?.refreshing?2e3:e?.ready?6e4:e?.refreshFailed?15e3:2e3,staleTimeMs:2e3}),o=ui({active:t===`apps`,fallbackError:`앱 설치 상태를 불러오지 못했습니다.`,loader:lr,pollInterval:e=>!e?.ready||e?.refreshing?2e3:e?.job.phase===`running`||e?.job.phase===`starting`||e?.restore?.phase===`running`||e?.restore?.phase===`starting`?3e3:12e3,staleTimeMs:3e3}),s=ui({active:t===`apps`,fallbackError:`저장 공간 정보를 확인하지 못했습니다.`,loader:dr,pollInterval:e=>e?.refreshing||!e?.ready?3e3:6e4,staleTimeMs:5e3}),c=io(t===`home`||t===`settings`),l=no(!0),u=Li(!0),d=ta(t===`network`),f=$i(t===`home`||t===`network`),p=Zi(t===`iptv`),m=wo(t===`wifi`),h=wi(t===`home`,!1),g=wi(t===`devices`),_=Za(t===`home`||t===`safeshield`),v=Ha(t===`home`||t===`safeshield`,t===`safeshield`),y=_,b=v,x=Ba(t===`rules`),S=yo(t===`account`),C=xo(t===`account`,S.data?.accountRegistered??null),w=mo(c.data),T=Xi(t===`home`||t===`settings`),E=ao(t===`settings`),D=ho(t===`settings`);I(()=>{let e=xy();e&&Dr(e).then(e=>{e.applied&&t===`settings`&&D.refresh()}).catch(()=>{})},[]);let O=o.data?.job.operationId,k=o.data?.job.phase,A=o.data?.restore?.phase,j=L(``);I(()=>{if(t!==`apps`||k!==`success`&&A!==`success`)return;let e=`${O??``}:${k}:${A??``}`;e!==j.current&&(j.current=e,Promise.allSettled([ur(),fr()]).then(()=>{o.refresh(),s.refresh()}))},[t,O,k,A]);let M=ja(_.refresh,v.refresh),N=t===`activity`?i:t===`network`?d:t===`wifi`?m:t===`iptv`?p:t===`devices`?g:t===`safeshield`?_:t===`rules`?x:t===`account`?S:t===`apps`?a:t===`system`?l:c,P;switch(t){case`apps`:P=H(_s,{data:a.data?.ready===!1?null:a.data,error:a.error??(a.data?.refreshFailed&&!a.data?.ready?`앱 목록 갱신에 실패했습니다. 서버 연결을 확인해 주세요.`:null),loading:a.loading||!!a.data&&!a.data.ready&&!a.data.refreshFailed,refreshing:a.refreshing||!!a.data?.refreshing,onRetry:()=>void cr().then(()=>a.refresh()).then(()=>Promise.all([o.refresh(),s.refresh()])).catch(()=>a.refresh()),installStatus:o.data?.ready===!1?null:o.data,metrics:s.data,statusError:o.error??(o.data?.ready===!1?`설치 상태를 확인하고 있습니다.`:null),onRefreshStatus:()=>void o.refresh(),onInstall:async e=>{await pr(e),await o.refresh()},onUpdate:async e=>{await mr(e),await o.refresh()},onRemove:async e=>{await hr(e),await o.refresh()}});break;case`network`:P=H(`div`,{class:`min-w-0`,children:[H(li,{active:n.network===`internet`?`internet`:`lan`,label:`네트워크 설정 메뉴`,tabs:[{id:`internet`,label:`인터넷 연결`,href:`#network`},{id:`lan`,label:`LAN 및 DHCP`,href:`#network/lan`}]}),H(`div`,{"aria-label":`인터넷 연결 설정`,"aria-labelledby":`internet-tab`,class:`min-w-0`,hidden:n.network!==`internet`,id:`internet-panel`,role:`tabpanel`,children:H(Sv,{action:d.action,data:d.data,error:d.error,feedback:d.feedback,loading:d.loading,onDismissFeedback:d.dismissFeedback,onReconnect:()=>void d.reconnect(),onRetry:()=>void d.refresh(),onSave:d.save})}),H(`div`,{"aria-label":`내부 네트워크 설정`,"aria-labelledby":`lan-tab`,class:`min-w-0`,hidden:n.network!==`lan`,id:`lan-panel`,role:`tabpanel`,children:H(cv,{action:f.action,data:f.data,error:f.error,feedback:f.feedback,loading:f.loading,onApplyRecommendation:f.applyRecommendation,onDismissFeedback:f.dismissFeedback,onRetry:()=>void f.refresh(),onSave:f.save})})]});break;case`activity`:P=H(ns,{actionError:i.actionError,actionMessage:i.actionMessage,data:i.data,error:i.error,loading:i.loading,onDismissActionFeedback:i.dismissActionFeedback,onRetry:()=>void i.refresh(),onSetCloudSync:e=>void i.setCloudSyncEnabled(e),savingCloudSync:i.savingCloudSync});break;case`wifi`:P=H(Cb,{data:m.data,error:m.error,feedback:m.feedback,loading:m.loading,onDismissFeedback:m.dismissFeedback,onRetry:()=>void m.refresh(),onUpdate:m.update,onUpdateGuest:m.updateGuest,onLoadQr:Wr,onLoadGuestQr:Gr,updatingSection:m.updatingSection});break;case`iptv`:P=H(q_,{data:p.data,error:p.error,feedback:p.feedback,loading:p.loading,onDismissFeedback:p.dismissFeedback,onRetry:()=>void p.refresh(),onSave:p.save,saving:p.saving});break;case`devices`:P=H(js,{data:g.data,error:g.error,loading:g.loading,onRetry:()=>void g.refresh()});break;case`account`:P=H(Uy,{data:S.data,error:S.error,loading:S.loading,pairingBusy:S.pairingBusy,refreshing:S.refreshing,syncError:S.syncError,onRequestPairing:S.requestPairing,onRetry:()=>void S.refresh()});break;case`system`:P=H(cb,{action:l.action,actionError:l.actionError,data:l.data,error:l.error,firmware:u,loading:l.loading,message:l.message,onCheck:()=>void l.check(),onDismissFeedback:l.dismissFeedback,onInstall:()=>void l.install(),onRetry:()=>void l.refresh(),onSaveSettings:l.saveSettings});break;case`settings`:P=H(Iy,{activeTab:n.settings,action:w.action,backupAction:r.action,backupError:r.error,backupMessage:r.message,backupRestoreAccepted:r.restoreAccepted,backupUploadProgress:r.uploadProgress,backupValidated:r.validated,data:c.data,error:c.error,feedbackError:w.error,feedbackMessage:w.message,health:T.data,healthActionError:T.actionError,healthActionMessage:T.actionMessage,healthError:T.error,healthLoading:T.loading,healthRunning:T.running,healthSavingReporter:T.savingReporter,loading:c.loading,onBackupDiscard:r.discard,onBackupDownload:()=>void r.download(),onBackupRestore:r.restore,onBackupUpload:r.upload,onDismissBackupFeedback:r.dismissFeedback,onDismissFeedback:w.dismissFeedback,onDismissHealthFeedback:T.dismissActionFeedback,onDismissTimeFeedback:D.dismissSaveFeedback,onDownloadDiagnostics:()=>void w.downloadDiagnostics(),onRunHealth:()=>void T.runDiagnostic(),onSetHealthReporter:e=>void T.setReporterEnabled(e),onReboot:()=>void w.reboot(),onRetry:()=>void Promise.all([c.refresh(),u.refresh(),D.refresh(),E.refresh(),T.refresh()]),onDismissScheduledRebootFeedback:E.dismissSaveFeedback,onSaveScheduledReboot:E.saveSettings,onSaveTimezone:D.saveTimezone,onSyncTime:D.syncTime,onAdministratorPasswordChanged:e,rebootAccepted:w.rebootAccepted,scheduledRebootData:E.data,scheduledRebootError:E.error,scheduledRebootLoading:E.loading,scheduledRebootSaveError:E.saveError,scheduledRebootSaveMessage:E.saveMessage,scheduledRebootSaving:E.saving,timeData:D.data,timeError:D.error,timeLoading:D.loading,timeSaveError:D.saveError,timeSaveMessage:D.saveMessage,timeSaving:D.saving,timeSyncing:D.syncing});break;case`safeshield`:P=H(iy,{action:M.action,actionError:M.error,actionMessage:M.message,data:_.data,error:_.error,loading:_.loading,statistics:v.data,statisticsError:v.error,statisticsLoading:v.loading,statisticsRefreshing:v.refreshing,onDismissFeedback:M.dismissFeedback,onRefreshBlocklist:()=>void M.refreshBlocklist(),onRetry:()=>void _.refresh(),onRetryStatistics:()=>void v.refresh(),onSetEnabled:e=>void M.setEnabled(e),onSetStatisticsEnabled:e=>void M.setStatisticsEnabled(e)});break;case`rules`:P=H(hy,{action:x.action,data:x.data,error:x.error,feedback:x.feedback,loading:x.loading,onAddRule:x.addRule,onDeleteRule:x.deleteRule,onLoadRecommendedRulesStatus:Qn,onSyncRecommendedRules:$n,onRevokeRecommendedRule:er,onDismissFeedback:x.dismissFeedback,onRetry:()=>void x.refresh()});break;default:P=H(S_,{accountRegistered:C,activity:c.data?.activityHistory??null,activityError:c.error,activityLoading:c.loading,data:c.data,devices:h.data,devicesError:h.error,devicesLoading:h.loading,error:c.error,firmware:u.data,firmwareError:u.error,firmwareLoading:u.loading,health:T.data,healthError:T.error,healthLoading:T.loading,lan:f.data,lanError:f.error,lanLoading:f.loading,loading:c.loading,onRetry:()=>void Promise.all([c.refresh(),h.refresh(),_.refresh(),v.refresh(),l.refresh(),u.refresh(),T.refresh(),f.refresh()]),safeshield:y.data,safeshieldError:y.error,safeshieldLoading:y.loading,statistics:b.data,statisticsError:b.error,statisticsLoading:b.loading,statisticsRefreshing:b.refreshing,updates:l.data,updatesError:l.error,updatesLoading:l.loading})}let ee=()=>{t===`home`?Promise.all([c.refresh(),h.refresh(),y.refresh(),b.refresh(),l.refresh(),u.refresh(),T.refresh(),f.refresh()]):t===`network`?Promise.all([d.refresh(),f.refresh()]):t===`system`?Promise.all([l.refresh(),u.refresh()]):t===`settings`?Promise.all([c.refresh(),u.refresh(),D.refresh(),E.refresh(),T.refresh()]):t===`safeshield`?Promise.all([_.refresh(),v.refresh()]):N.refresh()},te=+((l.data?.updateCount??0)>0)+ +!!u.data?.updateAvailable;return H(ci,{accountRegistered:C,loading:t===`network`?d.loading||f.loading:N.loading,onRefresh:ee,refreshing:N.refreshing||t===`network`&&f.refreshing||t===`home`&&(i.refreshing||h.refreshing||y.refreshing||b.refreshing||l.refreshing||u.refreshing||T.refreshing||f.refreshing)||t===`system`&&u.refreshing||t===`settings`&&(u.refreshing||D.refreshing||E.refreshing||T.refreshing)||t===`safeshield`&&v.refreshing,route:t,updateCount:te,children:P})}function Tb({onAdministratorPasswordChanged:e,onPasswordConfigured:t}){let[n,r]=F(`checking`),[i,a]=F(!1),o=R(async()=>{r(`checking`);try{let e=await Gt();a(e.recovery),r(e.configured?`ready`:`required`)}catch{r(`error`)}},[]);return I(()=>{o()},[o]),n===`ready`?H(wb,{onAdministratorPasswordChanged:e}):n===`required`?H(Gn,{onCompleted:()=>t(i),recovery:i}):H(`main`,{class:`ssh-initial-setup-probe`,children:H(`div`,{class:`ssh-initial-setup-probe-card`,role:n===`error`?`alert`:`status`,children:[n===`checking`?H(hn,{class:`ssh-login-probe-spinner`,"aria-hidden":`true`}):H(Yt,{"aria-hidden":`true`}),H(`strong`,{children:n===`checking`?`관리자 보안 상태 확인 중`:`관리자 보안 상태를 확인할 수 없습니다`}),H(`span`,{children:n===`checking`?`root 비밀번호 설정 여부를 확인하고 있습니다.`:`공유기 연결을 확인한 뒤 다시 시도해 주세요.`}),n===`error`?H(`button`,{onClick:()=>void o(),type:`button`,children:`다시 시도`}):null]})})}function Eb({icon:e,title:t,description:n}){return H(`div`,{class:`ssh-login-feature`,children:[H(`span`,{class:`ssh-login-feature-icon`,"aria-hidden":`true`,children:e}),H(`span`,{class:`ssh-login-feature-copy`,children:[H(`strong`,{children:t}),H(`span`,{children:n})]})]})}function Db({theme:e}){return H(e===`dark`?In:Fn,{})}function Ob({notice:e,onAuthenticated:t,probing:n=!1}){let r=Qe(Ce,[]),i=L(null),a=L(null),[o,s]=F(`root`),[c,l]=F(``),[u,d]=F(`ready`),[f,p]=F(null),[m,h]=F(e??null),[g,_]=F(!1),[v,y]=F(!1),[b,x]=F(!1),[S,C]=F(Rn),w=u===`submitting`,T=S===`dark`?`라이트 모드로 전환`:`다크 모드로 전환`;I(()=>{zn(S),Bn(S)},[S]),I(()=>{if(n)return;let e=window.requestAnimationFrame(()=>a.current?.focus());return()=>window.cancelAnimationFrame(e)},[n]),I(()=>{if(h(e??null),!e)return;let t=window.setTimeout(()=>h(null),7e3);return()=>window.clearTimeout(t)},[e]);let E=e=>{x(e.getModifierState?.(`CapsLock`)??!1)};return H(`main`,{class:`ssh-login-page`,"data-theme":S,children:[m?H(`div`,{"aria-atomic":`true`,"aria-live":`assertive`,class:`ssh-login-toast`,role:`alert`,children:[H(Yt,{"aria-hidden":`true`}),H(`span`,{children:m})]}):null,H(`section`,{class:`ssh-login-brand`,"aria-labelledby":`ssh-login-brand-title`,children:[H(`div`,{class:`ssh-login-brand-orb ssh-login-brand-orb-one`,"aria-hidden":`true`}),H(`div`,{class:`ssh-login-brand-orb ssh-login-brand-orb-two`,"aria-hidden":`true`}),H(`div`,{class:`ssh-login-brand-content`,children:[H(`span`,{class:`ssh-login-brand-mark`,"aria-hidden":`true`,children:H(Yt,{})}),H(`p`,{class:`ssh-login-eyebrow`,children:`SMART NETWORK PROTECTION`}),H(`h1`,{id:`ssh-login-brand-title`,children:`SmartSafeHub`}),H(`p`,{class:`ssh-login-brand-description`,children:`네트워크와 보안을 하나의 허브에서 편리하게 관리하세요.`}),H(`div`,{class:`ssh-login-features`,"aria-label":`SmartSafeHub 주요 기능`,children:[H(Eb,{description:`DNS 기반 광고·피싱·추적 차단과 사용자 보호 정책을 관리합니다.`,icon:H(Yt,{}),title:`SafeShield 보호`}),H(Eb,{description:`Wi-Fi 설정과 현재 연결된 기기의 상태를 한눈에 확인합니다.`,icon:H(cn,{}),title:`네트워크 관리`}),H(Eb,{description:`관리 기능과 인증은 현재 SmartSafeHub 장치에서 직접 처리됩니다.`,icon:H(yn,{}),title:`로컬 우선 관리`})]})]})]}),H(`section`,{class:`ssh-login-panel`,"aria-labelledby":`ssh-login-title`,children:[H(`button`,{"aria-label":T,class:`ssh-login-theme-toggle`,onClick:()=>C(e=>e===`dark`?`light`:`dark`),title:T,type:`button`,children:H(Db,{theme:S})}),H(`div`,{class:`ssh-login-panel-inner`,children:[n?H(`div`,{class:`ssh-login-probe`,role:`status`,"aria-live":`polite`,children:[H(hn,{class:`ssh-login-probe-spinner`,"aria-hidden":`true`}),H(`strong`,{children:`SmartSafeHub 연결 확인 중`}),H(`span`,{children:`로그인 세션을 확인하고 있습니다.`})]}):H(`div`,{class:`ssh-login-card`,children:[H(`div`,{class:`ssh-login-card-heading`,children:[H(`span`,{class:`ssh-login-mobile-mark`,"aria-hidden":`true`,children:H(Yt,{})}),H(`div`,{children:[H(`p`,{class:`ssh-login-kicker`,children:`SMARTSAFEHUB ACCESS`}),H(`h2`,{id:`ssh-login-title`,children:`로그인`}),H(`p`,{class:`ssh-login-subtitle`,children:`공유기 관리자 계정의 사용자 이름과 비밀번호를 입력해 주세요.`})]})]}),f?H(`div`,{class:`ssh-login-alert`,id:`ssh-login-error`,role:`alert`,"aria-live":`polite`,children:f}):null,H(`form`,{class:`ssh-login-form`,onSubmit:async e=>{e.preventDefault();let n=o.trim(),r=c;if(p(null),_(!1),!n||!r&&n!==`root`)p(n?`비밀번호를 입력해 주세요.`:`사용자 이름을 입력해 주세요.`),window.requestAnimationFrame(()=>{n?a.current?.focus():i.current?.focus()});else{d(`submitting`);try{let e=await ke(n,r);if(e){l(``),t(e);return}l(``),_(!0),p(`로그인하지 못했습니다. 계정 정보를 확인해 주세요. 추가 인증이 설정된 장치는 기본 LuCI 로그인에서 계속할 수 있습니다.`),window.requestAnimationFrame(()=>a.current?.focus())}catch{p(`공유기와 통신할 수 없습니다. 네트워크 연결을 확인한 뒤 다시 시도해 주세요.`)}finally{d(`ready`)}}},noValidate:!0,children:[H(`label`,{class:`ssh-login-field`,for:`smartsafehub-username`,children:[H(`span`,{class:`ssh-login-label`,children:`사용자 이름`}),H(`span`,{class:`ssh-login-input-wrap`,children:[H(`span`,{class:`ssh-login-field-icon`,"aria-hidden":`true`,children:H($t,{})}),H(`input`,{autoCapitalize:`none`,autoComplete:`username`,disabled:w,id:`smartsafehub-username`,name:`username`,onInput:e=>s(e.currentTarget.value),placeholder:`관리자 계정`,ref:i,required:!0,spellcheck:!1,type:`text`,value:o})]})]}),H(`label`,{class:`ssh-login-field`,for:`smartsafehub-password`,children:[H(`span`,{class:`ssh-login-label`,children:`비밀번호`}),H(`span`,{class:`ssh-login-input-wrap`,children:[H(`span`,{class:`ssh-login-field-icon`,"aria-hidden":`true`,children:H(yn,{})}),H(`input`,{autoComplete:`current-password`,disabled:w,id:`smartsafehub-password`,name:`password`,onBlur:()=>x(!1),onInput:e=>l(e.currentTarget.value),onKeyDown:E,onKeyUp:E,placeholder:`관리자 비밀번호`,ref:a,...v?{type:`text`}:{type:`password`},value:c}),H(`button`,{"aria-label":v?`비밀번호 숨기기`:`비밀번호 표시`,"aria-pressed":v,class:`ssh-login-password-toggle`,disabled:w,onClick:()=>{y(e=>!e),window.requestAnimationFrame(()=>a.current?.focus())},title:v?`비밀번호 숨기기`:`비밀번호 표시`,type:`button`,children:H(v?Sn:xn,{})})]})]}),o.trim()===`root`&&c.length===0?H(`p`,{class:`ssh-login-password-hint`,children:`초기 설정 전 root 계정은 비밀번호가 비어 있을 수 있습니다.`}):null,b?H(`p`,{class:`ssh-login-caps`,role:`status`,children:`Caps Lock이 켜져 있습니다.`}):null,H(`button`,{class:`ssh-login-submit`,disabled:w,type:`submit`,children:[w?H(hn,{class:`ssh-login-submit-spinner`,"aria-hidden":`true`}):null,H(`span`,{children:w?`로그인 중…`:`로그인`})]})]}),H(`div`,{class:`ssh-login-security-note`,children:[H(yn,{"aria-hidden":`true`}),H(`span`,{children:`관리자 비밀번호를 잊었다면 전원이 켜진 상태에서 Reset 버튼을 5~9초 누른 뒤 놓아 비밀번호만 복구할 수 있습니다. 10초 이상 누르면 모든 사용자 설정을 초기화하는 기기 초기화가 실행됩니다.`})]}),g?H(`a`,{class:`ssh-login-fallback`,href:r,children:`기본 LuCI 로그인으로 계속`}):null]}),H(`footer`,{class:`ssh-login-footer`,children:[H(`span`,{children:`SmartSafeHub`}),H(`span`,{"aria-hidden":`true`,children:`·`}),H(`span`,{children:window.location.host})]})]})]})]})}var kb=`smartsafehub-entry-root`,Ab=`data-smartsafehub-mount`,jb=`data-smartsafehub-shadow-style`;function Mb(){let e=ye(`/`);new Set([e,e.replace(/\/$/,``),ye(`/smartsafehub`),ye(`/admin/smartsafehub`)]).has(window.location.pathname)&&window.history.replaceState(null,``,`${xe()}${window.location.search}${window.location.hash}`)}function Nb(e,t){Ne(),window.__SMARTHUB_BOOTSTRAP__=Object.freeze({sessionId:e,rpcUrl:ye(`/admin/ubus`),assetBase:t.dataset.assetBase??`/luci-static/smartsafehub/`,assetVersion:t.dataset.assetVersion??`0.2.31-r1`,locale:document.documentElement.lang||`ko`})}function Pb(e,t){let n=window.__SMARTHUB_BOOTSTRAP__,r=n?.assetBase??t.dataset.assetBase??`/luci-static/smartsafehub/`,i=n?.assetVersion??t.dataset.assetVersion,a=`${r}${r.endsWith(`/`)?``:`/`}${e}`;return i?`${a}?v=${encodeURIComponent(i)}`:a}function Fb(e,t){let n=e.shadowRoot??e.attachShadow({mode:`open`}),r=n.querySelector(`link[${jb}]`),i=Pb(`app.css`,e);r?r.getAttribute(`href`)!==i&&(r.href=i):(r=document.createElement(`link`),r.rel=`stylesheet`,r.href=i,r.setAttribute(jb,``),n.appendChild(r));let a=n.querySelector(`[${Ab}]`);return a?a.className!==t&&(a.className=t):(a=document.createElement(`div`),a.className=t,a.setAttribute(Ab,``),n.appendChild(a)),a}function Ib(e,t,n){Nb(n,e),t.className=`smartsafehub-shadow-root`,se(H(Tb,{onAdministratorPasswordChanged:()=>{Lb(e,t,`관리자 비밀번호가 변경되었습니다. 새 비밀번호로 다시 로그인해 주세요.`)},onPasswordConfigured:n=>{Lb(e,t,n?`관리자 비밀번호 복구가 완료되었습니다. 새 비밀번호로 다시 로그인해 주세요.`:`관리자 비밀번호가 설정되었습니다. 새 비밀번호로 다시 로그인해 주세요.`)}}),t)}function Lb(e,t,n){delete window.__SMARTHUB_BOOTSTRAP__,t.className=`smartsafehub-login-shadow-root`,se(H(Ob,{notice:n,onAuthenticated:n=>{Ib(e,t,n)}}),t)}async function Rb(){Bn(Rn());let e=document.getElementById(kb);if(!e)return;Mb(),e.style.display=`block`,e.style.width=`100%`,e.style.minWidth=`0`,e.style.minHeight=`100dvh`,e.style.maxWidth=`100%`,e.style.isolation=`isolate`;let t=Fb(e,`smartsafehub-login-shadow-root`);window.addEventListener(Ae,()=>{Lb(e,t,je)}),se(H(Ob,{onAuthenticated:n=>{Ib(e,t,n)},probing:!0}),t);try{let n=await pe();if(n){Ib(e,t,n);return}}catch{}try{let n=await De();if(n){Ib(e,t,n);return}}catch{}Lb(e,t)}Rb(); \ No newline at end of file diff --git a/luci-app-smartsafehub/spec/contracts_spec.sh b/luci-app-smartsafehub/spec/contracts_spec.sh index 60d7ef45f..97e403353 100755 --- a/luci-app-smartsafehub/spec/contracts_spec.sh +++ b/luci-app-smartsafehub/spec/contracts_spec.sh @@ -22,6 +22,13 @@ Describe 'SmartSafeHub 셸 계약 테스트' The error should be blank End + It 'OpenWrt 25.12 BusyBox 기본 명령과 의존성 호환성을 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-openwrt-commands.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + It '셸 파이프라인의 Broken pipe 회귀를 방지한다' When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-shell-pipeline-safety.sh" The status should be success @@ -70,6 +77,13 @@ Describe 'SmartSafeHub 셸 계약 테스트' The error should be blank End + It '사용자 규칙 렌더링 최적화와 RPC 진단 개인정보 보호 계약을 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-rules-performance.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + It '추천 사용자 규칙의 적용과 해제 및 수동 규칙 보존을 검증한다' When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-recommended-rules.sh" The status should be success @@ -112,6 +126,20 @@ Describe 'SmartSafeHub 셸 계약 테스트' The error should be blank End + It 'Apps 설치 성공 이벤트 전송과 재시도·복원 제외 계약을 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-apps-metrics.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + + It '펌웨어 업데이트 후 검증된 Apps 자동 복원 계약을 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-apps-restore.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + It '내비게이션 계약을 검증한다' When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-navigation-contract.sh" The status should be success @@ -133,6 +161,13 @@ Describe 'SmartSafeHub 셸 계약 테스트' The error should be blank End + It 'CHANGELOG 릴리즈 사이 빈 줄 두 개를 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-changelog-spacing.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + It 'README와 상세 문서 분리 계약을 검증한다' When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-documentation-contract.sh" The status should be success @@ -273,6 +308,41 @@ Describe 'SmartSafeHub 셸 계약 테스트' The error should be blank End + It 'RPC 외부 작업 분리와 캐시/작업 중복 방지를 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-rpc-jobs.sh" + The status should be success + The output should start with 'PASS: detached RPC worker' + The error should be blank + End + + It 'SmartSafeHub Apps 설치와 제거 안전성 계약을 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-apps-manager.sh" + The status should be success + The output should start with 'PASS: Apps install/remove' + The error should be blank + End + + It 'Apps 설치/제거 색상과 제거 확인 팝업 및 진행 상태를 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-apps-ui.sh" + The status should be success + The output should start with 'PASS: Apps removal confirmation' + The error should be blank + End + + It 'SmartSafeHub Apps 공식 UI 새 탭 실행과 알림 닫기 계약을 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-apps-launch.sh" + The status should be success + The output should start with 'PASS: Apps secure new-tab launch' + The error should be blank + End + + It 'SmartSafeHub Apps 메뉴와 승인된 앱 카탈로그를 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-apps-contract.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + It '모든 rpcd ucode 진입점과 모듈의 실제 컴파일을 검증한다' When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-ucode-syntax.sh" The status should be success @@ -335,4 +405,111 @@ Describe 'SmartSafeHub 셸 계약 테스트' The output should start with 'PASS:' The error should be blank End + + # 지속적으로 보호해야 하는 기능 계약(과거 CI에서 누락된 테스트 포함) + It '최근 활동 동기화 데몬의 유휴 폴링 제한을 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-activity-idle-polling.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + + It '최근 활동의 Cloud 설정과 기록 표시 및 접근성을 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-activity-layout.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + + It '관리자 비밀번호 변경 권한과 입력 검증을 확인한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-admin-password-change.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + + It '물리 버튼 비밀번호 복구의 안전성 및 초기화를 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-admin-password-recovery.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + + It '데몬 실행 및 상태 관리의 런타임 계약을 확인한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-daemon-runtime.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + + It '대시보드의 데이터 중복 호출과 병렬 RPC를 방지한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-dashboard-performance-contract.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + + It '기기 등록 코드와 자격증명 처리의 안전성을 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-device-registration.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + + It '펌웨어 내장 소프트웨어 버전 비교를 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-firmware-bundling.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + + It '펌웨어 식별 정보와 업데이트 연결을 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-firmware-identity.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + + It 'WAN/LAN 통합 메뉴 및 과거 링크 호환성을 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-network-settings.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + + It '설정 탭 이동 및 입력값 유지와 키보드 접근을 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-page-tabs.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + + It '임시 상태 파일과 런타임 경로를 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-runtime-path-contract.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + + It '테스트 파일이 CI 실행 목록에서 누락되지 않는지 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-suite-integrity.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + + It '기본 UCI 설정값과 초기화를 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-system-defaults.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + + It 'Wi-Fi QR 인증과 비밀번호 보호를 검증한다' + When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-wifi-qr-contract.sh" + The status should be success + The output should start with 'PASS:' + The error should be blank + End + End diff --git a/luci-app-smartsafehub/tests/apps-storage-test.uc b/luci-app-smartsafehub/tests/apps-storage-test.uc new file mode 100644 index 000000000..d005bf7c3 --- /dev/null +++ b/luci-app-smartsafehub/tests/apps-storage-test.uc @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +'use strict'; +import { from_system_root, from_statvfs } from '../root/usr/share/rpcd/ucode/smartsafehub/apps-storage.uc'; +function check(ok, message) { + if (!ok) { + warn(`FAIL: ${message}\n`); + exit(1); + } +}; +let s = from_system_root({ total: 65536, avail: 40960 }); +check(s?.mount == '/' && s?.totalBytes == 67108864 && s?.availableBytes == 41943040, + 'procd root stats must convert KiB to bytes'); +check(from_system_root({ total: 500, avail: 501 }) == null, 'invalid root counters'); +check(from_system_root({ total: '65536', avail: '40960' }) == null, 'reject string counters'); +check(from_system_root({ total: 9007199254740991, avail: 1 }) == null, 'reject integer overflow'); +check(from_system_root(null) == null, 'missing procd statistics must be optional'); +check(from_system_root({ total: 42, avail: 0 })?.availableBytes == 0, 'allow a full filesystem'); +let t = from_statvfs({ frsize: 4096, blocks: 20000, bavail: 13000 }, '/overlay'); +check(t?.totalBytes == 81920000 && t?.availableBytes == 53248000, 'statvfs basic units'); +check(from_statvfs({ frsize: 0, bsize: 4096, blocks: 20000, bavail: 0 }, '/')?.availableBytes == 0, + 'fall back to bsize if frsize is zero'); +check(from_statvfs({ frsize: 4096, blocks: 20000, bavail: 20001 }, '/') == null, + 'reject invalid available blocks'); +check(from_statvfs({ frsize: 4096, blocks: 20000, bavail: 1 }, '/tmp') == null, + 'must never use tmpfs instead of APK storage'); +check(from_statvfs(null, '/overlay') == null, 'missing statvfs stats must be optional'); +print('PASS: Apps storage procd and ucode statvfs conversions\n'); diff --git a/luci-app-smartsafehub/tests/runtime/apps-operation-notice.test.mjs b/luci-app-smartsafehub/tests/runtime/apps-operation-notice.test.mjs new file mode 100644 index 000000000..564575977 --- /dev/null +++ b/luci-app-smartsafehub/tests/runtime/apps-operation-notice.test.mjs @@ -0,0 +1,50 @@ +import assert from 'node:assert/strict'; +import { test } from 'node:test'; + +import { + appsJobNoticeKey, + readDismissedAppsJob, + saveDismissedAppsJob, +} from '../../frontend/src/utils/appsJobNotice.ts'; + +test('Apps 알림: 같은 작업은 새로고침해도 닫힘 상태를 유지한다', () => { + const entries = new Map(); + const oldWindow = globalThis.window; + globalThis.window = { + localStorage: { + getItem: (key) => entries.get(key) ?? null, + setItem: (key, value) => entries.set(key, value), + }, + }; + try { + const failed = { phase: 'failed', action: 'install', appId: 'network-usage-monitor', code: 'E22', operationId: '1800000000-1234' }; + const key = appsJobNoticeKey(failed); + assert.equal(readDismissedAppsJob(), null); + saveDismissedAppsJob(key); + assert.equal(readDismissedAppsJob(), key); + assert.equal(appsJobNoticeKey({ ...failed }), key); + assert.notEqual(appsJobNoticeKey({ ...failed, operationId: '1800000000-1235' }), key, + 'a new operation with the same error must show a fresh notice'); + assert.equal(appsJobNoticeKey({ ...failed, phase: 'idle' }), ''); + } finally { + if (oldWindow === undefined) delete globalThis.window; + else globalThis.window = oldWindow; + } +}); + +test('Apps 알림: 저장소 사용을 막아도 UI가 동작하고 구형 작업 상태도 지원한다', () => { + const oldWindow = globalThis.window; + globalThis.window = { + get localStorage() { throw new Error('SecurityError'); }, + }; + try { + assert.equal(readDismissedAppsJob(), null); + assert.doesNotThrow(() => saveDismissedAppsJob('operation:1800000000-1234')); + assert.equal(appsJobNoticeKey({ phase: 'failed', action: 'install', appId: 'retro-arcade', code: 'E29' }), + 'legacy:failed:install:retro-arcade:E29'); + assert.equal(appsJobNoticeKey(null), ''); + } finally { + if (oldWindow === undefined) delete globalThis.window; + else globalThis.window = oldWindow; + } +}); diff --git a/luci-app-smartsafehub/tests/runtime/apps-storage.test.mjs b/luci-app-smartsafehub/tests/runtime/apps-storage.test.mjs new file mode 100644 index 000000000..c60b2368e --- /dev/null +++ b/luci-app-smartsafehub/tests/runtime/apps-storage.test.mjs @@ -0,0 +1,61 @@ +import assert from 'node:assert/strict'; +import { test } from 'node:test'; + +import { formatStorageBytes, summarizeAppsStorage } from '../../frontend/src/utils/appsStorage.ts'; + +const MB = 1024 ** 2; + +test('앱 공간: /overlay 기준 실제 설치 가능 공간과 백분율을 표시한다', () => { + const summary = summarizeAppsStorage({ mount: '/overlay', totalBytes: 80 * MB, availableBytes: 68 * MB }); + assert.equal(summary.availablePercent, 85); + assert.equal(summary.availableText, '68.0 MB'); + assert.equal(summary.usedText, '12.0 MB'); + assert.equal(summary.totalText, '80.0 MB'); + assert.ok(Math.abs(summary.availableRatio - 0.85) < 1e-10); + assert.equal(summary.level, 'normal'); +}); + +test('앱 공간: 극단값, 경계값과 ext4 루트 파일시스템을 처리한다', () => { + const empty = summarizeAppsStorage({ mount: '/', totalBytes: 100 * MB, availableBytes: 0 }); + assert.equal(empty.availablePercent, 0); + assert.equal(empty.usedText, '100.0 MB'); + const full = summarizeAppsStorage({ mount: '/', totalBytes: 100 * MB, availableBytes: 100 * MB }); + assert.equal(full.availableRatio, 1); + assert.equal(full.usedText, '0 B'); + assert.equal(summarizeAppsStorage({ mount: '/overlay', totalBytes: 100 * MB, availableBytes: 20 * MB }).level, 'warning'); + assert.equal(summarizeAppsStorage({ mount: '/overlay', totalBytes: 100 * MB, availableBytes: 10 * MB }).level, 'critical'); +}); + +test('앱 공간: 실제 시스템 용량은 MiB(표시 MB)로 계산하고 반올림한다', () => { + const summary = summarizeAppsStorage({ mount: '/', totalBytes: 81031168, availableBytes: 75153408 }); + assert.equal(summary.availableText, '71.7 MB'); + assert.equal(summary.usedText, '5.6 MB'); + assert.equal(summary.totalText, '77.3 MB'); +}); + +test('앱 공간: 누락·유효하지 않은 RPC 응답은 임의의 용량으로 채우지 않는다', () => { + for (const storage of [null, undefined, {}, { mount: '/tmp', totalBytes: 100, availableBytes: 20 }, + { mount: '/overlay', totalBytes: 0, availableBytes: 0 }, + { mount: '/overlay', totalBytes: 100, availableBytes: -1 }, + { mount: '/overlay', totalBytes: 100, availableBytes: 101 }, + { mount: '/overlay', totalBytes: Infinity, availableBytes: 20 }, + { mount: '/overlay', totalBytes: NaN, availableBytes: 20 }]) { + assert.equal(summarizeAppsStorage(storage), null); + } +}); + +test('앱 공간: 작은 용량과 큰 용량을 올바른 단위로 표시한다', () => { + assert.equal(formatStorageBytes(512), '512 B'); + assert.equal(formatStorageBytes(512 * 1024), '512.0 KB'); + assert.equal(formatStorageBytes(77.3 * MB), '77.3 MB'); + assert.equal(formatStorageBytes(3 * 1024 ** 3), '3.0 GB'); + assert.equal(formatStorageBytes(-3), '—'); +}); + +test('대시보드 디스크 사용률은 Apps 설치 가능 여유 공간과 정확히 대응한다', () => { + const summary = summarizeAppsStorage({ mount: '/', totalBytes: 100 * MB, availableBytes: 89 * MB }); + assert.equal(100 - summary.availablePercent, 11); + assert.equal(summary.usedText, '11.0 MB'); + assert.equal(summary.totalText, '100.0 MB'); + assert.equal(summarizeAppsStorage(null), null); // older RPC: never show a false 0% bar +}); diff --git a/luci-app-smartsafehub/tests/runtime/recommended-sync-stages.test.mjs b/luci-app-smartsafehub/tests/runtime/recommended-sync-stages.test.mjs index 1023c4aab..3be9b4d27 100644 --- a/luci-app-smartsafehub/tests/runtime/recommended-sync-stages.test.mjs +++ b/luci-app-smartsafehub/tests/runtime/recommended-sync-stages.test.mjs @@ -23,7 +23,7 @@ test('추천 규칙 상태를 단계별로 보여주고 UI의 오류를 중복 const rpc = source('root/usr/share/rpcd/ucode/smartsafehub/device-registration.uc'); const page = source('frontend/src/pages/SafeShieldRulesPage.tsx'); const types = source('frontend/src/types/rules.ts'); - assert.match(rpc, /syncStage: sync\?\.stage/); + assert.match(rpc, /syncStage: operationRunning \? 'server_sync' : \(sync\?\.stage/); assert.match(rpc, /syncReason: sync\?\.reason/); assert.match(types, /syncStage: string \| null/); for (const stage of ['server_sync', 'safeshield_refreshing', 'applying', 'verifying']) { diff --git a/luci-app-smartsafehub/tests/runtime/router-demo.test.mjs b/luci-app-smartsafehub/tests/runtime/router-demo.test.mjs index a5081cfe8..5ab1fdf70 100644 --- a/luci-app-smartsafehub/tests/runtime/router-demo.test.mjs +++ b/luci-app-smartsafehub/tests/runtime/router-demo.test.mjs @@ -79,3 +79,100 @@ test('추천 규칙 API 조회는 실제 공유기 앱에서만 주입된다', ( assert.match(app, /onLoadRecommendedRulesStatus=\{fetchRecommendedRulesStatus\}/); assert.doesNotMatch(demo, /onLoadRecommendedRulesStatus=/); }); + + +test('SmartSafeHub Account and Apps use fictional fixtures, not live APIs', () => { + const routes = readFileSync(resolve(root, 'app/routes.ts'), 'utf8'); + const app = readFileSync(resolve(root, 'demo/main.tsx'), 'utf8'); + const fixtures = readFileSync(resolve(root, 'demo/data.ts'), 'utf8'); + assert.match(routes, /'rules', 'account', 'apps', 'system'/); + for (const [route, component] of [['account', 'SmartSafeHubAccountPage'], ['apps', 'AppsPage']]) { + assert.match(app, new RegExp(`case '${route}':`)); + assert.ok(app.includes(`<${component}`), `${component} not reused by demo`); + assert.match(app, new RegExp(`<${component}[^;]*?demo`, 's')); + } + for (const fixture of ['demoAccount', 'demoApps', 'demoAppsStatus', 'demoAppsMetrics']) { + assert.ok(fixtures.includes(`export const ${fixture}:`), `missing ${fixture}`); + assert.ok(app.includes(fixture), `unused ${fixture}`); + } + assert.match(fixtures, /accountRegistered: true/); + assert.match(fixtures, /pairingCode: null/); + assert.match(fixtures, /id: 'network-usage-monitor'/); + assert.match(fixtures, /id: 'retro-arcade'/); + assert.match(fixtures, /id: 'wake-on-lan'/); + assert.match(fixtures, /category: 'entertainment'/); + const newFixtures = fixtures.slice(fixtures.indexOf('export const demoAccount:'), fixtures.indexOf('export const demoDevices:')); + assert.doesNotMatch(newFixtures, /https?:\/\/|\/cgi-bin\/|password|token|api_key/i); + assert.match(app, /accountRegistered=\{demoAccount\.accountRegistered\}/); +}); + +test('demo showcases verified Apps versions, upgrade badge, and installed sizes without changing router state', () => { + const fixtures = readFileSync(resolve(root, 'demo/data.ts'), 'utf8'); + const catalog = fixtures.split('export const demoApps: AppsCatalog = {')[1].split('export const demoAppsStatus:')[0]; + const status = fixtures.split('export const demoAppsStatus: AppsInstallStatus = {')[1].split('export const demoAppsMetrics:')[0]; + const metrics = fixtures.split('export const demoAppsMetrics: AppsMetrics = {')[1].split('export const demoDevices:')[0]; + + assert.ok(catalog.indexOf("id: 'retro-arcade'") < catalog.indexOf("id: 'network-usage-monitor'"), + 'demo card ordering should match the actual Apps page'); + assert.match(catalog, /id: 'retro-arcade',[\s\S]*?version: '1\.1\.0-r5'/); + assert.match(catalog, /id: 'network-usage-monitor',[\s\S]*?version: '2025\.06\.02~29236be6-r1'/); + assert.match(catalog, /id: 'wake-on-lan',[\s\S]*?category: 'utilities',[\s\S]*?version: '26\.288\.56989~75a306d'/); + assert.ok(catalog.indexOf("id: 'network-usage-monitor'") < catalog.indexOf("id: 'wake-on-lan'")); + assert.match(status, /'wake-on-lan': \{\s*installed: false,\s*partial: false,\s*managed: false/); + + assert.match(status, /'retro-arcade': \{\s*installed: true,\s*partial: false,\s*managed: true,\s*updateAvailable: true,\s*installedVersion: '1\.0\.0-r1'/); + assert.match(status, /'network-usage-monitor': \{\s*installed: true,\s*partial: false,\s*managed: true,\s*updateAvailable: false,\s*installedVersion: '2025\.06\.02~29236be6-r1'/); + assert.match(metrics, /'retro-arcade': 1394688/); + assert.match(metrics, /'network-usage-monitor': 117760/); + assert.match(fixtures, /storage: demoAppsMetrics\.storage/, + 'dashboard disk and Apps donut must share the same fictional storage'); + + const demo = readFileSync(resolve(root, 'demo/main.tsx'), 'utf8'); + assert.match(demo, /installStatus=\{demoAppsStatus\} metrics=\{demoAppsMetrics\}/); + assert.match(demo, /onUpdate=\{async \(\) => \{ readonlyNotice\(\); \}\}/); +}); + +test('Apps 카테고리 아이콘은 공유기와 데모에서 동일하고 도구와 기타가 구분된다', () => { + const page = readFileSync(resolve(root, 'pages/AppsPage.tsx'), 'utf8'); + const category = readFileSync(resolve(root, 'components/AppsCategoryIcon.tsx'), 'utf8'); + const icons = readFileSync(resolve(root, 'components/Icons.tsx'), 'utf8'); + const demo = readFileSync(resolve(root, 'demo/main.tsx'), 'utf8'); + assert.match(demo, / { + const demo = readFileSync(resolve(root, 'demo/main.tsx'), 'utf8'); + const apps = readFileSync(resolve(root, 'pages/AppsPage.tsx'), 'utf8'); + const account = readFileSync(resolve(root, 'pages/SmartSafeHubAccountPage.tsx'), 'utf8'); + assert.match(demo, /onDemoAction=\{readonlyNotice\}/); + assert.match(demo, /onRequestPairing=\{async \(\) => \{ readonlyNotice\(\); return null; \}\}/); + for (const action of ['onInstall', 'onRemove', 'onUpdate']) { + assert.ok(demo.includes(`${action}={async () => { readonlyNotice(); }}`), `${action} must be a no-op`); + } + assert.match(apps, /if \(demo\) \{/); + assert.match(apps, /if \(action === 'remove'\) closeRemoveDialog\(\)/); + assert.match(apps, /onDemoAction\?\.\(\);/); + assert.match(apps, /launchPath \? \(demo \?/); + assert.match(apps, /onClick=\{onDemoAction\} type="button">열기/); + assert.match(account, /demo \? \(/); + assert.match(account, /onClick=\{onDemoAction\}/); + assert.match(account, /href=\{DEVICE_CONSOLE_URL\}/); + assert.doesNotMatch(demo, /import .*from ['"]\.\.\/api\//); +}); + +test('README links to the public router demo', () => { + const readme = readFileSync(resolve(root, '../../README.md'), 'utf8'); + assert.match(readme, /https:\/\/www\.smartsafehub\.com\/router-demo\//); +}); diff --git a/luci-app-smartsafehub/tests/runtime/rpc-scheduler.test.mjs b/luci-app-smartsafehub/tests/runtime/rpc-scheduler.test.mjs new file mode 100644 index 000000000..5570bdea2 --- /dev/null +++ b/luci-app-smartsafehub/tests/runtime/rpc-scheduler.test.mjs @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { acquireRpcSlot } from '../../frontend/src/api/rpcScheduler.ts'; + +test('RPC queue reserves a slot for interactive actions and releases cancelled waiters', async () => { + const background = await Promise.all(Array.from({ length: 3 }, () => acquireRpcSlot('low'))); + const pending = acquireRpcSlot('low'); + const interactive = await acquireRpcSlot('high'); + // With four slots taken, a queued request must be cancellable without a leak. + const controller = new AbortController(); + const cancelled = acquireRpcSlot('normal', controller.signal); + controller.abort(); + await assert.rejects(cancelled, (error) => error.name === 'AbortError'); + interactive(); + let settled = false; + void pending.then(() => { settled = true; }); + await Promise.resolve(); + assert.equal(settled, false, 'fourth low-priority RPC must not consume the reserved slot'); + background[0](); + const fourth = await pending; + fourth(); + background[1](); + background[2](); +}); + +test('pre-aborted signal never starts work', async () => { + const controller = new AbortController(); + controller.abort(); + await assert.rejects(acquireRpcSlot('high', controller.signal), (error) => error.name === 'AbortError'); +}); + +test('queued RPC starts after an earlier queued request is aborted', async () => { + const active = await Promise.all(Array.from({ length: 4 }, () => acquireRpcSlot('normal'))); + const controller = new AbortController(); + const cancelled = acquireRpcSlot('normal', controller.signal); + const successor = acquireRpcSlot('high'); + + controller.abort(); + await assert.rejects(cancelled, (error) => error.name === 'AbortError'); + + active[0](); + const releaseSuccessor = await successor; + releaseSuccessor(); + active.slice(1).forEach((release) => release()); + + // All accounting must be restored after cancelling, draining and releasing. + const again = await Promise.all(Array.from({ length: 4 }, () => acquireRpcSlot('normal'))); + again.forEach((release) => release()); +}); diff --git a/luci-app-smartsafehub/tests/runtime/rule-origin.test.mjs b/luci-app-smartsafehub/tests/runtime/rule-origin.test.mjs index 3d1f5d495..20cd43d27 100644 --- a/luci-app-smartsafehub/tests/runtime/rule-origin.test.mjs +++ b/luci-app-smartsafehub/tests/runtime/rule-origin.test.mjs @@ -19,7 +19,7 @@ test('허용 목록의 수동 규칙과 추천 규칙을 로컬 소유 정보로 assert.match(rpc, /recommended-rules\.state/); assert.match(rpc, /domains: domains/); assert.match(helper, /grep -Fxq "\$domain" "\$OWNED"/); - assert.match(page, /const cloudManaged = isAllow && recommendedKnown && recommendedDomains\.includes\(domain\);/); + assert.match(page, /const cloudManaged = isAllow && recommendedKnown && recommendedDomainSet\.has\(domain\);/); assert.match(page, /cloudManaged \? '추천 규칙' : '직접 추가'/); assert.match(page, /disabled=\{busy \|\| cloudManaged\}/); }); @@ -50,7 +50,7 @@ test('추천 규칙 수동 동기화와 적용 확인 상태는 데모 API를 assert.match(acl, /"device_recommended_rules_refresh"/); assert.match(device, /write_recommended_sync_status failed/); assert.match(device, /write_recommended_sync_status confirmed/); - assert.match(rpc, /const syncStatus = sync\?\.status == 'pending'/); + assert.match(rpc, /const syncStatus = operationRunning \|\| sync\?\.status == 'pending'/); assert.match(rpc, /const syncWarning = confirmed &&/); assert.match(rpc, /const confirmed = revision != null && receipt\?\.status == 'confirmed'/); assert.doesNotMatch(page, /from ['"]\.\.\/api\//); @@ -78,9 +78,9 @@ test('추천 규칙 상태는 화면을 새로고침하지 않아도 주기적 test('갱신 실패 후에도 추천 규칙의 소유권을 유지하고 확인서가 없으면 재조회한다', () => { const device = readFileSync(resolve(root, 'root/usr/libexec/smartsafehub-device'), 'utf8'); - assert.match(helper, /Keep the ownership claim until the final SafeShield read confirms/); - assert.match(helper, /Only after successful reconciliation may we forget ownership/); - assert.match(helper, /ownership intent before creating the allow entry/); + assert.match(helper, /Retire ownership only after final verification/); + assert.match(helper, /persist "\$revision"/); + assert.match(helper, /Record intent before rule_add/); assert.match(device, /A state revision alone is not proof that SafeShield applied the rules/); assert.match(device, /json_value "\$RECOMMENDED_RECEIPT" '@\.revision'/); }); @@ -102,7 +102,7 @@ test('해제 요청 시간 초과 후에도 로컬 적용 확인을 반복하고 }); test('백그라운드 규칙 변경을 감지하면 SafeShield 목록을 다시 읽는다', () => { - assert.match(page, /previousStatusSignature\.current !== signature/); + assert.match(page, /previousStatusSignature\.current !== null/); assert.match(page, /onRetryRef\.current\(\)/); assert.match(page, /window\.setInterval\(updateStatus, 15_000\)/); assert.match(page, /window\.addEventListener\('focus', onFocus\)/); diff --git a/luci-app-smartsafehub/tests/runtime/rules-performance.test.mjs b/luci-app-smartsafehub/tests/runtime/rules-performance.test.mjs new file mode 100644 index 000000000..9e2d02180 --- /dev/null +++ b/luci-app-smartsafehub/tests/runtime/rules-performance.test.mjs @@ -0,0 +1,79 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { + filterRuleGroups, + filterRecommendedAssignments, + sameRecommendationContent, +} from '../../frontend/src/utils/ruleLists.ts'; +import { + recordRpcTiming, + resetRpcDiagnostics, + snapshotRpcDiagnostics, +} from '../../frontend/src/api/rpcDiagnostics.ts'; + +test('규칙 검색은 한 번만 분류하고 웹사이트 관리 규칙을 직접 삭제 가능한 그룹에서 분리한다', () => { + const rules = ['ads.example.com', 'manual.example.org', 'tv.example.net']; + const ownership = new Set(['ads.example.com', 'tv.example.net']); + const result = filterRuleGroups(rules, '', true, ownership); + assert.equal(result.filteredRules, rules, 'no search preserves source array'); + assert.deepEqual(result.managedRules, ['ads.example.com', 'tv.example.net']); + assert.deepEqual(result.manualRules, ['manual.example.org']); + assert.deepEqual(filterRuleGroups(rules, 'example.org', true, ownership).manualRules, ['manual.example.org']); + assert.deepEqual(filterRuleGroups(rules, 'no-match', true, ownership).managedRules, []); + assert.equal(filterRuleGroups(rules, '', false, ownership).manualRules, rules); +}); + +test('추천 규칙 검색은 제목 또는 도메인과 일치하고 빈 검색어에서 원래 목록을 유지한다', () => { + const rules = [ + { id: 1, title: 'Samsung TV', domains: ['ads.its-newid.net'] }, + { id: 2, title: 'Other', domains: ['example.org'] }, + ]; + assert.equal(filterRecommendedAssignments(rules, ''), rules); + assert.deepEqual(filterRecommendedAssignments(rules, 'samsung'), [rules[0]]); + assert.deepEqual(filterRecommendedAssignments(rules, 'its-newid'), [rules[0]]); +}); + +test('백그라운드 상태 갱신에서는 동일한 목록 참조를 재사용하되 실제 변경은 반영한다', () => { + const previous = { + revision: 'r1', domains: ['ads.its-newid.net'], + rules: [{ id: 2, title: 'TV', domains: ['ads.its-newid.net'] }], + lastCheckedAt: 1, syncStatus: 'pending', + }; + const progress = { + ...previous, + domains: ['ads.its-newid.net'], + rules: [{ id: 2, title: 'TV', domains: ['ads.its-newid.net'] }], + lastCheckedAt: 2, + syncStatus: 'confirmed', + }; + const stable = sameRecommendationContent(previous, progress); + assert.equal(stable.domains, previous.domains); + assert.equal(stable.rules, previous.rules); + assert.equal(progress.syncStatus, 'confirmed', 'status transitions still flow to the parent'); + const changed = sameRecommendationContent(previous, { + ...progress, domains: ['new.example.org'], + rules: [{ id: 2, title: 'TV updated', domains: ['new.example.org'] }], + }); + assert.notEqual(changed.domains, previous.domains); + assert.notEqual(changed.rules, previous.rules); +}); + +test('운영 환경 RPC 진단은 느린/실패 요청을 제한된 메모리에만 기록한다', () => { + resetRpcDiagnostics(); + recordRpcTiming({ object: 'safeshield', method: 'rules_list', elapsedMs: 12, responseMs: 10, decodeMs: 2, result: 'ok' }); + assert.equal(snapshotRpcDiagnostics().recent.length, 0); + assert.equal(recordRpcTiming({ object: 'safeshield', method: 'rules_list', elapsedMs: 1501, responseMs: 1490, decodeMs: 11, result: 'ok' }), true); + recordRpcTiming({ object: 'smartsafehub', method: 'device_recommended_rules_status', elapsedMs: 28, responseMs: 24, decodeMs: 4, result: 'RPC_TIMEOUT' }); + const snapshot = snapshotRpcDiagnostics(); + assert.deepEqual(snapshot.summary[0], { method: 'safeshield.rules_list', calls: 2, slow: 1, errors: 0, lastMs: 1501, maxMs: 1501, averageMs: 757 }); + assert.equal(snapshot.recent.length, 2); + assert.equal(snapshot.recent[1].result, 'RPC_TIMEOUT'); + assert.equal('params' in snapshot.recent[0], false); + assert.equal('sessionId' in snapshot.recent[0], false); + for (let i = 0; i < 70; i++) { + recordRpcTiming({ object: 'safeshield', method: 'rules_list', elapsedMs: 2000, responseMs: null, decodeMs: null, result: 'RPC_TIMEOUT' }); + } + assert.equal(snapshotRpcDiagnostics().recent.length, 60); + resetRpcDiagnostics(); + assert.deepEqual(snapshotRpcDiagnostics().summary, []); +}); diff --git a/luci-app-smartsafehub/tests/test-account-ui-contract.sh b/luci-app-smartsafehub/tests/test-account-ui-contract.sh index b96c11a67..eae2e8727 100755 --- a/luci-app-smartsafehub/tests/test-account-ui-contract.sh +++ b/luci-app-smartsafehub/tests/test-account-ui-contract.sh @@ -32,8 +32,8 @@ grep -Fq 'void refresh();' "$HOOK" || fail 'page entry must refresh Hub state in grep -Fq 'if (loading && !data) return ;' "$PAGE" || fail 'account page must render cached local state without waiting for Hub' grep -Fq '최신 상태 확인이 지연되고 있습니다. 마지막으로 확인된 연결 상태를 표시합니다.' "$PAGE" || fail 'connected devices must present cloud delay as freshness information, not a connection warning' grep -Fq '>마지막 확인' "$PAGE" || fail 'account status must label the timestamp as the last confirmed state' -grep -Fq "timeoutMs: 30000" "$API" || fail 'background account synchronization must allow the router helper enough time to complete' -grep -Fq "status-sync' ], 25000" "$RPC" || fail 'rpcd must allow status-sync to finish before the frontend timeout' +grep -Fq "timeoutMs: 6000" "$API" || fail 'RPC account sync must promptly return an accepted job' +grep -Fq "ensure_job('device-sync')" "$RPC" || fail 'RPC account sync must use detached worker' grep -Fq 'const connected = status?.accountRegistered === true;' "$PAGE" || fail 'page must derive explicit account connection state' grep -Fq 'const pairingCode = !connected && !expired ? status?.pairingCode : null;' "$PAGE" || fail 'connected devices must never display a stale pairing code' diff --git a/luci-app-smartsafehub/tests/test-activity-idle-polling.sh b/luci-app-smartsafehub/tests/test-activity-idle-polling.sh index a82ebc391..c4f4baa64 100755 --- a/luci-app-smartsafehub/tests/test-activity-idle-polling.sh +++ b/luci-app-smartsafehub/tests/test-activity-idle-polling.sh @@ -17,5 +17,5 @@ assert loop.index('cloud_sync_enabled') < loop.index("previous_state_number '@.n assert 'retry_backoff_active' in loop assert 'consume_wake_marker || true' in loop assert 'ssh_runtime_execute sync-once sync_once' in loop -print('activity idle polling contract: OK') +print('PASS: activity idle polling contract') PY diff --git a/luci-app-smartsafehub/tests/test-apps-contract.sh b/luci-app-smartsafehub/tests/test-apps-contract.sh new file mode 100755 index 000000000..f3178efea --- /dev/null +++ b/luci-app-smartsafehub/tests/test-apps-contract.sh @@ -0,0 +1,152 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-or-later +set -eu +ROOT="$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)" +ROUTES="$ROOT/frontend/src/app/routes.ts" +NAV="$ROOT/frontend/src/components/ProductNavigation.tsx" +UCODE="$ROOT/root/usr/share/rpcd/ucode/smartsafehub/apps.uc" +RPC="$ROOT/root/usr/share/rpcd/ucode/smartsafehub.uc" +HELPER="$ROOT/root/usr/libexec/smartsafehub-apps" +ACL="$ROOT/root/usr/share/rpcd/acl.d/luci-app-smartsafehub.json" + +fail() { echo "FAIL: $*" >&2; exit 1; } +for file in "$ROUTES" "$NAV" "$UCODE" "$RPC" "$HELPER" "$ACL" \ + "$ROOT/frontend/src/pages/AppsPage.tsx" "$ROOT/frontend/src/types/apps.ts"; do + [ -f "$file" ] || fail "missing ${file##*/}" +done +[ -x "$HELPER" ] || fail 'helper not executable' +sh -n "$HELPER" || fail 'invalid helper shell syntax' +python3 - "$ROUTES" "$NAV" "$ROOT/frontend/src/hooks/useHashRoute.ts" <<'PY' || exit 1 +from pathlib import Path +import sys +routes, nav, hash_route = map(lambda p: Path(p).read_text(), sys.argv[1:]) +assert "route: 'apps'" in routes and "hash: '#apps'" in routes +assert routes.index("route: 'account'") < routes.index("route: 'apps'") < routes.index("route: 'system'") +assert "{ label: 'Explore', routes: ['apps'] }" in nav +assert "{ label: 'System', routes: ['account', 'system', 'settings'] }" in nav +assert "case 'apps':" in nav and '' in activity +assert '
' in apps +heading = apps.split('', 1)[0] +assert 'action=' not in heading, 'refresh action changes heading height' +card = apps.split('/>', 1)[1].split('{error ?', 1)[0] +assert 'p-4 shadow-sm shadow-slate-900/5 sm:p-5' in card, 'card padding differs from Activity' +assert '목록 새로고침' in card, 'refresh action must be within card' +assert 'disabled={loading || refreshing}' in card, 'refresh loading guard missing' +PY +grep -Fq "item.runtime != 'router' || item.installer != 'apk'" "$UCODE" || fail 'unknown runtimes must stay hidden' +# Separate the privileged APK adapter from display-only Hub catalog parsing. +MANAGER="$ROOT/root/usr/libexec/smartsafehub-apps-manager" +MODULE="$ROOT/root/usr/share/rpcd/ucode/smartsafehub/apps-manager.uc" +[ -x "$MANAGER" ] || fail 'APK manager missing or not executable' +[ -f "$MODULE" ] || fail 'APK RPC adapter missing' +sh -n "$MANAGER" || fail 'APK manager shell syntax invalid' +grep -Fq 'apps_install: {' "$RPC" || fail 'Apps install RPC missing' +grep -Fq 'apps_update: {' "$RPC" || fail 'Apps update RPC missing' +grep -Fq 'apps_remove: {' "$RPC" || fail 'Apps remove RPC missing' +grep -Fq 'apps_status: {' "$RPC" || fail 'Apps status RPC missing' +grep -Fq '"apps_install"' "$ACL" || fail 'Apps install ACL missing' +grep -Fq '"apps_update"' "$ACL" || fail 'Apps update ACL missing' +grep -Fq '"apps_remove"' "$ACL" || fail 'Apps remove ACL missing' +grep -Fq '"apps_status"' "$ACL" || fail 'Apps status ACL missing' +grep -Fq '"apps_metrics"' "$ACL" || fail 'Apps metrics read ACL missing' +grep -Fq 'updateVerifiedApp' "$ROOT/frontend/src/api/smartsafehub.ts" || fail 'Apps frontend update call missing' +grep -Fq 'installVerifiedApp' "$ROOT/frontend/src/api/smartsafehub.ts" || fail 'Apps frontend installation call missing' +# 다크 모드에서 앱 작업 상태 텍스트가 어둡게 남지 않도록 색상 매핑을 확인한다. +python3 - "$ROOT/frontend/src/pages/AppsPage.tsx" "$ROOT/frontend/src/styles/app.css" <<'PY_APPS_THEME' || fail 'Apps 작업 상태 다크 모드 계약이 올바르지 않습니다' +from pathlib import Path +import sys + +page, styles = (Path(file).read_text() for file in sys.argv[1:]) +assert "'border-teal-200 bg-teal-50 text-teal-900'" in page +assert "'border-rose-200 bg-rose-50 text-rose-800'" in page +assert "[class~='text-teal-900']" in styles +assert "[class~='text-rose-800']" in styles +PY_APPS_THEME +# Apps RPC 인자가 rpcd의 request.args 아래로 전달되는지 검사한다. +# request.app_id는 항상 빈 값이어서 패키지 작업 시작 전에 APPS_INVALID_ID가 발생한다. +python3 - "$RPC" "$MODULE" "$ROOT/frontend/src/api/smartsafehub.ts" <<'PY_RPC' || fail 'Apps RPC 인자 전달 계약이 올바르지 않습니다' +from pathlib import Path +import re +import sys + +rpc, adapter, frontend = (Path(path).read_text() for path in sys.argv[1:]) +for action in ('install', 'remove'): + method = f'apps_{action}' + assert re.search(rf'{method}:\s*\{{\s*args:\s*\{{\s*app_id:\s*', rpc), method + assert f"'{method}', {{ app_id: appId }}" in frontend, method +assert 'const app_id = request?.args?.app_id;' in adapter +assert 'const app_id = request?.app_id;' not in adapter +assert 'match(app_id, /^[a-z0-9][a-z0-9-]{0,79}$/)' in adapter +assert "run_command([ MANAGER, 'start', action, app_id ], 5000)" in adapter +PY_RPC + +# Fake only the HTTP/JSON filter utilities: no external calls or OpenWrt runtime +# are needed to verify identity pinning and mismatch/failure handling. +TMP="$(mktemp -d)" +trap 'rm -rf "$TMP"' EXIT HUP INT TERM +mkdir -p "$TMP/bin" "$TMP/runtime" +cat > "$TMP/firmware.json" <<'EOF' +{"device_code":"iptime-ax3000sm","build_id":"2026.10.20-123","channel":"stable"} +EOF +cat > "$TMP/response.json" <<'EOF' +{"schema":1,"device_code":"iptime-ax3000sm","firmware_build_id":"2026.10.20-123","channel":"stable","apps":[]} +EOF +cat > "$TMP/bin/jsonfilter" <<'PY' +#!/usr/bin/env python3 +import json,sys +args=sys.argv +obj=json.load(open(args[args.index('-i')+1],encoding='utf-8')) +for key in args[args.index('-e')+1].removeprefix('@.').split('.'): + obj=obj[key] +print(obj if not isinstance(obj,bool) else str(obj).lower()) +PY +cat > "$TMP/bin/uclient-fetch" <<'SH2' +#!/bin/sh +[ "${APPS_TEST_FAIL:-0}" = 0 ] || exit 1 +while [ "$#" -gt 0 ]; do + case "$1" in -O) dest="$2"; shift 2;; *) url="$1"; shift;; esac +done +printf '%s\n' "$url" > "$APPS_TEST_URL_FILE" +cp "$APPS_TEST_RESPONSE" "$dest" +SH2 +chmod +x "$TMP/bin/jsonfilter" "$TMP/bin/uclient-fetch" +export SMARTSAFEHUB_APPS_ROM_METADATA="$TMP/firmware.json" +export SMARTSAFEHUB_APPS_METADATA="$TMP/firmware.json" +export SMARTSAFEHUB_APPS_RUNTIME_DIR="$TMP/runtime" +export SMARTSAFEHUB_APPS_JSONFILTER_BIN="$TMP/bin/jsonfilter" +export SMARTSAFEHUB_APPS_UCLIENT_BIN="$TMP/bin/uclient-fetch" +export APPS_TEST_RESPONSE="$TMP/response.json" +export APPS_TEST_URL_FILE="$TMP/url" +"$HELPER" || fail 'valid pinned catalog fetch failed' +grep -Fq 'firmware_build_id=2026.10.20-123&channel=stable' "$TMP/url" || fail 'local identity missing in request' +grep -Fq '"apps":[]' "$TMP/runtime/apps-catalog.json" || fail 'catalog not stored' + +# Wrong firmware builds must never be treated as approved. +sed 's/2026.10.20-123/2026.10.20-999/' "$TMP/response.json" > "$TMP/mismatch.json" +export APPS_TEST_RESPONSE="$TMP/mismatch.json" +if "$HELPER"; then fail 'mismatched firmware catalog accepted'; fi +export APPS_TEST_FAIL=1 +if "$HELPER"; then fail 'offline catalog fetch accepted'; fi +unset APPS_TEST_FAIL +cat > "$TMP/firmware.json" <<'EOF' +{"device_code":"iptime-ax3000sm","build_id":"../../bad","channel":"stable"} +EOF +if "$HELPER"; then fail 'invalid firmware identity accepted'; fi +printf 'PASS: Apps navigation, catalog pinning and APK RPC contracts\n' diff --git a/luci-app-smartsafehub/tests/test-apps-launch.sh b/luci-app-smartsafehub/tests/test-apps-launch.sh new file mode 100755 index 000000000..240496618 --- /dev/null +++ b/luci-app-smartsafehub/tests/test-apps-launch.sh @@ -0,0 +1,72 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-or-later +set -eu +ROOT="$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)" +python3 - "$ROOT" <<'PY' +from pathlib import Path +import re +import sys +root = Path(sys.argv[1]) +ui = (root/'frontend/src/pages/AppsPage.tsx').read_text() +types = (root/'frontend/src/types/apps.ts').read_text() +route = (root/'frontend/src/utils/appsWebUi.ts').read_text() +catalog = (root/'root/usr/share/rpcd/ucode/smartsafehub/apps.uc').read_text() +manager = (root/'root/usr/libexec/smartsafehub-apps-manager').read_text() +status = (root/'root/usr/share/rpcd/ucode/smartsafehub/apps-manager.uc').read_text() +assert 'target="_blank"' in ui and 'rel="noopener noreferrer"' in ui +assert 'approvedAppPath(app.webUi)' in ui and 'state?.webUiReady' in ui +assert '웹 UI 미설치' in ui and '설치 마무리' in ui +assert 'onClick={() => dismissJob(jobKey)}' in ui +assert 'useState(readDismissedAppsJob)' in ui +assert 'window.setTimeout(() => dismissJob(jobKey), 7000)' in ui +assert 'webUiReady?: boolean' in types and 'webUi?:' in types +assert 'operationId?: string' in types +assert 'updateAvailable?: boolean' in types +assert "updateAvailable: length(fields) >= 6 && fields[5] == '1'" in status +# rpcd must accept both existing timestamp-pid jobs and new receipt IDs. +assert r'^[0-9]{1,12}-[0-9]{1,12}(-[0-9a-f]{16})?$' in status +assert 'od -An' not in manager +assert "if (webUi.type !== 'luci')" in route +assert "'/cgi-bin/luci/admin/services/nlbw/display'" in catalog +assert 'luci_web_ui_path(item.web_ui.path)' in catalog +assert 'luci-app-nlbwmon' in manager +# Hub-approved Wake-on-LAN must route only to its matching LuCI app, never +# another administrator view or to the backend etherwake executable. +assert "id == 'wake-on-lan'" in catalog +assert "item?.web_ui?.package == 'luci-app-wol'" in catalog +assert "item?.web_ui?.path == '/cgi-bin/luci/admin/services/wol'" in catalog +assert '[ "$id" = wake-on-lan ]' in manager +assert 'web_ui.package")" = luci-app-wol' in manager +assert 'web_ui.path")" = /cgi-bin/luci/admin/services/wol' in manager +assert '[ "$app" = wake-on-lan ]' in manager +assert 'for required in etherwake luci-app-wol' in manager +assert 'primary_package=luci-app-wol' in manager +assert 'rm -f "$LUCI_INDEX_CACHE"' in manager +category = (root/'frontend/src/components/AppsCategoryIcon.tsx').read_text() +page = (root/'frontend/src/pages/AppsPage.tsx').read_text() +assert "case 'utilities': return 'utilities'" in category +assert "case 'utilities': return = 5 && fields[4] == '1'" in status +allowed = re.compile(r'^/cgi-bin/luci/admin/[a-z0-9_-]+(?:/[a-z0-9_-]+)*$') +assert allowed.fullmatch('/cgi-bin/luci/admin/services/nlbw/display') +for bad in ('https://evil.example/', '//evil.example/', '/cgi-bin/luci/admin/../logout', + '/cgi-bin/luci/admin/%2e%2e', '/cgi-bin/luci/admin/services/x?url=http', + '/cgi-bin/luci/admin/services/x#fragment', '/cgi-bin/luci/admin//services/x'): + assert not allowed.fullmatch(bad), bad +PY +# Check TypeScript helper without producing frontend build files. +if command -v tsc >/dev/null 2>&1; then + tsc --noEmit --skipLibCheck --target es2020 "$ROOT/frontend/src/utils/appsWebUi.ts" +fi +echo 'PASS: Apps secure new-tab launch and notification contracts' diff --git a/luci-app-smartsafehub/tests/test-apps-manager.sh b/luci-app-smartsafehub/tests/test-apps-manager.sh new file mode 100755 index 000000000..7f2397953 --- /dev/null +++ b/luci-app-smartsafehub/tests/test-apps-manager.sh @@ -0,0 +1,728 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-or-later +set -eu +ROOT="$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)" +MANAGER="$ROOT/root/usr/libexec/smartsafehub-apps-manager" +TMP="$(mktemp -d)" +trap 'rm -rf "$TMP"' EXIT HUP INT TERM +fail() { echo "FAIL: $*" >&2; exit 1; } +mkdir -p "$TMP/bin" "$TMP/runtime" "$TMP/owned" "$TMP/repo" "$TMP/overlay" +# A default OpenWrt BusyBox image does not provide od. Simulate that +# environment even if the developer workstation has GNU/coreutils od. +cat > "$TMP/bin/od" <<'SH_OD' +#!/bin/sh +exit 127 +SH_OD +chmod +x "$TMP/bin/od" +PATH="$TMP/bin:$PATH" +export PATH +# Linux /proc is unavailable on macOS. A fixture keeps the production check enabled. +printf 'MemTotal: 262144 kB\n' > "$TMP/meminfo" +printf 'all\naarch64_cortex-a53\n' > "$TMP/apk-arch" +printf 'signed immutable package-index test fixture\n' > "$TMP/repo/packages.adb" +printf 'signed mock package payload\n' > "$TMP/repo/nlbwmon-2025.06.02~29236be6-r1.apk" +printf 'approved LuCI mock package payload\n' > "$TMP/repo/luci-app-nlbwmon-26.288.56989~75a306d.apk" +printf 'approved chart mock package payload\n' > "$TMP/repo/luci-lib-chartjs-26.288.56989~75a306d.apk" +printf 'approved Retro Arcade mock package payload\n' > "$TMP/repo/smartsafehub-app-retro-arcade-1.0.0-r1.apk" +printf 'approved etherwake mock package payload\n' > "$TMP/repo/etherwake-1.09-r5.apk" +printf 'approved WOL LuCI mock package payload\n' > "$TMP/repo/luci-app-wol-26.288.56989~75a306d.apk" +INDEX_SHA="$(sha256sum "$TMP/repo/packages.adb" | cut -d ' ' -f 1)" +ARCHIVE_SHA="$(sha256sum "$TMP/repo/nlbwmon-2025.06.02~29236be6-r1.apk" | cut -d ' ' -f 1)" +LUCISH="$(sha256sum "$TMP/repo/luci-app-nlbwmon-26.288.56989~75a306d.apk" | cut -d ' ' -f 1)" +CHARTSHA="$(sha256sum "$TMP/repo/luci-lib-chartjs-26.288.56989~75a306d.apk" | cut -d ' ' -f 1)" +RETROSHA="$(sha256sum "$TMP/repo/smartsafehub-app-retro-arcade-1.0.0-r1.apk" | cut -d ' ' -f 1)" +ETHERSHA="$(sha256sum "$TMP/repo/etherwake-1.09-r5.apk" | cut -d ' ' -f 1)" +WOLSHA="$(sha256sum "$TMP/repo/luci-app-wol-26.288.56989~75a306d.apk" | cut -d ' ' -f 1)" +cat > "$TMP/catalog.json" < "$TMP/bin/jsonfilter" <<'SH2' +#!/bin/sh +if command -v jq >/dev/null 2>&1; then + file=''; expr='' + while [ "$#" -gt 0 ]; do + case "$1" in + -i) file="$2"; shift 2;; + -e) expr="$2"; shift 2;; + *) exit 2;; + esac + done + case "$expr" in + '@.apps[*].id') jq_expr='.apps[].id';; + @.*) jq_expr="${expr#@}";; + *) exit 2;; + esac + jq -r "($jq_expr) | select(. != null)" "$file" 2>/dev/null +else + exec python3 "$0.py" "$@" +fi +SH2 +cat > "$TMP/bin/jsonfilter.py" <<'PY' +import json, re, sys +args=sys.argv +obj=json.load(open(args[args.index('-i')+1])) +expression=args[args.index('-e')+1] +if expression == '@.apps[*].id': + for app in obj.get('apps',[]): print(app['id']) +else: + try: + for part in re.findall(r'[^.\[\]]+|\[\d+\]', expression[2:]): + obj = obj[int(part[1:-1])] if part.startswith('[') else obj[part] + if isinstance(obj,(str,int,float)): print(obj) + except (KeyError,IndexError,TypeError): pass +PY +cat > "$TMP/bin/fetch-catalog" <<'SH2' +#!/bin/sh +cp "$APPS_TEST_CATALOG" "$SMARTSAFEHUB_APPS_RUNTIME_DIR/apps-catalog.json" +SH2 +cat > "$TMP/bin/uclient-fetch" <<'SH2' +#!/bin/sh +while [ "$#" -gt 0 ]; do + case "$1" in + -O) dest="$2"; shift 2;; + -q|-T) [ "$1" != -T ] || shift; shift;; + *) url="$1"; shift;; + esac +done +case "$url" in + https://repo.smartsafehub.com/stable/packages/aarch64_cortex-a53/smartsafehub/20261027T123000/packages.adb) + cp "$APPS_TEST_REPO/packages.adb" "$dest";; + https://repo.smartsafehub.com/stable/packages/aarch64_cortex-a53/smartsafehub/20261027T123000/nlbwmon-2025.06.02~29236be6-r1.apk) + cp "$APPS_TEST_REPO/nlbwmon-2025.06.02~29236be6-r1.apk" "$dest";; + https://repo.smartsafehub.com/stable/packages/aarch64_cortex-a53/smartsafehub/20261027T123000/luci-app-nlbwmon-26.288.56989~75a306d.apk) + cp "$APPS_TEST_REPO/luci-app-nlbwmon-26.288.56989~75a306d.apk" "$dest";; + https://repo.smartsafehub.com/stable/packages/aarch64_cortex-a53/smartsafehub/20261027T123000/luci-lib-chartjs-26.288.56989~75a306d.apk) + cp "$APPS_TEST_REPO/luci-lib-chartjs-26.288.56989~75a306d.apk" "$dest";; + https://repo.smartsafehub.com/stable/packages/aarch64_cortex-a53/smartsafehub/20261027T123000/smartsafehub-app-retro-arcade-1.0.0-r1.apk) + cp "$APPS_TEST_REPO/smartsafehub-app-retro-arcade-1.0.0-r1.apk" "$dest";; + https://repo.smartsafehub.com/stable/packages/aarch64_cortex-a53/smartsafehub/20261027T123000/smartsafehub-app-retro-arcade-1.1.0-r1.apk) + cp "$APPS_TEST_REPO/smartsafehub-app-retro-arcade-1.1.0-r1.apk" "$dest";; + https://repo.smartsafehub.com/stable/packages/aarch64_cortex-a53/smartsafehub/20261027T123000/etherwake-1.09-r5.apk) + cp "$APPS_TEST_REPO/etherwake-1.09-r5.apk" "$dest";; + https://repo.smartsafehub.com/stable/packages/aarch64_cortex-a53/smartsafehub/20261027T123000/luci-app-wol-26.288.56989~75a306d.apk) + cp "$APPS_TEST_REPO/luci-app-wol-26.288.56989~75a306d.apk" "$dest";; + *) exit 2;; +esac +printf '%s\n' "$url" >> "$APPS_TEST_URL_LOG" +SH2 +cat > "$TMP/bin/apk" <<'SH2' +#!/bin/sh +printf '%s\n' "$*" >> "$APPS_TEST_APK_LOG" +case "$1" in + --print-arch) [ "${APPS_TEST_ARCH_CLI_FAIL:-0}" = 0 ] || exit 1; echo "${APPS_TEST_ARCH_CLI:-aarch64_cortex-a53}"; exit 0;; + version) + [ "$2" = -t ] || exit 2 + case "$3:$4" in + 1.0.0-r1:1.1.0-r1) echo '<';; + 1.1.0-r1:1.0.0-r1) echo '>';; + *) [ "$3" = "$4" ] && echo '=' || exit 2;; + esac + exit 0;; + info) + if [ "$2" = -s ]; then + shift 2 + [ "${APPS_TEST_SIZE_MISSING:-0}" = 0 ] || exit 2 + [ "$#" -eq 1 ] || exit 2 + [ "${APPS_TEST_SIZE_FULL_INFO_ONLY:-0}" = 0 ] || exit 2 + for name in "$@"; do + grep -qxF "$name" "$APPS_TEST_INSTALLED" 2>/dev/null || exit 2 + [ "${APPS_TEST_SIZE_MISSING_PACKAGE:-}" != "$name" ] || exit 2 + # Device capture (OpenWrt 25.12 APK): repeating the same installed + # size twice or three times is valid, but conflicting values are not. + # During an update the APK index can expose old and new versions. + # Only the installed version should determine the displayed size. + if [ "${APPS_TEST_SIZE_MIXED_RELEASES:-0}" != 0 ] && + [ "$name" = smartsafehub-app-retro-arcade ]; then + printf '%s-1.0.0-r1 installed size:\n1362 KiB\n\n' "$name" + printf '%s-1.1.0-r1 installed size:\n2048 KiB\n\n' "$name" + if [ "$APPS_TEST_SIZE_MIXED_RELEASES" = conflicting ]; then + printf '%s-1.1.0-r1 installed size:\n2096 KiB\n\n' "$name" + fi + continue + fi + if [ "${APPS_TEST_SIZE_DEVICE_REPEAT:-0}" = 1 ]; then + case "$name" in + nlbwmon) version=2025.06.02~29236be6-r1; kib=46; copies=2;; + luci-app-nlbwmon) version=26.288.56989~75a306d; kib=36; copies=3;; + luci-lib-chartjs) version=26.288.56989~75a306d; kib=33; copies=3;; + *) exit 2;; + esac + i=0 + while [ "$i" -lt "$copies" ]; do + value="$kib" + if [ "${APPS_TEST_SIZE_CONFLICTING_REPEAT:-0}" = 1 ] && + [ "$name" = nlbwmon ] && [ "$i" -eq 1 ]; then + value=47 + fi + printf '%s-%s installed size:\n%s KiB\n\n' "$name" "$version" "$value" + i=$((i + 1)) + done + continue + fi + if [ "${APPS_TEST_SIZE_INLINE:-0}" = 1 ]; then + case "$name" in + nlbwmon) printf '%s-1.0.0-r1 installed size: 1.5 MiB\n' "$name";; + luci-app-nlbwmon) printf '%s-1.0.0-r1 installed size: 512KiB\n' "$name";; + luci-lib-chartjs) printf '%s-1.0.0-r1 installed size: 256 KiB\n' "$name";; + smartsafehub-app-retro-arcade) printf '%s-1.0.0-r1 installed size: 12.5 MiB\n' "$name";; + esac + continue + fi + printf '%s-1.0.0-r1 installed size:\n' "$name" + if [ "${APPS_TEST_SIZE_INVALID:-0}" = 1 ]; then + echo 'not-a-size'; continue + fi + case "$name" in + nlbwmon) printf '1.5 MiB\n';; + luci-app-nlbwmon) printf '512 KiB\n';; + luci-lib-chartjs) printf '256 KiB\n';; + smartsafehub-app-retro-arcade) printf '12.5 MiB\n';; + *) printf '0 B\n';; + esac + done + exit 0 + fi + if [ "$#" -eq 2 ] && [ "${APPS_TEST_SIZE_FULL_INFO_ONLY:-0}" = 1 ]; then + name="$2" + grep -qxF "$name" "$APPS_TEST_INSTALLED" 2>/dev/null || exit 2 + printf '%s-1.0.0-r1 description:\nMock metadata\n\n%s-1.0.0-r1 installed size:\n' "$name" "$name" + case "$name" in + nlbwmon) printf '1.5 MiB\n';; + luci-app-nlbwmon) printf '512 KiB\n';; + luci-lib-chartjs) printf '256 KiB\n';; + *) exit 2;; + esac + exit 0 + fi + [ "$2" = -e ] || exit 2 + grep -qxF "$3" "$APPS_TEST_INSTALLED" 2>/dev/null; exit $?;; + list) + [ "$2" = -I ] || exit 2 + grep -qxF "$3" "$APPS_TEST_INSTALLED" 2>/dev/null || exit 0 + if [ -s "$APPS_TEST_VERSION_DB" ]; then + version="$(awk -v n="$3" '$1 == n {print $2; exit}' "$APPS_TEST_VERSION_DB")" + [ -z "$version" ] || { echo "$3-$version aarch64_cortex-a53 [installed]"; exit 0; } + fi + if [ "$3" = etherwake ]; then + echo 'etherwake-1.09-r5 aarch64_cortex-a53 [installed]' + else + echo "$3-${APPS_TEST_SHARED_VERSION:-26.288.56989~75a306d} aarch64_cortex-a53 [installed]" + fi + exit 0;; + --repositories-file) + [ "$2" = /dev/null ] || exit 2 + [ "$3" = -X ] || exit 2 + case "$4" in + file://*/apps-work.*/packages/packages.adb) repo=hub; local_index="${4#file://}";; + *) exit 2;; + esac + [ -s "$local_index" ] || exit 2 + cmp -s "$local_index" "$APPS_TEST_REPO/packages.adb" || exit 2 + if [ -s "${local_index%/*}/smartsafehub-app-retro-arcade-1.0.0-r1.apk" ] || + [ -s "${local_index%/*}/smartsafehub-app-retro-arcade-1.1.0-r1.apk" ]; then + [ "$(find "${local_index%/*}" -name '*.apk' | wc -l | tr -d ' ')" -eq 1 ] || exit 2 + elif [ -s "${local_index%/*}/etherwake-1.09-r5.apk" ] || + [ -s "${local_index%/*}/luci-app-wol-26.288.56989~75a306d.apk" ]; then + [ "$(find "${local_index%/*}" -name '*.apk' | wc -l | tr -d ' ')" -eq 2 ] || exit 2 + for name in etherwake-1.09-r5 luci-app-wol-26.288.56989~75a306d; do + [ -s "${local_index%/*}/$name.apk" ] || exit 2 + done + else + for name in nlbwmon-2025.06.02~29236be6-r1 \ + luci-app-nlbwmon-26.288.56989~75a306d \ + luci-lib-chartjs-26.288.56989~75a306d; do + [ -s "${local_index%/*}/$name.apk" ] || exit 2 + done + fi + if [ "$5" = update ]; then + if [ "${APPS_TEST_REPO_UPDATE_FAIL:-0}" = 1 ]; then + echo 'ERROR: repository index update rejected' >&2 + exit 1 + fi + touch "$APPS_TEST_INDEX_READY" + exit 0 + fi + [ "$5" = add ] || exit 2 + [ -f "$APPS_TEST_INDEX_READY" ] || { + echo 'WARNING: opening from cache: No such file or directory' >&2 + exit 1 + } + shift 5;; + del) + if [ "$2" = --simulate ]; then + [ "${APPS_TEST_DEL_CORE:-0}" = 1 ] && echo 'Purging kmod-nf-conntrack-netlink (mock)' + [ "${APPS_TEST_DEL_SHARED:-0}" = 1 ] && echo 'Purging luci-lib-chartjs (mock)' + exit 0 + fi + shift + for item in "$@"; do grep -vxF "$item" "$APPS_TEST_INSTALLED" > "$APPS_TEST_INSTALLED.new" || :; mv "$APPS_TEST_INSTALLED.new" "$APPS_TEST_INSTALLED"; done + exit 0;; + *) exit 2;; +esac +upgrade=0 +if [ "${1:-}" = --upgrade ]; then upgrade=1; shift; fi +if [ "${1:-}" = --simulate ]; then + [ "${APPS_TEST_MISSING_DEP:-0}" = 1 ] && { echo 'ERROR: unable to select packages: missing dependency' >&2; exit 1; } + shift + for pin in "$@"; do + name="${pin%%=*}" + case "$repo:$name" in + hub:nlbwmon|hub:luci-app-nlbwmon|hub:luci-lib-chartjs|hub:smartsafehub-app-retro-arcade|hub:etherwake|hub:luci-app-wol) ;; + *) exit 2;; + esac + if [ "${APPS_TEST_UPGRADE:-0}" = 1 ]; then + echo '(1/3) Upgrading luci-base (mock)' + elif [ "$upgrade" = 1 ]; then + echo "(1/1) Upgrading $name (mock)" + else + echo "(1/2) Installing $name (mock)" + fi + done + exit 0 +fi +for pin in "$@"; do + name="${pin%%=*}" + case "$repo:$name" in + hub:nlbwmon|hub:luci-app-nlbwmon|hub:luci-lib-chartjs|hub:smartsafehub-app-retro-arcade|hub:etherwake|hub:luci-app-wol) ;; + *) exit 2;; + esac + grep -qxF "$name" "$APPS_TEST_INSTALLED" 2>/dev/null || printf '%s\n' "$name" >> "$APPS_TEST_INSTALLED" + if [ "$upgrade" = 1 ]; then + awk -v n="$name" '$1 != n' "$APPS_TEST_VERSION_DB" > "$APPS_TEST_VERSION_DB.tmp" + printf '%s %s\n' "$name" "${pin#*=}" >> "$APPS_TEST_VERSION_DB.tmp" + mv -f "$APPS_TEST_VERSION_DB.tmp" "$APPS_TEST_VERSION_DB" + fi +done +SH2 +cat > "$TMP/bin/start-stop-daemon" <<'SH2' +#!/bin/sh +[ "$1" = -S ] && [ "$2" = -b ] && [ "$3" = -x ] && [ "$5" = -- ] || exit 2 +# Starting and final states must carry the same operation ID. +awk -F '\t' '$1 == "operation_id" { print $2; exit }' \ + "$SMARTSAFEHUB_APPS_RUNTIME_DIR/apps-operation.state" >> "$APPS_TEST_OPERATION_START_LOG" +"$4" "$6" "$7" "$8" +SH2 +chmod +x "$TMP/bin/"* +cat > "$TMP/bin/metrics-hook" <<'METRICS' +#!/bin/sh +printf '%s +' "$*" >> "$APPS_TEST_METRICS_LOG" +METRICS +chmod +x "$TMP/bin/metrics-hook" +export APPS_TEST_METRICS_LOG="$TMP/install-events" +export SMARTSAFEHUB_APPS_METRICS_BIN="$TMP/bin/metrics-hook" +: > "$APPS_TEST_METRICS_LOG" +export SMARTSAFEHUB_APPS_MANAGER_BIN="$MANAGER" +export SMARTSAFEHUB_APPS_HELPER_BIN="$TMP/bin/fetch-catalog" +export SMARTSAFEHUB_APPS_RUNTIME_DIR="$TMP/runtime" +export SMARTSAFEHUB_APPS_OWNED_DIR="$TMP/owned" +export SMARTSAFEHUB_APPS_UCLIENT_BIN="$TMP/bin/uclient-fetch" +export APPS_TEST_URL_LOG="$TMP/fetched-urls" +export SMARTSAFEHUB_APPS_OVERLAY_PATH="$TMP/overlay" +export SMARTSAFEHUB_APPS_MEMINFO_PATH="$TMP/meminfo" +export SMARTSAFEHUB_APPS_JSONFILTER_BIN="$TMP/bin/jsonfilter" +export SMARTSAFEHUB_APPS_APK_BIN="$TMP/bin/apk" +export SMARTSAFEHUB_APPS_ARCH_FILE="$TMP/apk-arch" +export SMARTSAFEHUB_APPS_DAEMON_BIN="$TMP/bin/start-stop-daemon" +export SMARTSAFEHUB_APPS_LUCI_INDEX_CACHE="$TMP/luci-indexcache" +export APPS_TEST_CATALOG="$TMP/catalog.json" +export APPS_TEST_REPO="$TMP/repo" +export APPS_TEST_INSTALLED="$TMP/installed" +export APPS_TEST_APK_LOG="$TMP/apk-commands" +export APPS_TEST_INDEX_READY="$TMP/index-ready" +export APPS_TEST_VERSION_DB="$TMP/installed-versions" +: > "$APPS_TEST_VERSION_DB" +export APPS_TEST_OPERATION_START_LOG="$TMP/operation-start-ids" +: > "$APPS_TEST_INSTALLED" +# A validated fixed release installs all three APKs from a single signed feed. +"$MANAGER" start install '../../../../etc/passwd' >/dev/null 2>&1 && fail 'invalid app ID accepted' +"$MANAGER" start install 'not-approved' || fail 'unknown app should queue' +grep -Fqx "$(printf 'code\tE22')" "$TMP/runtime/apps-operation.state" || fail 'unknown app was installed' +first_operation_id="$(awk -F '\t' '$1 == "operation_id" { print $2; exit }' "$TMP/runtime/apps-operation.state")" +[ -n "$first_operation_id" ] || fail 'first failed operation has no identity' +printf '%s\n' "$first_operation_id" | grep -Eq '^[0-9]{10}-[0-9]+-[0-9a-f]{16}$' || fail 'operation ID must include a valid random nonce without od' +[ "$(sed -n '1p' "$APPS_TEST_OPERATION_START_LOG")" = "$first_operation_id" ] || fail 'operation identity changed during failure' +"$MANAGER" start install not-approved || fail 'repeated failed install did not queue' +repeat_operation_id="$(awk -F '\t' '$1 == "operation_id" { print $2; exit }' "$TMP/runtime/apps-operation.state")" +[ "$repeat_operation_id" != "$first_operation_id" ] || fail 'repeated E22 failure reused dismissed operation ID' +[ "$(sed -n '2p' "$APPS_TEST_OPERATION_START_LOG")" = "$repeat_operation_id" ] || fail 'repeated failure changed identity between phases' +"$MANAGER" start install network-usage-monitor || fail 'install did not queue' +grep -Fqx "$(printf 'phase\tsuccess')" "$TMP/runtime/apps-operation.state" || fail 'three APK installation failed' +second_operation_id="$(awk -F '\t' '$1 == "operation_id" { print $2; exit }' "$TMP/runtime/apps-operation.state")" +[ -n "$second_operation_id" ] && [ "$first_operation_id" != "$second_operation_id" ] || fail 'new operation reused old identity' +[ "$(sed -n '3p' "$APPS_TEST_OPERATION_START_LOG")" = "$second_operation_id" ] || fail 'operation identity changed during success' +[ "$(wc -l < "$APPS_TEST_INSTALLED")" -eq 3 ] || fail 'all three APKs were not installed' +[ "$(wc -l < "$APPS_TEST_METRICS_LOG" | tr -d ' ')" -eq 1 ] || fail 'successful installation not recorded exactly once' +grep -Eq '^enqueue network-usage-monitor 2025\.06\.02-r1 [0-9]+-[0-9]+-[a-f0-9]{16} install$' "$APPS_TEST_METRICS_LOG" || fail 'invalid install receipt fields' + +grep -Eq '^--repositories-file /dev/null -X file://.*/packages/packages.adb update$' "$APPS_TEST_APK_LOG" || fail 'approved local index not loaded before simulation' +grep -Eq '^--repositories-file /dev/null -X file://.*/packages/packages.adb add --simulate nlbwmon=2025\.06\.02~29236be6-r1 luci-app-nlbwmon=26\.288\.56989~75a306d luci-lib-chartjs=26\.288\.56989~75a306d$' "$APPS_TEST_APK_LOG" || fail 'isolated signed repository simulation not used' +grep -Eq '^--repositories-file /dev/null -X file://.*/packages/packages.adb add nlbwmon=' "$APPS_TEST_APK_LOG" || fail 'isolated signed repository install not used' +# A failed random-source read must never launch a removal or leave a lock. +# This also guards against accidentally generating a fixed nonce from empty data. +cat > "$TMP/bin/dd" <<'SH_DD' +#!/bin/sh +exit 1 +SH_DD +chmod +x "$TMP/bin/dd" +if "$MANAGER" start remove network-usage-monitor >/dev/null 2>&1; then + fail 'failed entropy read started a removal' +fi +rm -f "$TMP/bin/dd" +[ ! -e "$TMP/runtime/apps-operation.lock" ] || fail 'failed entropy read left a lock' +grep -Fqx "$(printf 'phase\tsuccess')" "$TMP/runtime/apps-operation.state" || fail 'failed launch overwrote existing operation' +[ "$(wc -l < "$APPS_TEST_INSTALLED" | tr -d ' ')" -eq 3 ] || fail 'failed entropy read touched installed APKs' +"$MANAGER" status +grep -Fq "$(printf 'network-usage-monitor\t1\t1\t1\t1')" "$TMP/runtime/apps-status.tsv" || fail 'ready state missing' +grep -Fq "$(printf 'network-usage-monitor\t1\t1\t1\t1\t0\t')" "$TMP/runtime/apps-status.tsv" || fail 'installed state changed' +# Optional size lookup must never run on the critical installation-status path. +[ "$(grep -c '^info -s ' "$APPS_TEST_APK_LOG" || :)" -eq 0 ] || fail 'status unexpectedly queried APK sizes' +"$MANAGER" sizes +grep -Fqx "$(printf 'network-usage-monitor\t2359296')" "$TMP/runtime/apps-size.tsv" || fail 'multi-package installed size not summed' +[ "$(grep -c '^info -s ' "$APPS_TEST_APK_LOG" || :)" -eq 3 ] || fail 'each network APK size must be queried separately' +for package in nlbwmon luci-app-nlbwmon luci-lib-chartjs; do + grep -Fqx "info -s $package" "$APPS_TEST_APK_LOG" || fail "missing individual size lookup: $package" +done +# Standard apk info must work when this apk v3 variant does not expose -s. +export APPS_TEST_SIZE_FULL_INFO_ONLY=1 +"$MANAGER" sizes +grep -Fqx "$(printf 'network-usage-monitor\t2359296')" "$TMP/runtime/apps-size.tsv" || fail 'full APK info fallback failed' +unset APPS_TEST_SIZE_FULL_INFO_ONLY +# OpenWrt APK versions may render the size on the header line or with no +# whitespace between the number and KiB. The sum must be identical. +export APPS_TEST_SIZE_INLINE=1 +"$MANAGER" sizes +grep -Fqx "$(printf 'network-usage-monitor\t2359296')" "$TMP/runtime/apps-size.tsv" || fail 'inline/compact installed size not summed' +[ ! -e "$TMP/runtime/apps-size-diagnostics.tsv" ] || fail 'retired size diagnostic file was created' +unset APPS_TEST_SIZE_INLINE +# Real OpenWrt 25.12 device output repeats the *same* installed-size header: +# nlbwmon twice, luci-app-nlbwmon / luci-lib-chartjs three times each. +export APPS_TEST_SIZE_DEVICE_REPEAT=1 +"$MANAGER" sizes +grep -Fqx "$(printf 'network-usage-monitor\t117760')" "$TMP/runtime/apps-size.tsv" || fail 'real duplicated APK info output did not sum to 115 KiB' +[ ! -e "$TMP/runtime/apps-size-diagnostics.tsv" ] || fail 'repeated APK size metadata wrote a diagnostic file' +# A repeated heading with a *different* size is ambiguous: refuse to guess. +export APPS_TEST_SIZE_CONFLICTING_REPEAT=1 +"$MANAGER" sizes +[ ! -s "$TMP/runtime/apps-size.tsv" ] || fail 'conflicting duplicated size was accepted' +[ ! -e "$TMP/runtime/apps-size-diagnostics.tsv" ] || fail 'conflicting size metadata wrote a diagnostic file' +unset APPS_TEST_SIZE_CONFLICTING_REPEAT APPS_TEST_SIZE_DEVICE_REPEAT +# Do not show a misleading partial sum if one package cannot be measured. +export APPS_TEST_SIZE_MISSING_PACKAGE=luci-lib-chartjs +"$MANAGER" sizes +[ ! -s "$TMP/runtime/apps-size.tsv" ] || fail 'partial APK metadata reported as complete installed size' +[ ! -e "$TMP/runtime/apps-size-diagnostics.tsv" ] || fail 'missing package size wrote a diagnostic file' +unset APPS_TEST_SIZE_MISSING_PACKAGE +# Malformed and missing metadata must not alter the actual installed state. +export APPS_TEST_SIZE_INVALID=1 +"$MANAGER" sizes +[ ! -s "$TMP/runtime/apps-size.tsv" ] || fail 'invalid APK size reported as bytes' +"$MANAGER" status +grep -Fq "$(printf 'network-usage-monitor\t1\t1\t1\t1\t0\t')" "$TMP/runtime/apps-status.tsv" || fail 'invalid size changed app state' +unset APPS_TEST_SIZE_INVALID +export APPS_TEST_SIZE_MISSING=1 +"$MANAGER" sizes +[ ! -s "$TMP/runtime/apps-size.tsv" ] || fail 'missing APK size must be omitted' +[ ! -e "$TMP/runtime/apps-size-diagnostics.tsv" ] || fail 'invalid/missing APK size created retired diagnostics' +unset APPS_TEST_SIZE_MISSING +"$MANAGER" start remove network-usage-monitor || fail 'remove did not queue' +[ ! -s "$APPS_TEST_INSTALLED" ] || fail 'new Apps uninstall did not remove owned packages' +[ "$(wc -l < "$APPS_TEST_METRICS_LOG" | tr -d ' ')" -eq 1 ] || fail 'removal counted as an installation' + +cp "$TMP/catalog.json" "$TMP/catalog-good.json" +python3 - "$TMP/catalog.json" <<'PY_BAD' +import json,sys +path=sys.argv[1]; obj=json.load(open(path)); obj['apps'][0].pop('repository_release_id') +open(path,'w').write(json.dumps(obj)) +PY_BAD +"$MANAGER" start install network-usage-monitor || fail 'missing release ID did not queue' +grep -Fqx "$(printf 'code\tE25')" "$TMP/runtime/apps-operation.state" || fail 'missing release ID accepted' +cp "$TMP/catalog-good.json" "$TMP/catalog.json" +python3 - "$TMP/catalog.json" <<'PY_BAD' +import json,sys +path=sys.argv[1]; obj=json.load(open(path)); obj['apps'][0]['packages'].pop() +open(path,'w').write(json.dumps(obj)) +PY_BAD +"$MANAGER" start install network-usage-monitor || fail 'partial package set did not queue' +grep -Fqx "$(printf 'code\tE27')" "$TMP/runtime/apps-operation.state" || fail 'partial package set accepted' +cp "$TMP/catalog-good.json" "$TMP/catalog.json" +# A repository signature/index failure must fail closed before any install. +export APPS_TEST_REPO_UPDATE_FAIL=1 +rm -f "$APPS_TEST_INDEX_READY" +"$MANAGER" start install network-usage-monitor || fail 'failed repository update did not queue' +grep -Fqx "$(printf 'code\tE34')" "$TMP/runtime/apps-operation.state" || fail 'failed repository update was accepted' +grep -Fq 'repository index update rejected' "$TMP/runtime/apps-last-error.log" || fail 'repository update error was not preserved' +[ ! -s "$APPS_TEST_INSTALLED" ] || fail 'failed repository update installed packages' +unset APPS_TEST_REPO_UPDATE_FAIL +cp "$TMP/catalog-good.json" "$TMP/catalog.json" +printf 'tampered APK\n' > "$TMP/repo/luci-lib-chartjs-26.288.56989~75a306d.apk" +"$MANAGER" start install network-usage-monitor || fail 'tampered APK did not queue' +grep -Fqx "$(printf 'code\tE33')" "$TMP/runtime/apps-operation.state" || fail 'modified APK accepted' +[ "$(wc -l < "$APPS_TEST_METRICS_LOG" | tr -d ' ')" -eq 1 ] || fail 'failed installation counted' + +printf 'PASS: Apps install/remove signed immutable release, three APKs, ownership and hash checks\n' + +# Self-built App publications must install from immutable signed releases. +if ! grep -Fq 'repo_url="$REPO_BASE/$channel/packages/$arch/smartsafehub/$publication"' "$MANAGER"; then + echo 'FAIL: signed immutable Apps package publication is missing' >&2 + exit 1 +fi + +# Retro Arcade is a single APK from the same signed feed. Verify readiness of +# its static entry point independently of the package-manager install state. +: > "$APPS_TEST_INSTALLED" +export SMARTSAFEHUB_APPS_WEB_ROOT="$TMP/www" +cat > "$TMP/catalog.json" < "$APPS_TEST_VERSION_DB" + +"$MANAGER" status +grep -Fq "$(printf 'retro-arcade\t1\t1\t1\t0')" "$TMP/runtime/apps-status.tsv" || fail 'Retro Arcade should not launch before its HTML exists' +mkdir -p "$TMP/www/retro-arcade" +printf 'retro entry\n' > "$TMP/www/retro-arcade/index.html" +"$MANAGER" status +grep -Fq "$(printf 'retro-arcade\t1\t1\t1\t1')" "$TMP/runtime/apps-status.tsv" || fail 'Retro Arcade entry point is not ready' +grep -Fqx "$(printf 'retro-arcade\t1\t1\t1\t1\t0\t1.0.0-r1')" "$TMP/runtime/apps-status.tsv" || fail 'installed Retro version missing' +"$MANAGER" sizes +grep -Fqx "$(printf 'retro-arcade\t13107200')" "$TMP/runtime/apps-size.tsv" || fail 'Retro Arcade size missing' +rm "$TMP/www/retro-arcade/index.html" +"$MANAGER" status +grep -Fq "$(printf 'retro-arcade\t1\t1\t1\t0')" "$TMP/runtime/apps-status.tsv" || fail 'removed Retro Arcade entry point still launches' +# A malformed catalog must not allow more than one approved Retro APK. +python3 - "$TMP/catalog.json" <<'PY_RETRO_BAD' +import json,sys +p=sys.argv[1]; data=json.load(open(p)); data['apps'][0]['packages'].append(data['apps'][0]['packages'][0]); open(p,'w').write(json.dumps(data)) +PY_RETRO_BAD +"$MANAGER" start install retro-arcade || fail 'invalid multi-APK Retro install should queue' +grep -Fqx "$(printf 'code\tE27')" "$TMP/runtime/apps-operation.state" || fail 'multiple Retro packages not rejected' +# Restore the catalog for safe removal of the original installed APK. +python3 - "$TMP/catalog.json" <<'PY_RETRO_GOOD' +import json,sys +p=sys.argv[1]; data=json.load(open(p)); data['apps'][0]['packages'].pop(); open(p,'w').write(json.dumps(data)) +PY_RETRO_GOOD +"$MANAGER" start remove retro-arcade || fail 'Retro Arcade removal did not queue' +[ ! -s "$APPS_TEST_INSTALLED" ] || fail 'Retro Arcade was not uninstalled' +printf 'PASS: Retro Arcade single APK, static entry point readiness and safe removal\n' + +# Restore the mock file deliberately corrupted by the earlier hash test. +printf 'approved chart mock package payload\n' > "$TMP/repo/luci-lib-chartjs-26.288.56989~75a306d.apk" +# A catalog may contain multiple apps. Each app must be visible to the +# installer and status reporter regardless of its position in the list. +: > "$APPS_TEST_INSTALLED" +rm -f "$TMP/owned/retro-arcade" "$TMP/owned/network-usage-monitor" +printf '%s\n' smartsafehub-app-retro-arcade > "$APPS_TEST_INSTALLED" +cat > "$TMP/catalog.json" < "$APPS_TEST_INSTALLED" +rm -f "$TMP/owned/network-usage-monitor" "$TMP/owned/retro-arcade" +: > "$APPS_TEST_VERSION_DB" +cat > "$TMP/catalog.json" < "$APPS_TEST_VERSION_DB" +receipt_before="$(wc -l < "$APPS_TEST_METRICS_LOG" | tr -d ' ')" +printf 'new signed Retro payload\n' > "$TMP/repo/smartsafehub-app-retro-arcade-1.1.0-r1.apk" +NEWRETROSHA="$(sha256sum "$TMP/repo/smartsafehub-app-retro-arcade-1.1.0-r1.apk" | cut -d ' ' -f 1)" +python3 - "$TMP/catalog.json" "$NEWRETROSHA" <<'PY_UPDATE' +import json,sys +p=sys.argv[1]; data=json.load(open(p)); app=data['apps'][0] +app['version']='1.1.0-r1'; app['packages'][0]['version']='1.1.0-r1' +app['packages'][0]['sha256']=sys.argv[2] +open(p,'w').write(json.dumps(data)) +PY_UPDATE +"$TMP/bin/fetch-catalog" +"$MANAGER" status +grep -Fqx "$(printf 'retro-arcade\t1\t1\t1\t0\t1\t1.0.0-r1')" "$TMP/runtime/apps-status.tsv" || fail 'new approved release hid installed 1.0.0-r1' +# Prevent core upgrades even if the APK solver proposes them. +export APPS_TEST_UPGRADE=1 +"$MANAGER" start update retro-arcade || fail 'unrelated package simulation did not queue' +grep -Fqx "$(printf 'code\tE53')" "$TMP/runtime/apps-operation.state" || fail 'unrelated system upgrade was not blocked' +grep -Fq "$(printf 'smartsafehub-app-retro-arcade\t1.0.0-r1\t')" "$TMP/owned/retro-arcade" || fail 'failed simulation changed ownership' +unset APPS_TEST_UPGRADE +# Reject altered signed payloads before mutation. +printf 'tampered\n' > "$TMP/repo/smartsafehub-app-retro-arcade-1.1.0-r1.apk" +"$MANAGER" start update retro-arcade || fail 'tampered update did not queue' +grep -Fqx "$(printf 'code\tE33')" "$TMP/runtime/apps-operation.state" || fail 'tampered update was not rejected' +printf 'new signed Retro payload\n' > "$TMP/repo/smartsafehub-app-retro-arcade-1.1.0-r1.apk" +"$MANAGER" start update retro-arcade || fail 'approved update did not queue' +grep -Fqx "$(printf 'phase\tsuccess')" "$TMP/runtime/apps-operation.state" || fail 'approved update did not succeed' +grep -Fqx "$(printf 'smartsafehub-app-retro-arcade\t1.1.0-r1\t%s' "$NEWRETROSHA")" "$TMP/owned/retro-arcade" || fail 'new version manifest not committed' +[ "$(awk '$1 == "smartsafehub-app-retro-arcade" {print $2}' "$APPS_TEST_VERSION_DB")" = 1.1.0-r1 ] || fail 'mock apk version did not update' +[ "$(wc -l < "$APPS_TEST_METRICS_LOG" | tr -d ' ')" -eq "$((receipt_before + 1))" ] || fail 'successful upgrade not recorded exactly once' +grep -Eq '^enqueue retro-arcade 1\.1\.0-r1 [0-9]+-[0-9]+-[a-f0-9]{16} update$' "$APPS_TEST_METRICS_LOG" || fail 'update receipt kind/version incorrect' +[ "$(awk '$1 == "enqueue" && $5 == "update" { n++ } END {print n+0}' "$APPS_TEST_METRICS_LOG")" -eq 1 ] || fail 'upgrade counted as a new install or multiple updates' +"$MANAGER" status +grep -Fqx "$(printf 'retro-arcade\t1\t1\t1\t0\t0\t1.1.0-r1')" "$TMP/runtime/apps-status.tsv" || fail 'installed version not updated after APK upgrade' +# Update releases may appear alongside older APK index metadata: the size +# must match the installed version, even if the older version appears first. +export APPS_TEST_SIZE_MIXED_RELEASES=1 +"$MANAGER" sizes +grep -Fqx "$(printf 'retro-arcade\t2097152')" "$TMP/runtime/apps-size.tsv" || fail 'updated Retro size lost when APK info listed multiple releases' +# Contradictory records for that same installed version are still rejected. +export APPS_TEST_SIZE_MIXED_RELEASES=conflicting +"$MANAGER" sizes +[ ! -s "$TMP/runtime/apps-size.tsv" ] || fail 'conflicting current APK release size must be omitted' +unset APPS_TEST_SIZE_MIXED_RELEASES +"$MANAGER" start update retro-arcade || fail 'repeated update should report a no-op' +grep -Fqx "$(printf 'code\tE52')" "$TMP/runtime/apps-operation.state" || fail 'repeated update was not rejected' +[ "$(wc -l < "$APPS_TEST_METRICS_LOG" | tr -d ' ')" -eq "$((receipt_before + 1))" ] || fail 'no-op upgrade produced an event' +# Any attempt to downgrade a package must fail closed. +python3 - "$TMP/catalog.json" "$RETROSHA" <<'PY_DOWNGRADE' +import json,sys +p=sys.argv[1]; data=json.load(open(p)); app=data['apps'][0] +app['version']='1.0.0-r1'; app['packages'][0]['version']='1.0.0-r1' +app['packages'][0]['sha256']=sys.argv[2] +open(p,'w').write(json.dumps(data)) +PY_DOWNGRADE +"$TMP/bin/fetch-catalog" +"$MANAGER" status +grep -Fqx "$(printf 'retro-arcade\t1\t1\t1\t0\t0\t1.1.0-r1')" "$TMP/runtime/apps-status.tsv" || fail 'downgrade must not be advertised' +"$MANAGER" start update retro-arcade || fail 'downgrade did not queue' +grep -Fqx "$(printf 'code\tE52')" "$TMP/runtime/apps-operation.state" || fail 'downgrade was not refused' +# Installed APK changed outside Apps ownership: never perform another upgrade. +python3 - "$TMP/catalog.json" "$NEWRETROSHA" <<'PY_NEW' +import json,sys +p=sys.argv[1]; data=json.load(open(p)); app=data['apps'][0] +app['version']='1.1.0-r1'; app['packages'][0]['version']='1.1.0-r1' +app['packages'][0]['sha256']=sys.argv[2] +open(p,'w').write(json.dumps(data)) +PY_NEW +printf 'smartsafehub-app-retro-arcade 1.0.0-r1\n' > "$APPS_TEST_VERSION_DB" +"$MANAGER" start update retro-arcade || fail 'manual version change did not queue' +grep -Fqx "$(printf 'code\tE52')" "$TMP/runtime/apps-operation.state" || fail 'manual version drift not rejected' +printf 'PASS: selected-app signed updates, version checks, no core upgrades and no duplicate receipts\n' + +# Approved catalog and installed status are fetched independently. A mismatch +# across requests is not an orphan: only an Apps-owned manifest for a package +# that remains installed can mark an approval as retired. +python3 - "$TMP/catalog.json" <<'PY_RETIRED' +import json, sys +p = sys.argv[1] +data = json.load(open(p)) +data['apps'] = [] +with open(p, 'w') as fp: + json.dump(data, fp) +PY_RETIRED +"$TMP/bin/fetch-catalog" +"$MANAGER" status +grep -Fqx "$(printf 'retro-arcade\t0\t1\t1\t0\t0\t\t1')" "$TMP/runtime/apps-status.tsv" || fail 'a genuinely Apps-owned removed approval was not marked retired' +# Manual APK installations have no ownership manifest and must not be promoted +# to managed/retired Apps. Likewise, forged/corrupt ownership is ignored. +rm -f "$TMP/owned/retro-arcade" +"$MANAGER" status +[ ! -s "$TMP/runtime/apps-status.tsv" ] || fail 'manually installed APK falsely marked retired' +printf 'invalid manifest contents\n' > "$TMP/owned/retro-arcade" +"$MANAGER" status +[ ! -s "$TMP/runtime/apps-status.tsv" ] || fail 'invalid manifest falsely marked retired' +rm -f "$TMP/owned/retro-arcade" +printf 'PASS: catalog/status refresh races do not mistake manual APK installs for retired Apps\n' + +# Wake-on-LAN integrates with the same signed APK flow, but requires exactly +# etherwake + luci-app-wol. Its UI is NOT the etherwake helper executable. +printf 'signed index cache\n' > "$SMARTSAFEHUB_APPS_LUCI_INDEX_CACHE" +: > "$APPS_TEST_INSTALLED" +: > "$APPS_TEST_VERSION_DB" +cat > "$TMP/catalog.json" < "$SMARTSAFEHUB_APPS_LUCI_INDEX_CACHE" +"$MANAGER" start remove wake-on-lan || fail 'WOL removal not queued' +grep -Fqx "$(printf 'phase\tsuccess')" "$TMP/runtime/apps-operation.state" || fail 'WOL removal failed' +[ ! -e "$SMARTSAFEHUB_APPS_LUCI_INDEX_CACHE" ] || fail 'LuCI menu cache not invalidated after WOL removal' +[ ! -e "$TMP/owned/wake-on-lan" ] || fail 'WOL ownership not cleared' +[ ! -s "$APPS_TEST_INSTALLED" ] || fail 'WOL left installed APKs behind' +# An extra/omitted package in a bad catalog must be rejected before any APK +# download/install, even if the index and SHA values look valid. +python3 - "$TMP/catalog.json" <<'PY_WOL_EXTRA' +import json,sys +p=sys.argv[1]; data=json.load(open(p)) +data['apps'][0]['packages'].append({'name':'luci-app-nlbwmon','version':'26.288.56989~75a306d','sha256': 'b'*64}) +open(p,'w').write(json.dumps(data)) +PY_WOL_EXTRA +"$MANAGER" start install wake-on-lan || fail 'bad WOL catalog not queued' +grep -Fqx "$(printf 'code\tE27')" "$TMP/runtime/apps-operation.state" || fail 'WOL extra APK was not rejected' +[ ! -s "$APPS_TEST_INSTALLED" ] || fail 'invalid WOL feed changed package state' +[ ! -e "$TMP/owned/wake-on-lan" ] || fail 'invalid WOL feed wrote ownership' +python3 - "$TMP/catalog.json" <<'PY_WOL_MISSING' +import json,sys +p=sys.argv[1]; data=json.load(open(p)) +data['apps'][0]['packages']=data['apps'][0]['packages'][:1] +open(p,'w').write(json.dumps(data)) +PY_WOL_MISSING +"$MANAGER" start install wake-on-lan || fail 'incomplete WOL catalog not queued' +grep -Fqx "$(printf 'code\tE27')" "$TMP/runtime/apps-operation.state" || fail 'missing WOL LuCI APK was not rejected' +printf 'PASS: Wake-on-LAN signed dual-APK lifecycle, LuCI route and corrupt approvals\n' diff --git a/luci-app-smartsafehub/tests/test-apps-metrics.sh b/luci-app-smartsafehub/tests/test-apps-metrics.sh new file mode 100755 index 000000000..7a57a4a00 --- /dev/null +++ b/luci-app-smartsafehub/tests/test-apps-metrics.sh @@ -0,0 +1,91 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-or-later +set -eu +ROOT="$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)" +HELPER="$ROOT/root/usr/libexec/smartsafehub-apps-metrics" +MANAGER="$ROOT/root/usr/libexec/smartsafehub-apps-manager" +DEVICE="$ROOT/root/usr/libexec/smartsafehub-device" +RESTORE="$ROOT/root/usr/libexec/smartsafehub-apps-restore" +TMP="$(mktemp -d)" +trap 'rm -rf "$TMP"' EXIT HUP INT TERM +fail() { echo "FAIL: $*" >&2; exit 1; } +mkdir -p "$TMP/bin" "$TMP/pending" +cat > "$TMP/bin/jsonfilter" <<'SH2' +#!/bin/sh +exec python3 - "$@" <<'PY' +import json, sys +args = sys.argv[1:] +obj = json.load(open(args[args.index('-i') + 1])) +key = args[args.index('-e') + 1].removeprefix('@.') +if key in obj: print(obj[key]) +PY +SH2 +cat > "$TMP/bin/uclient-fetch" <<'SH2' +#!/bin/sh +[ "$APPS_METRICS_TEST_MODE" = fail ] && exit 1 +while [ "$#" -gt 0 ]; do + case "$1" in + -O) out="$2"; shift 2;; + --post-file=*) body="${1#--post-file=}"; shift;; + --header=Authorization:*) auth="$1"; shift;; + *) shift;; + esac +done +[ -n "${auth:-}" ] && [ -n "${body:-}" ] || exit 1 +cp "$body" "$APPS_METRICS_TEST_LAST_BODY" +printf '{"status":"%s"} +' "$APPS_METRICS_TEST_MODE" > "$out" +SH2 +chmod +x "$TMP/bin/"* +export SMARTSAFEHUB_APPS_METRICS_DIR="$TMP/pending" +export SMARTSAFEHUB_APPS_METRICS_CREDENTIAL="$TMP/credential.json" +export SMARTSAFEHUB_APPS_METRICS_FETCH_BIN="$TMP/bin/uclient-fetch" +export SMARTSAFEHUB_APPS_JSONFILTER_BIN="$TMP/bin/jsonfilter" +export APPS_METRICS_TEST_MODE=fail +export APPS_METRICS_TEST_LAST_BODY="$TMP/last-body.json" +EVENT=1793170000-4321-1234567890abcdef +"$HELPER" enqueue retro-arcade 1.0.0-r1 "$EVENT" +[ "$(find "$TMP/pending" -name '*.json' | wc -l | tr -d ' ')" -eq 1 ] || fail 'receipt not queued' +"$HELPER" enqueue retro-arcade 1.0.0-r1 "$EVENT" +[ "$(find "$TMP/pending" -name '*.json' | wc -l | tr -d ' ')" -eq 1 ] || fail 'same event duplicated' +"$HELPER" enqueue '../../etc/passwd' x "$EVENT" >/dev/null 2>&1 && fail 'unsafe app ID accepted' +"$HELPER" enqueue retro-arcade 1.0.0-r1 "$EVENT" invalid >/dev/null 2>&1 && fail 'invalid event kind accepted' +"$HELPER" enqueue retro-arcade 1.0.0-r1 "$EVENT" update extra >/dev/null 2>&1 && fail 'extra event fields accepted' +"$HELPER" enqueue retro-arcade x 'bad/id' >/dev/null 2>&1 && fail 'unsafe event accepted' +"$HELPER" flush +[ -f "$TMP/pending/$EVENT.json" ] || fail 'unregistered device lost receipt' +printf '{"token":"ssh_dev_%064d"} +' 0 > "$TMP/credential.json" +"$HELPER" flush >/dev/null 2>&1 && fail 'failed upload returned success' +[ -f "$TMP/pending/$EVENT.json" ] || fail 'offline request lost receipt' +export APPS_METRICS_TEST_MODE=recorded +"$HELPER" flush +[ ! -f "$TMP/pending/$EVENT.json" ] || fail 'acknowledged event not cleared' +grep -Fq '"app_id":"retro-arcade"' "$TMP/last-body.json" || fail 'app ID lost' +grep -Fq '"kind":"install"' "$TMP/last-body.json" || fail 'legacy install kind lost' +# The same device can report a newer app release as an update; retry must +# preserve the kind and event ID without changing the install counter. +UPDATE_EVENT=1793170001-4322-abcdef1234567890 +"$HELPER" enqueue retro-arcade 1.1.0-r5 "$UPDATE_EVENT" update +[ "$(find "$TMP/pending" -name '*.json' | wc -l | tr -d ' ')" -eq 1 ] || fail 'update receipt not queued' +grep -Fq '"kind":"update"' "$TMP/pending/$UPDATE_EVENT.json" || fail 'update recorded as install' +export APPS_METRICS_TEST_MODE=fail +"$HELPER" flush >/dev/null 2>&1 && fail 'failed update upload returned success' +[ -f "$TMP/pending/$UPDATE_EVENT.json" ] || fail 'update receipt lost on failure' +export APPS_METRICS_TEST_MODE=recorded +"$HELPER" flush +[ ! -f "$TMP/pending/$UPDATE_EVENT.json" ] || fail 'updated receipt not acknowledged' +grep -Fq '"kind":"update"' "$TMP/last-body.json" || fail 'update kind lost over HTTP' +"$HELPER" enqueue retro-arcade 1.0.0-r1 "$EVENT" +export APPS_METRICS_TEST_MODE=duplicate +"$HELPER" flush +[ ! -f "$TMP/pending/$EVENT.json" ] || fail 'deduplicated event not cleared' +! grep -Eiq '(credential|mac|ip_address|device_uuid|user)' "$TMP/last-body.json" || fail 'private metadata uploaded' +grep -Fq '"$METRICS" enqueue "$app" "$version" "$operation_id" "$action"' "$MANAGER" || fail 'successful installation/update not queued' +grep -Fq '[ "$source" = user ]' "$MANAGER" || fail 'restores are included in download count' +grep -Fq 'start install "$id" restore' "$RESTORE" || fail 'restore source missing' +grep -Fq '"$APPS_METRICS" flush' "$DEVICE" || fail 'background queue retry missing' +grep -Fxq '/etc/smartsafehub/apps-metrics-pending/' "$ROOT/root/lib/upgrade/keep.d/smartsafehub-apps" || fail 'sysupgrade lost pending receipts' +sh -n "$HELPER" "$MANAGER" "$DEVICE" "$RESTORE" || fail 'shell syntax invalid' +printf 'PASS: authenticated Apps install/update receipt queue, retry, dedup and restore exclusion +' diff --git a/luci-app-smartsafehub/tests/test-apps-restore.sh b/luci-app-smartsafehub/tests/test-apps-restore.sh new file mode 100755 index 000000000..20eb26155 --- /dev/null +++ b/luci-app-smartsafehub/tests/test-apps-restore.sh @@ -0,0 +1,98 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-or-later +set -eu +ROOT="$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)" +RESTORE="$ROOT/root/usr/libexec/smartsafehub-apps-restore" +TMP="$(mktemp -d)" +trap 'rm -rf "$TMP"' EXIT HUP INT TERM +fail() { echo "FAIL: $*" >&2; exit 1; } +mkdir -p "$TMP/runtime" "$TMP/owned" "$TMP/bin" +cat > "$TMP/bin/apk" <<'MOCK' +#!/bin/sh +[ "$1" = info ] && [ "$2" = -e ] || exit 2 +grep -qxF "$3" "$RESTORE_TEST_INSTALLED" 2>/dev/null +MOCK +cat > "$TMP/bin/manager" <<'MOCK' +#!/bin/sh +[ "$1" = start ] && [ "$2" = install ] && [ "$3" = network-usage-monitor ] && [ "$4" = restore ] || exit 4 +printf '%s\n' "$3" >> "$RESTORE_TEST_CALLS" +case "${RESTORE_TEST_MODE:-success}" in + busy) exit 3;; + offline) + code=E21 + phase=failed;; + revoked) + code=E22 + phase=failed;; + success) + printf 'nlbwmon\nluci-app-nlbwmon\nluci-lib-chartjs\n' > "$RESTORE_TEST_INSTALLED" + code=NONE + phase=success;; +esac +printf 'phase\t%s\naction\tinstall\napp_id\t%s\ncode\t%s\n' "$phase" "$3" "$code" > "$SMARTSAFEHUB_APPS_RUNTIME_DIR/apps-operation.state" +MOCK +cat > "$TMP/bin/sleep" <<'MOCK' +#!/bin/sh +exit 0 +MOCK +chmod +x "$TMP/bin/"* +export SMARTSAFEHUB_APPS_MANAGER_BIN="$TMP/bin/manager" +export SMARTSAFEHUB_APPS_APK_BIN="$TMP/bin/apk" +export SMARTSAFEHUB_APPS_RESTORE_SLEEP_BIN="$TMP/bin/sleep" +export SMARTSAFEHUB_APPS_RESTORE_START_DELAY=0 +export SMARTSAFEHUB_APPS_RESTORE_RETRIES=2 +export SMARTSAFEHUB_APPS_RESTORE_RETRY_DELAY=0 +export SMARTSAFEHUB_APPS_RESTORE_POLL_INTERVAL=0 +export SMARTSAFEHUB_APPS_RESTORE_POLL_LIMIT=2 +export SMARTSAFEHUB_APPS_RUNTIME_DIR="$TMP/runtime" +export SMARTSAFEHUB_APPS_OWNED_DIR="$TMP/owned" +export RESTORE_TEST_INSTALLED="$TMP/installed" +export RESTORE_TEST_CALLS="$TMP/calls" +: > "$RESTORE_TEST_CALLS" +: > "$RESTORE_TEST_INSTALLED" +# No ownership record (or one from a removed app) must never install packages. +"$RESTORE" run +[ ! -s "$RESTORE_TEST_CALLS" ] || fail 'fresh device tried to restore an app' +# A malformed manifest must never invoke the package manager. +printf 'evil\t1\tbadsha\n' > "$TMP/owned/network-usage-monitor" +"$RESTORE" run +[ ! -s "$RESTORE_TEST_CALLS" ] || fail 'invalid manifest triggered package installation' +grep -Fqx "$(printf 'code\tINVALID_MANIFEST')" "$TMP/runtime/apps-restore.state" || fail 'invalid manifest was not diagnosed' +# The persisted manifest contains only Apps-owned packages. A previously shared +# chart dependency must not be recorded as owned. +HASH="$(printf %064d 0)" +printf 'nlbwmon\t2025.06.02~29236be6-r1\t%s\nluci-app-nlbwmon\t26.288.56989~75a306d\t%s\n' "$HASH" "$HASH" > "$TMP/owned/network-usage-monitor" +export RESTORE_TEST_MODE=offline +"$RESTORE" run +[ "$(wc -l < "$RESTORE_TEST_CALLS" | tr -d ' ')" -eq 2 ] || fail 'network error retry was not bounded' +grep -Fqx "$(printf 'code\tE21')" "$TMP/runtime/apps-restore.state" || fail 'network failure state missing' +: > "$RESTORE_TEST_CALLS" +export RESTORE_TEST_MODE=revoked +"$RESTORE" run +[ "$(wc -l < "$RESTORE_TEST_CALLS" | tr -d ' ')" -eq 1 ] || fail 'revoked approval was retried' +grep -Fqx "$(printf 'code\tE22')" "$TMP/runtime/apps-restore.state" || fail 'revoked approval error missing' +: > "$RESTORE_TEST_CALLS" +export RESTORE_TEST_MODE=success +"$RESTORE" run +[ "$(wc -l < "$RESTORE_TEST_CALLS" | tr -d ' ')" -eq 1 ] || fail 'owned app not restored exactly once' +grep -Fqx "$(printf 'phase\tsuccess')" "$TMP/runtime/apps-restore.state" || fail 'restore success not recorded' +"$RESTORE" run +[ "$(wc -l < "$RESTORE_TEST_CALLS" | tr -d ' ')" -eq 1 ] || fail 'already installed app was reinstalled' +# Apps remove deletes the ownership file. Never recreate it on future boots. +rm -f "$TMP/owned/network-usage-monitor" +: > "$RESTORE_TEST_INSTALLED" +"$RESTORE" run +[ "$(wc -l < "$RESTORE_TEST_CALLS" | tr -d ' ')" -eq 1 ] || fail 'removed app was restored' +# Structural contracts: ownership backup, existing firmware service hook and +# shared RPC status. Do not regress to another procd/init daemon. +grep -Fxq '/etc/smartsafehub/apps-installed/' "$ROOT/root/lib/upgrade/keep.d/smartsafehub-apps" || fail 'sysupgrade backup missing' +[ ! -e "$ROOT/root/etc/init.d/smartsafehub-apps-restore" ] || fail 'extra Apps restore init service introduced' +[ ! -e "$ROOT/root/etc/uci-defaults/93-smartsafehub-apps-restore" ] || fail 'extra Apps restore service enable introduced' +grep -Fq 'start_apps_restore_once' "$ROOT/root/usr/libexec/smartsafehub-firmware" || fail 'existing firmware daemon does not schedule restore' +grep -Fq '"$APPS_RESTORE_BIN" run /dev/null 2>&1 &' "$ROOT/root/usr/libexec/smartsafehub-firmware" || fail 'restore is not a detached one-shot' +grep -Fq 'restore: restore_status()' "$ROOT/root/usr/share/rpcd/ucode/smartsafehub/apps-manager.uc" || fail 'restore status missing from RPC' +grep -Fq 'E21|E25|E31|E35|BUSY' "$ROOT/root/etc/hotplug.d/iface/98-smartsafehub-apps-restore" || fail 'WAN retry safety contract missing' +grep -Fq '"$RUNNER" run /dev/null 2>&1 &' "$ROOT/root/etc/hotplug.d/iface/98-smartsafehub-apps-restore" || fail 'WAN should trigger the one-shot worker directly' +! grep -Fq '"$APK" add' "$RESTORE" || fail 'restore runner must not invoke APK directly' +[ -x "$RESTORE" ] || fail 'restore worker is not executable' +printf 'PASS: sysupgrade Apps restoration without new daemon, retry, revocation and ownership\n' diff --git a/luci-app-smartsafehub/tests/test-apps-ui.sh b/luci-app-smartsafehub/tests/test-apps-ui.sh new file mode 100755 index 000000000..fd3fdbeab --- /dev/null +++ b/luci-app-smartsafehub/tests/test-apps-ui.sh @@ -0,0 +1,243 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-or-later +set -eu +ROOT="$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)" +python3 - "$ROOT" <<'PY' +from pathlib import Path +import sys + +root = Path(sys.argv[1]) +page = (root / 'frontend/src/pages/AppsPage.tsx').read_text() +styles = (root / 'frontend/src/styles/app.css').read_text() +package = (root / 'Makefile').read_text() + + +def check(ok, message): + if not ok: + raise AssertionError(message) + + +# Version/revision validity is covered by test-package-contract.sh. +check('border-teal-300 text-teal-800 hover:bg-teal-50' in page, 'install should stay teal') +check('border-red-300 text-red-700 hover:bg-red-50' in page, 'removal must be red outline') +check('hover\\:bg-red-50:hover' in styles, 'red hover needs an explicit dark-mode style') +check('rgb(239 68 68 / 0.16)' in styles, 'dark-mode removal hover should be subtle') +check('ssh-apps-installed-badge' in page and 'ssh-apps-update-badge' in page and + 'ssh-apps-update-button' in page, + 'installed, update notice and update action need distinct styles') +check('.ssh-apps-update-button' in styles and ".ssh-app[data-theme='dark'] .ssh-apps-update-button" in styles, + 'update action must have a distinct dark-mode style') + + +# App installation storage must refer to the writable APK filesystem. +backend = (root / 'root/usr/share/rpcd/ucode/smartsafehub/apps-manager.uc').read_text() +card = (root / 'frontend/src/components/AppsStorageCard.tsx').read_text() +utils = (root / 'frontend/src/utils/appsStorage.ts').read_text() +check("safe_call('system', 'info', {})" in backend and + "from_system_root(info?.root)" in backend, + 'Apps disk data must prefer procd system.info root stats') +check("from_statvfs(stats, mount)" in backend and "[ '/overlay', '/' ]" in backend, + 'statvfs fallback must support overlay and ext4 rootfs') +storage_module = (root / 'root/usr/share/rpcd/ucode/smartsafehub/apps-storage.uc').read_text() +check("type(value) == 'int'" in storage_module and "type(value) == 'double'" in storage_module, + 'ucode type() emits int/double and must never require integer') +check("root.total * 1024" in storage_module and "root.avail * 1024" in storage_module, + 'procd system.info root counters are KiB, not raw bytes') +check("MAX_BYTES / frsize" in storage_module, + 'unexpected statvfs counters must not overflow safe byte values') +check('stats.bavail' in storage_module and 'stats.frsize' in storage_module and 'storage: storage' in backend, + 'optional Apps metrics must report actual APK-available bytes without spawning df') +check('read_apps_metrics(request)' in backend and 'restore: restore_status(), installed: installed' in backend, + 'critical Apps status must be separate from optional storage metrics') +check("ensure_job('sizes')" in backend and "ensure_job('status')" in backend, + 'APK scan must execute asynchronously and independently from RPC status') +check('apps_metrics:' in (root / 'root/usr/share/rpcd/ucode/smartsafehub.uc').read_text(), + 'metrics RPC must be independently accessible') +import json +acl = json.loads((root / 'root/usr/share/rpcd/acl.d/luci-app-smartsafehub.json').read_text()) +check('apps_metrics' in acl['luci-app-smartsafehub']['read']['ubus']['smartsafehub'], + 'critical regression: Apps metrics RPC is missing from LuCI read ACL') +check('fetchAppsMetrics' in (root / 'frontend/src/app/App.tsx').read_text() and + '!data?.ready ? 3_000 : 60000' in (root / 'frontend/src/app/App.tsx').read_text(), + 'optional Apps metrics should run separately and less frequently') +check("'/bin/df'" not in backend and "'/bin/df'" not in storage_module, 'storage must not spawn a polling command') +check('lg:grid-cols-[minmax(0,1fr)_minmax(0,18.5rem)]' in page, + 'Apps storage should be a compact fixed-width column on desktop, stacked on mobile') +check('ssh-apps-storage-card' in card and 'size-24' in card and 'gap-3' in card and 'sm:p-5' not in card, + 'storage card must be compact without hiding the donut or capacity data') +check('' in page, + 'Apps storage should be read from independent optional metrics') +check('stroke-dasharray=' in card and 'aria-label="앱 설치 저장 공간"' in card, + 'storage donut must be accessible and use SVG') +check('Math.PI * 39' in card and 'r="39"' in card and card.count('size-24') == 2, + 'storage donut needs a larger ring and enough room around the center label') +check('용량 정보를 확인할 수 없습니다.' in card and 'summarizeAppsStorage(storage)' in card, + 'storage errors and older RPC responses need a safe fallback') +check('storage.availableBytes > storage.totalBytes' in utils, + 'malformed storage reports must be rejected') +check('usedText: formatStorageBytes(storage.totalBytes - storage.availableBytes)' in utils, + 'used storage must be derived from validated total and APK-available counters') +check('사용 {summary.usedText} / 전체 {summary.totalText}' in card, + 'storage card must show used and total bytes without increasing its height') +check('파일시스템 예약 공간' in card and '앱 설치 가능 공간

' not in card, + 'capacity breakdown must explain reserved space and avoid redundant footer') +check(".ssh-app[data-theme='dark'] .ssh-apps-storage-track" in styles and + "[data-level='critical']" in styles, + 'donut must support dark mode and dangerously low storage') + +# Per-app size reflects the installed APK package metadata only (no du scan). +manager = (root / 'root/usr/libexec/smartsafehub-apps-manager').read_text() +check('installed_size_bytes() {' in manager and '"$APK" info -s "$name"' in manager, + 'Apps installed size should query each package independently') +check('du -' not in manager and 'find /' not in manager, + 'installed size must not recursively scan the router filesystem') +check('installedSizes[fields[0]]' in backend and 'length(fields) != 2' in backend and + 'installedBytes:' not in backend and 'installedVersion:' in backend, + 'package size data must be parsed separately from the six-column status') +check('sizes) mkdir -p "$RUNTIME"; sizes;;' in manager and 'installed_size_bytes "$name"' in manager, + 'optional sizes command must report app APK totals without modifying status') +check('apps-size-diag' not in manager and 'diagnostic=' not in manager, + 'optional size checks must not create the retired diagnostics TSV') +check('rm -f /tmp/smartsafehub/apps-size-diagnostics.tsv' in package, + 'package upgrade must clean up the retired runtime diagnostic file') +check('app_bytes=' not in manager and 'set --' not in manager.split('sizes() {')[0].split('status() {')[1], + 'status must not invoke optional size processing') +check('sizeLabel !== null' in page and '설치 용량 약 {sizeLabel}' in page, + 'installed app card must show a real size only when known') +check('showOfferedVersion || sizeLabel !== null' in page and + 'showOfferedVersion && sizeLabel !== null' in page and + 'flex-wrap items-center gap-x-1.5' in page, + 'offered version and installed size must share a compact wrapping metadata row') +check(page.count('설치 용량 약 {sizeLabel}') == 1 and page.count('제공 v{app.version}') == 1, + 'Apps metadata must not duplicate version or installed size rows') +check('Number.isSafeInteger(bytes)' in page and 'installed && typeof bytes' in page and 'metrics?.installedSizes' in page, + 'missing or invalid sizes must not be guessed') +check('캐시는 포함되지 않습니다' in page, + 'metadata size must not be misrepresented as actual overlay consumption') +check('installedVersion?: string | null' in (root / 'frontend/src/types/apps.ts').read_text(), + 'installed APK version must have a typed field') +check('installed_release="$(installed_version "$primary_package" || :)"' in manager and + '"$update_ready" "$installed_release"' in manager, + 'current APK version must originate from installed package metadata') +check('installedVersion: length(fields) >= 7' in backend and + 'match(fields[6]' in backend, + 'RPC parser must validate installed APK version') +check('설치 v${installedVersion}' in page and '제공 v{app.version}' in page, + 'installed and approved versions must have independent labels') +check('업데이트 가능' in page and '설치 버전 확인 불가' in page, + 'updates must be distinguished from unknown installed versions') + +# Category icons are local, consistent across cards and filters, and safe +# for unknown/future catalog categories. No external icon service or assets. +icon_source = (root / 'frontend/src/components/AppsCategoryIcon.tsx').read_text() +shared_icons = (root / 'frontend/src/components/Icons.tsx').read_text() +check('AppsCategoryIcon, appsCategoryOf' in page and + '' in page and + '' in page, + 'filters and cards must share category-specific icons in appropriately sized frames') + +check('class="grid size-14 shrink-0 place-items-center rounded-xl bg-slate-100 text-slate-600"' in page, + 'app card category icon frame must be 56px and align with the installed size row') +check('' in page and + 'class="grid size-11 shrink-0 place-items-center' not in page, + 'app category icon itself must be 28px while retaining the 56px frame') +check('' in page, + 'category filter icons must remain compact and not change touch targets') +check('appsCategoryOf(app.category) === category' in page, + 'icon categorization and filtering must use the same normalization') +check('aria-label="앱 카테고리"' in page and '>{tab.label}' in page and + 'inline-flex min-h-10 items-center gap-1.5' in page, + 'filter icons must retain text labels, touch targets and wrapping') +for catalog_key, category_key in [('network', 'network'), ('security', 'security'), + ('entertainment', 'entertainment'), ('smart_home', 'smart_home'), + ('iot', 'smart_home')]: + check(f"case '{catalog_key}':" in icon_source, + f'category {catalog_key} must be explicitly mapped to {category_key}') +for tab_key, icon_name in [('all', 'AppsIcon'), ('network', 'NetworkNodesIcon'), + ('security', 'ShieldIcon'), ('smart_home', 'HomeIcon'), + ('entertainment', 'GamepadIcon')]: + check(f"case '{tab_key}': return <{icon_name}" in icon_source, + f'{tab_key} category has the wrong icon') +check("default: return 'other';" in icon_source and + 'default: return ' in shared_icons and + 'M8 12h.01M12 12h.01M16 12h.01' in shared_icons and + '3.106-3.105' in shared_icons, + 'tools use a wrench, other uses a circle ellipsis, not network-like nodes') +check('aria-hidden={title ? undefined : true}' in shared_icons and + 'fill="none"' in shared_icons and 'stroke="currentColor"' in shared_icons, + 'icons must be decorative line SVGs that inherit light/dark text color') +check('https://' not in icon_source and '이전 목록' in page, 'cached catalog should have a compact non-blocking stale marker') +check('state.retired === true && state.managed' in page and '!error && !loading && !refreshing' in page, + 'retirement must require explicit backend proof and a complete catalog') +status_rpc = (root / 'root/usr/share/rpcd/ucode/smartsafehub/apps-manager.uc').read_text() +check("retired: length(fields) == 8 && fields[7] == '1'" in status_rpc, + 'retired status must originate only from a signed-off local owner manifest record') +check('retired?: boolean;' in (root / 'frontend/src/types/apps.ts').read_text(), + 'retired proof must be optional for older router responses') + +# Removal never calls onRemove from a card or from the orphan-list button. +check("onClick={(event) => removable ? openRemoveDialog(app, event.currentTarget)" in page, + 'catalog removal must open confirmation') +check("onClick={(event) => openRemoveDialog({ id, name: id" in page, + 'orphaned apps must open the same confirmation') +check("onClick={() => void requestOperation(removeTarget, 'remove')}" in page, + 'dialog approval must be the only removal confirmation action') +check(page.count('onRemove(app.id)') == 1, 'only the accepted operation may call the remove RPC callback') +check('aria-modal="true"' in page and 'aria-labelledby="apps-remove-title"' in page, + 'remove confirmation must be accessible') +check('취소' in page and '앱 제거' in page, 'dialog must offer both choices') +check("if (event.key === 'Escape')" in page and "event.key !== 'Tab'" in page, + 'dialog must support escape and focus containment') +check("if (action === 'remove') closeRemoveDialog()" in page, + 'confirmed operation should close the modal before starting') +check("if (!installStatus || statusError || pending !== null || running || restoring) return;" in page, + 'operation must preserve status and concurrency guards') + +# Installing still uses the existing confirmation and neither action bypasses RPC guards. +check("action === 'install' && !window.confirm" in page, 'existing install confirmation must remain') +check("" in page, 'loading must show on app and orphan entries') +check("{removing ? '제거 중…' : action === 'update' ? '업데이트 중…' : '설치 중…'}" in page, + 'install, update and remove must show distinct spinner states') +check("job.action === 'remove' ? '앱 제거 중' : job.action === 'update' ? '앱 업데이트 중' : '앱 설치 중'" in page, + 'running job status must use the action name') +check("job.phase === 'failed' ? 'border-rose-200 bg-rose-50 text-rose-800'" in page, + 'errors must keep a red alert') +check('useState(readDismissedAppsJob)' in page, + 'dismissal must be restored after refreshing Apps') +check('saveDismissedAppsJob(key)' in page and 'onClick={() => dismissJob(jobKey)}' in page, + 'dismissing a job should persist the dismissed operation ID') +check("onClick={() => void requestOperation(app, 'update')}" in page, 'approved update action must be shown') +check('setDismissedJob(null)' not in page, + 'starting a new operation must not resurrect the previous failure') +PY +echo 'PASS: Apps removal confirmation, theme and operation states' + +# Real ucode runtime coverage: prevents wrong numeric type names and unit +# conversions from passing the static Apps UI contract again. +if command -v ucode >/dev/null 2>&1; then + ucode "$ROOT/tests/apps-storage-test.uc" +elif [ "${SMARTSAFEHUB_REQUIRE_UCODE:-0}" = '1' ]; then + echo 'FAIL: Apps storage runtime test requires ucode' >&2 + exit 1 +fi diff --git a/luci-app-smartsafehub/tests/test-changelog-spacing.sh b/luci-app-smartsafehub/tests/test-changelog-spacing.sh new file mode 100755 index 000000000..11890e156 --- /dev/null +++ b/luci-app-smartsafehub/tests/test-changelog-spacing.sh @@ -0,0 +1,28 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-or-later +set -eu + +ROOT_DIR="$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)" +python3 - "$ROOT_DIR/CHANGELOG.md" <<'PYTEST' +from pathlib import Path +import sys + +lines = Path(sys.argv[1]).read_text(encoding="utf-8").splitlines() +releases = [index for index, line in enumerate(lines) if line.startswith("## [")] +if len(releases) < 2: + raise SystemExit("FAIL: CHANGELOG must contain multiple releases") + +for index in releases[1:]: + previous = index - 1 + while previous >= 0 and not lines[previous].strip(): + if lines[previous]: + raise SystemExit(f"FAIL: whitespace-only line before release at {index + 1}") + previous -= 1 + blank_lines = index - previous - 1 + if blank_lines != 2: + raise SystemExit( + f"FAIL: release at line {index + 1} has {blank_lines} blank lines; expected 2" + ) + +print(f"PASS: {len(releases)} CHANGELOG releases have two blank lines between entries") +PYTEST diff --git a/luci-app-smartsafehub/tests/test-daemon-runtime.sh b/luci-app-smartsafehub/tests/test-daemon-runtime.sh index 7ee3e95c3..71b470122 100755 --- a/luci-app-smartsafehub/tests/test-daemon-runtime.sh +++ b/luci-app-smartsafehub/tests/test-daemon-runtime.sh @@ -43,4 +43,4 @@ for service in device health activity-sync; do grep -Fq 'ssh_runtime_execute' "$script" done grep -Eq '^PKG_RELEASE:=[0-9]+$' "$ROOT/Makefile" -echo 'daemon runtime checks: OK' +echo 'PASS: daemon runtime checks' diff --git a/luci-app-smartsafehub/tests/test-dashboard-performance-contract.sh b/luci-app-smartsafehub/tests/test-dashboard-performance-contract.sh index 5481aa39b..ec7e034d8 100755 --- a/luci-app-smartsafehub/tests/test-dashboard-performance-contract.sh +++ b/luci-app-smartsafehub/tests/test-dashboard-performance-contract.sh @@ -15,6 +15,12 @@ assert "useFirmwareUpdates(true)" in app # sidebar firmware badge stays current assert 'if (loading && !data)' in home assert "let info_finished = false" in server and "let wan_finished = false" in server assert server.index("const info_request = defer_call('system', 'info'") < server.index("const wan_request = defer_call('network.interface.wan'") +assert "storage: dashboard_writable_storage(info?.root)" in server +assert "storage: dashboard_writable_storage(info?.root)" in server[server.index('function system_status_payload('):server.index('function collect_system_status(')] +assert "const from_root = from_system_root(root)" in server, 'procd root counters must be the fast path' +fallback = server[server.index('function dashboard_writable_storage(root)'):server.index('function system_status_payload(')] +assert "from_statvfs(fs.statvfs(mount), mount)" in fallback, 'local statvfs should recover missing root counters' +assert "run_command" not in fallback and "defer_call" not in fallback, 'extra process or ubus call not allowed for storage' for hook in ('useSoftwareUpdates', 'useFirmwareUpdates'): source = Path(f'frontend/src/hooks/{hook}.ts').read_text() assert 'const [pollingPhase, setPollingPhase]' in source diff --git a/luci-app-smartsafehub/tests/test-dashboard-ui-contract.sh b/luci-app-smartsafehub/tests/test-dashboard-ui-contract.sh index 73f2ddbc2..e78882ef7 100755 --- a/luci-app-smartsafehub/tests/test-dashboard-ui-contract.sh +++ b/luci-app-smartsafehub/tests/test-dashboard-ui-contract.sh @@ -257,6 +257,68 @@ if grep -Fq '메모리 사용률' "$HOME"; then fail '대시보드는 메모리 사용률을 별도 블록으로 중복 표시하지 않아야 합니다' fi +# Disk belongs to the normal dashboard status payload; no Apps metrics polling. +python3 - "$HOME" "$ROOT_DIR/root/usr/share/rpcd/ucode/smartsafehub/system.uc" "$ROOT_DIR/frontend/src/types/status.ts" "$ROOT_DIR/frontend/src/demo/data.ts" <<'PY_DASH_DISK' +from pathlib import Path +import sys + +home, backend, types, demo = [Path(name).read_text() for name in sys.argv[1:]] +labels = [f'{title}' for title in + ('메모리', '디스크', '시스템 부하', '실행 시간')] +assert all(home.count(label) == 1 for label in labels), '리소스 카드 네 종류가 필요합니다' +assert [home.index(label) for label in labels] == sorted(home.index(label) for label in labels), '카드 순서 오류' +assert 'class="mt-5 grid min-w-0 grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-4"' in home, '데스크톱 4열, 태블릿 2열, 모바일 1열이 필요합니다' +assert 'summarizeAppsStorage(data.runtime.storage)' in home, 'Apps 저장 공간 계산을 재사용해야 합니다' +assert 'disk.availablePercent' in home and 'disk.availableText' in home, 'Apps와 동일한 여유 공간 표시가 필요합니다' +assert '사용 {disk.usedText} / 전체 {disk.totalText}' in home, '사용/전체 용량을 표시해야 합니다' +assert "disk.availableRatio * DISK_RING_CIRCUMFERENCE" in home, '실제 여유 비율로 도넛 호를 계산해야 합니다' +assert 'DISK_RING_CIRCUMFERENCE = 2 * Math.PI * 39' in home, 'Apps 도넛과 같은 반지름을 사용해야 합니다' +assert 'ssh-apps-storage-track' in home and 'ssh-apps-storage-free' in home and 'ssh-apps-storage-ring' in home, 'Apps의 테마 색상과 도넛 스타일을 재사용해야 합니다' +assert 'disk && disk.availableRatio > 0' in home, '여유 공간이 0인 경우 가짜 호를 그리면 안 됩니다' +assert "data-level={disk?.level ?? 'unavailable'}" in home, 'Apps와 같은 부족 경고 색상 상태가 필요합니다' +assert 'aria-label={disk' in home and '디스크 여유 공간 ${disk.availablePercent}%' in home, '스크린 리더에 저장 공간 정보를 제공해야 합니다' +assert "{disk ? `${disk.availableText} 남음` : '저장 공간 확인 불가'}" in home, '용량 조회 실패를 0%로 표시하면 안 됩니다' +assert 'diskUsedPercent' not in home, '기존 선형 사용률 막대 로직을 제거해야 합니다' +assert '[a-zA-Z_][a-zA-Z_0-9]*)\s*=\s*["\']?' + r'\$\{[a-zA-Z_][a-zA-Z_0-9]*:-(?P[a-zA-Z_][a-zA-Z_0-9.+-]*)\}' +) +# Shell syntax, builtins, environment assignments, and case patterns. +# Provided by /etc/rc.common and /etc/diag.sh, which are sourced at runtime. +SOURCED_FUNCTIONS = { + 'procd_add_reload_trigger', 'procd_close_instance', 'procd_open_instance', + 'procd_set_param', 'set_state', +} +# OpenWrt's standard rootfs does not ship curl. Device registration has a +# legacy *conditional* curl fallback; it uses the required uclient-fetch when +# curl is absent. Allow that existing branch only, never a new curl caller. +OPTIONAL_CURL_SOURCE = 'root/usr/libexec/smartsafehub-device' + + +def legacy_curl_is_guarded(source: str) -> bool: + """Verify every curl invocation is in the existing guarded branch.""" + match = re.search(r'^post_json\(\)\s*\{(?P.*?)^\}', source, + flags=re.MULTILINE | re.DOTALL) + if not match: + return False + body = match.group('body') + guard = re.search(r'^ if command -v curl >/dev/null 2>&1; then$', + body, flags=re.MULTILINE) + end_guard = re.search(r'^ fi$', body, flags=re.MULTILINE) + invocations = list(re.finditer(r'^\s*curl\s', source, flags=re.MULTILINE)) + if not guard or not end_guard or not invocations: + return False + # The fallback requires both authenticated and unauthenticated requests. + for invocation in invocations: + if not (match.start('body') + guard.end() <= invocation.start() < + match.start('body') + end_guard.start()): + return False + return True +INTERNAL = set(''' +if then elif else fi for in do done while until case esac function return exit +local export readonly set shift trap read eval exec command builtin type hash alias +unalias unset wait break continue cd pwd printf echo test true false time +umask ulimit getopts kill jobs fg bg select coproc +'''.split()) + + +def policy_names(path: Path) -> set[str]: + names = set() + for line in path.read_text(encoding='utf-8').splitlines(): + value = line.partition('#')[0].strip() + if not value: + continue + if not re.fullmatch(r'[a-z][a-z0-9._+-]*', value): + raise ValueError(f'invalid allowlisted command: {value}') + names.add(value) + if not names: + raise ValueError('empty command policy') + return names + + +def router_scripts(root: Path) -> list[Path]: + scripts = [] + for path in sorted((root / 'root').rglob('*')): + if not path.is_file(): + continue + rel = path.relative_to(root).as_posix() + if not rel.startswith(('root/usr/libexec/', 'root/usr/lib/', 'root/etc/', + 'root/www/cgi-bin/')): + continue + with path.open('rb') as stream: + shebang = stream.readline(128).decode('utf-8', errors='replace').strip() + if SHELL.match(shebang): + scripts.append(path) + return scripts + + +def unquoted_shell(line: str, state: list[dict]) -> str: + """Mask shell literals, retain executable command substitutions. + + Each nested $(...) is a separate shell context. Single-quoted awk/sed + source is *not* parsed as shell code, including across source lines. + """ + out = [] + i = 0 + while i < len(line): + ctx = state[-1] + quote = ctx['quote'] + char = line[i] + if char == "\\" and quote != "'": + out.append(' ') + if i + 1 < len(line): + out.append(' ') + i += 2 + else: + i += 1 + continue + if quote != "'" and line.startswith('$((', i): + # Arithmetic expansion is not a command substitution. + end = line.find('))', i + 3) + if end != -1: + out.extend(' ' * (end + 2 - i)) + i = end + 2 + continue + if quote != "'" and line.startswith('$(', i): + out.extend('$(') + state.append({'quote': None, 'depth': 1}) + i += 2 + continue + if quote == "'": + if char == "'": + ctx['quote'] = None + out.append(' ') + elif quote == '"': + if char == '"': + ctx['quote'] = None + out.append(' ') + elif char in ("'", '"'): + ctx['quote'] = char + out.append(' ') + elif char == '#' and (not out or out[-1].isspace()): + break + else: + out.append(char) + if len(state) > 1: + if char == '(': + ctx['depth'] += 1 + if char == ')': + ctx['depth'] -= 1 + if ctx['depth'] == 0: + state.pop() + i += 1 + return ''.join(out) + + +def commands(source: str) -> set[str]: + functions = {match.group(1) for line in source.splitlines() + if (match := FUNCTION.match(line))} + found: set[str] = set() + heredoc_end: str | None = None + state = [{'quote': None, 'depth': 0}] + for raw in source.splitlines(): + if heredoc_end: + if raw.strip() == heredoc_end: + heredoc_end = None + continue + # Check heredoc delimiters on raw shell syntax before quote masking. + heredoc = HEREDOC.search(raw) + if heredoc and state[0]['quote'] is None and len(state) == 1: + heredoc_end = heredoc.group(2) + # A quoted executable path/variable is one command token. Keep a + # placeholder to prevent its first argument being mistaken for a call. + raw = re.sub(r'"\$(?:\{[a-zA-Z0-9_]+\}|[a-zA-Z0-9_]+)"', 'DYNAMIC_EXEC', raw) + line = unquoted_shell(raw, state) + # Case labels are not commands, including multi-pattern arms and + # single-line `case value in one|two) ...` forms. + if re.match(r'^\s*case\b.*\bin\b.*\)', line): + line = line.split(')', 1)[1] + elif re.match(r'^\s*[^#$;={}()]+\)', line): + line = line.split(')', 1)[1] + if not line.strip() or line.lstrip().startswith('#'): + continue + # Ignore shell function definitions, pattern arms, and plain assignments. + for probe in (*PROBE.finditer(line), *POST_KEYWORD.finditer(line)): + name = probe.group('name') + if name in INTERNAL or name in functions or name == 'DYNAMIC_EXEC': + continue + if line[probe.end('name'):].lstrip().startswith('='): + continue + found.add(name) + for match in SITE.finditer(line): + name = match.group('name') + # Shell case arms / function declarations are not executable calls. + suffix = line[match.end('name'):].lstrip() + if suffix.startswith('()') or suffix.startswith(')'): + continue + if name in INTERNAL or name in functions or name == 'DYNAMIC_EXEC': + continue + # An assignment cannot be an executable command name. + if suffix.startswith('='): + continue + # Expressions like $(foo) are real commands but `${foo}` is not. + if line[:match.start('name')].endswith('${'): + continue + found.add(name) + return found + + + +# Performance guardrails for constrained router hardware. These are deliberately +# high-confidence anti-patterns, not a blanket ban on grep/find/sort: bounded +# scans and file processing are legitimate and often faster than alternatives. +# Using the same shipped-script discovery as the compatibility audit ensures +# that every added router entry point receives both checks automatically. +# Detect executable sites, not command names embedded in quotes or comments. +# Assignment prefixes such as LC_ALL=C grep -R must not bypass the audit. +PERFORMANCE_SITE = re.compile( + r'(?:^|[;|`]|\$\(|\bthen\s+|\bdo\s+|\belse\s+|' + r'\bif\s+|\belif\s+|\bwhile\s+|\buntil\s+|\b!\s+)' + r'\s*(?:[a-zA-Z_][a-zA-Z_0-9]*=[^\s;|]+\s+)*' + r'(?Pfind|du|grep|ls|dd|xargs|sleep)\b' +) +INFINITE_LOOP = re.compile( + r'(?:^|[;|]|\$\()\s*(?:while\s+(?:true|:)|until\s+false)\s*;\s*do\b' +) +NESTED_LOOP = re.compile(r'\b(?:for|while|until)\b[^;]*;\s*do\b') +LOOP_DONE = re.compile(r'(?:^|;)\s*done\b') +BLOCKING_ACTION = re.compile(r'\b(?:sleep|wait)\b|\bubus\s+listen\b') +LOOP_EXIT = re.compile(r'\b(?:break|return|exit)\b') +ZERO_SLEEP = re.compile(r'0+(?:\.0+)?[smhd]?$', re.IGNORECASE) + + +def shell_lines(source: str) -> list[tuple[int, str, str]]: + """Return source and quote-masked shell lines, excluding heredoc data. + + The mask retains offsets, so we can lex *real arguments* only after we have + established that a command name is executable shell, not a quoted string. + """ + lines = [] + heredoc_end: str | None = None + state = [{'quote': None, 'depth': 0}] + for number, raw in enumerate(source.splitlines(), 1): + if heredoc_end: + if raw.strip() == heredoc_end: + heredoc_end = None + continue + heredoc = HEREDOC.search(raw) + if heredoc and state[0]['quote'] is None and len(state) == 1: + heredoc_end = heredoc.group(2) + masked = unquoted_shell(raw, state) + lines.append((number, raw, masked)) + return lines + + +def call_arguments(raw: str, masked: str, end: int) -> list[str]: + """Parse arguments up to the next unquoted shell operator.""" + boundary = re.search(r'[;|`]|\$\(', masked[end:]) + stop = end + boundary.start() if boundary else len(masked) + try: + return shlex.split(raw[end:stop], comments=True, posix=True) + except ValueError: + # The command may use a line continuation or multiline quotes. Avoid + # a false positive based on incomplete arguments; build/runtime tests + # remain necessary for cases this static checker cannot resolve. + return [] + + +def command_risk(name: str, args: list[str]) -> str | None: + """Only report expensive or unbounded operations with clear evidence.""" + options = [a for a in args if a.startswith('-')] + shorts = ''.join(a[1:] for a in options if a.startswith('-') and not a.startswith('--')) + recursive = 'R' in shorts or '--recursive' in options + if name == 'find' and args and args[0] == '/': + return 'full filesystem traversal (find /); use a bounded subtree' + if name == 'du' and ('a' in shorts or '--all' in options or '/' in args): + return 'unbounded disk scan (du -a or du /); target a bounded path' + if name == 'grep' and (recursive or 'r' in shorts): + return 'recursive grep; limit the files/directory and scan budget' + if name == 'ls' and recursive: + return 'recursive ls; use a targeted directory listing' + if name == 'dd' and any(a in ('if=/dev/zero', 'if=/dev/urandom') for a in args): + if not any(a.startswith(('count=', 'count_bytes=')) for a in args): + return 'unbounded dd from a generator; specify count=' + if name == 'xargs' and ('-P0' in args or '--max-procs=0' in args or + any(args[i:i + 2] == ['-P', '0'] + for i in range(len(args) - 1))): + return 'unbounded xargs concurrency (-P 0); specify a small limit' + if name == 'sleep' and args and ZERO_SLEEP.fullmatch(args[0]): + return 'zero-delay sleep; set a positive delay to prevent busy polling' + return None + + +def performance_risks(source: str, rel: str) -> list[str]: + errors: list[str] = [] + lines = shell_lines(source) + # Some shell code has case labels (`grep)`) and function declarations; + # they are not command invocations. Raw strings in heredocs are excluded. + for number, raw, masked in lines: + for match in PERFORMANCE_SITE.finditer(masked): + name = match.group('name') + suffix = masked[match.end('name'):].lstrip() + if suffix.startswith((')', '()')): + continue + args = call_arguments(raw, masked, match.end('name')) + reason = command_risk(name, args) + if reason: + errors.append(f'{rel}:{number}: performance risk: {reason}') + + # An unconditional infinite loop needs explicit throttling, blocking + # wait, or an exit path. A zero-delay sleep is separately rejected. A + # bounded `while :` loop with `break` must remain valid (apps-manager). + for i, (number, _, masked) in enumerate(lines): + loop = INFINITE_LOOP.search(masked) + if not loop: + continue + depth = 1 + body: list[str] = [] + closed = False + # Handle both multiline loops and `while true; do :; done`. + for next_line in [masked[loop.end():], *(line[2] for line in lines[i + 1:])]: + closing = LOOP_DONE.search(next_line) + if depth == 1 and closing: + body.append(next_line[:closing.start()]) + closed = True + break + depth += len(NESTED_LOOP.findall(next_line)) + depth -= len(LOOP_DONE.findall(next_line)) + if depth <= 0: + closed = True + break + body.append(next_line) + if closed and not any(BLOCKING_ACTION.search(line) or LOOP_EXIT.search(line) + for line in body): + errors.append(f'{rel}:{number}: performance risk: ' + 'unthrottled infinite loop (no sleep, wait, or exit)') + return errors + + +def audit(root: Path, allowed: set[str]) -> list[str]: + errors = [] + files = router_scripts(root) + if not files: + return ['no router shell scripts found'] + # A newly added script requiring bash/python must not escape the audit just + # because its shebang is not /bin/sh. Ucode files have no shell shebang. + runtime_roots = ('root/usr/libexec/', 'root/usr/lib/', 'root/etc/', + 'root/www/cgi-bin/') + for path in sorted((root / 'root').rglob('*')): + if not path.is_file(): + continue + rel = path.relative_to(root).as_posix() + if not rel.startswith(runtime_roots): + continue + with path.open('rb') as stream: + shebang = stream.readline(128).decode('utf-8', errors='replace').strip() + if re.match(r'^#!\s*(?:/bin/bash|/usr/bin/env\s+(?:bash|python3?))\b', shebang): + errors.append(f'{rel}: unsupported interpreter: {shebang}') + # Shared shell helpers can define functions used by sourced scripts. + shared = set() + for path in files: + shared.update(match.group(1) for line in path.read_text(encoding='utf-8').splitlines() + if (match := FUNCTION.match(line))) + for path in files: + rel = path.relative_to(root).as_posix() + source = path.read_text(encoding='utf-8') + for match in COMMAND_DEFAULT.finditer(source): + variable = match.group('var') + command = match.group('name') + if variable.upper().endswith(('_BIN', '_COMMAND', '_CMD', '_EXEC')): + if command not in allowed and command not in INTERNAL: + errors.append(f'{rel}: unsupported command default: ' + f'{variable}={command}') + for command in sorted(commands(source) - allowed - shared - SOURCED_FUNCTIONS): + if (rel == OPTIONAL_CURL_SOURCE and command == 'curl' and + legacy_curl_is_guarded(source)): + continue + errors.append(f'{rel}: unsupported command: {command}') + errors.extend(performance_risks(source, rel)) + return errors + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--root', type=Path, default=ROOT) + args = parser.parse_args() + try: + errors = audit(args.root, policy_names(POLICY)) + except (OSError, ValueError) as exc: + print(f'FAIL: OpenWrt command policy: {exc}', file=sys.stderr) + return 1 + if errors: + print('FAIL: OpenWrt 25.12 unsupported or high-cost router shell operation(s):', file=sys.stderr) + for error in errors: + print(f' {error}', file=sys.stderr) + return 1 + print('PASS: OpenWrt 25.12 command and performance policy') + return 0 + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/luci-app-smartsafehub/tools/check_test_coverage.py b/luci-app-smartsafehub/tools/check_test_coverage.py new file mode 100644 index 000000000..4f0149094 --- /dev/null +++ b/luci-app-smartsafehub/tools/check_test_coverage.py @@ -0,0 +1,242 @@ +#!/usr/bin/env python3 +"""Fail fast when a test is not connected to ShellSpec or GitHub Actions. + +No third-party dependencies: the checker runs before CI installs ShellSpec/Node. +""" + +from __future__ import annotations + +from collections import Counter +from pathlib import Path +import re +import sys +import tempfile + + +ROOT = Path(__file__).resolve().parents[1] +REGISTRATION = re.compile( + r'^\s*When\s+run\s+command\s+sh\s+["\']\$SHELLSPEC_PROJECT_ROOT/' + r'(tests/[a-zA-Z0-9_./-]+\.sh)["\']\s*$' +) +JOB_HEADER = re.compile(r'^ ([a-zA-Z][a-zA-Z0-9_-]*):\s*$') + + +class CoverageError(Exception): + pass + + +def require(condition: bool, message: str) -> None: + if not condition: + raise CoverageError(message) + + +def relative_names(paths, root: Path) -> set[str]: + return {path.relative_to(root).as_posix() for path in paths} + + +def check_shellspec(root: Path) -> int: + tests_dir = root / 'tests' + spec_dir = root / 'spec' + scripts = relative_names(tests_dir.rglob('*.sh'), root) + require(bool(scripts), 'tests/ 안에 셸 테스트가 없습니다.') + specs = sorted(spec_dir.rglob('*_spec.sh')) + unsupported_specs = sorted(spec_dir.rglob('*.sh')) + unsupported_specs = [spec for spec in unsupported_specs if spec not in specs] + require(not unsupported_specs, 'ShellSpec 자동 검색 대상이 아닌 spec 스크립트: ' + + ', '.join(str(spec.relative_to(root)) for spec in unsupported_specs)) + require(bool(specs), 'ShellSpec spec/*_spec.sh 파일이 없습니다.') + + registrations: Counter[str] = Counter() + for spec in specs: + for line in spec.read_text(encoding='utf-8').splitlines(): + match = REGISTRATION.fullmatch(line) + if match: + registrations[match.group(1)] += 1 + + missing = sorted(scripts - registrations.keys()) + stale = sorted(registrations.keys() - scripts) + duplicates = sorted(name for name, count in registrations.items() if count > 1) + require(not missing, 'ShellSpec 미등록 셸 테스트: ' + ', '.join(missing)) + require(not stale, 'ShellSpec 등록 경로에 파일 없음: ' + ', '.join(stale)) + require(not duplicates, 'ShellSpec 중복 등록: ' + ', '.join(duplicates)) + return len(scripts) + + +def check_runtime(root: Path) -> int: + runtime_dir = root / 'tests/runtime' + runtime = sorted(runtime_dir.glob('*.test.mjs')) + require(bool(runtime), 'tests/runtime/*.test.mjs 테스트가 없습니다.') + # The workflow deliberately uses a non-recursive *.test.mjs glob. Nested + # tests or newly introduced .test.ts/.spec.mjs files must not be silent. + for path in (root / 'tests').rglob('*'): + if not path.is_file() or path.suffix == '.sh': + continue + name = path.name + looks_like_test = ( + '.test.' in name or '.spec.' in name or + name.startswith(('test-', 'test_')) or name.endswith('_test.py') + ) + if looks_like_test and path not in runtime: + raise CoverageError( + f'CI 실행 대상이 아닌 테스트 파일: {path.relative_to(root)} ' + '(JavaScript 테스트는 tests/runtime/*.test.mjs에 배치하세요)' + ) + return len(runtime) + + +def job_section(workflow: str, name: str) -> str: + lines = workflow.splitlines() + start = next((i for i, line in enumerate(lines) + if JOB_HEADER.fullmatch(line) and JOB_HEADER.fullmatch(line).group(1) == name), None) + require(start is not None, f'CI jobs.{name} 누락') + end = next((i for i in range(start + 1, len(lines)) + if JOB_HEADER.fullmatch(lines[i])), len(lines)) + return '\n'.join(lines[start:end]) + + +def command_is_unconditional(job: str, command: str) -> bool: + if re.search(r'^ (?:if|continue-on-error)\s*:', job, re.MULTILINE): + return False + # Match exact YAML step commands rather than substrings, comments or + # commands that can swallow failures (e.g. `... || true`). + steps = re.split(r'(?=^ - )', job, flags=re.MULTILINE) + for step in steps: + if re.search(r'^ (?:if|continue-on-error)\s*:', step, re.MULTILINE): + continue + if re.search(r'^ run:[ \t]*' + re.escape(command) + r'[ \t]*$', step, re.MULTILINE): + return True + return False + + +def check_ci(root: Path) -> None: + workflow = (root / '.github/workflows/ci.yml').read_text(encoding='utf-8') + backend = job_section(workflow, 'backend') + frontend = job_section(workflow, 'frontend') + require( + command_is_unconditional(backend, 'sh tests/test-suite-integrity.sh'), + 'Backend CI의 독립 테스트 누락 검사 단계가 없거나 조건부로 실행됩니다.', + ) + require( + command_is_unconditional(backend, 'shellspec'), + 'Backend CI에서 전체 ShellSpec 테스트를 실행하지 않습니다.', + ) + require( + command_is_unconditional(backend, 'sh tests/test-openwrt-commands.sh'), + 'Backend CI에서 OpenWrt 25.12 명령 호환성 검사가 누락되거나 조건부로 실행됩니다.', + ) + require( + command_is_unconditional(frontend, 'node --experimental-strip-types --test ../tests/runtime/*.test.mjs'), + 'Frontend CI에서 모든 *.test.mjs 파일을 자동 실행하지 않습니다.', + ) + + +def check(root: Path) -> tuple[int, int]: + shell_count = check_shellspec(root) + runtime_count = check_runtime(root) + check_ci(root) + return shell_count, runtime_count + + +def self_test() -> None: + """Mutation tests: prove unregistered and skipped tests really fail.""" + with tempfile.TemporaryDirectory(prefix='smartsafehub-ci-gate-') as temp: + root = Path(temp) + for dirname in ('tests/runtime', 'spec', '.github/workflows'): + (root / dirname).mkdir(parents=True) + (root / 'tests/test-existing.sh').write_text('#!/bin/sh\n', encoding='utf-8') + (root / 'tests/runtime/existing.test.mjs').write_text('', encoding='utf-8') + spec_path = root / 'spec/contracts_spec.sh' + spec_base = 'Describe "checks"\n When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-existing.sh"\nEnd\n' + spec_path.write_text(spec_base, encoding='utf-8') + workflow_path = root / '.github/workflows/ci.yml' + workflow_base = '''jobs: + backend: + runs-on: ubuntu-latest + steps: + - name: Guard + run: sh tests/test-suite-integrity.sh + - name: Test + run: shellspec + - name: OpenWrt BusyBox + run: sh tests/test-openwrt-commands.sh + frontend: + runs-on: ubuntu-latest + steps: + - name: Test + run: node --experimental-strip-types --test ../tests/runtime/*.test.mjs +''' + workflow_path.write_text(workflow_base, encoding='utf-8') + require(check(root) == (1, 1), 'self-test fixture 불일치') + + def fails_with(fragment: str) -> None: + try: + check(root) + except CoverageError as exc: + require(fragment in str(exc), f'예상 외 오류: {exc}') + else: + raise CoverageError(f'누락 검출 실패: {fragment}') + + extra = root / 'tests/test-new.sh' + extra.write_text('#!/bin/sh\n', encoding='utf-8') + fails_with('ShellSpec 미등록') + extra.unlink() + + spec_path.write_text(spec_base.replace('End\n', + ' When run command sh "$SHELLSPEC_PROJECT_ROOT/tests/test-existing.sh"\nEnd\n'), encoding='utf-8') + fails_with('ShellSpec 중복') + spec_path.write_text(spec_base.replace('End\n', + ' When run command sh \"$SHELLSPEC_PROJECT_ROOT/tests/test-deleted.sh\"\nEnd\n'), encoding='utf-8') + fails_with('등록 경로에 파일 없음') + spec_path.write_text(spec_base, encoding='utf-8') + extra_spec = root / 'spec/hidden.sh' + extra_spec.write_text('Describe \"hidden\"\nEnd\n', encoding='utf-8') + fails_with('자동 검색 대상이 아닌') + extra_spec.unlink() + + # A correctly named new runtime test is covered by the CI glob. + included = root / 'tests/runtime/new.test.mjs' + included.write_text('', encoding='utf-8') + require(check(root) == (1, 2), '새 JS 테스트 자동 검색 실패') + included.unlink() + + unsupported = root / 'tests/runtime/new.test.js' + unsupported.write_text('', encoding='utf-8') + fails_with('CI 실행 대상이 아닌') + unsupported.unlink() + unsupported_python = root / 'tests/test_missing.py' + unsupported_python.write_text('', encoding='utf-8') + fails_with('CI 실행 대상이 아닌') + unsupported_python.unlink() + nested = root / 'tests/runtime/nested' + nested.mkdir() + (nested / 'new.test.mjs').write_text('', encoding='utf-8') + fails_with('CI 실행 대상이 아닌') + (nested / 'new.test.mjs').unlink() + + for old, replacement, error in ( + ('run: sh tests/test-openwrt-commands.sh', '# run: sh tests/test-openwrt-commands.sh', '명령 호환성'), + ('run: sh tests/test-openwrt-commands.sh', 'run: sh tests/test-openwrt-commands.sh || true', '명령 호환성'), + ('run: sh tests/test-suite-integrity.sh', '# run: sh tests/test-suite-integrity.sh', '독립 테스트'), + ('run: shellspec', 'run: shellspec spec/selected_spec.sh', 'ShellSpec 테스트'), + ('run: node --experimental-strip-types --test ../tests/runtime/*.test.mjs', + 'run: node --experimental-strip-types --test ../tests/runtime/existing.test.mjs', '*.test.mjs'), + ('run: shellspec', 'if: false\n run: shellspec', 'ShellSpec 테스트'), + ('run: shellspec', 'run: shellspec || true', 'ShellSpec 테스트'), + ('run: shellspec', 'continue-on-error: true\n run: shellspec', 'ShellSpec 테스트'), + ): + workflow_path.write_text(workflow_base.replace(old, replacement), encoding='utf-8') + fails_with(error) + workflow_path.write_text(workflow_base, encoding='utf-8') + require(check(root) == (1, 1), 'self-test fixture 복구 실패') + + +if __name__ == '__main__': + try: + shell, runtime = check(ROOT) + if '--self-test' in sys.argv[1:]: + self_test() + print(f'PASS: ShellSpec {shell}개, Frontend CI {runtime}개 파일 등록 확인' + + (' (누락/중복/CI 우회 회귀 테스트 통과)' if '--self-test' in sys.argv[1:] else '')) + except (CoverageError, OSError) as exc: + print(f'FAIL: {exc}', file=sys.stderr) + sys.exit(1) diff --git a/luci-app-smartsafehub/tools/openwrt-25.12-commands.txt b/luci-app-smartsafehub/tools/openwrt-25.12-commands.txt new file mode 100644 index 000000000..363957b40 --- /dev/null +++ b/luci-app-smartsafehub/tools/openwrt-25.12-commands.txt @@ -0,0 +1,98 @@ +# OpenWrt 25.12 BusyBox default applets, with explicitly installed OpenWrt base +# commands. Source for BusyBox default y/n: +# https://github.com/openwrt/openwrt/blob/openwrt-25.12/package/utils/busybox/Config-defaults.in +# This is an *allowlist* of supported router commands, not host Ubuntu commands. +# Non-BusyBox commands are documented separately below. Never add a command just +# to silence a failure; verify that each supported firmware image supplies it. +# BusyBox 25.12 default applets needed by SmartSafeHub shell runtime: +awk +basename +cat +chmod +chown +cp +cut +cmp +date +dd +df +flock +dirname +dmesg +du +echo +env +expr +find +grep +hexdump +head +id +kill +killall +ln +logger +ls +md5sum +mkdir +mkfifo +mknod +mktemp +mount +mv +pidof +passwd +ping +printf +ps +readlink +reboot +rm +rmdir +sed +seq +sha256sum +sleep +sort +start-stop-daemon +strings +sync +tail +tar +tee +test +time +touch +tr +true +uname +uniq +uptime +wc +xargs +yes +# Guaranteed OpenWrt base/required-package commands (not BusyBox applets): +# apk: firmware package manager (OpenWrt 25.12) +apk +# ubus / uci: base system +ubus +uci +# jsonfilter: base/explicit LuCI and SafeShield dependency +jsonfilter +# uclient-fetch: LUCI_DEPENDS +uclient-fetch +uclient-fetch +# procd: LUCI_DEPENDS +procd +procd +# networking tools included by OpenWrt base system / firmware +ip +ifstatus +ifup +ifdown +wifi +# fw4 and nft: firewall packages in stock OpenWrt router +fw4 +nft +# system services and init tooling +# factoryreset: OpenWrt 25.12 base-files reset utility + +factoryreset diff --git a/luci-app-wwand/htdocs/luci-static/resources/wwand/modemopts.js b/luci-app-wwand/htdocs/luci-static/resources/wwand/modemopts.js index 6b3fd3678..1ad0d8562 100644 --- a/luci-app-wwand/htdocs/luci-static/resources/wwand/modemopts.js +++ b/luci-app-wwand/htdocs/luci-static/resources/wwand/modemopts.js @@ -702,6 +702,21 @@ return baseclass.extend({ o.depends('gnss', '1'); bind(o); + /* '' is not "back to full": the modem stores the masks, so unsetting + the option changes nothing on it (wwand reference.md, gnss_nmea) — + the labels have to say so, or "unchanged" reads as "default". It is + written only in start_gnss (modem_common.uc, once per bring-up); a + saved change gets there because gnss_nmea is in the daemon's modem + reload signature, which restarts the modem. */ + o = s.taboption(tab, form.ListValue, 'gnss_nmea', _('GNSS NMEA output'), + _('Quectel and ASR modems: which NMEA sentences the receiver streams. Written when wwand starts the receiver; saving a change restarts this modem\'s bring-up, so its connection drops briefly. Fix only is GPS position, time and DOP (GGA, RMC, GSA) with the other constellations\' sentences off — far less for wwand-gps to parse, the same fix, but no satellites-in-view list and only GPS satellites counted as used. The modem keeps what was written last: leaving this unset does not undo Fix only, choose All sentences for that.')); + o.value('', _('Leave modem setting unchanged')); + o.value('fix', _('Fix only (less CPU)')); + o.value('full', _('All sentences')); + o.optional = true; + o.depends('gnss', '1'); + bind(o); + o = s.taboption(tab, form.Flag, 'auto_correct_config', _('Auto-correct modem config'), _('Let wwand reprogram mismatched modem-side settings (attach profile, etc.) when it detects them.')); o.default = '0'; diff --git a/luci-app-wwand/po/templates/wwand.pot b/luci-app-wwand/po/templates/wwand.pot index 16d70cc4b..208e1de98 100644 --- a/luci-app-wwand/po/templates/wwand.pot +++ b/luci-app-wwand/po/templates/wwand.pot @@ -329,6 +329,10 @@ msgstr "" msgid "All" msgstr "" +#: htdocs/luci-static/resources/wwand/modemopts.js:715 +msgid "All sentences" +msgstr "" + #: htdocs/luci-static/resources/view/wwand/status.js:611 msgid "" "An environmental limit the modem reports (temperature, voltage or charge " @@ -400,7 +404,7 @@ msgstr "" msgid "Authentication type" msgstr "" -#: htdocs/luci-static/resources/wwand/modemopts.js:705 +#: htdocs/luci-static/resources/wwand/modemopts.js:720 msgid "Auto-correct modem config" msgstr "" @@ -931,6 +935,10 @@ msgstr "" msgid "Fix age" msgstr "" +#: htdocs/luci-static/resources/wwand/modemopts.js:714 +msgid "Fix only (less CPU)" +msgstr "" + #: htdocs/luci-static/resources/view/wwand/settings.js:680 msgid "Forbidden" msgstr "" @@ -960,6 +968,10 @@ msgstr "" msgid "GNSS" msgstr "" +#: htdocs/luci-static/resources/wwand/modemopts.js:711 +msgid "GNSS NMEA output" +msgstr "" + #: htdocs/luci-static/resources/wwand/modemopts.js:694 msgid "GNSS receiver" msgstr "" @@ -1212,10 +1224,11 @@ msgid "" msgstr "" #: htdocs/luci-static/resources/wwand/modemopts.js:178 +#: htdocs/luci-static/resources/wwand/modemopts.js:713 msgid "Leave modem setting unchanged" msgstr "" -#: htdocs/luci-static/resources/wwand/modemopts.js:706 +#: htdocs/luci-static/resources/wwand/modemopts.js:721 msgid "" "Let wwand reprogram mismatched modem-side settings (attach profile, etc.) " "when it detects them." @@ -2019,6 +2032,18 @@ msgstr "" msgid "QRTR node" msgstr "" +#: htdocs/luci-static/resources/wwand/modemopts.js:712 +msgid "" +"Quectel and ASR modems: which NMEA sentences the receiver streams. Written " +"when wwand starts the receiver; saving a change restarts this modem's bring-" +"up, so its connection drops briefly. Fix only is GPS position, time " +"and DOP (GGA, RMC, GSA) with the other constellations' sentences off — far " +"less for wwand-gps to parse, the same fix, but no satellites-in-view list " +"and only GPS satellites counted as used. The modem keeps what was written " +"last: leaving this unset does not undo Fix only, choose All " +"sentences for that." +msgstr "" + #: htdocs/luci-static/resources/wwand/modemopts.js:177 msgid "" "Quectel modems: let the modem notice a SIM card that is inserted or removed " diff --git a/maxminddb-dump-country/Makefile b/maxminddb-dump-country/Makefile index 6f8bdb91c..42ab2b217 100644 --- a/maxminddb-dump-country/Makefile +++ b/maxminddb-dump-country/Makefile @@ -1,8 +1,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=maxminddb-dump-country -PKG_VERSION:=1 -PKG_RELEASE:=1 +PKG_VERSION:=2 +PKG_RELEASE:=2 PKG_MAINTAINER:=Konstantine Shevlakov PKG_LICENSE:=LICENSE @@ -40,12 +40,12 @@ endef define Build/Compile $(TARGET_CC) $(TARGET_CFLAGS) -Wall -lmaxminddb \ - -o $(PKG_BUILD_DIR)/xt_geoip_build_maxmind $(PKG_BUILD_DIR)/xt_geoip_build_maxmind.c + -o $(PKG_BUILD_DIR)/xt_geoip_build $(PKG_BUILD_DIR)/xt_geoip_build_maxmind.c endef define Package/$(PKG_NAME)/install $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/xt_geoip_build_maxmind $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/xt_geoip_build $(1)/usr/bin/ endef $(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/maxminddb-dump-country/patches/0001-geoip-add-DB-IP-CSV-input-support.patch b/maxminddb-dump-country/patches/0001-geoip-add-DB-IP-CSV-input-support.patch new file mode 100644 index 000000000..f0c6c3263 --- /dev/null +++ b/maxminddb-dump-country/patches/0001-geoip-add-DB-IP-CSV-input-support.patch @@ -0,0 +1,388 @@ +From 8ea81c36bee0d4eefc023561a423cbfaac7acc41 Mon Sep 17 00:00:00 2001 +From: koshev-msk +Date: Thu, 29 Oct 2026 23:04:25 +0000 +Subject: [PATCH] geoip: add DB-IP CSV input support + +Add a -d option to read DB-IP Country Lite CSV files and generate the +same per-country .iv4/.iv6 binary range files as the existing MMDB +input path. + +The parser accepts the DB-IP start_ip,end_ip,country format, handles +quoted fields and CRLF line endings, skips the header and unknown +country codes, and validates address families and range ordering. + +The existing MMDB processing path and -c CSV export mode remain +unchanged. + +Signed-off-by: OpenWrt Developer +--- + xt_geoip_build_maxmind.c | 292 ++++++++++++++++++++++++++++++++++----- + 1 file changed, 260 insertions(+), 32 deletions(-) + +diff --git a/xt_geoip_build_maxmind.c b/xt_geoip_build_maxmind.c +index 55e86d0..95d2c92 100644 +--- a/xt_geoip_build_maxmind.c ++++ b/xt_geoip_build_maxmind.c +@@ -3,6 +3,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -31,6 +32,8 @@ int opt_v = 0; + int opt_4 = 1; + int opt_6 = 1; + int opt_csv = 0; ++int opt_dbip = 0; ++char *dbip_filename = NULL; + + int opt_asn = 0; + char *opt_asn_val = NULL; +@@ -326,6 +329,204 @@ void p_dump(int l, uint8_t *path, MMDB_entry_s *e) { + fwrite(&path[start],16-start,1,CFD[cind]); + fwrite(&path2[start],16-start,1,CFD[cind]); + } ++/* ++ * DB-IP Country Lite CSV format: ++ * start_ip,end_ip,country ++ * ++ * The fields may optionally be quoted. The CSV has no embedded commas. ++ */ ++static char *csv_trim(char *field) ++{ ++ char *end; ++ ++ while(isspace((unsigned char)*field)) ++ field++; ++ end = field + strlen(field); ++ while(end > field && isspace((unsigned char)end[-1])) ++ *--end = '\0'; ++ if(end - field >= 2 && field[0] == '"' && end[-1] == '"') { ++ field++; ++ end[-1] = '\0'; ++ } ++ return field; ++} ++ ++static int dbip_write_range(int family, const uint8_t *start, ++ const uint8_t *end, const char *country, int cind) ++{ ++ char path[sizeof(output_dir) + 8]; ++ FILE **files; ++ int32_t *counts; ++ size_t addr_len; ++ ++ if(family == AF_INET) { ++ if(!opt_4) ++ return 0; ++ files = CFD4; ++ counts = CCN4; ++ addr_len = 4; ++ } else { ++ if(!opt_6) ++ return 0; ++ files = CFD6; ++ counts = CCN6; ++ addr_len = 16; ++ } ++ ++ if(!files[cind]) { ++ snprintf(path, sizeof(path), "%s%s.iv%c", ++ output_dir, country, family == AF_INET ? '4' : '6'); ++ files[cind] = fopen(path, "wb"); ++ if(!files[cind]) { ++ fprintf(stderr, "create file %s: %s\n", ++ path, strerror(errno)); ++ return -1; ++ } ++ } ++ ++ if(fwrite(start, addr_len, 1, files[cind]) != 1 || ++ fwrite(end, addr_len, 1, files[cind]) != 1) { ++ fprintf(stderr, "write %s range failed: %s\n", ++ country, strerror(errno)); ++ return -1; ++ } ++ ++ counts[cind]++; ++ return 0; ++} ++ ++static int dbip_csv_dump(const char *path) ++{ ++ FILE *input; ++ char line[256]; ++ unsigned long lineno = 0; ++ int first_line = 1; ++ int result = 0; ++ ++ input = fopen(path, "r"); ++ if(!input) { ++ fprintf(stderr, "Can't open DB-IP CSV %s: %s\n", ++ path, strerror(errno)); ++ return -1; ++ } ++ ++ while(fgets(line, sizeof(line), input)) { ++ char *field[3], *p, *comma; ++ char *country; ++ uint8_t start[16], end[16]; ++ char start_text[INET6_ADDRSTRLEN]; ++ char end_text[INET6_ADDRSTRLEN]; ++ int family, end_family, cind; ++ ++ lineno++; ++ if(!strchr(line, '\n') && !feof(input)) { ++ fprintf(stderr, "DB-IP CSV line %lu is too long\n", lineno); ++ result = -1; ++ break; ++ } ++ ++ p = line + strspn(line, " \t"); ++ p[strcspn(p, "\r\n")] = '\0'; ++ if(!*p) ++ continue; ++ ++ field[0] = p; ++ comma = strchr(p, ','); ++ if(!comma) ++ goto malformed; ++ *comma = '\0'; ++ field[1] = comma + 1; ++ ++ comma = strchr(field[1], ','); ++ if(!comma) ++ goto malformed; ++ *comma = '\0'; ++ field[2] = comma + 1; ++ if(strchr(field[2], ',')) ++ goto malformed; ++ ++ field[0] = csv_trim(field[0]); ++ field[1] = csv_trim(field[1]); ++ field[2] = csv_trim(field[2]); ++ country = field[2]; ++ ++ if(first_line) { ++ first_line = 0; ++ if(!strcmp(field[0], "start_ip") || ++ !strcmp(field[0], "ip_start")) ++ continue; ++ } ++ ++ /* DB-IP uses "--" when the country is unknown. */ ++ if(!strcmp(country, "--") || !*country) ++ continue; ++ ++ if(strlen(country) != 2 || ++ country[0] < 'A' || country[0] > 'Z' || ++ country[1] < 'A' || country[1] > 'Z') { ++ fprintf(stderr, "Invalid country code on DB-IP CSV line %lu\n", ++ lineno); ++ result = -1; ++ break; ++ } ++ ++ cind = country2idx(country); ++ if(cind < 0) ++ continue; ++ ++ if(inet_pton(AF_INET, field[0], start) == 1) ++ family = AF_INET; ++ else if(inet_pton(AF_INET6, field[0], start) == 1) ++ family = AF_INET6; ++ else { ++ fprintf(stderr, "Invalid start IP on DB-IP CSV line %lu\n", ++ lineno); ++ result = -1; ++ break; ++ } ++ ++ if(inet_pton(family, field[1], end) != 1) { ++ fprintf(stderr, "Invalid or mismatched end IP on DB-IP CSV line %lu\n", ++ lineno); ++ result = -1; ++ break; ++ } ++ end_family = family; ++ if(end_family != family || ++ memcmp(start, end, family == AF_INET ? 4 : 16) > 0) { ++ fprintf(stderr, "Invalid IP range on DB-IP CSV line %lu\n", ++ lineno); ++ result = -1; ++ break; ++ } ++ ++ if(dbip_write_range(family, start, end, country, cind)) { ++ result = -1; ++ break; ++ } ++ ++ if(opt_v > 1) { ++ inet_ntop(family, start, start_text, sizeof(start_text)); ++ inet_ntop(family, end, end_text, sizeof(end_text)); ++ printf("%s-%s %s\n", start_text, end_text, country); ++ } ++ continue; ++ ++malformed: ++ fprintf(stderr, "Malformed DB-IP CSV line %lu\n", lineno); ++ result = -1; ++ break; ++ } ++ ++ if(ferror(input)) { ++ fprintf(stderr, "Error reading DB-IP CSV %s: %s\n", ++ path, strerror(errno)); ++ result = -1; ++ } ++ fclose(input); ++ return result; ++} ++ + static int skip_n96 = 0; + + void tree_walk(int rn,int l, uint8_t *path) { +@@ -372,9 +573,10 @@ int main(int argc, char **argv) + + progname = strdup(argv[0]); + +- while((c=getopt(argc,argv,"46cvo:A:N:")) != -1) { ++ while((c=getopt(argc,argv,"46cvd:o:A:N:")) != -1) { + switch(c) { + case 'c': opt_csv = 1; break; ++ case 'd': opt_dbip = 1; dbip_filename = optarg; break; + case '4': opt_6 = 0; break; + case '6': opt_4 = 0; break; + case 'v': opt_v++; break; +@@ -394,17 +596,29 @@ int main(int argc, char **argv) + filename = strdup(argv[optind]); + } else { + filename = opt_asn ? asn_name:country_name; +- if(access(filename,R_OK)) usage(); ++ if(!opt_dbip && access(filename,R_OK)) usage(); ++ } ++ ++ if(opt_dbip) { ++ if(opt_csv || opt_asn || !opt_xtgeo || optind < argc) { ++ fprintf(stderr, "%s: -d requires -o and cannot be combined with -c, -A or a positional input file\n", progname); ++ exit(1); ++ } ++ filename = dbip_filename; + } + + if(stat(filename,&st)) { +- perror("mmdb file:"); ++ perror("input file:"); + exit(1); + } + if(!opt_xtgeo && !opt_csv && !opt_asn) { + fprintf(stderr,"%s: -o or -c or -a is required!\n",progname); + exit(1); + } ++ if(opt_dbip && !S_ISREG(st.st_mode)) { ++ fprintf(stderr, "DB-IP input is not a regular file\n"); ++ exit(1); ++ } + if(opt_asn && (opt_xtgeo || opt_csv)) { + fprintf(stderr,"%s: cant use -A with -o or -c\n",progname); + exit(1); +@@ -426,43 +640,55 @@ int main(int argc, char **argv) + output_dir[l+2] = '\0'; + } + +- status = MMDB_open(filename, MMDB_MODE_MMAP, &mmdb); ++ if(opt_dbip) { ++ status = dbip_csv_dump(filename); ++ if(status) ++ exit(1); ++ } else { ++ status = MMDB_open(filename, MMDB_MODE_MMAP, &mmdb); + +- if (MMDB_SUCCESS != status) { +- fprintf(stderr, "\n Can't open %s - %s\n", +- filename, MMDB_strerror(status)); ++ if (MMDB_SUCCESS != status) { ++ fprintf(stderr, "\n Can't open %s - %s\n", ++ filename, MMDB_strerror(status)); + +- if (MMDB_IO_ERROR == status) { +- fprintf(stderr, " IO error: %s\n", strerror(errno)); +- } +- exit(1); +- } +- if(opt_csv) { +- if(opt_4) { +- CSV_IPv4_fd = fopen("GeoLite2-Country-Blocks-IPv4.csv","w"); +- if(CSV_IPv4_fd) +- fprintf(CSV_IPv4_fd,"%s",CSV_IP_hdr); ++ if (MMDB_IO_ERROR == status) { ++ fprintf(stderr, " IO error: %s\n", strerror(errno)); ++ } ++ exit(1); + } +- if(opt_6) { +- CSV_IPv6_fd = fopen("GeoLite2-Country-Blocks-IPv6.csv","w"); +- if(CSV_IPv6_fd) +- fprintf(CSV_IPv6_fd,"%s",CSV_IP_hdr); ++ if(opt_csv) { ++ if(opt_4) { ++ CSV_IPv4_fd = fopen("GeoLite2-Country-Blocks-IPv4.csv","w"); ++ if(CSV_IPv4_fd) ++ fprintf(CSV_IPv4_fd,"%s",CSV_IP_hdr); ++ } ++ if(opt_6) { ++ CSV_IPv6_fd = fopen("GeoLite2-Country-Blocks-IPv6.csv","w"); ++ if(CSV_IPv6_fd) ++ fprintf(CSV_IPv6_fd,"%s",CSV_IP_hdr); ++ } ++ CSV_EN_fd = fopen("GeoLite2-Country-Locations-en.csv","w"); ++ if(CSV_EN_fd) ++ fprintf(CSV_EN_fd,"%s",CSV_EN_hdr); + } +- CSV_EN_fd = fopen("GeoLite2-Country-Locations-en.csv","w"); +- if(CSV_EN_fd) +- fprintf(CSV_EN_fd,"%s",CSV_EN_hdr); ++ memset(path,0,sizeof(path)); ++ if(!opt_6) { ++ tree_walk(mmdb.ipv4_start_node.node_value,mmdb.ipv4_start_node.netmask,path); ++ } else ++ tree_walk(0,0,path); ++ MMDB_close(&mmdb); + } +- memset(path,0,sizeof(path)); +- if(!opt_6) { +- tree_walk(mmdb.ipv4_start_node.node_value,mmdb.ipv4_start_node.netmask,path); +- } else +- tree_walk(0,0,path); +- MMDB_close(&mmdb); + if(opt_asn) exit(0); + for(fd = 0; fd < sizeof(CFD4)/sizeof(CFD4[0]); fd++) { + if(opt_xtgeo) { +- if(CFD4[fd]) fclose(CFD4[fd]); +- if(CFD6[fd]) fclose(CFD6[fd]); ++ if(CFD4[fd] && fclose(CFD4[fd])) { ++ fprintf(stderr, "close IPv4 output failed: %s\n", strerror(errno)); ++ status = 1; ++ } ++ if(CFD6[fd] && fclose(CFD6[fd])) { ++ fprintf(stderr, "close IPv6 output failed: %s\n", strerror(errno)); ++ status = 1; ++ } + } + c_ipv4 += CCN4[fd]; + c_ipv6 += CCN6[fd]; +@@ -482,6 +708,8 @@ int main(int argc, char **argv) + if(CSV_IPv6_fd) fclose(CSV_IPv6_fd); + if(CSV_EN_fd) fclose(CSV_EN_fd); + ++ if(status) ++ exit(1); + exit(0); + } + +-- +2.43.0 + diff --git a/maxminddb-dump-country/patches/0002-add-help-CSV-args.patch b/maxminddb-dump-country/patches/0002-add-help-CSV-args.patch new file mode 100644 index 000000000..29abcbd68 --- /dev/null +++ b/maxminddb-dump-country/patches/0002-add-help-CSV-args.patch @@ -0,0 +1,11 @@ +--- a/xt_geoip_build_maxmind.c ++++ b/xt_geoip_build_maxmind.c +@@ -559,7 +559,7 @@ + } + + void usage(void) { +- printf("%s [-4] [-6] [-v] [-c] [-N ASNUM|string ][-A all|asnum[,asnum...]] [-o outputdir] file.mmdb\n",progname); ++ printf("%s [-4] [-6] [-v] [-c] [-N ASNUM|string ][-A all|asnum[,asnum...]] [-o outputdir] file.mmdb|-d file.dbip.csv\n",progname); + printf("\t asnum: number | number-number\n"); + exit(1); + } diff --git a/netdata/Makefile b/netdata/Makefile index 2374034ca..a14d99761 100644 --- a/netdata/Makefile +++ b/netdata/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=netdata PKG_VERSION:=2.12.2 -PKG_RELEASE:=22 +PKG_RELEASE:=23 PKG_MAINTAINER:=Josef Schlehofer , Daniel Engberg PKG_LICENSE:=GPL-3.0-or-later @@ -49,7 +49,6 @@ define Package/netdata/description python3-urllib3 endef -TARGET_CFLAGS := $(filter-out -O%,$(TARGET_CFLAGS)) -O3 TARGET_LDFLAGS += -L$(STAGING_DIR)/usr/lib TARGET_CFLAGS += $(FPIC) diff --git a/node/Makefile b/node/Makefile index 2f2efbbdb..007a92cc8 100644 --- a/node/Makefile +++ b/node/Makefile @@ -8,25 +8,25 @@ PKG_NAME:=node ifeq ($(CONFIG_NODEJS_22),y) PKG_VERSION:=22.23.4 -PKG_RELEASE:=3 +PKG_RELEASE:=4 PKG_HASH:=skip PATCH_DIR:=./patches/v22.x NODEJS_BIN_SUM:=b8492284c76a54baf58d61668dd0e41ee0fc98adabf9503d30f05d08f55b4406 NODE_MODULE_VERSION:=127 else ifeq ($(CONFIG_NODEJS_26),y) -PKG_VERSION:=26.12.1 -PKG_RELEASE:=3 +PKG_VERSION:=26.13.0 +PKG_RELEASE:=4 PKG_HASH:=skip PATCH_DIR:=./patches/v26.x -NODEJS_BIN_SUM:=0fd1eb7770598f52a21995edf6ed35fc690400fa437c2386af329519e9143132 +NODEJS_BIN_SUM:=5848553868b402d3fabb5b09270649977780a390f832155721025a08b5104455 NODE_MODULE_VERSION:=147 else -PKG_VERSION:=24.22.1 -PKG_RELEASE:=3 +PKG_VERSION:=24.22.2 +PKG_RELEASE:=4 PKG_HASH:=skip PATCH_DIR:=./patches/v24.x -NODEJS_BIN_SUM:=eb6728e77c576a35162c122c45ccadf224d89ff00abc8dae46cc2897c6002d7c +NODEJS_BIN_SUM:=361718c444e49af2ca5a110c83ba6a8901143f23ab285ebbef0341f391f482a9 NODE_MODULE_VERSION:=137 endif endif @@ -104,10 +104,10 @@ define Package/node/config bool "22.x Maintenance LTS" config NODEJS_24 - bool "24.x Active LTS" + bool "24.x Maintenance LTS" config NODEJS_26 - bool "26.x Current" + bool "26.x Active LTS" endchoice if PACKAGE_node diff --git a/node/patches/v24.x/999-v8-icu4c-79.patch b/node/patches/v24.x/999-v8-icu4c-79.patch new file mode 100644 index 000000000..55df32a4b --- /dev/null +++ b/node/patches/v24.x/999-v8-icu4c-79.patch @@ -0,0 +1,220 @@ +From e455d955bd6b7a7549106d1b9d7ae5bb3b9e77b4 Mon Sep 17 00:00:00 2001 +From: Jakob Linke +Date: Fri, 9 Oct 2026 12:41:30 +0200 +Subject: [PATCH] [regexp] Handle supplementary case equivalents of BMP + characters + +Unicode 18 adds U+1DF95, which simple-folds to U+00DF. This creates the +first case-equivalence class spanning BMP and supplementary characters: +{U+00DF, U+1E9E, U+1DF95}. + +Discard supplementary characters from the generator's non-unicode +closures before calling Canonicalize, which requires UTF-16 code units +and otherwise CHECK-fails with ICU 79. Apply the same filtering in +runtime non-unicode closure. + +Generate SupplementaryEquivalentsSet and desugar its BMP characters into +character classes under /iu and /iv, allowing literals to match +surrogate pairs. + +Backreferences with differing UTF-16 character widths remain unsupported +and are tracked in crbug.com/571793821. + +IgnoreSet is unchanged with ICU 78 and with ICU 78.2 patched to upstream +Unicode 18 case data. With the patched data, the generator succeeds, +SupplementaryEquivalentsSet is {U+00DF, U+1E9E}, and regexp tests pass +in release and debug. + +Bug: 571232615, 571668686 +Change-Id: I9eacb273a74c66e17f0cfb1b256e863f2718c130 +Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8548134 +Reviewed-by: Patrick Thier +Commit-Queue: Jakob Linke +Cr-Commit-Position: refs/heads/main@{#110522} +--- + src/regexp/gen-regexp-special-case.cc | 18 ++++++++++ + src/regexp/regexp-parser.cc | 18 +++++++--- + src/regexp/special-case.h | 47 ++++++++++++++++++++++++++- + 3 files changed, 77 insertions(+), 6 deletions(-) + +--- a/deps/v8/src/regexp/gen-regexp-special-case.cc ++++ b/deps/v8/src/regexp/gen-regexp-special-case.cc +@@ -9,6 +9,7 @@ + + #include "src/base/strings.h" + #include "src/regexp/special-case.h" ++#include "unicode/uchar.h" + + namespace v8 { + namespace internal { +@@ -17,6 +18,19 @@ static const base::uc32 kSurrogateStart + static const base::uc32 kSurrogateEnd = 0xdfff; + static const base::uc32 kNonBmpStart = 0x10000; + ++// Removes supplementary code points from |set| and returns whether any were ++// present. Since Unicode 18, the case closure of a BMP character can contain ++// supplementary code points (U+1DF95 LATIN SMALL LIGATURE LONG S WITH ++// DESCENDER S case-folds to U+00DF LATIN SMALL LETTER SHARP S). Non-unicode ++// ignoreCase matching compares UTF-16 code units, so a supplementary code ++// point never matches a BMP character and does not take part in Canonicalize. ++bool RemoveSupplementary(icu::UnicodeSet& set) { ++ constexpr UChar32 kFirstSupplementary = static_cast(kNonBmpStart); ++ if (!set.containsSome(kFirstSupplementary, UCHAR_MAX_VALUE)) return false; ++ set.remove(kFirstSupplementary, UCHAR_MAX_VALUE); ++ return true; ++} ++ + // The following code generates "src/regexp/special-case.cc". + void PrintSet(std::ofstream& out, const char* name, + const icu::UnicodeSet& set) { +@@ -51,6 +65,7 @@ void PrintSpecial(std::ofstream& out) { + icu::UnicodeSet current; + icu::UnicodeSet special_add; + icu::UnicodeSet ignore; ++ icu::UnicodeSet supplementary_equivalents; + UErrorCode status = U_ZERO_ERROR; + icu::UnicodeSet upper("[\\p{Lu}]", status); + CHECK(U_SUCCESS(status)); +@@ -63,6 +78,7 @@ void PrintSpecial(std::ofstream& out) { + } + current.set(i, i); + current.closeOver(USET_CASE_INSENSITIVE); ++ if (RemoveSupplementary(current)) supplementary_equivalents.add(i); + + // Check to see if all characters in the case-folding equivalence + // class as defined by UnicodeSet::closeOver all map to the same +@@ -112,6 +128,7 @@ void PrintSpecial(std::ofstream& out) { + UChar32 canonical = RegExpCaseFolding::Canonicalize(c); + current.set(c, c); + current.closeOver(USET_CASE_INSENSITIVE); ++ RemoveSupplementary(current); + current.removeAll(ignore); + for (int32_t j = 0; j < current.getRangeCount(); j++) { + for (UChar32 c2 = current.getRangeStart(j); +@@ -124,6 +141,7 @@ void PrintSpecial(std::ofstream& out) { + + PrintSet(out, "IgnoreSet", ignore); + PrintSet(out, "SpecialAddSet", special_add); ++ PrintSet(out, "SupplementaryEquivalentsSet", supplementary_equivalents); + } + + void WriteHeader(const char* header_filename) { +--- a/deps/v8/src/regexp/regexp-parser.cc ++++ b/deps/v8/src/regexp/regexp-parser.cc +@@ -9,6 +9,7 @@ + #include "src/regexp/regexp-ast.h" + #include "src/regexp/regexp-macro-assembler.h" + #include "src/regexp/regexp.h" ++#include "src/regexp/special-case.h" + #include "src/strings/char-predicates-inl.h" + #include "src/utils/ostreams.h" + #include "src/utils/utils.h" +@@ -155,6 +156,10 @@ void RegExpTextBuilder::FlushText() { + + void RegExpTextBuilder::AddCharacter(base::uc16 c) { + FlushPendingSurrogate(); ++ if (NeedsDesugaringForIgnoreCase(c)) { ++ AddClassRangesForDesugaring(c); ++ return; ++ } + if (characters_ == nullptr) { + characters_ = zone()->New>(4, zone()); + } +@@ -237,15 +242,18 @@ bool RegExpTextBuilder::NeedsDesugaringF + return false; + } + +-// We only use this for characters made of surrogate pairs. All other +-// characters outside of character classes are made case independent in the +-// code generation. ++// Desugar supplementary characters with case equivalents and BMP characters ++// with supplementary equivalents. Other atoms are folded during code ++// generation. + bool RegExpTextBuilder::NeedsDesugaringForIgnoreCase(base::uc32 c) { + #ifdef V8_INTL_SUPPORT + if (IsUnicodeMode() && ignore_case()) { ++ if (c <= unibrow::Utf16::kMaxNonSurrogateCharCode) { ++ return RegExpCaseFolding::HasSupplementaryEquivalents( ++ static_cast(c)); ++ } + icu::UnicodeSet set(c, c); +- set.closeOver(USET_CASE_INSENSITIVE); +- set.removeAllStrings(); ++ RegExpCaseFolding::CloseOver(set, RegExpCaseFolding::Mode::kUnicode); + return set.size() > 1; + } + // In the case where ICU is not included, we act as if the unicode flag is +--- a/deps/v8/src/regexp/special-case.h ++++ b/deps/v8/src/regexp/special-case.h +@@ -7,8 +7,8 @@ + + #ifdef V8_INTL_SUPPORT + #include "src/base/logging.h" ++#include "src/base/strings.h" + #include "src/common/globals.h" +- + #include "unicode/uchar.h" + #include "unicode/uniset.h" + #include "unicode/unistr.h" +@@ -71,9 +71,17 @@ namespace internal { + // another character. Characters that match no other characters in + // their equivalence class are added to IgnoreSet. Characters that + // match at least one other character are added to SpecialAddSet. ++// Supplementary code points are ignored throughout: non-unicode matching ++// compares UTF-16 code units, so they can never match a BMP character. ++// ++// The generator additionally emits SupplementaryEquivalentsSet, the BMP ++// characters whose Unicode case closure contains supplementary code points. ++// This set is used for unicode-mode matching, see HasSupplementaryEquivalents. + + class RegExpCaseFolding final : public AllStatic { + public: ++ enum class Mode { kNonUnicode, kUnicode }; ++ + static const icu::UnicodeSet& IgnoreSet(); + static const icu::UnicodeSet& SpecialAddSet(); + +@@ -108,6 +116,43 @@ class RegExpCaseFolding final : public A + // h. Return cu. + return cu; + } ++ ++ // Close a set of characters under case equivalence, preserving its ++ // original members. Non-unicode inputs must be UTF-16 code units. ++ static void CloseOver(icu::UnicodeSet& set, Mode mode) { ++ if (mode == Mode::kUnicode) { ++ set.closeOver(USET_SIMPLE_CASE_INSENSITIVE); ++ return; ++ } ++ DCHECK(!set.containsSome(0x10000, 0x10ffff)); ++ if (IgnoreSet().containsNone(set)) { ++ CloseOverNonUnicode(set); ++ return; ++ } ++ if (IgnoreSet().containsAll(set)) return; ++ // Ignored characters neither contribute nor acquire equivalents, but ++ // must remain in the result if they were explicitly present. ++ icu::UnicodeSet ignored(set); ++ ignored.retainAll(IgnoreSet()); ++ set.removeAll(IgnoreSet()); ++ CloseOverNonUnicode(set); ++ set.addAll(ignored); ++ } ++ ++ // Whether c has supplementary Unicode case equivalents. ++ static bool HasSupplementaryEquivalents(base::uc16 c) { ++ return SupplementaryEquivalentsSet().contains(c); ++ } ++ ++ private: ++ static const icu::UnicodeSet& SupplementaryEquivalentsSet(); ++ ++ // Requires a set containing no IgnoreSet characters. ++ static void CloseOverNonUnicode(icu::UnicodeSet& set) { ++ set.closeOver(USET_SIMPLE_CASE_INSENSITIVE); ++ set.removeAll(IgnoreSet()); ++ set.remove(0x10000, 0x10ffff); ++ } + }; + + } // namespace internal diff --git a/node/patches/v26.x/999-v8-icu4c-79.patch b/node/patches/v26.x/999-v8-icu4c-79.patch new file mode 100644 index 000000000..c644fa817 --- /dev/null +++ b/node/patches/v26.x/999-v8-icu4c-79.patch @@ -0,0 +1,220 @@ +From e455d955bd6b7a7549106d1b9d7ae5bb3b9e77b4 Mon Sep 17 00:00:00 2001 +From: Jakob Linke +Date: Fri, 9 Oct 2026 12:41:30 +0200 +Subject: [PATCH] [regexp] Handle supplementary case equivalents of BMP + characters + +Unicode 18 adds U+1DF95, which simple-folds to U+00DF. This creates the +first case-equivalence class spanning BMP and supplementary characters: +{U+00DF, U+1E9E, U+1DF95}. + +Discard supplementary characters from the generator's non-unicode +closures before calling Canonicalize, which requires UTF-16 code units +and otherwise CHECK-fails with ICU 79. Apply the same filtering in +runtime non-unicode closure. + +Generate SupplementaryEquivalentsSet and desugar its BMP characters into +character classes under /iu and /iv, allowing literals to match +surrogate pairs. + +Backreferences with differing UTF-16 character widths remain unsupported +and are tracked in crbug.com/571793821. + +IgnoreSet is unchanged with ICU 78 and with ICU 78.2 patched to upstream +Unicode 18 case data. With the patched data, the generator succeeds, +SupplementaryEquivalentsSet is {U+00DF, U+1E9E}, and regexp tests pass +in release and debug. + +Bug: 571232615, 571668686 +Change-Id: I9eacb273a74c66e17f0cfb1b256e863f2718c130 +Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8548134 +Reviewed-by: Patrick Thier +Commit-Queue: Jakob Linke +Cr-Commit-Position: refs/heads/main@{#110522} +--- + src/regexp/gen-regexp-special-case.cc | 18 ++++++++++ + src/regexp/regexp-parser.cc | 18 +++++++--- + src/regexp/special-case.h | 47 ++++++++++++++++++++++++++- + 3 files changed, 77 insertions(+), 6 deletions(-) + +--- a/deps/v8/src/regexp/gen-regexp-special-case.cc ++++ b/deps/v8/src/regexp/gen-regexp-special-case.cc +@@ -9,6 +9,7 @@ + + #include "src/base/strings.h" + #include "src/regexp/special-case.h" ++#include "unicode/uchar.h" + + namespace v8 { + namespace internal { +@@ -17,6 +18,19 @@ static const base::uc32 kSurrogateStart + static const base::uc32 kSurrogateEnd = 0xdfff; + static const base::uc32 kNonBmpStart = 0x10000; + ++// Removes supplementary code points from |set| and returns whether any were ++// present. Since Unicode 18, the case closure of a BMP character can contain ++// supplementary code points (U+1DF95 LATIN SMALL LIGATURE LONG S WITH ++// DESCENDER S case-folds to U+00DF LATIN SMALL LETTER SHARP S). Non-unicode ++// ignoreCase matching compares UTF-16 code units, so a supplementary code ++// point never matches a BMP character and does not take part in Canonicalize. ++bool RemoveSupplementary(icu::UnicodeSet& set) { ++ constexpr UChar32 kFirstSupplementary = static_cast(kNonBmpStart); ++ if (!set.containsSome(kFirstSupplementary, UCHAR_MAX_VALUE)) return false; ++ set.remove(kFirstSupplementary, UCHAR_MAX_VALUE); ++ return true; ++} ++ + // The following code generates "src/regexp/special-case.cc". + void PrintSet(std::ofstream& out, const char* name, + const icu::UnicodeSet& set) { +@@ -51,6 +65,7 @@ void PrintSpecial(std::ofstream& out) { + icu::UnicodeSet current; + icu::UnicodeSet special_add; + icu::UnicodeSet ignore; ++ icu::UnicodeSet supplementary_equivalents; + UErrorCode status = U_ZERO_ERROR; + icu::UnicodeSet upper("[\\p{Lu}]", status); + CHECK(U_SUCCESS(status)); +@@ -63,6 +78,7 @@ void PrintSpecial(std::ofstream& out) { + } + current.set(i, i); + current.closeOver(USET_CASE_INSENSITIVE); ++ if (RemoveSupplementary(current)) supplementary_equivalents.add(i); + + // Check to see if all characters in the case-folding equivalence + // class as defined by UnicodeSet::closeOver all map to the same +@@ -112,6 +128,7 @@ void PrintSpecial(std::ofstream& out) { + UChar32 canonical = RegExpCaseFolding::Canonicalize(c); + current.set(c, c); + current.closeOver(USET_CASE_INSENSITIVE); ++ RemoveSupplementary(current); + current.removeAll(ignore); + for (int32_t j = 0; j < current.getRangeCount(); j++) { + for (UChar32 c2 = current.getRangeStart(j); +@@ -124,6 +141,7 @@ void PrintSpecial(std::ofstream& out) { + + PrintSet(out, "IgnoreSet", ignore); + PrintSet(out, "SpecialAddSet", special_add); ++ PrintSet(out, "SupplementaryEquivalentsSet", supplementary_equivalents); + } + + void WriteHeader(const char* header_filename) { +--- a/deps/v8/src/regexp/regexp-parser.cc ++++ b/deps/v8/src/regexp/regexp-parser.cc +@@ -10,6 +10,7 @@ + #include "src/regexp/regexp-ast.h" + #include "src/regexp/regexp-macro-assembler.h" + #include "src/regexp/regexp.h" ++#include "src/regexp/special-case.h" + #include "src/strings/char-predicates-inl.h" + #include "src/utils/ostreams.h" + #include "src/utils/utils.h" +@@ -156,6 +157,10 @@ void RegExpTextBuilder::FlushText() { + + void RegExpTextBuilder::AddCharacter(base::uc16 c) { + FlushPendingSurrogate(); ++ if (NeedsDesugaringForIgnoreCase(c)) { ++ AddClassRangesForDesugaring(c); ++ return; ++ } + if (characters_ == nullptr) { + characters_ = zone()->New>(4, zone()); + } +@@ -238,15 +243,18 @@ bool RegExpTextBuilder::NeedsDesugaringF + return false; + } + +-// We only use this for characters made of surrogate pairs. All other +-// characters outside of character classes are made case independent in the +-// code generation. ++// Desugar supplementary characters with case equivalents and BMP characters ++// with supplementary equivalents. Other atoms are folded during code ++// generation. + bool RegExpTextBuilder::NeedsDesugaringForIgnoreCase(base::uc32 c) { + #ifdef V8_INTL_SUPPORT + if (IsUnicodeMode() && ignore_case()) { ++ if (c <= unibrow::Utf16::kMaxNonSurrogateCharCode) { ++ return RegExpCaseFolding::HasSupplementaryEquivalents( ++ static_cast(c)); ++ } + icu::UnicodeSet set(c, c); +- set.closeOver(USET_CASE_INSENSITIVE); +- set.removeAllStrings(); ++ RegExpCaseFolding::CloseOver(set, RegExpCaseFolding::Mode::kUnicode); + return set.size() > 1; + } + // In the case where ICU is not included, we act as if the unicode flag is +--- a/deps/v8/src/regexp/special-case.h ++++ b/deps/v8/src/regexp/special-case.h +@@ -7,8 +7,8 @@ + + #ifdef V8_INTL_SUPPORT + #include "src/base/logging.h" ++#include "src/base/strings.h" + #include "src/common/globals.h" +- + #include "unicode/uchar.h" + #include "unicode/uniset.h" + #include "unicode/unistr.h" +@@ -71,9 +71,17 @@ namespace internal { + // another character. Characters that match no other characters in + // their equivalence class are added to IgnoreSet. Characters that + // match at least one other character are added to SpecialAddSet. ++// Supplementary code points are ignored throughout: non-unicode matching ++// compares UTF-16 code units, so they can never match a BMP character. ++// ++// The generator additionally emits SupplementaryEquivalentsSet, the BMP ++// characters whose Unicode case closure contains supplementary code points. ++// This set is used for unicode-mode matching, see HasSupplementaryEquivalents. + + class RegExpCaseFolding final : public AllStatic { + public: ++ enum class Mode { kNonUnicode, kUnicode }; ++ + static const icu::UnicodeSet& IgnoreSet(); + static const icu::UnicodeSet& SpecialAddSet(); + +@@ -108,6 +116,43 @@ class RegExpCaseFolding final : public A + // h. Return cu. + return cu; + } ++ ++ // Close a set of characters under case equivalence, preserving its ++ // original members. Non-unicode inputs must be UTF-16 code units. ++ static void CloseOver(icu::UnicodeSet& set, Mode mode) { ++ if (mode == Mode::kUnicode) { ++ set.closeOver(USET_SIMPLE_CASE_INSENSITIVE); ++ return; ++ } ++ DCHECK(!set.containsSome(0x10000, 0x10ffff)); ++ if (IgnoreSet().containsNone(set)) { ++ CloseOverNonUnicode(set); ++ return; ++ } ++ if (IgnoreSet().containsAll(set)) return; ++ // Ignored characters neither contribute nor acquire equivalents, but ++ // must remain in the result if they were explicitly present. ++ icu::UnicodeSet ignored(set); ++ ignored.retainAll(IgnoreSet()); ++ set.removeAll(IgnoreSet()); ++ CloseOverNonUnicode(set); ++ set.addAll(ignored); ++ } ++ ++ // Whether c has supplementary Unicode case equivalents. ++ static bool HasSupplementaryEquivalents(base::uc16 c) { ++ return SupplementaryEquivalentsSet().contains(c); ++ } ++ ++ private: ++ static const icu::UnicodeSet& SupplementaryEquivalentsSet(); ++ ++ // Requires a set containing no IgnoreSet characters. ++ static void CloseOverNonUnicode(icu::UnicodeSet& set) { ++ set.closeOver(USET_SIMPLE_CASE_INSENSITIVE); ++ set.removeAll(IgnoreSet()); ++ set.remove(0x10000, 0x10ffff); ++ } + }; + + } // namespace internal diff --git a/wwand/Makefile b/wwand/Makefile index 6ed4f799e..1ed8af285 100644 --- a/wwand/Makefile +++ b/wwand/Makefile @@ -50,12 +50,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=wwand -PKG_VERSION:=1.8.0_pre32 -PKG_RELEASE:=85 +PKG_VERSION:=1.8.0_pre36 +PKG_RELEASE:=86 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/ddimension/wwand.git -PKG_SOURCE_VERSION:=4ea1d116311a0205396f3c40dffe9f012c200233 +PKG_SOURCE_VERSION:=d13826e8e19f0e4118d3246fdb021ca04b9ca05e PKG_MIRROR_HASH:=skip PKG_LICENSE:=GPL-2.0-only
체험 모드 · 표시되는 기기와 보호 통계는 모두 예시입니다. 지원 기기 살펴보기 → diff --git a/luci-app-smartsafehub/frontend/src/hooks/useAsyncResource.ts b/luci-app-smartsafehub/frontend/src/hooks/useAsyncResource.ts index 47e923e5e..a7de37630 100644 --- a/luci-app-smartsafehub/frontend/src/hooks/useAsyncResource.ts +++ b/luci-app-smartsafehub/frontend/src/hooks/useAsyncResource.ts @@ -12,7 +12,7 @@ export interface AsyncResourceState { interface AsyncResourceOptions { active?: boolean; fallbackError: string; - loader: () => Promise; + loader: (signal?: AbortSignal) => Promise; pollInterval?: number | ((data: T | null) => number | null); refreshOnFocus?: boolean; refreshOnVisible?: boolean; @@ -37,6 +37,8 @@ export function useAsyncResource({ const requested = useRef(false); const mounted = useRef(true); const inFlight = useRef | null>(null); + const controller = useRef(null); + const generation = useRef(0); const lastAttemptAt = useRef(null); const lastSuccessAt = useRef(null); const failureCount = useRef(0); @@ -48,6 +50,8 @@ export function useAsyncResource({ return () => { mounted.current = false; + generation.current += 1; + controller.current?.abort(); }; }, []); @@ -67,10 +71,14 @@ export function useAsyncResource({ } let request: Promise; + const sequence = ++generation.current; + const activeController = new AbortController(); + controller.current = activeController; lastAttemptAt.current = Date.now(); - request = loader() + request = loader(activeController.signal) .then((data) => { + if (sequence !== generation.current || activeController.signal.aborted) return; lastSuccessAt.current = Date.now(); failureCount.current = 0; if (mounted.current) { @@ -78,6 +86,7 @@ export function useAsyncResource({ } }) .catch((error: unknown) => { + if (sequence !== generation.current || activeController.signal.aborted) return; failureCount.current += 1; if (mounted.current) { setState((current) => ({ @@ -89,9 +98,8 @@ export function useAsyncResource({ } }) .finally(() => { - if (inFlight.current === request) { - inFlight.current = null; - } + if (inFlight.current === request) inFlight.current = null; + if (controller.current === activeController) controller.current = null; }); inFlight.current = request; @@ -103,6 +111,10 @@ export function useAsyncResource({ useEffect(() => { if (!active) { requested.current = false; + generation.current += 1; + controller.current?.abort(); + controller.current = null; + inFlight.current = null; return; } diff --git a/luci-app-smartsafehub/frontend/src/hooks/useDeviceRegistration.ts b/luci-app-smartsafehub/frontend/src/hooks/useDeviceRegistration.ts index 3af344c06..4c93516ca 100644 --- a/luci-app-smartsafehub/frontend/src/hooks/useDeviceRegistration.ts +++ b/luci-app-smartsafehub/frontend/src/hooks/useDeviceRegistration.ts @@ -157,7 +157,8 @@ export function useDeviceRegistration(enabled: boolean) { useEffect(() => () => { mounted.current = false; }, []); - const shouldPoll = useMemo(() => pairingStillValid(data), [data]); + const shouldPoll = useMemo(() => pairingStillValid(data) || + data?.pairingOperation?.phase === 'starting' || data?.pairingOperation?.phase === 'running', [data]); useEffect(() => { if (!enabled || !shouldPoll) { @@ -168,10 +169,10 @@ export function useDeviceRegistration(enabled: boolean) { let timer = 0; const poll = async () => { - await refresh(); - if (active) { - timer = window.setTimeout(() => void poll(), PAIRING_POLL_INTERVAL_MS); - } + const generation = ++requestGeneration.current; + const status = await fetchDeviceRegistrationStatus().catch(() => null); + if (active && status) commitStatus(status, generation); + if (active) timer = window.setTimeout(() => void poll(), PAIRING_POLL_INTERVAL_MS); }; timer = window.setTimeout(() => void poll(), PAIRING_POLL_INTERVAL_MS); @@ -179,7 +180,7 @@ export function useDeviceRegistration(enabled: boolean) { active = false; window.clearTimeout(timer); }; - }, [enabled, refresh, shouldPoll]); + }, [enabled, commitStatus, shouldPoll]); return { data, diff --git a/luci-app-smartsafehub/frontend/src/hooks/useHashRoute.ts b/luci-app-smartsafehub/frontend/src/hooks/useHashRoute.ts index 1b17eba54..f0e56c156 100644 --- a/luci-app-smartsafehub/frontend/src/hooks/useHashRoute.ts +++ b/luci-app-smartsafehub/frontend/src/hooks/useHashRoute.ts @@ -16,6 +16,7 @@ const HASH_ROUTES: Readonly> = { '#safeshield': 'safeshield', '#rules': 'rules', '#account': 'account', + '#apps': 'apps', '#system': 'system', '#settings': 'settings', '#settings/diagnostics': 'settings', diff --git a/luci-app-smartsafehub/frontend/src/main.tsx b/luci-app-smartsafehub/frontend/src/main.tsx index 0b5c080df..b9edbdcc9 100644 --- a/luci-app-smartsafehub/frontend/src/main.tsx +++ b/luci-app-smartsafehub/frontend/src/main.tsx @@ -44,7 +44,7 @@ function installBootstrap(sessionId: string, host: HTMLElement): void { sessionId, rpcUrl: luciUrl('/admin/ubus'), assetBase: host.dataset.assetBase ?? '/luci-static/smartsafehub/', - assetVersion: host.dataset.assetVersion ?? '0.2.30-r1', + assetVersion: host.dataset.assetVersion ?? '0.2.31-r1', locale: document.documentElement.lang || 'ko', }); } diff --git a/luci-app-smartsafehub/frontend/src/pages/AppsPage.tsx b/luci-app-smartsafehub/frontend/src/pages/AppsPage.tsx new file mode 100644 index 000000000..219fce62c --- /dev/null +++ b/luci-app-smartsafehub/frontend/src/pages/AppsPage.tsx @@ -0,0 +1,436 @@ +import { useEffect, useMemo, useRef, useState } from 'preact/hooks'; + +import { AppsIcon, ReloadIcon } from '../components/Icons'; +import { AppsStorageCard } from '../components/AppsStorageCard'; +import { AppsCategoryIcon, appsCategoryOf } from '../components/AppsCategoryIcon'; +import type { AppsCategory } from '../components/AppsCategoryIcon'; +import { SectionHeading } from '../components/SectionHeading'; +import type { AppsCatalog, AppsInstallStatus, AppsMetrics, VerifiedApp } from '../types/apps'; +import { errorMessage } from '../utils/errors'; +import { approvedAppPath } from '../utils/appsWebUi'; +import { formatStorageBytes } from '../utils/appsStorage'; +import { appsJobNoticeKey, readDismissedAppsJob, saveDismissedAppsJob } from '../utils/appsJobNotice'; + +interface AppsPageProps { + data: AppsCatalog | null; + error: string | null; + loading: boolean; + refreshing: boolean; + onRetry: () => void; + installStatus: AppsInstallStatus | null; + metrics: AppsMetrics | null; + statusError: string | null; + onRefreshStatus: () => void; + onInstall: (id: string) => Promise; + onRemove: (id: string) => Promise; + onUpdate: (id: string) => Promise; + /** All public demo actions are local-only; no installs or real app launch. */ + demo?: boolean; + onDemoAction?: () => void; +} + +const OPERATION_MESSAGES: Readonly> = { + E21: '서버에서 승인 정보를 확인하지 못했습니다. 인터넷 연결을 확인해 주세요.', + E22: '이 펌웨어에서 승인되지 않은 앱입니다.', + E24: '공유기의 패키지 아키텍처와 앱이 일치하지 않습니다.', + E25: '배포 저장소가 승인 당시와 달라졌거나 접근할 수 없습니다. 관리자 확인 후 다시 시도해 주세요.', + E26: '앱 설치에 필요한 메모리 또는 저장 공간이 부족합니다.', + E27: '승인된 패키지 정보가 올바르지 않습니다.', + E28: '이전에 설치한 앱의 구성이 현재 승인 정보와 다릅니다.', + E29: '동일한 패키지가 이미 다른 방법으로 설치되어 있습니다.', + E31: '앱 파일을 다운로드하지 못했습니다.', + E32: '다운로드된 앱 파일이 올바르지 않습니다.', + E33: '앱 파일의 검증 값이 일치하지 않습니다.', + E34: '패키지 설치 사전 확인에 실패했습니다.', + E35: '패키지를 설치하지 못했습니다.', + E37: '공식 OpenWrt LuCI 저장소가 승인 당시와 다릅니다. 관리자에게 확인해 주세요.', + E38: '기존 공유 라이브러리의 버전이 승인된 버전과 달라 설치할 수 없습니다.', + E51: 'SmartSafeHub Apps에서 관리하는 앱만 업데이트할 수 있습니다.', + E52: '현재 설치 버전과 승인된 업데이트가 일치하지 않습니다. 앱 구성과 업데이트 버전을 확인해 주세요.', + E53: '다른 시스템 패키지 변경이 필요하여 앱 업데이트를 중단했습니다.', + E54: '앱 업데이트에 실패했습니다. 일부 패키지가 변경되었을 수 있으니 관리자에게 확인해 주세요.', + E55: '업데이트 후 설치 기록을 저장하지 못했습니다. 관리자에게 확인해 주세요.', + E41: 'SmartSafeHub Apps에서 설치한 앱만 여기서 제거할 수 있습니다.', + E44: '기존 시스템에 영향을 줄 수 있어 앱 제거가 차단됐습니다.', + E45: '앱 제거에 실패했습니다.', +}; + +const TABS: readonly { id: AppsCategory; label: string }[] = [ + { id: 'all', label: '전체' }, + { id: 'network', label: '네트워크' }, + { id: 'security', label: '보안' }, + { id: 'smart_home', label: '스마트홈' }, + { id: 'entertainment', label: '엔터테인먼트' }, + { id: 'utilities', label: '도구' }, + { id: 'other', label: '기타' }, +]; + +type AppAction = 'install' | 'update' | 'remove'; + +function OperationIndicator({ action }: { action: AppAction }) { + const removing = action === 'remove'; + return ( + + + {removing ? '제거 중…' : action === 'update' ? '업데이트 중…' : '설치 중…'} + + ); +} + +export function AppsPage({ data, error, loading, refreshing, onRetry, installStatus, metrics, statusError, + onRefreshStatus, onInstall, onUpdate, onRemove, demo = false, onDemoAction }: AppsPageProps) { + const [category, setCategory] = useState('all'); + const [query, setQuery] = useState(''); + const [pending, setPending] = useState<{ appId: string; action: AppAction } | null>(null); + const [removeTarget, setRemoveTarget] = useState(null); + const cancelRemoveRef = useRef(null); + const removeTriggerRef = useRef(null); + const [actionError, setActionError] = useState(null); + const [dismissedJob, setDismissedJob] = useState(readDismissedAppsJob); + // Keep the last successful catalog while a refresh fails. A separate status + // request may describe a different catalog generation, so a missing ID + // alone is NOT proof that an app has been discontinued. + const currentData = data; + const apps = currentData?.apps ?? []; + const orphans = currentData && !error && !loading && !refreshing && !statusError + ? Object.entries(installStatus?.installed ?? {}).filter(([id, state]) => + state.retired === true && state.managed && !apps.some((app) => app.id === id)) + : []; + const restore = installStatus?.restore; + const job = installStatus?.job; + const running = job?.phase === 'starting' || job?.phase === 'running'; + const restoring = restore?.phase === 'starting' || restore?.phase === 'running'; + const jobKey = appsJobNoticeKey(job); + const dismissJob = (key: string) => { + setDismissedJob(key); + saveDismissedAppsJob(key); + }; + const showJob = job && job.phase !== 'idle' && jobKey !== dismissedJob; + useEffect(() => { + if (job?.phase !== 'success' || !showJob) return; + const timeout = window.setTimeout(() => dismissJob(jobKey), 7000); + return () => window.clearTimeout(timeout); + }, [jobKey, job?.phase, showJob]); + const jobAction: AppAction | null = job?.action === 'install' || job?.action === 'update' || job?.action === 'remove' ? job.action : null; + const filtered = useMemo(() => apps.filter((app) => + (category === 'all' || appsCategoryOf(app.category) === category) && + `${app.name} ${app.summary}`.toLocaleLowerCase().includes(query.trim().toLocaleLowerCase()), + ), [apps, category, query]); + + useEffect(() => { + if (!removeTarget) return; + cancelRemoveRef.current?.focus(); + const handleEscape = (event: KeyboardEvent) => { + if (event.key === 'Escape') { + event.preventDefault(); + setRemoveTarget(null); + removeTriggerRef.current?.focus(); + } + }; + window.addEventListener('keydown', handleEscape); + return () => window.removeEventListener('keydown', handleEscape); + }, [removeTarget]); + + const closeRemoveDialog = () => { + setRemoveTarget(null); + removeTriggerRef.current?.focus(); + }; + + const openRemoveDialog = (app: VerifiedApp, trigger: HTMLButtonElement) => { + if (!installStatus || statusError || pending !== null || running || restoring) return; + removeTriggerRef.current = trigger; + setRemoveTarget(app); + }; + + const requestOperation = async (app: VerifiedApp, action: AppAction) => { + if (!installStatus || statusError || pending !== null || running || restoring) return; + if (demo) { + if (action === 'remove') closeRemoveDialog(); + onDemoAction?.(); + return; + } + if (action === 'update' && !window.confirm(`${app.name} 앱을 최신 승인 버전으로 업데이트하시겠습니까?\n\n업데이트 중 공유기를 재부팅하지 마세요.`)) return; + if (action === 'install' && !window.confirm(`${app.name} 앱을 설치하시겠습니까?\n\n앱을 변경하는 동안 공유기를 재부팅하지 마세요.`)) return; + if (action === 'remove') closeRemoveDialog(); + setActionError(null); + setPending({ appId: app.id, action }); + try { + if (action === 'install') await onInstall(app.id); + else if (action === 'update') await onUpdate(app.id); + else await onRemove(app.id); + onRefreshStatus(); + } catch (cause: unknown) { + setActionError(errorMessage(cause, `${app.name} 앱 작업을 시작하지 못했습니다.`)); + } finally { + setPending(null); + } + }; + + return ( +
+ {removeTarget ? ( +
{ if (event.target === event.currentTarget) closeRemoveDialog(); }} + role="presentation" + > +
{ + if (event.key !== 'Tab') return; + // Keep keyboard focus inside the confirmation dialog. + if (event.shiftKey && event.target === cancelRemoveRef.current) { + event.preventDefault(); + const confirmButton = event.currentTarget.querySelector('[data-confirm-remove]'); + confirmButton?.focus(); + } else if (!event.shiftKey && event.target instanceof HTMLButtonElement && event.target.hasAttribute('data-confirm-remove')) { + event.preventDefault(); + cancelRemoveRef.current?.focus(); + } + }} + role="dialog" + > +

앱 제거 확인

+

+ {removeTarget.name} 앱을 이 공유기에서 제거하시겠습니까? +

+

+ 앱에서 제공하던 기능을 더 이상 사용할 수 없습니다. 제거하는 동안 공유기를 재부팅하지 마세요. +

+
+ + +
+
+
+ ) : null} +
+ +
+
+
+
+ + + +
+

검증된 앱

+

현재 펌웨어에서 확인된 앱만 표시합니다.

+
+
+
+ + {currentData ? `${apps.length}개` : '확인 전'} + + {error && currentData ? ( + 이전 목록 + ) : null} + +
+
+

+ 검증된 APK를 설치·업데이트·제거할 수 있습니다. 작업 중에는 다른 앱 작업을 시작할 수 없습니다. +

+
+ +
+
+ + {restore && (restore.phase === 'starting' || restore.phase === 'running' || restore.phase === 'failed') ? ( +
+ {restore.phase === 'failed' ? 'Apps 자동 복원을 완료하지 못했습니다.' : '펌웨어 업데이트 후 Apps를 복원하는 중입니다.'} + {restore.appId ? · {restore.appId} : null} + {restore.phase === 'failed' ?

{OPERATION_MESSAGES[restore.code] ?? '승인·연결·설치 상태를 확인해 주세요.'} 필요한 경우 앱 카드에서 설치 마무리를 진행할 수 있습니다.

:

검증된 패키지만 다시 설치합니다. 완료될 때까지 앱 설치·제거를 시작하지 마세요.

} +
+ ) : null} + {showJob && job ? ( +
+
+
+ {running ? (job.action === 'remove' ? '앱 제거 중' : job.action === 'update' ? '앱 업데이트 중' : '앱 설치 중') : job.phase === 'success' ? '마지막 앱 작업 완료' : '마지막 앱 작업 실패'} + {job.appId ? ` · ${job.appId}` : ''} + {job.code && job.code !== 'NONE' ? ` · 오류 코드 ${job.code}` : ''} + {job.phase === 'failed' && job.code && OPERATION_MESSAGES[job.code] + ?

{OPERATION_MESSAGES[job.code]}

: null} + {running ?

{job.action === 'remove' ? '앱 제거와 패키지 정리가 진행 중입니다.' : job.action === 'update' ? '승인된 버전으로 앱을 업데이트하고 있습니다.' : '설치 확인과 패키지 처리가 진행 중입니다.'} 화면을 닫아도 작업은 계속됩니다.

: null} +
+ {!running ? : null} +
+
+ ) : null} + {actionError ? : null} + {statusError ? : null} + {error && !currentData ? ( + + ) : null} + {loading && !currentData ? ( +
검증된 앱 목록을 확인하는 중입니다.
+ ) : null} + {currentData ? ( + <> + {apps.length > 0 ? ( +
+
+
+ {TABS.map((tab) => ( + + ))} +
+ setQuery(event.currentTarget.value)} + placeholder="앱 검색" + type="search" + value={query} + /> +
+
+ {filtered.map((app) => { + const state = installStatus?.installed[app.id]; + const installed = state?.installed ?? false; + const bytes = metrics?.installedSizes?.[app.id]; + const sizeLabel = installed && typeof bytes === 'number' && Number.isSafeInteger(bytes) && bytes >= 0 + ? formatStorageBytes(bytes) : null; + const managed = state?.managed ?? false; + const updateAvailable = Boolean(installed && managed && state?.updateAvailable); + const installedVersion = installed ? state?.installedVersion : null; + const showOfferedVersion = Boolean(installed && installedVersion && (updateAvailable || installedVersion !== app.version)); + const activeAction = pending?.appId === app.id ? pending.action : running && job?.appId === app.id ? jobAction : null; + const disabled = !installStatus || Boolean(statusError) || pending !== null || running || restoring; + const removable = managed && (installed || Boolean(state?.partial)); + const launchPath = installed && state?.webUiReady ? approvedAppPath(app.webUi) : null; + return ( +
+
+ +
+
+

{app.name}

+ {installed && managed ? ✓ 설치됨 : null} +
+
+ + {installed ? installedVersion ? `설치 v${installedVersion}` : '설치 버전 확인 불가' : `v${app.version}`} + + {updateAvailable ? 업데이트 가능 : null} +
+ {showOfferedVersion || sizeLabel !== null ? ( +

+ {showOfferedVersion ? ( + 제공 v{app.version} + ) : null} + {showOfferedVersion && sizeLabel !== null ? : null} + {sizeLabel !== null ? ( + 설치 용량 약 {sizeLabel} + ) : null} +

+ ) : null} +
+
+

{app.summary}

+
+ ✓ 검증된 앱 + {activeAction ? : ( + + {managed && state?.partial && !installed ? ( + + ) : null} + {updateAvailable ? : null} + {launchPath ? (demo ? ( + + ) : ( + 열기 ↗ + )) : installed && app.webUi ? ( + 웹 UI 미설치 + ) : null} + {installed && !managed ? 기존에 설치됨 + : state?.partial && !managed ? 일부 패키지 설치됨 + : } + + )} +
+
+ ); + })} +
+ {filtered.length === 0 ?

검색 조건에 맞는 앱이 없습니다.

: null} +
+ ) : ( +
+ +

아직 등록된 앱이 없습니다.

+

현재 기기와 펌웨어에 대해 승인된 앱이 준비되면 이곳에서 확인할 수 있습니다.

+
+ )} +

기기 {currentData.deviceCode} · 펌웨어 {currentData.firmwareBuildId} · {currentData.channel} 채널

+ + ) : null} + {orphans.length > 0 ? ( +
+

제공이 중단된 앱

+

현재 승인 목록에서 제외되었지만 기기에 남아 있는 앱입니다. 설치는 불가능하며 제거할 수 있습니다.

+
+ {orphans.map(([id]) => { + const activeAction = pending?.appId === id ? pending.action : running && job?.appId === id ? jobAction : null; + return ( +
+ {id} + {activeAction ? : } +
+ ); + })} +
+
+ ) : null} +
+ ); +} diff --git a/luci-app-smartsafehub/frontend/src/pages/HomePage.tsx b/luci-app-smartsafehub/frontend/src/pages/HomePage.tsx index d7dae2a6f..1052edc3f 100644 --- a/luci-app-smartsafehub/frontend/src/pages/HomePage.tsx +++ b/luci-app-smartsafehub/frontend/src/pages/HomePage.tsx @@ -7,6 +7,7 @@ import { CheckCircleIcon, ClockIcon, DevicesIcon, + DatabaseIcon, GlobeIcon, MemoryIcon, RouterIcon, @@ -26,6 +27,7 @@ import type { SafeShieldStatistics, SafeShieldStatus } from '../types/safeshield import type { SmartSafeHubStatus } from '../types/status'; import type { SoftwareUpdateStatus } from '../types/updates'; import { isSoftwareUpdateCheckStale } from '../utils/softwareUpdates'; +import { summarizeAppsStorage } from '../utils/appsStorage'; import { formatBootTime, formatBytes, @@ -37,6 +39,9 @@ import { getMemoryUsage, } from '../app/format'; +// Keep the dashboard ring geometry identical to AppsStorageCard (96px SVG, r=39). +const DISK_RING_CIRCUMFERENCE = 2 * Math.PI * 39; + interface HomePageProps { accountRegistered: boolean | null; activity: ActivityHistory | null; @@ -514,6 +519,8 @@ export function HomePage({ } const memoryPercent = memory ? Math.round(memory.percent) : 0; + const disk = summarizeAppsStorage(data.runtime.storage); + const diskAvailableArc = disk ? (disk.availableRatio * DISK_RING_CIRCUMFERENCE).toFixed(2) : '0'; const safeShieldSummary = safeShieldOverview( safeshield, safeshieldLoading, @@ -857,7 +864,7 @@ export function HomePage({