From a3f9d914e460145913dcbccc9e44048be31e6b0f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 04:02:58 +0000 Subject: [PATCH 001/160] Update default to v3.5.4 (#802) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 8770bc493..58024c3bb 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ UTF-8 com.ghostchu.peerbanhelper.MainJumpLoader yyyyMMdd-HHmmss - 3.5.2 + 3.5.4 /opt/install4j 6.1 @@ -498,7 +498,7 @@ com.formdev flatlaf-extras - 3.5.2 + 3.5.4 com.offbynull.portmapper From 5dbc4020379c27c28b6c6fb79454243869629d76 Mon Sep 17 00:00:00 2001 From: CreeperAWA Date: Sun, 15 Dec 2024 12:08:21 +0800 Subject: [PATCH 002/160] Update README.EN.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit “Following function are provided by PeerBanHelper:” 修改为 “The following functions are provided by PeerBanHelper:”,以匹配正确的复数形式。 “and supports the following functions once it successful loaded” 修改为 “and supports the following functions once it has been successfully loaded”,以使用正确的时态和副词形式。 “Transmission (deprecated;3.00-20 or higher)” 中的分号修改为英文分号,以符合英文标点规范。 --- README.EN.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.EN.md b/README.EN.md index 691e546d5..835713dd4 100644 --- a/README.EN.md +++ b/README.EN.md @@ -6,7 +6,7 @@ Automatically block unwanted, leeches and abnormal BT peers with support for cus ![page-views](https://raw.githubusercontent.com/PBH-BTN/views-counter/refs/heads/master/svg/754169590/badge.svg) ## Introduction -Following function are provided by PeerBanHelper: +The following functions are provided by PeerBanHelper: - [PeerID Blacklist](https://docs.pbh-btn.com/en/docs/module/peer-id) - [Client Name Blacklist](https://docs.pbh-btn.com/en/docs/module/client-name) @@ -19,7 +19,7 @@ Following function are provided by PeerBanHelper: - [IP set subscribe](https://docs.pbh-btn.com/en/docs/module/ip-address-blocker-rules) - A modern WebUI -In addition, PeerBanHelper downloads the GeoIP library at startup, and supports the following functions once it successful loaded: +In addition, PeerBanHelper downloads the GeoIP library at startup and supports the following functions once it has been successfully loaded: - View IP address attribution, AS information (ASN, ISP, AS name, etc.), network type information (broadband, base station, IoT, data center, etc.) in the blocking list. - Based on GeoIP information, block IP addresses by country/region, city, network type, ASN and so on. - View GeoIP statistics @@ -34,7 +34,7 @@ In addition, PeerBanHelper downloads the GeoIP library at startup, and supports - BiglyBT([plugin](https://github.com/PBH-BTN/PBH-Adapter-BiglyBT) is required) - Deluge([plugin](https://github.com/PBH-BTN/PBH-Adapter-Deluge) is required) - Azureus(Vuze)([plugin](https://github.com/PBH-BTN/PBH-Adapter-Azureus) is required) -- Transmission **(deprecated;3.00-20 or higher)** +- Transmission **(deprecated; 3.00-20 or higher)** - BitComet **v2.10 Beta6 [20240928] or higher** (P2SP LTSeed mode is not supported) From 18cc9a24f0f8987506e24e7ffb033d2d762afb6e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 00:28:40 +0000 Subject: [PATCH 003/160] Update dependency org.springframework:spring-context to v6.2.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 58024c3bb..1aac8b1d9 100644 --- a/pom.xml +++ b/pom.xml @@ -364,7 +364,7 @@ org.springframework spring-context - 6.2.0 + 6.2.1 From 9e2ac3a1e5dfa6f3f7b92cfbb9fd333a8da8840c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 13:23:39 +0000 Subject: [PATCH 004/160] Bump org.springframework:spring-context from 6.2.0 to 6.2.1 Bumps [org.springframework:spring-context](https://github.com/spring-projects/spring-framework) from 6.2.0 to 6.2.1. - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.0...v6.2.1) --- updated-dependencies: - dependency-name: org.springframework:spring-context dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b4bd60005..7e43c2a22 100644 --- a/pom.xml +++ b/pom.xml @@ -364,7 +364,7 @@ org.springframework spring-context - 6.2.0 + 6.2.1 From ceca8a3e089297c3ab51c5f44d9f3155313d957d Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 17 Dec 2024 16:47:02 +0800 Subject: [PATCH 005/160] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java | 1 + src/main/java/com/ghostchu/peerbanhelper/ipdb/IPDB.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java index d3c0ff17e..03d796222 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java +++ b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java @@ -50,6 +50,7 @@ import com.ghostchu.simplereloadlib.Reloadable; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import com.google.common.hash.Hashing; import com.google.gson.JsonObject; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.EvalMode; diff --git a/src/main/java/com/ghostchu/peerbanhelper/ipdb/IPDB.java b/src/main/java/com/ghostchu/peerbanhelper/ipdb/IPDB.java index 20cb115ff..ac7a24df5 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/ipdb/IPDB.java +++ b/src/main/java/com/ghostchu/peerbanhelper/ipdb/IPDB.java @@ -270,7 +270,7 @@ private void loadMMDB() throws IOException { private void updateMMDB(String databaseName, File target) throws IOException { log.info(tlUI(Lang.IPDB_UPDATING, databaseName)); - IPDBDownloadSource mirror1 = new IPDBDownloadSource("https://github.com/P3TERX/GeoLite.mmdb/releases/latest/download/", databaseName); + IPDBDownloadSource mirror1 = new IPDBDownloadSource("https://github.com/PBH-BTN/GeoLite.mmdb/releases/latest/download/", databaseName, true); //IPDBDownloadSource mirror2 = new IPDBDownloadSource("https://ghp.ci/https://github.com/P3TERX/GeoLite.mmdb/releases/latest/download/", databaseName); IPDBDownloadSource mirror3 = new IPDBDownloadSource("https://pbh-static.paulzzh.com/ipdb/", databaseName, true); IPDBDownloadSource mirror4 = new IPDBDownloadSource("https://pbh-static.ghostchu.com/ipdb/", databaseName, true); From e4ed71f493297bca3e6ede2836df6e84a735692e Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 17 Dec 2024 18:45:09 +0800 Subject: [PATCH 006/160] Update README --- README.EN.md | 10 ++++++++++ README.md | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/README.EN.md b/README.EN.md index 835713dd4..cbcbccfab 100644 --- a/README.EN.md +++ b/README.EN.md @@ -68,12 +68,22 @@ Any consequences caused by the user's use of this software are borne by the user [![Star History Chart](https://api.star-history.com/svg?repos=PBH-BTN/PeerBanHelper&type=Date)](https://star-history.com/#PBH-BTN/PeerBanHelper&Date) +## Tools + +In the development process of PeerBanHelper, we have used many excellent professional tools. Thanks to the following companies or projects for providing open-source licenses: + ### Install4j PeerBanHelper use [Install4j multi-platform installer builder](https://www.ej-technologies.com/products/install4j/overview.html) to build its multi-platform installer. Thanks the open-source license provided by ej-technolgies. Click the link or the image below to download install4j. [![Install4j](https://www.ej-technologies.com/images/product_banners/install4j_large.png)](https://www.ej-technologies.com/products/install4j/overview.html) +### JProfiler + +PeerBanHelper use [JProfiler all-in one Java profiler](https://www.ej-technologies.com/jprofiler) to analyze and optimize the program. Thanks the open-source license provided by ej-technolgies. Click the link or the image below to download JProfiler. + +[![JProfiler](https://www.ej-technologies.com/images/product_banners/jprofiler_large.png)](https://www.ej-technologies.com/jprofiler) + ## Credit ### Backend diff --git a/README.md b/README.md index 279e552fc..b0f7d0674 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,9 @@ PeerBanHelper 仅支持对传统 IPv4 或 IPv6 地址的反吸血,如遇 I2P [![Star History Chart](https://api.star-history.com/svg?repos=PBH-BTN/PeerBanHelper&type=Date)](https://star-history.com/#PBH-BTN/PeerBanHelper&Date) +## Tools + +在 PeerBanHelper 的开发过程中,我们使用到了许多优秀的专业工具。感谢下面的公司或项目慷慨的提供开源许可证: ### Install4j @@ -76,6 +79,12 @@ PeerBanHelper 使用 [Install4j multi-platform installer builder](https://www.ej [![Install4j](https://www.ej-technologies.com/images/product_banners/install4j_large.png)](https://www.ej-technologies.com/products/install4j/overview.html) +### JProfiler + +PeerBanHelper 使用 [JProfiler all-in one Java profiler](https://www.ej-technologies.com/jprofiler) 对程序进行性能分析与优化。感谢 ej-technolgies 的开放源代码许可证。点击链接或者下面的图片下载 JProfiler。 + +[![JProfiler](https://www.ej-technologies.com/images/product_banners/jprofiler_large.png)](https://www.ej-technologies.com/jprofiler) + ## Credit ### Backend From 441a865e79b8f7171b7246a3103664724fda13a2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2024 21:32:01 +0000 Subject: [PATCH 007/160] Update dependency io.javalin:javalin to v6.4.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1aac8b1d9..f00780728 100644 --- a/pom.xml +++ b/pom.xml @@ -341,7 +341,7 @@ io.javalin javalin - 6.3.0 + 6.4.0 jetty-server From 77282e69135d796fc89b68030a999ac3c863106e Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Wed, 18 Dec 2024 17:26:46 +0800 Subject: [PATCH 008/160] =?UTF-8?q?=E5=AE=89=E8=A3=85=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E5=89=8D=E7=BB=93=E6=9D=9F=20PeerBanHelper=20=E8=BF=9B?= =?UTF-8?q?=E7=A8=8B=20#718?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install4j/project.install4j | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/install4j/project.install4j b/install4j/project.install4j index e37180e67..9dede8906 100644 --- a/install4j/project.install4j +++ b/install4j/project.install4j @@ -285,6 +285,23 @@ return true; + + + 70 + + + + + + + try{ + Runtime.getRuntime().exec(new String[] {"taskkill", "/f", "/t", "/im", "PeerBanHelper*"}).waitFor(); +} catch (Exception ignored) {} +return true; + + + + From f8c144bb1dcf4e38e0b900533265d2197042668d Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Wed, 18 Dec 2024 17:31:38 +0800 Subject: [PATCH 009/160] =?UTF-8?q?=E5=AE=89=E8=A3=85=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E5=89=8D=E8=BF=90=E8=A1=8C=E4=B8=8A=E4=B8=AA=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=9A=84=E5=8D=B8=E8=BD=BD=E5=99=A8=20#718?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install4j/project.install4j | 34 +++++----------------------------- 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/install4j/project.install4j b/install4j/project.install4j index 9dede8906..278b7701f 100644 --- a/install4j/project.install4j +++ b/install4j/project.install4j @@ -285,35 +285,6 @@ return true; - - - 70 - - - - - - - try{ - Runtime.getRuntime().exec(new String[] {"taskkill", "/f", "/t", "/im", "PeerBanHelper*"}).waitFor(); -} catch (Exception ignored) {} -return true; - - - - - - - - - - libraries - - - - - - @@ -458,6 +429,11 @@ return console.askYesNo(message, true); + + + 70 + + From 0816eef8d42a377797f4c13f28b049223c65954a Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Wed, 18 Dec 2024 18:44:09 +0800 Subject: [PATCH 010/160] =?UTF-8?q?=E5=8D=B8=E8=BD=BD=E6=97=B6=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A7=E7=9A=84=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install4j/project.install4j | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/install4j/project.install4j b/install4j/project.install4j index 278b7701f..5e362a4e6 100644 --- a/install4j/project.install4j +++ b/install4j/project.install4j @@ -435,6 +435,17 @@ return console.askYesNo(message, true); + + + + + + libraries + + + + + From f8dba64c5584549e97959f0646ca1114d66b89d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 13:50:44 +0000 Subject: [PATCH 011/160] Bump com.google.guava:guava from 33.3.1-jre to 33.4.0-jre Bumps [com.google.guava:guava](https://github.com/google/guava) from 33.3.1-jre to 33.4.0-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b4bd60005..3f379da12 100644 --- a/pom.xml +++ b/pom.xml @@ -276,7 +276,7 @@ com.google.guava guava - 33.3.1-jre + 33.4.0-jre org.jetbrains From 92c26b55172d2428aa9904176c66e1eb5b3c893f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 13:51:05 +0000 Subject: [PATCH 012/160] Bump org.junit.jupiter:junit-jupiter-api from 5.11.3 to 5.11.4 Bumps [org.junit.jupiter:junit-jupiter-api](https://github.com/junit-team/junit5) from 5.11.3 to 5.11.4. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.11.3...r5.11.4) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-api dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b4bd60005..e6eea781f 100644 --- a/pom.xml +++ b/pom.xml @@ -330,7 +330,7 @@ org.junit.jupiter junit-jupiter-api - 5.11.3 + 5.11.4 test From 37f1936ab0aff2842c6f139638454543e430aea0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 13:51:21 +0000 Subject: [PATCH 013/160] Bump ch.qos.logback:logback-classic from 1.5.12 to 1.5.15 Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.5.12 to 1.5.15. - [Commits](https://github.com/qos-ch/logback/compare/v_1.5.12...v_1.5.15) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b4bd60005..5c536347f 100644 --- a/pom.xml +++ b/pom.xml @@ -319,7 +319,7 @@ ch.qos.logback logback-classic - 1.5.12 + 1.5.15 com.formdev From c6e09e061b0545b811a6d8b2eadc98dae1c97c9d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 13:51:27 +0000 Subject: [PATCH 014/160] Bump io.javalin:javalin from 6.3.0 to 6.4.0 Bumps [io.javalin:javalin](https://github.com/javalin/javalin) from 6.3.0 to 6.4.0. - [Release notes](https://github.com/javalin/javalin/releases) - [Commits](https://github.com/javalin/javalin/compare/javalin-parent-6.3.0...javalin-parent-6.4.0) --- updated-dependencies: - dependency-name: io.javalin:javalin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b4bd60005..855ae79da 100644 --- a/pom.xml +++ b/pom.xml @@ -341,7 +341,7 @@ io.javalin javalin - 6.3.0 + 6.4.0 jetty-server From 73d3762e83670ff91152eb39acb9f20ef2e271b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=B8=90=E7=A6=BB?= Date: Tue, 24 Dec 2024 15:21:29 +0800 Subject: [PATCH 015/160] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f00780728..c3f752d8f 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.ghostchu.peerbanhelper peerbanhelper - 7.2.0-Alpha1 + 7.3-snapshot jar PeerBanHelper From 78463209d78d769c419a9b454b0c76339db3c484 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Thu, 26 Dec 2024 22:28:07 +0800 Subject: [PATCH 016/160] fixed #828 --- src/main/resources/profile.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/resources/profile.yml b/src/main/resources/profile.yml index cf48d1845..4e3b2a2b9 100644 --- a/src/main/resources/profile.yml +++ b/src/main/resources/profile.yml @@ -92,7 +92,6 @@ module: - '{"method":"STARTS_WITH","content":"qbittorrent/3.3.15"}' - '{"method":"STARTS_WITH","content":"github.com/thank423/trafficconsume"}' - '{"method":"STARTS_WITH","content":"ޭ__"}' # 0xde-0xad-0xbe-0xef - - '{"method":"STARTS_WITH","content":"taipei-torrent"}' - '{"method":"STARTS_WITH","content":"-XL"}' # 进度作弊检查器:Progress Cheat Blocker # 注:有时这会错误的封禁部分启用“超级做种”的客户端。但在大多数情况下,此模块能够有效阻止循环下载的流量消耗器,建议启用。 From e0cc20cb05567492284cbc6ecb3ed98f2763e942 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Thu, 26 Dec 2024 22:38:52 +0800 Subject: [PATCH 017/160] bump to install4j11 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b4bd60005..a4bd9f6e5 100644 --- a/pom.xml +++ b/pom.xml @@ -219,7 +219,7 @@ - C:\Program Files\install4j10 + C:\Program Files\install4j11 From 38c5b0b3c6badf1c60f4b8be6517d115bd4618f3 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Fri, 27 Dec 2024 00:00:01 +0800 Subject: [PATCH 018/160] =?UTF-8?q?=E5=85=81=E8=AE=B8=E6=9A=82=E5=81=9C?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=99=A8=20#833?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../peerbanhelper/PeerBanHelperServer.java | 17 ++++++++++------- .../downloader/AbstractDownloader.java | 3 +++ .../peerbanhelper/downloader/Downloader.java | 4 ++++ .../downloader/DownloaderLoginResult.java | 3 ++- .../downloader/impl/biglybt/BiglyBT.java | 13 +++++++++++++ .../downloader/impl/bitcomet/BitComet.java | 13 +++++++++++++ .../downloader/impl/deluge/Deluge.java | 13 +++++++++++++ .../impl/qbittorrent/QBittorrentConfig.java | 4 ++++ .../impl/qbittorrent/impl/QBittorrent.java | 10 ++++++++++ .../qbittorrent/impl/QBittorrentConfigImpl.java | 3 +++ .../impl/enhanced/QBittorrentEE.java | 10 ++++++++++ .../impl/enhanced/QBittorrentEEConfigImpl.java | 3 +++ .../impl/transmission/Transmission.java | 13 +++++++++++++ .../impl/webapi/PBHDownloaderController.java | 4 ++-- .../com/ghostchu/peerbanhelper/text/Lang.java | 2 +- src/main/resources/lang/en_us/messages.yml | 1 + src/main/resources/lang/messages_fallback.yml | 3 ++- src/main/resources/lang/zh_cn/messages.yml | 3 ++- 18 files changed, 109 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java index 03d796222..daa2624d1 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java +++ b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java @@ -50,7 +50,6 @@ import com.ghostchu.simplereloadlib.Reloadable; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import com.google.common.hash.Hashing; import com.google.gson.JsonObject; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.EvalMode; @@ -676,8 +675,10 @@ public void updateDownloader(@NotNull Downloader downloader, boolean updateBanLi try { var loginResult = downloader.login(); if (!loginResult.success()) { - log.error(tlUI(Lang.ERR_CLIENT_LOGIN_FAILURE_SKIP, downloader.getName(), downloader.getEndpoint(), tlUI(loginResult.getMessage()))); - downloader.setLastStatus(DownloaderLastStatus.ERROR, loginResult.getMessage()); + if(loginResult.getStatus() != DownloaderLoginResult.Status.PAUSED) { + log.error(tlUI(Lang.ERR_CLIENT_LOGIN_FAILURE_SKIP, downloader.getName(), downloader.getEndpoint(), tlUI(loginResult.getMessage()))); + downloader.setLastStatus(DownloaderLastStatus.ERROR, loginResult.getMessage()); + } return; } else { downloader.setLastStatus(DownloaderLastStatus.HEALTHY, loginResult.getMessage()); @@ -768,10 +769,12 @@ public Map> collectPeers(Downloader downloader) { Map> peers = new ConcurrentHashMap<>(); var loginResult = downloader.login(); if (!loginResult.success()) { - log.error(tlUI(Lang.ERR_CLIENT_LOGIN_FAILURE_SKIP, downloader.getName(), downloader.getEndpoint(), tlUI(loginResult.getMessage()))); - downloader.setLastStatus(DownloaderLastStatus.ERROR, loginResult.getMessage()); - if (loginResult.getStatus() == DownloaderLoginResult.Status.MISSING_COMPONENTS || loginResult.getStatus() == DownloaderLoginResult.Status.REQUIRE_TAKE_ACTIONS) { - downloader.setLastStatus(DownloaderLastStatus.NEED_TAKE_ACTION, loginResult.getMessage()); + if(loginResult.getStatus() != DownloaderLoginResult.Status.PAUSED){ + log.error(tlUI(Lang.ERR_CLIENT_LOGIN_FAILURE_SKIP, downloader.getName(), downloader.getEndpoint(), tlUI(loginResult.getMessage()))); + downloader.setLastStatus(DownloaderLastStatus.ERROR, loginResult.getMessage()); + if (loginResult.getStatus() == DownloaderLoginResult.Status.MISSING_COMPONENTS || loginResult.getStatus() == DownloaderLoginResult.Status.REQUIRE_TAKE_ACTIONS) { + downloader.setLastStatus(DownloaderLastStatus.NEED_TAKE_ACTION, loginResult.getMessage()); + } } return Collections.emptyMap(); } diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/AbstractDownloader.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/AbstractDownloader.java index 2834ed893..4edd1b778 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/AbstractDownloader.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/AbstractDownloader.java @@ -27,6 +27,9 @@ public AbstractDownloader(String name, AlertManager alertManager) { @Override public DownloaderLoginResult login() { + if(isPaused()){ + return new DownloaderLoginResult(DownloaderLoginResult.Status.PAUSED, new TranslationComponent(Lang.DOWNLOADER_PAUSED)); + } if (nextLoginTry >= System.currentTimeMillis()) { alertManager.publishAlert(true, AlertLevel.WARN, diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/Downloader.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/Downloader.java index ee368fb1d..2c635f33e 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/Downloader.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/Downloader.java @@ -52,6 +52,10 @@ public interface Downloader extends AutoCloseable { */ DownloaderLoginResult login(); + boolean isPaused(); + + void setPaused(boolean paused); + /** * 一个执行调度任务的窗口,该方法总是在 banWave 中调用 */ diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/DownloaderLoginResult.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/DownloaderLoginResult.java index b96133704..5ede3710c 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/DownloaderLoginResult.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/DownloaderLoginResult.java @@ -19,10 +19,11 @@ public boolean success() { public enum Status { SUCCESS, + PAUSED, INCORRECT_CREDENTIAL, MISSING_COMPONENTS, NETWORK_ERROR, EXCEPTION, - REQUIRE_TAKE_ACTIONS + REQUIRE_TAKE_ACTIONS, } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java index 6b4334956..16b4f2fc9 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java @@ -137,6 +137,16 @@ public String getType() { return "BiglyBT"; } + @Override + public boolean isPaused() { + return config.isPaused(); + } + + @Override + public void setPaused(boolean paused) { + config.setPaused(paused); + } + @Override public void setBanList(@NotNull Collection fullList, @Nullable Collection added, @Nullable Collection removed, boolean applyFullList) { if (removed != null && removed.isEmpty() && added != null && config.isIncrementBan() && !applyFullList) { @@ -301,6 +311,7 @@ public static class Config { private boolean incrementBan; private boolean verifySsl; private boolean ignorePrivate; + private boolean paused; public static Config readFromYaml(ConfigurationSection section) { Config config = new Config(); @@ -314,6 +325,7 @@ public static Config readFromYaml(ConfigurationSection section) { config.setHttpVersion(section.getString("http-version", "HTTP_1_1")); config.setVerifySsl(section.getBoolean("verify-ssl", true)); config.setIgnorePrivate(section.getBoolean("ignore-private", false)); + config.setPaused(section.getBoolean("paused", false)); return config; } @@ -326,6 +338,7 @@ public YamlConfiguration saveToYaml() { section.set("increment-ban", incrementBan); section.set("ignore-private", ignorePrivate); section.set("verify-ssl", verifySsl); + section.set("paused", paused); return section; } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/BitComet.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/BitComet.java index 0c49aa0ce..589685503 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/BitComet.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/BitComet.java @@ -191,6 +191,16 @@ public String getType() { return "BitComet"; } + @Override + public boolean isPaused() { + return config.isPaused(); + } + + @Override + public void setPaused(boolean paused) { + config.setPaused(paused); + } + public boolean isLoggedIn() { try { queryNeedReConfigureIpFilter(); @@ -460,6 +470,7 @@ public static class Config { private String httpVersion; private boolean verifySsl; private boolean ignorePrivate; + private boolean paused; public static Config readFromYaml(ConfigurationSection section) { Config config = new Config(); @@ -474,6 +485,7 @@ public static Config readFromYaml(ConfigurationSection section) { config.setHttpVersion(section.getString("http-version", "HTTP_1_1")); config.setVerifySsl(section.getBoolean("verify-ssl", true)); config.setIgnorePrivate(section.getBoolean("ignore-private", false)); + config.setPaused(section.getBoolean("paused", false)); return config; } @@ -487,6 +499,7 @@ public YamlConfiguration saveToYaml() { section.set("http-version", httpVersion); section.set("verify-ssl", verifySsl); section.set("ignore-private", ignorePrivate); + section.set("paused", paused); return section; } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/Deluge.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/Deluge.java index 622450045..7df7ae0ee 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/Deluge.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/Deluge.java @@ -84,6 +84,16 @@ public String getType() { return "Deluge"; } + @Override + public boolean isPaused() { + return config.isPaused(); + } + + @Override + public void setPaused(boolean paused) { + config.setPaused(paused); + } + @Override public DownloaderLoginResult login0() { try { @@ -244,6 +254,7 @@ public static class Config { private String rpcUrl; private boolean incrementBan; private boolean ignorePrivate; + private boolean paused; public static Config readFromYaml(ConfigurationSection section) { Config config = new Config(); @@ -258,6 +269,7 @@ public static Config readFromYaml(ConfigurationSection section) { config.setVerifySsl(section.getBoolean("verify-ssl", true)); config.setIncrementBan(section.getBoolean("increment-ban", true)); config.setIgnorePrivate(section.getBoolean("ignore-private", false)); + config.setPaused(section.getBoolean("paused", false)); return config; } @@ -271,6 +283,7 @@ public YamlConfiguration saveToYaml() { section.set("increment-ban", incrementBan); section.set("verify-ssl", verifySsl); section.set("ignore-private", ignorePrivate); + section.set("paused", paused); return section; } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentConfig.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentConfig.java index c81f93c3e..6db8b85c7 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentConfig.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentConfig.java @@ -26,6 +26,10 @@ public interface QBittorrentConfig { boolean isIgnorePrivate(); + boolean isPaused(); + + void setPaused(boolean paused); + void setType(String type); void setEndpoint(String endpoint); diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/QBittorrent.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/QBittorrent.java index 57ecec8ee..6a8a2de74 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/QBittorrent.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/QBittorrent.java @@ -15,6 +15,16 @@ public QBittorrent(String name, QBittorrentConfig config, AlertManager alertMana super(name, config, alertManager); } + @Override + public boolean isPaused() { + return config.isPaused(); + } + + @Override + public void setPaused(boolean paused) { + config.setPaused(paused); + } + public static QBittorrent loadFromConfig(String name, JsonObject section, AlertManager alertManager) { QBittorrentConfigImpl config = JsonUtil.getGson().fromJson(section.toString(), QBittorrentConfigImpl.class); return new QBittorrent(name, config, alertManager); diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/QBittorrentConfigImpl.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/QBittorrentConfigImpl.java index 727d3258d..48f91dc61 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/QBittorrentConfigImpl.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/QBittorrentConfigImpl.java @@ -22,6 +22,7 @@ public class QBittorrentConfigImpl implements QBittorrentConfig { private boolean useShadowBan; private boolean verifySsl; private boolean ignorePrivate; + private boolean paused; public static QBittorrentConfigImpl readFromYaml(ConfigurationSection section) { QBittorrentConfigImpl config = new QBittorrentConfigImpl(); @@ -41,6 +42,7 @@ public static QBittorrentConfigImpl readFromYaml(ConfigurationSection section) { config.setUseShadowBan(section.getBoolean("use-shadow-ban", false)); config.setVerifySsl(section.getBoolean("verify-ssl", true)); config.setIgnorePrivate(section.getBoolean("ignore-private", false)); + config.setPaused(section.getBoolean("paused", false)); return config; } @@ -58,6 +60,7 @@ public YamlConfiguration saveToYaml() { section.set("use-shadow-ban", useShadowBan); section.set("verify-ssl", verifySsl); section.set("ignore-private", ignorePrivate); + section.set("paused", paused); return section; } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/enhanced/QBittorrentEE.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/enhanced/QBittorrentEE.java index 3fe959f68..d437fe506 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/enhanced/QBittorrentEE.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/enhanced/QBittorrentEE.java @@ -41,6 +41,16 @@ public QBittorrentEE(String name, QBittorrentEEConfigImpl config, AlertManager a } } + @Override + public boolean isPaused() { + return config.isPaused(); + } + + @Override + public void setPaused(boolean paused) { + config.setPaused(paused); + } + public static QBittorrentEE loadFromConfig(String name, JsonObject section, AlertManager alertManager) { QBittorrentEEConfigImpl config = JsonUtil.getGson().fromJson(section.toString(), QBittorrentEEConfigImpl.class); return new QBittorrentEE(name, config, alertManager); diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/enhanced/QBittorrentEEConfigImpl.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/enhanced/QBittorrentEEConfigImpl.java index d4e5b6c1a..c0d99f091 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/enhanced/QBittorrentEEConfigImpl.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/enhanced/QBittorrentEEConfigImpl.java @@ -22,6 +22,7 @@ public class QBittorrentEEConfigImpl implements QBittorrentConfig { private boolean verifySsl; private boolean useShadowBan; private boolean ignorePrivate; + private boolean paused; public static QBittorrentEEConfigImpl readFromYaml(ConfigurationSection section) { QBittorrentEEConfigImpl config = new QBittorrentEEConfigImpl(); @@ -41,6 +42,7 @@ public static QBittorrentEEConfigImpl readFromYaml(ConfigurationSection section) config.setUseShadowBan(section.getBoolean("use-shadow-ban", false)); config.setVerifySsl(section.getBoolean("verify-ssl", true)); config.setIgnorePrivate(section.getBoolean("ignore-private", false)); + config.setPaused(section.getBoolean("paused", false)); return config; } @@ -58,6 +60,7 @@ public YamlConfiguration saveToYaml() { section.set("use-shadow-ban", useShadowBan); section.set("verify-ssl", verifySsl); section.set("ignore-private", ignorePrivate); + section.set("paused", paused); return section; } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/Transmission.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/Transmission.java index 311945622..435582b29 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/Transmission.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/Transmission.java @@ -96,6 +96,16 @@ public String getType() { return "Transmission"; } + @Override + public boolean isPaused() { + return config.isPaused(); + } + + @Override + public void setPaused(boolean paused) { + config.setPaused(paused); + } + @SneakyThrows(InterruptedException.class) @Override public DownloaderLoginResult login0() { @@ -280,6 +290,7 @@ public static class Config { private boolean verifySsl; private String rpcUrl; private boolean ignorePrivate; + private boolean paused; public static Transmission.Config readFromYaml(ConfigurationSection section) { Transmission.Config config = new Transmission.Config(); @@ -294,6 +305,7 @@ public static Transmission.Config readFromYaml(ConfigurationSection section) { config.setHttpVersion(section.getString("http-version", "HTTP_1_1")); config.setVerifySsl(section.getBoolean("verify-ssl", true)); config.setIgnorePrivate(section.getBoolean("ignore-private", false)); + config.setPaused(section.getBoolean("paused", false)); return config; } @@ -307,6 +319,7 @@ public YamlConfiguration saveToYaml() { section.set("http-version", httpVersion); section.set("verify-ssl", verifySsl); section.set("ignore-private", ignorePrivate); + section.set("paused", paused); return section; } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java index 2eb930348..aa5007bac 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java @@ -260,7 +260,7 @@ private void handleDownloaderStatus(@NotNull Context ctx, String downloaderName) .count(); JsonObject config = downloader.saveDownloaderJson(); - ctx.json(new StdResp(true, null, new DownloaderStatus(lastStatus, tl(locale, downloader.getLastStatusMessage() == null ? new TranslationComponent(Lang.STATUS_TEXT_UNKNOWN) : downloader.getLastStatusMessage()), activeTorrents, activePeers, config))); + ctx.json(new StdResp(true, null, new DownloaderStatus(lastStatus, tl(locale, downloader.getLastStatusMessage() == null ? new TranslationComponent(Lang.STATUS_TEXT_UNKNOWN) : downloader.getLastStatusMessage()), activeTorrents, activePeers, config, downloader.isPaused()))); } private void handleDownloaderList(@NotNull Context ctx) { @@ -281,7 +281,7 @@ record DraftDownloader(String name, JsonObject config) { record DownloaderStatus(DownloaderLastStatus lastStatus, String lastStatusMessage, long activeTorrents, - long activePeers, JsonObject config) { + long activePeers, JsonObject config, boolean paused) { } diff --git a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java index d90801107..f785d1037 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java +++ b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java @@ -467,7 +467,7 @@ public enum Lang { FREE_LICENSE_DESCRIPTION, FREE_LICENSE_SOURCE, FREE_LICENSE_LICENSE_TO, - FREE_LICENSE_RENEW_STILL_ACTIVE, PBH_PLUS_LICENSE_UPDATED, DOWNLOADER_QB_DISABLE_SAME_IP_MULTI_CONNECTION_FAILED; + FREE_LICENSE_RENEW_STILL_ACTIVE, PBH_PLUS_LICENSE_UPDATED, DOWNLOADER_QB_DISABLE_SAME_IP_MULTI_CONNECTION_FAILED, DOWNLOADER_PAUSED; public String getKey() { return name(); diff --git a/src/main/resources/lang/en_us/messages.yml b/src/main/resources/lang/en_us/messages.yml index ae51683f3..2af8f1f7a 100644 --- a/src/main/resources/lang/en_us/messages.yml +++ b/src/main/resources/lang/en_us/messages.yml @@ -535,3 +535,4 @@ FREE_LICENSE_RENEW_STILL_ACTIVE: "The current license is still active and does n FREE_LICENSE_SOURCE: "Locally generated free license." FREE_LICENSE_LICENSE_TO: "{} for personal use." FREE_LICENSE_DESCRIPTION: "Local generated renewable free license, for personal use only." +DOWNLOADER_PAUSED: Downloader paused \ No newline at end of file diff --git a/src/main/resources/lang/messages_fallback.yml b/src/main/resources/lang/messages_fallback.yml index 1529036a5..e9e23008d 100644 --- a/src/main/resources/lang/messages_fallback.yml +++ b/src/main/resources/lang/messages_fallback.yml @@ -534,4 +534,5 @@ FREE_LICENSE_RENEW_STILL_ACTIVE: "当前许可证仍在有效期内,无需重 FREE_LICENSE_SOURCE: "本地生成的免费许可证" FREE_LICENSE_LICENSE_TO: "{} 用于个人用途" FREE_LICENSE_DESCRIPTION: "本地生成的循环免费许可证,仅用于个人用途" -DOWNLOADER_QB_DISABLE_SAME_IP_MULTI_CONNECTION_FAILED: "禁用 {} ({}) 的高级设置 “允许来自不同 IP 地址的多重连接” 失败:{} - {}!此功能必须关闭,否则将导致 PCB 封禁误判。" \ No newline at end of file +DOWNLOADER_QB_DISABLE_SAME_IP_MULTI_CONNECTION_FAILED: "禁用 {} ({}) 的高级设置 “允许来自不同 IP 地址的多重连接” 失败:{} - {}!此功能必须关闭,否则将导致 PCB 封禁误判。" +DOWNLOADER_PAUSED: "下载器已暂停" \ No newline at end of file diff --git a/src/main/resources/lang/zh_cn/messages.yml b/src/main/resources/lang/zh_cn/messages.yml index 624a20df6..fb1524e83 100644 --- a/src/main/resources/lang/zh_cn/messages.yml +++ b/src/main/resources/lang/zh_cn/messages.yml @@ -531,4 +531,5 @@ FREE_LICENSE_RENEW_SUCCESS: "新的许可证已生成并激活" FREE_LICENSE_RENEW_STILL_ACTIVE: "当前许可证仍在有效期内,无需重新生成" FREE_LICENSE_SOURCE: "本地生成的免费许可证" FREE_LICENSE_LICENSE_TO: "{} 用于个人用途" -FREE_LICENSE_DESCRIPTION: "本地生成的循环免费许可证,仅用于个人用途" \ No newline at end of file +FREE_LICENSE_DESCRIPTION: "本地生成的循环免费许可证,仅用于个人用途" +DOWNLOADER_PAUSED: "下载器已暂停" \ No newline at end of file From a06b86e0fca63814399ae3b3d55b62b79b12b72b Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Fri, 27 Dec 2024 01:28:27 +0800 Subject: [PATCH 019/160] Use dnsjava/dnsjava as DNS Provider, also add it's experiment in lab, an dependency of #834 --- pom.xml | 5 + .../peerbanhelper/PeerBanHelperServer.java | 33 ++++++- .../peerbanhelper/lab/Experiments.java | 3 +- .../peerbanhelper/lab/Laboratory.java | 8 +- .../com/ghostchu/peerbanhelper/text/Lang.java | 2 +- .../peerbanhelper/util/dns/DNSLookup.java | 91 +++++++++++++++++++ src/main/resources/config.yml | 14 +++ src/main/resources/lang/en_us/messages.yml | 4 +- src/main/resources/lang/messages_fallback.yml | 4 +- src/main/resources/lang/zh_cn/messages.yml | 4 +- 10 files changed, 154 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/ghostchu/peerbanhelper/util/dns/DNSLookup.java diff --git a/pom.xml b/pom.xml index 136059688..212adead1 100644 --- a/pom.xml +++ b/pom.xml @@ -510,5 +510,10 @@ java-multiaddr v1.4.12 + + dnsjava + dnsjava + 3.6.2 + diff --git a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java index daa2624d1..8da946c37 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java +++ b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java @@ -23,6 +23,7 @@ import com.ghostchu.peerbanhelper.invoker.impl.IPFilterInvoker; import com.ghostchu.peerbanhelper.ipdb.IPDB; import com.ghostchu.peerbanhelper.ipdb.IPGeoData; +import com.ghostchu.peerbanhelper.lab.Experiments; import com.ghostchu.peerbanhelper.lab.Laboratory; import com.ghostchu.peerbanhelper.metric.BasicMetrics; import com.ghostchu.peerbanhelper.module.*; @@ -34,6 +35,7 @@ import com.ghostchu.peerbanhelper.text.TranslationComponent; import com.ghostchu.peerbanhelper.torrent.Torrent; import com.ghostchu.peerbanhelper.util.*; +import com.ghostchu.peerbanhelper.util.dns.DNSLookup; import com.ghostchu.peerbanhelper.util.encrypt.RSAUtils; import com.ghostchu.peerbanhelper.util.json.JsonUtil; import com.ghostchu.peerbanhelper.util.paging.Pageable; @@ -59,6 +61,7 @@ import inet.ipaddr.format.util.DualIPv4v6Tries; import io.javalin.util.JavalinBindException; import lombok.Getter; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.bspfsystems.yamlconfiguration.configuration.ConfigurationSection; @@ -139,6 +142,8 @@ public class PeerBanHelperServer implements Reloadable { private BanListDao banListDao; @Autowired private Laboratory laboratory; + @Autowired + private DNSLookup dnsLookup; // @Autowired // private IPFSBanListShare share; @@ -197,7 +202,15 @@ public void start() throws SQLException { Main.getReloadManager().register(this); Main.getEventBus().post(new PBHServerStartedEvent(this)); sendSnapshotAlert(); + runTestCode(); + } + @SneakyThrows + private void runTestCode() { + if (!"LiveDebug".equalsIgnoreCase(System.getProperty("pbh.release"))) { + return; + } + // run some junky test code here } private void setupScriptEngine() { @@ -675,7 +688,7 @@ public void updateDownloader(@NotNull Downloader downloader, boolean updateBanLi try { var loginResult = downloader.login(); if (!loginResult.success()) { - if(loginResult.getStatus() != DownloaderLoginResult.Status.PAUSED) { + if (loginResult.getStatus() != DownloaderLoginResult.Status.PAUSED) { log.error(tlUI(Lang.ERR_CLIENT_LOGIN_FAILURE_SKIP, downloader.getName(), downloader.getEndpoint(), tlUI(loginResult.getMessage()))); downloader.setLastStatus(DownloaderLastStatus.ERROR, loginResult.getMessage()); } @@ -769,7 +782,7 @@ public Map> collectPeers(Downloader downloader) { Map> peers = new ConcurrentHashMap<>(); var loginResult = downloader.login(); if (!loginResult.success()) { - if(loginResult.getStatus() != DownloaderLoginResult.Status.PAUSED){ + if (loginResult.getStatus() != DownloaderLoginResult.Status.PAUSED) { log.error(tlUI(Lang.ERR_CLIENT_LOGIN_FAILURE_SKIP, downloader.getName(), downloader.getEndpoint(), tlUI(loginResult.getMessage()))); downloader.setLastStatus(DownloaderLastStatus.ERROR, loginResult.getMessage()); if (loginResult.getStatus() == DownloaderLoginResult.Status.MISSING_COMPONENTS || loginResult.getStatus() == DownloaderLoginResult.Status.REQUIRE_TAKE_ACTIONS) { @@ -920,9 +933,19 @@ private void banPeer(@NotNull Collection compareWith, @NotNull BanM banMetadata.setReverseLookup("N/A"); if (Main.getMainConfig().getBoolean("lookup.dns-reverse-lookup")) { executor.submit(() -> { - String hostName = peer.getPeerAddress().getAddress().toInetAddress().getHostName(); - if (!peer.getPeerAddress().getIp().equals(hostName)) { - banMetadata.setReverseLookup(peer.getPeerAddress().getAddress().toInetAddress().getHostName()); + if (laboratory.isExperimentActivated(Experiments.DNSJAVA.getExperiment())) { + dnsLookup.ptr(peer.getPeerAddress().getAddress().toReverseDNSLookupString()).thenAccept(hostName -> { + if (hostName.isPresent()) { + if (!peer.getPeerAddress().getIp().equals(hostName.get())) { + banMetadata.setReverseLookup(hostName.get()); + } + } + }); + } else { + String hostName = peer.getPeerAddress().getAddress().toInetAddress().getHostName(); + if (!peer.getPeerAddress().getIp().equals(hostName)) { + banMetadata.setReverseLookup(peer.getPeerAddress().getAddress().toInetAddress().getHostName()); + } } }); } diff --git a/src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java b/src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java index 2734edd79..96f44a8b8 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java +++ b/src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java @@ -6,7 +6,8 @@ import java.util.List; public enum Experiments { - IPFS(new Experiment("ipfs", List.of(0), new TranslationComponent(Lang.LAB_EXPERIMENT_IPFS_TITLE), new TranslationComponent(Lang.LAB_EXPERIMENT_IPFS_DESCRIPTION))); + IPFS(new Experiment("ipfs", List.of(0), new TranslationComponent(Lang.LAB_EXPERIMENT_IPFS_TITLE), new TranslationComponent(Lang.LAB_EXPERIMENT_IPFS_DESCRIPTION))), + DNSJAVA(new Experiment("dnsjava", List.of(0, 1, 2), new TranslationComponent(Lang.LAB_EXPERIMENT_DNSJAVA_TITLE), new TranslationComponent(Lang.LAB_EXPERIMENT_DNSJAVA_DESCRIPTION))); private final Experiment experiment; diff --git a/src/main/java/com/ghostchu/peerbanhelper/lab/Laboratory.java b/src/main/java/com/ghostchu/peerbanhelper/lab/Laboratory.java index 7ad93d299..3e822995f 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/lab/Laboratory.java +++ b/src/main/java/com/ghostchu/peerbanhelper/lab/Laboratory.java @@ -37,7 +37,7 @@ public Laboratory() throws IOException { } public boolean isExperimentActivated(Experiment experiment) { - if(!isEnabled()){ + if (!isEnabled()) { return false; } var value = labConfig.getString(experiment.getId()); @@ -57,16 +57,16 @@ public boolean isExperimentActivated(Experiment experiment) { } } - public void setExperimentActivated(String id, Boolean activated) throws IllegalArgumentException{ + public void setExperimentActivated(String id, Boolean activated) throws IllegalArgumentException { for (Experiments value : Experiments.values()) { - if(!value.getExperiment().getId().equals(id)){ + if (!value.getExperiment().getId().equals(id)) { continue; } labConfig.set(value.getExperiment().getId(), activated == null ? "default" : activated); saveLabConfig(); return; } - throw new IllegalArgumentException("Invalid experiment id: "+id+", it's not exists in Experiments registry"); + throw new IllegalArgumentException("Invalid experiment id: " + id + ", it's not exists in Experiments registry"); } private void saveLabConfig() { diff --git a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java index f785d1037..c7de0e147 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java +++ b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java @@ -467,7 +467,7 @@ public enum Lang { FREE_LICENSE_DESCRIPTION, FREE_LICENSE_SOURCE, FREE_LICENSE_LICENSE_TO, - FREE_LICENSE_RENEW_STILL_ACTIVE, PBH_PLUS_LICENSE_UPDATED, DOWNLOADER_QB_DISABLE_SAME_IP_MULTI_CONNECTION_FAILED, DOWNLOADER_PAUSED; + FREE_LICENSE_RENEW_STILL_ACTIVE, PBH_PLUS_LICENSE_UPDATED, DOWNLOADER_QB_DISABLE_SAME_IP_MULTI_CONNECTION_FAILED, DOWNLOADER_PAUSED, LAB_EXPERIMENT_DNSJAVA_TITLE, LAB_EXPERIMENT_DNSJAVA_DESCRIPTION; public String getKey() { return name(); diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/dns/DNSLookup.java b/src/main/java/com/ghostchu/peerbanhelper/util/dns/DNSLookup.java new file mode 100644 index 000000000..c81eb9de2 --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/util/dns/DNSLookup.java @@ -0,0 +1,91 @@ +package com.ghostchu.peerbanhelper.util.dns; + +import com.ghostchu.peerbanhelper.Main; +import com.ghostchu.simplereloadlib.ReloadResult; +import com.ghostchu.simplereloadlib.Reloadable; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.xbill.DNS.Record; +import org.xbill.DNS.*; +import oshi.SystemInfo; + +import java.net.UnknownHostException; +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +@Slf4j +@Component +public class DNSLookup implements Reloadable { + private volatile ExtendedResolver resolver = new ExtendedResolver(); + + public DNSLookup() { + reloadConfig(); + Main.getReloadManager().register(this); + } + + @Override + public ReloadResult reloadModule() throws Exception { + reloadConfig(); + return Reloadable.super.reloadModule(); + } + + private void reloadConfig() { + // get system dns via oshi + SystemInfo systemInfo = new SystemInfo(); + var dnsServers = systemInfo.getOperatingSystem().getNetworkParams().getDnsServers(); + List dns = Main.getMainConfig().getStringList("resolvers.servers"); + if (Main.getMainConfig().getBoolean("resolvers.use-system",true)) { + dns.addAll(Arrays.asList(dnsServers)); + } + applyDnsServers(dns); + } + + private void applyDnsServers(List servers) { + List resolvers = new ArrayList<>(); + for (String dns : servers) { + if (dns.startsWith("http")) { + resolvers.add(new DohResolver(dns)); + log.info("Added DoH resolver: {}", dns); + } else { + try { + resolvers.add(new SimpleResolver(dns)); + log.info("Added resolver: {}", dns); + } catch (UnknownHostException e) { + log.warn("Failed to add resolver: {}", dns, e); + } + } + } + var replace = new ExtendedResolver(resolvers.toArray(new Resolver[0])); + replace.setLoadBalance(true); + replace.setTimeout(Duration.of(3, ChronoUnit.SECONDS)); + resolver = replace; + } + + public CompletableFuture> ptr(String query) { + return CompletableFuture.supplyAsync(() -> { + try { + Lookup lookup = new Lookup(query, Type.PTR); + lookup.setResolver(resolver); + lookup.run(); + if (lookup.getResult() == Lookup.SUCCESSFUL) { + Record[] records = lookup.getAnswers(); + for (Record record : records) { + if (record instanceof PTRRecord ptr) { + return Optional.of(ptr.getTarget().toString()); + } + } + return Optional.empty(); + } + return Optional.empty(); + } catch (TextParseException ignored) { + return Optional.empty(); + } + }); + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 2bab58397..1a6b45c56 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -173,3 +173,17 @@ decentralized: # 发布当前封禁列表到 IPFS 以允许它人订阅您的封禁列表内容,时间单位:毫秒,设置为 -1 以禁用 # Publish current banlist to IPFS to allow others subscribe your banlist, time unit: milliseconds, set to -1 to disable publish-banlist: 3600000 + +# 自定义 DNS 解析器,暂不支持 DoH/DoT/DoQ +# 留空则使用系统 DNS +# 部分 DNS 存在速率限制,建议使用与系统 DNS 不同的 DNS,以避免影响正常上网解析 +# 要使此配置生效,需要启用 DNSJava 实验 +# Custom DNS resolver, DoT/DoQ are not supported yet +# Leave it empty to use system DNS +# Some DNS have rate limit, it's recommended to use different DNS with system DNS to avoid affect normal internet access +# To make this config take effect, you need enable DNSJava experiment +resolvers: + # 使用系统 DNS - Use system DNS + use-system: true + # 自定义 DNS 服务器列表 - Custom DNS server list + servers: [] \ No newline at end of file diff --git a/src/main/resources/lang/en_us/messages.yml b/src/main/resources/lang/en_us/messages.yml index 2af8f1f7a..e3dfec2b8 100644 --- a/src/main/resources/lang/en_us/messages.yml +++ b/src/main/resources/lang/en_us/messages.yml @@ -535,4 +535,6 @@ FREE_LICENSE_RENEW_STILL_ACTIVE: "The current license is still active and does n FREE_LICENSE_SOURCE: "Locally generated free license." FREE_LICENSE_LICENSE_TO: "{} for personal use." FREE_LICENSE_DESCRIPTION: "Local generated renewable free license, for personal use only." -DOWNLOADER_PAUSED: Downloader paused \ No newline at end of file +DOWNLOADER_PAUSED: Downloader paused +LAB_EXPERIMENT_DNSJAVA_TITLE: "DNSJava DNS" +LAB_EXPERIMENT_DNSJAVA_DESCRIPTION: "Use [dnsjava/dnsjava](https://github.com/dnsjava/dnsjava) to replace the default JDK DNS resolver in some modules, providing more reliable hostname and reverse DNS lookup capabilities, and supporting custom DNS servers and load balancing. DNSJava only works for certain functions (such as reverse DNS lookup), while other functions will continue to use JDK DNS. \nAfter enabling this experiment, you can configure the DNS server addresses for DNSJava in the configuration file." \ No newline at end of file diff --git a/src/main/resources/lang/messages_fallback.yml b/src/main/resources/lang/messages_fallback.yml index e9e23008d..3a0af2290 100644 --- a/src/main/resources/lang/messages_fallback.yml +++ b/src/main/resources/lang/messages_fallback.yml @@ -535,4 +535,6 @@ FREE_LICENSE_SOURCE: "本地生成的免费许可证" FREE_LICENSE_LICENSE_TO: "{} 用于个人用途" FREE_LICENSE_DESCRIPTION: "本地生成的循环免费许可证,仅用于个人用途" DOWNLOADER_QB_DISABLE_SAME_IP_MULTI_CONNECTION_FAILED: "禁用 {} ({}) 的高级设置 “允许来自不同 IP 地址的多重连接” 失败:{} - {}!此功能必须关闭,否则将导致 PCB 封禁误判。" -DOWNLOADER_PAUSED: "下载器已暂停" \ No newline at end of file +DOWNLOADER_PAUSED: "下载器已暂停" +LAB_EXPERIMENT_DNSJAVA_TITLE: "DNSJava DNS 解析" +LAB_EXPERIMENT_DNSJAVA_DESCRIPTION: "在部分功能模块中使用 [dnsjava/dnsjava](https://github.com/dnsjava/dnsjava) 替代 JDK 默认的 DNS 解析器,以提供更可靠的主机名和反向 DNS 查询能力,并支持自定义 DNS 服务器和负载均衡的能力。DNSJava 仅在部分功能上工作(如 DNS 反查),其它功能将继续使用 JDK DNS。 \n启用此实验后,您可以在配置文件中配置 DNSJava 的 DNS 服务器地址。" \ No newline at end of file diff --git a/src/main/resources/lang/zh_cn/messages.yml b/src/main/resources/lang/zh_cn/messages.yml index fb1524e83..02beea9f6 100644 --- a/src/main/resources/lang/zh_cn/messages.yml +++ b/src/main/resources/lang/zh_cn/messages.yml @@ -532,4 +532,6 @@ FREE_LICENSE_RENEW_STILL_ACTIVE: "当前许可证仍在有效期内,无需重 FREE_LICENSE_SOURCE: "本地生成的免费许可证" FREE_LICENSE_LICENSE_TO: "{} 用于个人用途" FREE_LICENSE_DESCRIPTION: "本地生成的循环免费许可证,仅用于个人用途" -DOWNLOADER_PAUSED: "下载器已暂停" \ No newline at end of file +DOWNLOADER_PAUSED: "下载器已暂停" +LAB_EXPERIMENT_DNSJAVA_TITLE: "DNSJava DNS 解析" +LAB_EXPERIMENT_DNSJAVA_DESCRIPTION: "在部分功能模块中使用 [dnsjava/dnsjava](https://github.com/dnsjava/dnsjava) 替代 JDK 默认的 DNS 解析器,以提供更可靠的主机名和反向 DNS 查询能力,并支持自定义 DNS 服务器和负载均衡的能力。DNSJava 仅在部分功能上工作(如 DNS 反查),其它功能将继续使用 JDK DNS。 \n启用此实验后,您可以在配置文件中配置 DNSJava 的 DNS 服务器地址。" \ No newline at end of file From e999eb19ffffb8aface521a1f2082c1869468b79 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Fri, 27 Dec 2024 03:31:35 +0800 Subject: [PATCH 020/160] =?UTF-8?q?=E8=87=AA=E5=8A=A8=20VACUUM=20DB=20?= =?UTF-8?q?=E6=96=87=E4=BB=B6=20#843?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ghostchu/peerbanhelper/database/Database.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/ghostchu/peerbanhelper/database/Database.java b/src/main/java/com/ghostchu/peerbanhelper/database/Database.java index ed0fd6807..16d26dfcd 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/database/Database.java +++ b/src/main/java/com/ghostchu/peerbanhelper/database/Database.java @@ -53,6 +53,7 @@ public void setupDatabase(File file) throws SQLException { try (var stmt = rawConnection.createStatement()) { stmt.executeUpdate("PRAGMA synchronous = NORMAL"); stmt.executeUpdate("PRAGMA journal_mode = WAL"); + stmt.executeUpdate("PRAGMA auto_vacuum = INCREMENTAL"); } catch (Exception e) { log.warn(tlUI(Lang.UNABLE_SET_SQLITE_OPTIMIZED_PRAGMA), e); } From f1fa9668ad3399d64dbf154e44014d2afc1b9afb Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Fri, 27 Dec 2024 03:57:41 +0800 Subject: [PATCH 021/160] =?UTF-8?q?=E5=85=81=E8=AE=B8=E5=85=A8=E9=87=8F=20?= =?UTF-8?q?VACUUM=20#843?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/MainConfigUpdateScript.java | 10 +++ .../peerbanhelper/database/Database.java | 75 ++++++++++++++++++- .../peerbanhelper/lab/Experiments.java | 5 +- .../com/ghostchu/peerbanhelper/text/Lang.java | 2 +- src/main/resources/config.yml | 9 ++- src/main/resources/lang/en_us/messages.yml | 9 ++- src/main/resources/lang/messages_fallback.yml | 9 ++- src/main/resources/lang/zh_cn/messages.yml | 9 ++- 8 files changed, 119 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/config/MainConfigUpdateScript.java b/src/main/java/com/ghostchu/peerbanhelper/config/MainConfigUpdateScript.java index 06aa01328..63989565e 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/config/MainConfigUpdateScript.java +++ b/src/main/java/com/ghostchu/peerbanhelper/config/MainConfigUpdateScript.java @@ -6,6 +6,7 @@ import org.bspfsystems.yamlconfiguration.file.YamlConfiguration; import java.io.File; +import java.util.ArrayList; import java.util.UUID; @Slf4j @@ -30,6 +31,15 @@ private void validate() { } + @UpdateScript(version = 27) + public void updateResolvers() { + conf.set("resolvers.use-system", true); + conf.set("resolvers.servers", new ArrayList<>()); + conf.set("persist.vacuum-interval-days", 60); + } + + + @UpdateScript(version = 26) public void pushProvidersSMTPStructUpgrade() { var pushNotification = conf.getConfigurationSection("push-notification"); diff --git a/src/main/java/com/ghostchu/peerbanhelper/database/Database.java b/src/main/java/com/ghostchu/peerbanhelper/database/Database.java index 16d26dfcd..14bf9d9b5 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/database/Database.java +++ b/src/main/java/com/ghostchu/peerbanhelper/database/Database.java @@ -1,7 +1,11 @@ package com.ghostchu.peerbanhelper.database; import com.ghostchu.peerbanhelper.Main; +import com.ghostchu.peerbanhelper.lab.Experiments; +import com.ghostchu.peerbanhelper.lab.Laboratory; import com.ghostchu.peerbanhelper.text.Lang; +import com.ghostchu.peerbanhelper.util.MiscUtil; +import com.ghostchu.peerbanhelper.util.MsgUtil; import com.j256.ormlite.field.DataPersisterManager; import com.j256.ormlite.jdbc.JdbcSingleConnectionSource; import com.j256.ormlite.jdbc.db.SqliteDatabaseType; @@ -12,8 +16,13 @@ import org.springframework.stereotype.Component; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; import java.sql.Connection; import java.sql.SQLException; +import java.time.Duration; import static com.ghostchu.peerbanhelper.text.TextManager.tlUI; @@ -21,24 +30,48 @@ @Slf4j @Component public class Database { + private final File sqliteDb; + private final File dbMaintenanceFile; + private final Laboratory laboratory; private JdbcSingleConnectionSource dataSource; private HikariDataSource hikari; private DatabaseHelper helper; - public Database() throws SQLException, ClassNotFoundException { + public Database(Laboratory laboratory) throws SQLException, ClassNotFoundException { + this.laboratory = laboratory; File databaseDirectory = new File(Main.getDataDirectory(), "persist"); if (!databaseDirectory.exists()) { databaseDirectory.mkdirs(); } - File sqliteDb = new File(databaseDirectory, "peerbanhelper.db"); + this.sqliteDb = new File(databaseDirectory, "peerbanhelper.db"); + this.dbMaintenanceFile = new File(databaseDirectory, "peerbanhelper.db.maintenance"); registerPersisters(); setupDatabase(sqliteDb); + } private void registerPersisters() { DataPersisterManager.registerDataPersisters(TranslationComponentPersistener.getSingleton()); } + private long getLastMaintenanceTime() { + if (!dbMaintenanceFile.exists()) { + return 0; + } + try { + return Long.parseLong(Files.readString(dbMaintenanceFile.toPath())); + } catch (IOException e) { + return 0; + } + } + + private void setLastMaintenanceTime(long time) { + try { + Files.writeString(dbMaintenanceFile.toPath(), String.valueOf(time)); + } catch (IOException e) { + } + } + public void setupDatabase(File file) throws SQLException { HikariConfig config = new HikariConfig(); config.setPoolName("PeerBanHelper SQLite Connection Pool"); @@ -54,6 +87,37 @@ public void setupDatabase(File file) throws SQLException { stmt.executeUpdate("PRAGMA synchronous = NORMAL"); stmt.executeUpdate("PRAGMA journal_mode = WAL"); stmt.executeUpdate("PRAGMA auto_vacuum = INCREMENTAL"); + try { + if (System.currentTimeMillis() - getLastMaintenanceTime() >= Duration.ofDays(Main.getMainConfig().getInt("persist.vacuum-interval-days")).toMillis()) { + if (System.getProperty("pbh.disableSQLiteVacuum") == null) { + if (laboratory.isExperimentActivated(Experiments.SQLITE_VACUUM.getExperiment())) { + log.info(tlUI(Lang.SQLITE_VACUUM_BACKUP)); + // 防强关备份 + File outputBackup = new File(file.getParentFile(), file.getName() + ".bak.gz"); + log.info(tlUI(Lang.SQLITE_VACUUM_BACKUP_COMPLETED)); + for (int i = 0; i < 10; i++) { + log.info(tlUI(Lang.SQLITE_VACUUM_IN_PROGRESS)); + } + try { + backupDatabase(file, outputBackup); + long fileSize = file.length(); + stmt.executeUpdate("VACUUM;"); + long newFileSize = file.length(); + log.info(tlUI(Lang.SQLITE_VACUUM_SUCCESS, MsgUtil.humanReadableByteCountBin(fileSize), MsgUtil.humanReadableByteCountBin(newFileSize))); + } catch (IOException e) { + log.warn(tlUI(Lang.SQLITE_VACUUM_BACKUP_FAILED), e); + } finally { + // 太好了,我们没有被强关 + outputBackup.delete(); + } + } + } + } + } catch (Exception e) { + log.warn(tlUI(Lang.UNABLE_SET_SQLITE_OPTIMIZED_PRAGMA), e); + } finally { + setLastMaintenanceTime(System.currentTimeMillis()); + } } catch (Exception e) { log.warn(tlUI(Lang.UNABLE_SET_SQLITE_OPTIMIZED_PRAGMA), e); } @@ -63,6 +127,13 @@ public void setupDatabase(File file) throws SQLException { // this.dataSource = new DataSourceConnectionSource( new HikariDataSource(config), new SqliteDatabaseType()); } + private void backupDatabase(File input, File output) throws IOException { + try (var filein = new FileInputStream(input); + var fileout = new FileOutputStream(output)) { + MiscUtil.gzip(filein, fileout); + } + } + public void close() { this.dataSource.closeQuietly(); } diff --git a/src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java b/src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java index 96f44a8b8..470b35387 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java +++ b/src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java @@ -7,7 +7,8 @@ public enum Experiments { IPFS(new Experiment("ipfs", List.of(0), new TranslationComponent(Lang.LAB_EXPERIMENT_IPFS_TITLE), new TranslationComponent(Lang.LAB_EXPERIMENT_IPFS_DESCRIPTION))), - DNSJAVA(new Experiment("dnsjava", List.of(0, 1, 2), new TranslationComponent(Lang.LAB_EXPERIMENT_DNSJAVA_TITLE), new TranslationComponent(Lang.LAB_EXPERIMENT_DNSJAVA_DESCRIPTION))); + DNSJAVA(new Experiment("dnsjava", List.of(0, 1, 2), new TranslationComponent(Lang.LAB_EXPERIMENT_DNSJAVA_TITLE), new TranslationComponent(Lang.LAB_EXPERIMENT_DNSJAVA_DESCRIPTION))), + SQLITE_VACUUM(new Experiment("sqlite_vacuum", List.of(0, 1, 3, 5), new TranslationComponent(Lang.LAB_EXPERIMENT_SQLITE_VACUUM_TITLE), new TranslationComponent(Lang.LAB_EXPERIMENT_SQLITE_VACUUM_DESCRIPTION))); private final Experiment experiment; @@ -18,4 +19,4 @@ public enum Experiments { public Experiment getExperiment() { return experiment; } -} + } diff --git a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java index c7de0e147..7a201d3d4 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java +++ b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java @@ -467,7 +467,7 @@ public enum Lang { FREE_LICENSE_DESCRIPTION, FREE_LICENSE_SOURCE, FREE_LICENSE_LICENSE_TO, - FREE_LICENSE_RENEW_STILL_ACTIVE, PBH_PLUS_LICENSE_UPDATED, DOWNLOADER_QB_DISABLE_SAME_IP_MULTI_CONNECTION_FAILED, DOWNLOADER_PAUSED, LAB_EXPERIMENT_DNSJAVA_TITLE, LAB_EXPERIMENT_DNSJAVA_DESCRIPTION; + FREE_LICENSE_RENEW_STILL_ACTIVE, PBH_PLUS_LICENSE_UPDATED, DOWNLOADER_QB_DISABLE_SAME_IP_MULTI_CONNECTION_FAILED, DOWNLOADER_PAUSED, LAB_EXPERIMENT_DNSJAVA_TITLE, LAB_EXPERIMENT_DNSJAVA_DESCRIPTION, LAB_EXPERIMENT_SQLITE_VACUUM_TITLE, LAB_EXPERIMENT_SQLITE_VACUUM_DESCRIPTION, SQLITE_VACUUM_BACKUP_FAILED, SQLITE_VACUUM_BACKUP, SQLITE_VACUUM_BACKUP_COMPLETED, SQLITE_VACUUM_IN_PROGRESS, SQLITE_VACUUM_SUCCESS; public String getKey() { return name(); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 1a6b45c56..82b8a8c62 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,4 +1,4 @@ -config-version: 26 +config-version: 27 # 设置程序语言 # Set the program language # default 跟随操作系统 (Follow the operating system) @@ -54,6 +54,13 @@ persist: # 您是否想要持久化保存封禁列表?如果不持久化,重启 PBH 将重置封禁列表。 # Do you want persist the banlist? If you disable it, PBH will reset the banlist when you restarting it. banlist: true + # 数据库维护操作间隔时间,单位:天 + # 定时维护数据库将可以提升性能,并释放未使用的空间;过于频繁的维护可能会导致嵌入式设备的闪存磨损 + # 此操作仅在 PeerBanHelper 启动时才会检查是否需要执行 + # Database maintenance interval, time unit: days + # Regular maintenance will improve performance and release unused space; too frequent maintenance may cause flash wear on embedded devices + # This operation only check and execute when PeerBanHelper starting + vacuum-interval-days: 60 # BitTorrent Threat Network 威胁防护网络(测试版) # BitTorrent Threat Network (BETA) btn: diff --git a/src/main/resources/lang/en_us/messages.yml b/src/main/resources/lang/en_us/messages.yml index e3dfec2b8..3bbe2929d 100644 --- a/src/main/resources/lang/en_us/messages.yml +++ b/src/main/resources/lang/en_us/messages.yml @@ -537,4 +537,11 @@ FREE_LICENSE_LICENSE_TO: "{} for personal use." FREE_LICENSE_DESCRIPTION: "Local generated renewable free license, for personal use only." DOWNLOADER_PAUSED: Downloader paused LAB_EXPERIMENT_DNSJAVA_TITLE: "DNSJava DNS" -LAB_EXPERIMENT_DNSJAVA_DESCRIPTION: "Use [dnsjava/dnsjava](https://github.com/dnsjava/dnsjava) to replace the default JDK DNS resolver in some modules, providing more reliable hostname and reverse DNS lookup capabilities, and supporting custom DNS servers and load balancing. DNSJava only works for certain functions (such as reverse DNS lookup), while other functions will continue to use JDK DNS. \nAfter enabling this experiment, you can configure the DNS server addresses for DNSJava in the configuration file." \ No newline at end of file +LAB_EXPERIMENT_DNSJAVA_DESCRIPTION: "Use [dnsjava/dnsjava](https://github.com/dnsjava/dnsjava) to replace the default JDK DNS resolver in some modules, providing more reliable hostname and reverse DNS lookup capabilities, and supporting custom DNS servers and load balancing. DNSJava only works for certain functions (such as reverse DNS lookup), while other functions will continue to use JDK DNS. \nAfter enabling this experiment, you can configure the DNS server addresses for DNSJava in the configuration file." +LAB_EXPERIMENT_SQLITE_VACUUM_TITLE: "SQLite VACUUM Optimization" +LAB_EXPERIMENT_SQLITE_VACUUM_DESCRIPTION: "PeerBanHelper will check the SQLite data file for vacuuming (VACUUM) when starting up, and will perform a vacuum operation every 60 days by default (you can modify `persist.vacuum-interval-days` to change the vacuum interval). The vacuum operation will optimize the database file, reduce the file size, and improve query performance at the same time." +SQLITE_VACUUM_BACKUP: "Backing up SQLite database file for vacuum operation..." +SQLITE_VACUUM_BACKUP_COMPLETED: "SQLite database file backup completed, preparing for vacuum..." +SQLITE_VACUUM_BACKUP_FAILED: "SQLite database file backup failed, unable to perform vacuum operation. This may be due to insufficient disk space, IO errors, or insufficient permissions. Please check the error message." +SQLITE_VACUUM_IN_PROGRESS: "Vacuuming SQLite database in progress, do not close PeerBanHelper as it may cause database corruption! [In Progress]...." +SQLITE_VACUUM_SUCCESS: "SQLite database vacuumed successfully, original file size: {} vacuumed file size: {}" \ No newline at end of file diff --git a/src/main/resources/lang/messages_fallback.yml b/src/main/resources/lang/messages_fallback.yml index 3a0af2290..410d0675d 100644 --- a/src/main/resources/lang/messages_fallback.yml +++ b/src/main/resources/lang/messages_fallback.yml @@ -537,4 +537,11 @@ FREE_LICENSE_DESCRIPTION: "本地生成的循环免费许可证,仅用于个 DOWNLOADER_QB_DISABLE_SAME_IP_MULTI_CONNECTION_FAILED: "禁用 {} ({}) 的高级设置 “允许来自不同 IP 地址的多重连接” 失败:{} - {}!此功能必须关闭,否则将导致 PCB 封禁误判。" DOWNLOADER_PAUSED: "下载器已暂停" LAB_EXPERIMENT_DNSJAVA_TITLE: "DNSJava DNS 解析" -LAB_EXPERIMENT_DNSJAVA_DESCRIPTION: "在部分功能模块中使用 [dnsjava/dnsjava](https://github.com/dnsjava/dnsjava) 替代 JDK 默认的 DNS 解析器,以提供更可靠的主机名和反向 DNS 查询能力,并支持自定义 DNS 服务器和负载均衡的能力。DNSJava 仅在部分功能上工作(如 DNS 反查),其它功能将继续使用 JDK DNS。 \n启用此实验后,您可以在配置文件中配置 DNSJava 的 DNS 服务器地址。" \ No newline at end of file +LAB_EXPERIMENT_DNSJAVA_DESCRIPTION: "在部分功能模块中使用 [dnsjava/dnsjava](https://github.com/dnsjava/dnsjava) 替代 JDK 默认的 DNS 解析器,以提供更可靠的主机名和反向 DNS 查询能力,并支持自定义 DNS 服务器和负载均衡的能力。DNSJava 仅在部分功能上工作(如 DNS 反查),其它功能将继续使用 JDK DNS。 \n启用此实验后,您可以在配置文件中配置 DNSJava 的 DNS 服务器地址。" +LAB_EXPERIMENT_SQLITE_VACUUM_TITLE: "SQLite VACUUM 数据库优化" +LAB_EXPERIMENT_SQLITE_VACUUM_DESCRIPTION: "PeerBanHelper 将在启动时检查 SQLite 数据文件是否需要真空(VACUUM),默认每 60 天进行一次真空操作(可修改 `persist.vacuum-interval-days` 来改变真空间隔时间)。真空操作将优化数据库文件并减少文件大小,并同时提高查询性能。" +SQLITE_VACUUM_BACKUP: "正在备份 SQLite 数据库文件以便对数据库进行真空操作……" +SQLITE_VACUUM_BACKUP_COMPLETED: "SQLite 数据库文件备份完成,准备进行真空……" +SQLITE_VACUUM_BACKUP_FAILED: "SQLite 数据库文件备份失败,无法进行真空操作,这可能是由于磁盘空间不足,IO 错误或者权限不足导致的,请检查错误信息。" +SQLITE_VACUUM_IN_PROGRESS: "正在对 SQLite 数据库进行真空操作,请勿关闭 PeerBanHelper 否则将可能导致数据库损坏! 【进行中】...." +SQLITE_VACUUM_SUCCESS: "SQLite 数据库已成功真空,原文件大小: {} 真空后文件大小: {}" \ No newline at end of file diff --git a/src/main/resources/lang/zh_cn/messages.yml b/src/main/resources/lang/zh_cn/messages.yml index 02beea9f6..ac7d73568 100644 --- a/src/main/resources/lang/zh_cn/messages.yml +++ b/src/main/resources/lang/zh_cn/messages.yml @@ -534,4 +534,11 @@ FREE_LICENSE_LICENSE_TO: "{} 用于个人用途" FREE_LICENSE_DESCRIPTION: "本地生成的循环免费许可证,仅用于个人用途" DOWNLOADER_PAUSED: "下载器已暂停" LAB_EXPERIMENT_DNSJAVA_TITLE: "DNSJava DNS 解析" -LAB_EXPERIMENT_DNSJAVA_DESCRIPTION: "在部分功能模块中使用 [dnsjava/dnsjava](https://github.com/dnsjava/dnsjava) 替代 JDK 默认的 DNS 解析器,以提供更可靠的主机名和反向 DNS 查询能力,并支持自定义 DNS 服务器和负载均衡的能力。DNSJava 仅在部分功能上工作(如 DNS 反查),其它功能将继续使用 JDK DNS。 \n启用此实验后,您可以在配置文件中配置 DNSJava 的 DNS 服务器地址。" \ No newline at end of file +LAB_EXPERIMENT_DNSJAVA_DESCRIPTION: "在部分功能模块中使用 [dnsjava/dnsjava](https://github.com/dnsjava/dnsjava) 替代 JDK 默认的 DNS 解析器,以提供更可靠的主机名和反向 DNS 查询能力,并支持自定义 DNS 服务器和负载均衡的能力。DNSJava 仅在部分功能上工作(如 DNS 反查),其它功能将继续使用 JDK DNS。 \n启用此实验后,您可以在配置文件中配置 DNSJava 的 DNS 服务器地址。" +LAB_EXPERIMENT_SQLITE_VACUUM_TITLE: "SQLite VACUUM 数据库优化" +LAB_EXPERIMENT_SQLITE_VACUUM_DESCRIPTION: "PeerBanHelper 将在启动时检查 SQLite 数据文件是否需要真空(VACUUM),默认每 60 天进行一次真空操作(可修改 `persist.vacuum-interval-days` 来改变真空间隔时间)。真空操作将优化数据库文件并减少文件大小,并同时提高查询性能。" +SQLITE_VACUUM_BACKUP: "正在备份 SQLite 数据库文件以便对数据库进行真空操作……" +SQLITE_VACUUM_BACKUP_COMPLETED: "SQLite 数据库文件备份完成,准备进行真空……" +SQLITE_VACUUM_BACKUP_FAILED: "SQLite 数据库文件备份失败,无法进行真空操作,这可能是由于磁盘空间不足,IO 错误或者权限不足导致的,请检查错误信息。" +SQLITE_VACUUM_IN_PROGRESS: "正在对 SQLite 数据库进行真空操作,请勿关闭 PeerBanHelper 否则将可能导致数据库损坏! 【进行中】...." +SQLITE_VACUUM_SUCCESS: "SQLite 数据库已成功真空,原文件大小: {} 真空后文件大小: {}" \ No newline at end of file From 1ec950fe052608c670f89b801d420d290caca525 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Fri, 27 Dec 2024 16:20:01 +0800 Subject: [PATCH 022/160] bump version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3545d0513..7900bef26 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.ghostchu.peerbanhelper peerbanhelper - 7.3-snapshot + 7.3.0-SNAPSHOT jar PeerBanHelper From 1d7b1ea96560b21206db719898a17b1c6eb45335 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Fri, 27 Dec 2024 16:21:08 +0800 Subject: [PATCH 023/160] =?UTF-8?q?=E6=8E=92=E9=99=A4=20install4j=20output?= =?UTF-8?q?=20=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index da5364e69..66171cba5 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,4 @@ dependency-reduced-pom.xml PeerBanHelper.jar *.pkg +install4j/output From 1c0e3873f0dbcf15185b9f27cdbdf19442597d59 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Fri, 27 Dec 2024 16:53:17 +0800 Subject: [PATCH 024/160] Add PTRBlacklist #834 WebUI need follow up --- .../config/ProfileUpdateScript.java | 5 +- .../module/impl/rule/PTRBlacklist.java | 124 ++++++++++++++++++ .../com/ghostchu/peerbanhelper/text/Lang.java | 15 ++- src/main/resources/lang/en_us/messages.yml | 3 +- src/main/resources/lang/messages_fallback.yml | 3 +- src/main/resources/lang/zh_cn/messages.yml | 3 +- src/main/resources/profile.yml | 34 ++++- 7 files changed, 180 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java diff --git a/src/main/java/com/ghostchu/peerbanhelper/config/ProfileUpdateScript.java b/src/main/java/com/ghostchu/peerbanhelper/config/ProfileUpdateScript.java index dcb476f2d..bf5158689 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/config/ProfileUpdateScript.java +++ b/src/main/java/com/ghostchu/peerbanhelper/config/ProfileUpdateScript.java @@ -25,7 +25,10 @@ public ProfileUpdateScript(YamlConfiguration conf) { this.conf = conf; } - + @UpdateScript(version = 23) + public void ptrBlacklist(YamlConfiguration bundled) { + conf.set("module.ptr-blacklist", bundled.get("module.ptr-blacklist")); + } @UpdateScript(version = 22) public void workaroundForBadWebUI() { diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java new file mode 100644 index 000000000..181bb5549 --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java @@ -0,0 +1,124 @@ +package com.ghostchu.peerbanhelper.module.impl.rule; + +import com.ghostchu.peerbanhelper.Main; +import com.ghostchu.peerbanhelper.downloader.Downloader; +import com.ghostchu.peerbanhelper.lab.Experiments; +import com.ghostchu.peerbanhelper.lab.Laboratory; +import com.ghostchu.peerbanhelper.module.AbstractRuleFeatureModule; +import com.ghostchu.peerbanhelper.module.CheckResult; +import com.ghostchu.peerbanhelper.module.PeerAction; +import com.ghostchu.peerbanhelper.peer.Peer; +import com.ghostchu.peerbanhelper.text.Lang; +import com.ghostchu.peerbanhelper.text.TranslationComponent; +import com.ghostchu.peerbanhelper.torrent.Torrent; +import com.ghostchu.peerbanhelper.util.context.IgnoreScan; +import com.ghostchu.peerbanhelper.util.dns.DNSLookup; +import com.ghostchu.peerbanhelper.util.rule.Rule; +import com.ghostchu.peerbanhelper.util.rule.RuleMatchResult; +import com.ghostchu.peerbanhelper.util.rule.RuleParser; +import com.ghostchu.peerbanhelper.web.JavalinWebContainer; +import com.ghostchu.peerbanhelper.web.Role; +import com.ghostchu.peerbanhelper.web.wrapper.StdResp; +import com.ghostchu.simplereloadlib.ReloadResult; +import com.ghostchu.simplereloadlib.Reloadable; +import io.javalin.http.Context; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ExecutorService; + +@Component +@IgnoreScan +public class PTRBlacklist extends AbstractRuleFeatureModule implements Reloadable { + private List ptrRules; + @Autowired + private JavalinWebContainer webContainer; + @Autowired + private DNSLookup dnsLookup; + private long banDuration; + private Laboratory laboratory; + + @Override + public @NotNull String getName() { + return "PTR Blacklist"; + } + + @Override + public @NotNull String getConfigName() { + return "ptr-blacklist"; + } + + + @Override + public boolean isConfigurable() { + return true; + } + + + @Override + public void onEnable() { + reloadConfig(); + webContainer.javalin() + .get("/api/modules/" + getConfigName(), this::handleWebAPI, Role.USER_READ); + Main.getReloadManager().register(this); + } + + @Override + public boolean isThreadSafe() { + return true; + } + + private void handleWebAPI(Context ctx) { + String locale = locale(ctx); + ctx.json(new StdResp(true, null, Map.of("ptr-rules", ptrRules.stream().map(r -> r.toPrintableText(locale)).toList()))); + } + + @Override + public void onDisable() { + Main.getReloadManager().unregister(this); + } + + @Override + public ReloadResult reloadModule() throws Exception { + reloadConfig(); + return Reloadable.super.reloadModule(); + } + + public void reloadConfig() { + this.banDuration = getConfig().getLong("ban-duration", 0); + this.ptrRules = RuleParser.parse(getConfig().getStringList("ptr-rules")); + getCache().invalidateAll(); + } + + @Override + public @NotNull CheckResult shouldBanPeer(@NotNull Torrent torrent, @NotNull Peer peer, @NotNull Downloader downloader, @NotNull ExecutorService ruleExecuteExecutor) { + var reverseDnsLookupString = peer.getPeerAddress().getAddress().toReverseDNSLookupString(); + return getCache().readCache(this, reverseDnsLookupString, () -> { + Optional ptr; + if (laboratory.isExperimentActivated(Experiments.DNSJAVA.getExperiment())) { + ptr = dnsLookup.ptr(reverseDnsLookupString).join(); + } else { + try { + ptr = Optional.ofNullable(InetAddress.getByName(peer.getPeerAddress().getIp()).getHostName()); + } catch (UnknownHostException e) { + ptr = Optional.empty(); + } + } + if (ptr.isPresent()) { + RuleMatchResult matchResult = RuleParser.matchRule(ptrRules, ptr.get()); + if (matchResult.hit()) { + return new CheckResult(getClass(), PeerAction.BAN, banDuration, new TranslationComponent(matchResult.rule().toString()), + new TranslationComponent(Lang.MODULE_PTR_MATCH_PTR_RULE, matchResult.rule().toString())); + } + } + return pass(); + }, true); + } + +} diff --git a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java index 7a201d3d4..0eea9ec56 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java +++ b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java @@ -467,7 +467,20 @@ public enum Lang { FREE_LICENSE_DESCRIPTION, FREE_LICENSE_SOURCE, FREE_LICENSE_LICENSE_TO, - FREE_LICENSE_RENEW_STILL_ACTIVE, PBH_PLUS_LICENSE_UPDATED, DOWNLOADER_QB_DISABLE_SAME_IP_MULTI_CONNECTION_FAILED, DOWNLOADER_PAUSED, LAB_EXPERIMENT_DNSJAVA_TITLE, LAB_EXPERIMENT_DNSJAVA_DESCRIPTION, LAB_EXPERIMENT_SQLITE_VACUUM_TITLE, LAB_EXPERIMENT_SQLITE_VACUUM_DESCRIPTION, SQLITE_VACUUM_BACKUP_FAILED, SQLITE_VACUUM_BACKUP, SQLITE_VACUUM_BACKUP_COMPLETED, SQLITE_VACUUM_IN_PROGRESS, SQLITE_VACUUM_SUCCESS; + FREE_LICENSE_RENEW_STILL_ACTIVE, + PBH_PLUS_LICENSE_UPDATED, + DOWNLOADER_QB_DISABLE_SAME_IP_MULTI_CONNECTION_FAILED, + DOWNLOADER_PAUSED, + LAB_EXPERIMENT_DNSJAVA_TITLE, + LAB_EXPERIMENT_DNSJAVA_DESCRIPTION, + LAB_EXPERIMENT_SQLITE_VACUUM_TITLE, + LAB_EXPERIMENT_SQLITE_VACUUM_DESCRIPTION, + SQLITE_VACUUM_BACKUP_FAILED, + SQLITE_VACUUM_BACKUP, + SQLITE_VACUUM_BACKUP_COMPLETED, + SQLITE_VACUUM_IN_PROGRESS, + SQLITE_VACUUM_SUCCESS, + MODULE_PTR_MATCH_PTR_RULE; public String getKey() { return name(); diff --git a/src/main/resources/lang/en_us/messages.yml b/src/main/resources/lang/en_us/messages.yml index 3bbe2929d..1630d307c 100644 --- a/src/main/resources/lang/en_us/messages.yml +++ b/src/main/resources/lang/en_us/messages.yml @@ -544,4 +544,5 @@ SQLITE_VACUUM_BACKUP: "Backing up SQLite database file for vacuum operation..." SQLITE_VACUUM_BACKUP_COMPLETED: "SQLite database file backup completed, preparing for vacuum..." SQLITE_VACUUM_BACKUP_FAILED: "SQLite database file backup failed, unable to perform vacuum operation. This may be due to insufficient disk space, IO errors, or insufficient permissions. Please check the error message." SQLITE_VACUUM_IN_PROGRESS: "Vacuuming SQLite database in progress, do not close PeerBanHelper as it may cause database corruption! [In Progress]...." -SQLITE_VACUUM_SUCCESS: "SQLite database vacuumed successfully, original file size: {} vacuumed file size: {}" \ No newline at end of file +SQLITE_VACUUM_SUCCESS: "SQLite database vacuumed successfully, original file size: {} vacuumed file size: {}" +MODULE_PTR_MATCH_PTR_RULE: "Match PTR rule: {}" \ No newline at end of file diff --git a/src/main/resources/lang/messages_fallback.yml b/src/main/resources/lang/messages_fallback.yml index 410d0675d..6eb0a64eb 100644 --- a/src/main/resources/lang/messages_fallback.yml +++ b/src/main/resources/lang/messages_fallback.yml @@ -544,4 +544,5 @@ SQLITE_VACUUM_BACKUP: "正在备份 SQLite 数据库文件以便对数据库进 SQLITE_VACUUM_BACKUP_COMPLETED: "SQLite 数据库文件备份完成,准备进行真空……" SQLITE_VACUUM_BACKUP_FAILED: "SQLite 数据库文件备份失败,无法进行真空操作,这可能是由于磁盘空间不足,IO 错误或者权限不足导致的,请检查错误信息。" SQLITE_VACUUM_IN_PROGRESS: "正在对 SQLite 数据库进行真空操作,请勿关闭 PeerBanHelper 否则将可能导致数据库损坏! 【进行中】...." -SQLITE_VACUUM_SUCCESS: "SQLite 数据库已成功真空,原文件大小: {} 真空后文件大小: {}" \ No newline at end of file +SQLITE_VACUUM_SUCCESS: "SQLite 数据库已成功真空,原文件大小: {} 真空后文件大小: {}" +MODULE_PTR_MATCH_PTR_RULE: "匹配 PTR 规则: {}" \ No newline at end of file diff --git a/src/main/resources/lang/zh_cn/messages.yml b/src/main/resources/lang/zh_cn/messages.yml index ac7d73568..445c161d3 100644 --- a/src/main/resources/lang/zh_cn/messages.yml +++ b/src/main/resources/lang/zh_cn/messages.yml @@ -541,4 +541,5 @@ SQLITE_VACUUM_BACKUP: "正在备份 SQLite 数据库文件以便对数据库进 SQLITE_VACUUM_BACKUP_COMPLETED: "SQLite 数据库文件备份完成,准备进行真空……" SQLITE_VACUUM_BACKUP_FAILED: "SQLite 数据库文件备份失败,无法进行真空操作,这可能是由于磁盘空间不足,IO 错误或者权限不足导致的,请检查错误信息。" SQLITE_VACUUM_IN_PROGRESS: "正在对 SQLite 数据库进行真空操作,请勿关闭 PeerBanHelper 否则将可能导致数据库损坏! 【进行中】...." -SQLITE_VACUUM_SUCCESS: "SQLite 数据库已成功真空,原文件大小: {} 真空后文件大小: {}" \ No newline at end of file +SQLITE_VACUUM_SUCCESS: "SQLite 数据库已成功真空,原文件大小: {} 真空后文件大小: {}" +MODULE_PTR_MATCH_PTR_RULE: "匹配 PTR 规则: {}" \ No newline at end of file diff --git a/src/main/resources/profile.yml b/src/main/resources/profile.yml index 4e3b2a2b9..56c472cb2 100644 --- a/src/main/resources/profile.yml +++ b/src/main/resources/profile.yml @@ -1,4 +1,4 @@ -config-version: 22 +config-version: 23 # Check interval (Timeunit: ms) # 检查频率(单位:毫秒) check-interval: 5000 @@ -412,4 +412,34 @@ module: traffic-monitoring: # 每日阈值 - 设置为 -1 以禁用,单位:bytes # Daily threshold, set to -1 to disable, Unit: bytes - daily: -1 \ No newline at end of file + daily: -1 + # PTR (反向解析记录) 封禁 + # 此模块将强制对 Peer IP 进行 PTR 查询,并试图解析其 IP 地址绑定的主机名。如果 IP 地址绑定了一个主机名且主机名匹配下列规则,则执行操作 + # PTR (Reverse DNS) Blocker + # This module will force to do PTR query on Peer IP, and try to resolve the hostname that bind with IP address. If the IP address bind with a hostname and the hostname match the rules below, then do the action + ptr-blacklist: + enabled: false + # 封禁时间,单位:毫秒,使用 default 则跟随全局设置 + # BanDuration, Timeunit: ms, use `default` to fallback to global settings + ban-duration: 259200000 + # method = 匹配方式 - Match Method + # + STARTS_WITH = 匹配开头 - Match the starts + # + ENDS_WITH = 匹配结尾 - Match the ends + # + LENGTH = 匹配字符串长度 - Match the string length + # + 支持的额外字段 - Other supported fields + # * min = 最小长度 - Min length + # * max = 最大长度 - Max length + # + CONTAINS = 匹配包含 - Match the contains + # + EQUALS = 匹配相同 - Match the equals + # + REGEX = 匹配正则表达式(大小写敏感) - Match the regex (case-sensitive) + # content = 匹配的内容(除正则外忽略大小写) - The content will be matched + # if = 表达式控制器,当 if 的表达式为 true 时,则检查此规则;否则此规则被忽略。 # if controller, `0` or `false` will skip this rule + # + if 表达式可以为 true/false, 1/0 或者一个嵌套的规则 # the return result can be `true` or `false` and `0` or `1` + # hit = 匹配成功返回的行为代码 # the behavior if matched + # + TRUE = 在 if 中代表 true,在规则中代表 BAN(封禁) # true in if controller, BAN in rule + # + FALSE = 在 if 中代表 false,在规则中代表 SKIP(排除) # false in if controller, SKIP in rule + # + DEFAULT = 在 if 中代表 true,在规则中代表 NO_ACTION(默认行为) # true in if controller, NO_ACTION in rule + # miss = 匹配失败返回的行为代码(与上相同) # the behavior if match failed, same as above + # 规则从上到下执行 + ptr-rules: + - '{"method":"EQUALS","content":"example.com"}' \ No newline at end of file From 2ac28eeebb4e9d4cc764628a6f1261b136bbfe93 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Fri, 27 Dec 2024 16:54:46 +0800 Subject: [PATCH 025/160] Downgrade log level from info to debug --- .../java/com/ghostchu/peerbanhelper/util/dns/DNSLookup.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/dns/DNSLookup.java b/src/main/java/com/ghostchu/peerbanhelper/util/dns/DNSLookup.java index c81eb9de2..de1229238 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/dns/DNSLookup.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/dns/DNSLookup.java @@ -50,11 +50,11 @@ private void applyDnsServers(List servers) { for (String dns : servers) { if (dns.startsWith("http")) { resolvers.add(new DohResolver(dns)); - log.info("Added DoH resolver: {}", dns); + log.debug("Added DoH resolver: {}", dns); } else { try { resolvers.add(new SimpleResolver(dns)); - log.info("Added resolver: {}", dns); + log.debug("Added resolver: {}", dns); } catch (UnknownHostException e) { log.warn("Failed to add resolver: {}", dns, e); } From 1005c46db3752e27b0f67c83696b54b5ea9cb00a Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Fri, 27 Dec 2024 16:59:33 +0800 Subject: [PATCH 026/160] update Tor Exit Nodes list, closed #845 --- .../ghostchu/peerbanhelper/config/ProfileUpdateScript.java | 5 ++++- src/main/resources/profile.yml | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/config/ProfileUpdateScript.java b/src/main/java/com/ghostchu/peerbanhelper/config/ProfileUpdateScript.java index bf5158689..6df28083a 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/config/ProfileUpdateScript.java +++ b/src/main/java/com/ghostchu/peerbanhelper/config/ProfileUpdateScript.java @@ -26,8 +26,11 @@ public ProfileUpdateScript(YamlConfiguration conf) { } @UpdateScript(version = 23) - public void ptrBlacklist(YamlConfiguration bundled) { + public void ptrBlacklistAndUpdateTorExitNodeList(YamlConfiguration bundled) { conf.set("module.ptr-blacklist", bundled.get("module.ptr-blacklist")); + if("https://cdn.jsdelivr.net/gh/platformcosmo/Tor-IP-Addresses/tor-exit-nodes.lst".equals(conf.getString("module.ip-address-blocker-rules.rules.tor-exit-nodes.url"))){ + conf.set("module.ip-address-blocker-rules.rules.tor-exit-nodes.url", "https://cdn.jsdelivr.net/gh/7c/torfilter/lists/txt/torfilter-1d-flat.txt"); + } } @UpdateScript(version = 22) diff --git a/src/main/resources/profile.yml b/src/main/resources/profile.yml index 56c472cb2..8b4d13a53 100644 --- a/src/main/resources/profile.yml +++ b/src/main/resources/profile.yml @@ -378,7 +378,7 @@ module: tor-exit-nodes: enabled: false name: Tor Exit Nodes - url: https://cdn.jsdelivr.net/gh/platformcosmo/Tor-IP-Addresses/tor-exit-nodes.lst + url: https://cdn.jsdelivr.net/gh/7c/torfilter/lists/txt/torfilter-1d-flat.txt # 主动监测 - Active Monitoring # 此功能允许 PeerBanHelper 主动记录每次请求下载器时获取到的数据到本地 SQLite 数据库中 # Allow PBH records all data that fetched from downloader and save them into SQLite database From 1661ef3a55a40d321f15d7ccf0c4fecb543b585e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 27 Dec 2024 14:32:13 +0000 Subject: [PATCH 027/160] Update dependency com.github.mizosoft.methanol:methanol to v1.8.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7900bef26..ffe59fe02 100644 --- a/pom.xml +++ b/pom.xml @@ -313,7 +313,7 @@ com.github.mizosoft.methanol methanol - 1.7.0 + 1.8.0 From 0d8f3ab1df7db6462db63b5d6077ca4eed28405d Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 28 Dec 2024 02:25:08 +0800 Subject: [PATCH 028/160] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=94=AF=E6=8C=81=20?= =?UTF-8?q?PTR=20=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/impl/webapi/PBHPeerController.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHPeerController.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHPeerController.java index df39530d1..a69d4f202 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHPeerController.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHPeerController.java @@ -4,11 +4,14 @@ import com.ghostchu.peerbanhelper.database.dao.impl.PeerRecordDao; import com.ghostchu.peerbanhelper.ipdb.IPDB; import com.ghostchu.peerbanhelper.ipdb.IPGeoData; +import com.ghostchu.peerbanhelper.lab.Experiments; +import com.ghostchu.peerbanhelper.lab.Laboratory; import com.ghostchu.peerbanhelper.module.AbstractFeatureModule; import com.ghostchu.peerbanhelper.module.impl.rule.ActiveMonitoringModule; import com.ghostchu.peerbanhelper.util.IPAddressUtil; import com.ghostchu.peerbanhelper.util.MsgUtil; import com.ghostchu.peerbanhelper.util.context.IgnoreScan; +import com.ghostchu.peerbanhelper.util.dns.DNSLookup; import com.ghostchu.peerbanhelper.util.paging.Page; import com.ghostchu.peerbanhelper.util.paging.Pageable; import com.ghostchu.peerbanhelper.web.JavalinWebContainer; @@ -32,15 +35,20 @@ public class PBHPeerController extends AbstractFeatureModule { private final HistoryDao historyDao; private final PeerRecordDao peerRecordDao; private final ActiveMonitoringModule activeMonitoringModule; + private final Laboratory laboratory; + private final DNSLookup dnsLookup; public PBHPeerController(JavalinWebContainer javalinWebContainer, HistoryDao historyDao, PeerRecordDao peerRecordDao, - ActiveMonitoringModule activeMonitoringModule) { + ActiveMonitoringModule activeMonitoringModule, + Laboratory laboratory, DNSLookup dnsLookup) { super(); this.javalinWebContainer = javalinWebContainer; this.historyDao = historyDao; this.peerRecordDao = peerRecordDao; this.activeMonitoringModule = activeMonitoringModule; + this.laboratory = laboratory; + this.dnsLookup = dnsLookup; } @Override @@ -78,7 +86,7 @@ private void handleInfo(Context ctx) throws SQLException { .countOf(); long torrentAccessCount = peerRecordDao.queryBuilder() .where() - .eq("address",new SelectArg( ip)) + .eq("address", new SelectArg(ip)) .countOf(); long uploadedToPeer; long downloadedFromPeer; @@ -128,9 +136,18 @@ private void handleInfo(Context ctx) throws SQLException { } catch (Exception e) { log.warn("Unable to perform GeoIP query for ip {}", ip); } + String ptrLookup = null; + try { + if (laboratory.isExperimentActivated(Experiments.DNSJAVA.getExperiment())) { + ptrLookup = dnsLookup.ptr(ip).join().orElse(null); + } else { + ptrLookup = InetAddress.getByName(ip).getCanonicalHostName(); + } + } catch (Exception ignored) { + } var info = new PeerInfo( upDownResult != null || banCount > 0 || torrentAccessCount > 0, - ip, firstTimeSeenTS, lastTimeSeenTS, banCount, torrentAccessCount, uploadedToPeer, downloadedFromPeer, geoIP); + ip, firstTimeSeenTS, lastTimeSeenTS, banCount, torrentAccessCount, uploadedToPeer, downloadedFromPeer, geoIP, ptrLookup); ctx.json(new StdResp(true, null, info)); } @@ -179,7 +196,8 @@ public record PeerInfo( long torrentAccessCount, long uploadedToPeer, long downloadedFromPeer, - IPGeoData geo + IPGeoData geo, + String ptrLookup ) { } } From 988796357a1f83f4199cf121a00fb39bf6683e09 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 28 Dec 2024 21:11:49 +0800 Subject: [PATCH 029/160] =?UTF-8?q?=E6=80=8E=E4=B9=88=E6=9C=89=E4=B8=A4?= =?UTF-8?q?=E4=B8=AA=20BtnNetwork?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/impl/rule/BtnNetworkOnline.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java index 8e412f2a7..e82c0e901 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java @@ -55,12 +55,10 @@ @IgnoreScan public class BtnNetworkOnline extends AbstractRuleFeatureModule implements Reloadable { private final CheckResult BTN_MANAGER_NOT_INITIALIZED = new CheckResult(getClass(), PeerAction.NO_ACTION, 0, new TranslationComponent(Lang.GENERAL_NA), new TranslationComponent("BtnManager not initialized")); - @Autowired(required = false) - private BtnNetwork manager; private long banDuration; @Autowired private JavalinWebContainer javalinWebContainer; - @Autowired + @Autowired(required = false) private BtnNetwork btnNetwork; @Autowired private ScriptEngine scriptEngine; @@ -168,7 +166,7 @@ public boolean isThreadSafe() { @Override public @NotNull CheckResult shouldBanPeer(@NotNull Torrent torrent, @NotNull Peer peer, @NotNull Downloader downloader, @NotNull ExecutorService ruleExecuteExecutor) { - if (manager == null) { + if (btnNetwork == null) { return BTN_MANAGER_NOT_INITIALIZED; } // TODO: 需要重构 @@ -186,7 +184,7 @@ public boolean isThreadSafe() { } private @NotNull CheckResult checkScript(Torrent torrent, Peer peer, Downloader downloader, ExecutorService ruleExecuteExecutor) { - var abilityObject = manager.getAbilities().get(BtnAbilityRules.class); + var abilityObject = btnNetwork.getAbilities().get(BtnAbilityRules.class); if (abilityObject == null) { return pass(); } @@ -262,7 +260,7 @@ public boolean isThreadSafe() { } private @NotNull CheckResult checkShouldSkip(Torrent torrent, Peer peer, Downloader downloader, ExecutorService ruleExecuteExecutor) { - var abilityObject = manager.getAbilities().get(BtnAbilityException.class); + var abilityObject = btnNetwork.getAbilities().get(BtnAbilityException.class); if (abilityObject == null) { return pass(); } @@ -296,7 +294,7 @@ public boolean isThreadSafe() { } private @NotNull CheckResult checkShouldBan(@NotNull Torrent torrent, @NotNull Peer peer, @NotNull Downloader downloader, @NotNull ExecutorService ruleExecuteExecutor) { - var abilityObject = manager.getAbilities().get(BtnAbilityRules.class); + var abilityObject = btnNetwork.getAbilities().get(BtnAbilityRules.class); if (abilityObject == null) { return pass(); } From e00e0c0f263d9e17fec1180ac238e1f1d0170f88 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 28 Dec 2024 21:21:43 +0800 Subject: [PATCH 030/160] =?UTF-8?q?Revert=20"=E6=80=8E=E4=B9=88=E6=9C=89?= =?UTF-8?q?=E4=B8=A4=E4=B8=AA=20BtnNetwork"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 988796357a1f83f4199cf121a00fb39bf6683e09. --- .../module/impl/rule/BtnNetworkOnline.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java index e82c0e901..8e412f2a7 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java @@ -55,10 +55,12 @@ @IgnoreScan public class BtnNetworkOnline extends AbstractRuleFeatureModule implements Reloadable { private final CheckResult BTN_MANAGER_NOT_INITIALIZED = new CheckResult(getClass(), PeerAction.NO_ACTION, 0, new TranslationComponent(Lang.GENERAL_NA), new TranslationComponent("BtnManager not initialized")); + @Autowired(required = false) + private BtnNetwork manager; private long banDuration; @Autowired private JavalinWebContainer javalinWebContainer; - @Autowired(required = false) + @Autowired private BtnNetwork btnNetwork; @Autowired private ScriptEngine scriptEngine; @@ -166,7 +168,7 @@ public boolean isThreadSafe() { @Override public @NotNull CheckResult shouldBanPeer(@NotNull Torrent torrent, @NotNull Peer peer, @NotNull Downloader downloader, @NotNull ExecutorService ruleExecuteExecutor) { - if (btnNetwork == null) { + if (manager == null) { return BTN_MANAGER_NOT_INITIALIZED; } // TODO: 需要重构 @@ -184,7 +186,7 @@ public boolean isThreadSafe() { } private @NotNull CheckResult checkScript(Torrent torrent, Peer peer, Downloader downloader, ExecutorService ruleExecuteExecutor) { - var abilityObject = btnNetwork.getAbilities().get(BtnAbilityRules.class); + var abilityObject = manager.getAbilities().get(BtnAbilityRules.class); if (abilityObject == null) { return pass(); } @@ -260,7 +262,7 @@ public boolean isThreadSafe() { } private @NotNull CheckResult checkShouldSkip(Torrent torrent, Peer peer, Downloader downloader, ExecutorService ruleExecuteExecutor) { - var abilityObject = btnNetwork.getAbilities().get(BtnAbilityException.class); + var abilityObject = manager.getAbilities().get(BtnAbilityException.class); if (abilityObject == null) { return pass(); } @@ -294,7 +296,7 @@ public boolean isThreadSafe() { } private @NotNull CheckResult checkShouldBan(@NotNull Torrent torrent, @NotNull Peer peer, @NotNull Downloader downloader, @NotNull ExecutorService ruleExecuteExecutor) { - var abilityObject = btnNetwork.getAbilities().get(BtnAbilityRules.class); + var abilityObject = manager.getAbilities().get(BtnAbilityRules.class); if (abilityObject == null) { return pass(); } From 427ac8a9ebe49875ed3a6c645557bf37c0b3a1f6 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 28 Dec 2024 21:24:30 +0800 Subject: [PATCH 031/160] =?UTF-8?q?=E6=8F=90=E5=89=8D=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=20AV=20=E8=84=9A=E6=9C=AC=E5=BC=95=E6=93=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ghostchu/peerbanhelper/Main.java | 64 +++++++++++++++++++ .../peerbanhelper/PeerBanHelperServer.java | 62 ------------------ 2 files changed, 64 insertions(+), 62 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/Main.java b/src/main/java/com/ghostchu/peerbanhelper/Main.java index d1003aedd..ad6dac27e 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/Main.java +++ b/src/main/java/com/ghostchu/peerbanhelper/Main.java @@ -8,18 +8,29 @@ import com.ghostchu.peerbanhelper.config.PBHConfigUpdater; import com.ghostchu.peerbanhelper.config.ProfileUpdateScript; import com.ghostchu.peerbanhelper.event.PBHShutdownEvent; +import com.ghostchu.peerbanhelper.exchange.ExchangeMap; import com.ghostchu.peerbanhelper.gui.PBHGuiManager; import com.ghostchu.peerbanhelper.gui.impl.console.ConsoleGuiImpl; import com.ghostchu.peerbanhelper.gui.impl.swing.SwingGuiImpl; import com.ghostchu.peerbanhelper.text.Lang; import com.ghostchu.peerbanhelper.text.TextManager; +import com.ghostchu.peerbanhelper.util.*; +import com.ghostchu.peerbanhelper.util.encrypt.RSAUtils; +import com.ghostchu.peerbanhelper.util.json.JsonUtil; +import com.ghostchu.peerbanhelper.util.paging.Pageable; +import com.ghostchu.peerbanhelper.util.time.InfoHashUtil; import com.ghostchu.simplereloadlib.ReloadManager; import com.ghostchu.simplereloadlib.ReloadResult; import com.ghostchu.simplereloadlib.ReloadStatus; import com.google.common.eventbus.EventBus; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.EvalMode; +import com.googlecode.aviator.Options; +import com.googlecode.aviator.runtime.JavaMethodReflectionFunctionMissing; import lombok.Getter; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.bspfsystems.yamlconfiguration.configuration.InvalidConfigurationException; import org.bspfsystems.yamlconfiguration.file.YamlConfiguration; import org.jetbrains.annotations.Nullable; @@ -37,6 +48,7 @@ import java.io.IOException; import java.io.InputStream; import java.lang.management.ManagementFactory; +import java.math.MathContext; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.Arrays; @@ -111,6 +123,7 @@ public static void main(String[] args) { guiManager.createMainWindow(); pbhServerAddress = mainConfig.getString("server.prefix", "http://127.0.0.1:" + mainConfig.getInt("server.http")); setupProxySettings(); + setupScriptEngine(); try { log.info(TextManager.tlUI(Lang.SPRING_CONTEXT_LOADING)); applicationContext = new AnnotationConfigApplicationContext(); @@ -450,4 +463,55 @@ public static void unregisterBean(String beanName) { defaultListableBeanFactory.removeBeanDefinition(beanName); } + private static void setupScriptEngine() { + AviatorEvaluator.getInstance().setCachedExpressionByDefault(true); + // ASM 性能优先 + AviatorEvaluator.getInstance().setOption(Options.EVAL_MODE, EvalMode.ASM); + // EVAL 性能优先 + AviatorEvaluator.getInstance().setOption(Options.OPTIMIZE_LEVEL, AviatorEvaluator.EVAL); + // 降低浮点计算精度 + AviatorEvaluator.getInstance().setOption(Options.MATH_CONTEXT, MathContext.DECIMAL32); + // 启用变量语法糖 + AviatorEvaluator.getInstance().setOption(Options.ENABLE_PROPERTY_SYNTAX_SUGAR, true); +// // 表达式允许序列化和反序列化 +// AviatorEvaluator.getInstance().setOption(Options.SERIALIZABLE, true); + // 启用反射方法查找 + AviatorEvaluator.getInstance().setFunctionMissing(JavaMethodReflectionFunctionMissing.getInstance()); + // 注册反射调用 + registerFunctions(IPAddressUtil.class); + registerFunctions(HTTPUtil.class); + registerFunctions(JsonUtil.class); + registerFunctions(Lang.class); + registerFunctions(StrUtil.class); + registerFunctions(PeerBanHelperServer.class); + registerFunctions(InfoHashUtil.class); + registerFunctions(CommonUtil.class); + registerFunctions(ByteUtil.class); + registerFunctions(MiscUtil.class); + registerFunctions(MsgUtil.class); + registerFunctions(SharedObject.class); + registerFunctions(UrlEncoderDecoder.class); + registerFunctions(URLUtil.class); + registerFunctions(WebUtil.class); + registerFunctions(RSAUtils.class); + registerFunctions(Pageable.class); + registerFunctions(TextManager.class); + registerFunctions(ExchangeMap.class); + registerFunctions(Main.class); + } + + private static void registerFunctions(Class clazz) { + try { + AviatorEvaluator.addInstanceFunctions(StringUtils.uncapitalize(clazz.getSimpleName()), clazz); + } catch (IllegalAccessException | NoSuchMethodException e) { + log.error("Internal error: failed on register instance functions: {}", clazz.getName(), e); + } + try { + AviatorEvaluator.addStaticFunctions(StringUtils.capitalize(clazz.getSimpleName()), clazz); + } catch (IllegalAccessException | NoSuchMethodException e) { + log.error("Internal error: failed on register static functions: {}", clazz.getName(), e); + } + } + + } \ No newline at end of file diff --git a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java index 8da946c37..25c7d01d8 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java +++ b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java @@ -17,7 +17,6 @@ import com.ghostchu.peerbanhelper.event.PBHServerStartedEvent; import com.ghostchu.peerbanhelper.event.PeerBanEvent; import com.ghostchu.peerbanhelper.event.PeerUnbanEvent; -import com.ghostchu.peerbanhelper.exchange.ExchangeMap; import com.ghostchu.peerbanhelper.invoker.BanListInvoker; import com.ghostchu.peerbanhelper.invoker.impl.CommandExec; import com.ghostchu.peerbanhelper.invoker.impl.IPFilterInvoker; @@ -31,17 +30,12 @@ import com.ghostchu.peerbanhelper.module.impl.webapi.*; import com.ghostchu.peerbanhelper.peer.Peer; import com.ghostchu.peerbanhelper.text.Lang; -import com.ghostchu.peerbanhelper.text.TextManager; import com.ghostchu.peerbanhelper.text.TranslationComponent; import com.ghostchu.peerbanhelper.torrent.Torrent; import com.ghostchu.peerbanhelper.util.*; import com.ghostchu.peerbanhelper.util.dns.DNSLookup; -import com.ghostchu.peerbanhelper.util.encrypt.RSAUtils; -import com.ghostchu.peerbanhelper.util.json.JsonUtil; -import com.ghostchu.peerbanhelper.util.paging.Pageable; import com.ghostchu.peerbanhelper.util.rule.ModuleMatchCache; import com.ghostchu.peerbanhelper.util.time.ExceptedTime; -import com.ghostchu.peerbanhelper.util.time.InfoHashUtil; import com.ghostchu.peerbanhelper.util.time.TimeoutProtect; import com.ghostchu.peerbanhelper.web.JavalinWebContainer; import com.ghostchu.peerbanhelper.wrapper.BanMetadata; @@ -53,17 +47,12 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.gson.JsonObject; -import com.googlecode.aviator.AviatorEvaluator; -import com.googlecode.aviator.EvalMode; -import com.googlecode.aviator.Options; -import com.googlecode.aviator.runtime.JavaMethodReflectionFunctionMissing; import inet.ipaddr.IPAddress; import inet.ipaddr.format.util.DualIPv4v6Tries; import io.javalin.util.JavalinBindException; import lombok.Getter; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import org.bspfsystems.yamlconfiguration.configuration.ConfigurationSection; import org.bspfsystems.yamlconfiguration.configuration.MemoryConfiguration; import org.jetbrains.annotations.NotNull; @@ -77,7 +66,6 @@ import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; -import java.math.MathContext; import java.sql.SQLException; import java.util.*; import java.util.concurrent.*; @@ -185,7 +173,6 @@ public void start() throws SQLException { log.info(tlUI(Lang.MOTD, Main.getMeta().getVersion())); loadDownloaders(); registerBanListInvokers(); - setupScriptEngine(); registerModules(); setupIPDB(); registerHttpServer(); @@ -213,55 +200,6 @@ private void runTestCode() { // run some junky test code here } - private void setupScriptEngine() { - AviatorEvaluator.getInstance().setCachedExpressionByDefault(true); - // ASM 性能优先 - AviatorEvaluator.getInstance().setOption(Options.EVAL_MODE, EvalMode.ASM); - // EVAL 性能优先 - AviatorEvaluator.getInstance().setOption(Options.OPTIMIZE_LEVEL, AviatorEvaluator.EVAL); - // 降低浮点计算精度 - AviatorEvaluator.getInstance().setOption(Options.MATH_CONTEXT, MathContext.DECIMAL32); - // 启用变量语法糖 - AviatorEvaluator.getInstance().setOption(Options.ENABLE_PROPERTY_SYNTAX_SUGAR, true); -// // 表达式允许序列化和反序列化 -// AviatorEvaluator.getInstance().setOption(Options.SERIALIZABLE, true); - // 启用反射方法查找 - AviatorEvaluator.getInstance().setFunctionMissing(JavaMethodReflectionFunctionMissing.getInstance()); - // 注册反射调用 - registerFunctions(IPAddressUtil.class); - registerFunctions(HTTPUtil.class); - registerFunctions(JsonUtil.class); - registerFunctions(Lang.class); - registerFunctions(StrUtil.class); - registerFunctions(PeerBanHelperServer.class); - registerFunctions(InfoHashUtil.class); - registerFunctions(CommonUtil.class); - registerFunctions(ByteUtil.class); - registerFunctions(MiscUtil.class); - registerFunctions(MsgUtil.class); - registerFunctions(SharedObject.class); - registerFunctions(UrlEncoderDecoder.class); - registerFunctions(URLUtil.class); - registerFunctions(WebUtil.class); - registerFunctions(RSAUtils.class); - registerFunctions(Pageable.class); - registerFunctions(TextManager.class); - registerFunctions(ExchangeMap.class); - registerFunctions(Main.class); - } - - private void registerFunctions(Class clazz) { - try { - AviatorEvaluator.addInstanceFunctions(StringUtils.uncapitalize(clazz.getSimpleName()), clazz); - } catch (IllegalAccessException | NoSuchMethodException e) { - log.error("Internal error: failed on register instance functions: {}", clazz.getName(), e); - } - try { - AviatorEvaluator.addStaticFunctions(StringUtils.capitalize(clazz.getSimpleName()), clazz); - } catch (IllegalAccessException | NoSuchMethodException e) { - log.error("Internal error: failed on register static functions: {}", clazz.getName(), e); - } - } private void sendSnapshotAlert() { if (Main.getMeta().isSnapshotOrBeta()) { From 28711c18e364b56f68094760f3bafe5555072a01 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 28 Dec 2024 21:24:37 +0800 Subject: [PATCH 032/160] =?UTF-8?q?Reapply=20"=E6=80=8E=E4=B9=88=E6=9C=89?= =?UTF-8?q?=E4=B8=A4=E4=B8=AA=20BtnNetwork"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit e00e0c0f263d9e17fec1180ac238e1f1d0170f88. --- .../module/impl/rule/BtnNetworkOnline.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java index 8e412f2a7..e82c0e901 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java @@ -55,12 +55,10 @@ @IgnoreScan public class BtnNetworkOnline extends AbstractRuleFeatureModule implements Reloadable { private final CheckResult BTN_MANAGER_NOT_INITIALIZED = new CheckResult(getClass(), PeerAction.NO_ACTION, 0, new TranslationComponent(Lang.GENERAL_NA), new TranslationComponent("BtnManager not initialized")); - @Autowired(required = false) - private BtnNetwork manager; private long banDuration; @Autowired private JavalinWebContainer javalinWebContainer; - @Autowired + @Autowired(required = false) private BtnNetwork btnNetwork; @Autowired private ScriptEngine scriptEngine; @@ -168,7 +166,7 @@ public boolean isThreadSafe() { @Override public @NotNull CheckResult shouldBanPeer(@NotNull Torrent torrent, @NotNull Peer peer, @NotNull Downloader downloader, @NotNull ExecutorService ruleExecuteExecutor) { - if (manager == null) { + if (btnNetwork == null) { return BTN_MANAGER_NOT_INITIALIZED; } // TODO: 需要重构 @@ -186,7 +184,7 @@ public boolean isThreadSafe() { } private @NotNull CheckResult checkScript(Torrent torrent, Peer peer, Downloader downloader, ExecutorService ruleExecuteExecutor) { - var abilityObject = manager.getAbilities().get(BtnAbilityRules.class); + var abilityObject = btnNetwork.getAbilities().get(BtnAbilityRules.class); if (abilityObject == null) { return pass(); } @@ -262,7 +260,7 @@ public boolean isThreadSafe() { } private @NotNull CheckResult checkShouldSkip(Torrent torrent, Peer peer, Downloader downloader, ExecutorService ruleExecuteExecutor) { - var abilityObject = manager.getAbilities().get(BtnAbilityException.class); + var abilityObject = btnNetwork.getAbilities().get(BtnAbilityException.class); if (abilityObject == null) { return pass(); } @@ -296,7 +294,7 @@ public boolean isThreadSafe() { } private @NotNull CheckResult checkShouldBan(@NotNull Torrent torrent, @NotNull Peer peer, @NotNull Downloader downloader, @NotNull ExecutorService ruleExecuteExecutor) { - var abilityObject = manager.getAbilities().get(BtnAbilityRules.class); + var abilityObject = btnNetwork.getAbilities().get(BtnAbilityRules.class); if (abilityObject == null) { return pass(); } From 42c294cac9e4369d40a35e5e38dbb450bbe377cd Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 28 Dec 2024 21:55:16 +0800 Subject: [PATCH 033/160] =?UTF-8?q?DNS=20=E5=8F=8D=E6=9F=A5=E5=9C=A8=20pop?= =?UTF-8?q?ulate=20=E4=B8=AD=E5=90=AF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/webapi/PBHDownloaderController.java | 26 +++++++++++++++++-- .../impl/webapi/dto/PopulatedPeerDTO.java | 1 + .../peerbanhelper/util/IPAddressUtil.java | 3 ++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java index aa5007bac..fde5049c7 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java @@ -4,11 +4,15 @@ import com.ghostchu.peerbanhelper.downloader.Downloader; import com.ghostchu.peerbanhelper.downloader.DownloaderLastStatus; import com.ghostchu.peerbanhelper.ipdb.IPGeoData; +import com.ghostchu.peerbanhelper.lab.Experiments; +import com.ghostchu.peerbanhelper.lab.Laboratory; import com.ghostchu.peerbanhelper.module.AbstractFeatureModule; import com.ghostchu.peerbanhelper.module.impl.webapi.dto.PopulatedPeerDTO; import com.ghostchu.peerbanhelper.text.Lang; import com.ghostchu.peerbanhelper.text.TranslationComponent; +import com.ghostchu.peerbanhelper.util.IPAddressUtil; import com.ghostchu.peerbanhelper.util.context.IgnoreScan; +import com.ghostchu.peerbanhelper.util.dns.DNSLookup; import com.ghostchu.peerbanhelper.web.JavalinWebContainer; import com.ghostchu.peerbanhelper.web.Role; import com.ghostchu.peerbanhelper.web.wrapper.StdResp; @@ -24,6 +28,8 @@ import org.springframework.stereotype.Component; import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; import java.util.Collection; import java.util.List; import java.util.Optional; @@ -36,6 +42,10 @@ public class PBHDownloaderController extends AbstractFeatureModule { @Autowired private JavalinWebContainer webContainer; + @Autowired + private Laboratory laboratory; + @Autowired + private DNSLookup dnsLookup; @Override public boolean isConfigurable() { @@ -188,7 +198,7 @@ private void handlePeersInTorrentOnDownloader(Context ctx, String downloaderName Downloader downloader = selected.get(); List peerWrappers = getServer().getLivePeersSnapshot().values() .stream() - .flatMap(Collection::stream) + .flatMap(Collection::parallelStream) .filter(p -> p.getDownloader().equals(downloader.getName())) .filter(p -> p.getTorrent().getId().equals(torrentId)) .sorted((o1, o2) -> Long.compare(o2.getPeer().getUploadSpeed(), o1.getPeer().getUploadSpeed())) @@ -198,12 +208,24 @@ private void handlePeersInTorrentOnDownloader(Context ctx, String downloaderName } private PopulatedPeerDTO populatePeerDTO(PeerMetadata p) { - PopulatedPeerDTO dto = new PopulatedPeerDTO(p.getPeer(), null); + PopulatedPeerDTO dto = new PopulatedPeerDTO(p.getPeer(), null, null); PeerBanHelperServer.IPDBResponse response = getServer().queryIPDB(p.getPeer().toPeerAddress()); IPGeoData geoData = response.geoData().get(); if (geoData != null) { dto.setGeo(geoData); } + if (dto.getPtrRecord() == null) { + if (laboratory.isExperimentActivated(Experiments.DNSJAVA.getExperiment())) { + dto.setPtrRecord(dnsLookup.ptr(IPAddressUtil.getIPAddress(p.getPeer().getAddress().getIp()).toReverseDNSLookupString()).join().orElse(null)); + } else { + try { + dto.setPtrRecord(InetAddress.getByName(p.getPeer().getAddress().getIp()).getCanonicalHostName()); + } catch (UnknownHostException e) { + dto.setPtrRecord(null); + } + } + } + return dto; } diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/dto/PopulatedPeerDTO.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/dto/PopulatedPeerDTO.java index 04dd8088d..4d6c64fcf 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/dto/PopulatedPeerDTO.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/dto/PopulatedPeerDTO.java @@ -13,4 +13,5 @@ public final class PopulatedPeerDTO { private PeerWrapper peer; private IPGeoData geo; + private String ptrRecord; } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/IPAddressUtil.java b/src/main/java/com/ghostchu/peerbanhelper/util/IPAddressUtil.java index e07bb1d70..aeb9d145e 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/IPAddressUtil.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/IPAddressUtil.java @@ -5,6 +5,7 @@ import inet.ipaddr.IPAddress; import inet.ipaddr.IPAddressString; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -34,7 +35,7 @@ public class IPAddressUtil { * @param ip * @return */ - @Nullable + @Contract(value = "null -> null", pure = true) public static IPAddress getIPAddress(String ip) { if (ip == null) return null; if (ip.startsWith("[") && ip.endsWith("]")) { From fd2c2db88bebe0a9274e007e2c421476754128dc Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 28 Dec 2024 21:55:55 +0800 Subject: [PATCH 034/160] =?UTF-8?q?=E6=A3=80=E6=9F=A5=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/impl/webapi/PBHDownloaderController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java index fde5049c7..0cfdf5889 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java @@ -1,5 +1,6 @@ package com.ghostchu.peerbanhelper.module.impl.webapi; +import com.ghostchu.peerbanhelper.Main; import com.ghostchu.peerbanhelper.PeerBanHelperServer; import com.ghostchu.peerbanhelper.downloader.Downloader; import com.ghostchu.peerbanhelper.downloader.DownloaderLastStatus; @@ -214,7 +215,7 @@ private PopulatedPeerDTO populatePeerDTO(PeerMetadata p) { if (geoData != null) { dto.setGeo(geoData); } - if (dto.getPtrRecord() == null) { + if (dto.getPtrRecord() == null && Main.getMainConfig().getBoolean("lookup.dns-reverse-lookup")) { if (laboratory.isExperimentActivated(Experiments.DNSJAVA.getExperiment())) { dto.setPtrRecord(dnsLookup.ptr(IPAddressUtil.getIPAddress(p.getPeer().getAddress().getIp()).toReverseDNSLookupString()).join().orElse(null)); } else { From 1518f7c0b797ef578119b4983c70c33baeb83ba4 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 28 Dec 2024 21:56:49 +0800 Subject: [PATCH 035/160] =?UTF-8?q?=E6=A3=80=E6=9F=A5=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/impl/webapi/PBHDownloaderController.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java index 0cfdf5889..64fe5281e 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java @@ -197,25 +197,26 @@ private void handlePeersInTorrentOnDownloader(Context ctx, String downloaderName return; } Downloader downloader = selected.get(); + boolean ptr = Main.getMainConfig().getBoolean("lookup.dns-reverse-lookup"); List peerWrappers = getServer().getLivePeersSnapshot().values() .stream() .flatMap(Collection::parallelStream) .filter(p -> p.getDownloader().equals(downloader.getName())) .filter(p -> p.getTorrent().getId().equals(torrentId)) .sorted((o1, o2) -> Long.compare(o2.getPeer().getUploadSpeed(), o1.getPeer().getUploadSpeed())) - .map(this::populatePeerDTO) + .map(dat -> populatePeerDTO(dat, ptr)) .toList(); ctx.json(new StdResp(true, null, peerWrappers)); } - private PopulatedPeerDTO populatePeerDTO(PeerMetadata p) { + private PopulatedPeerDTO populatePeerDTO(PeerMetadata p, boolean resolvePTR) { PopulatedPeerDTO dto = new PopulatedPeerDTO(p.getPeer(), null, null); PeerBanHelperServer.IPDBResponse response = getServer().queryIPDB(p.getPeer().toPeerAddress()); IPGeoData geoData = response.geoData().get(); if (geoData != null) { dto.setGeo(geoData); } - if (dto.getPtrRecord() == null && Main.getMainConfig().getBoolean("lookup.dns-reverse-lookup")) { + if (dto.getPtrRecord() == null && resolvePTR) { if (laboratory.isExperimentActivated(Experiments.DNSJAVA.getExperiment())) { dto.setPtrRecord(dnsLookup.ptr(IPAddressUtil.getIPAddress(p.getPeer().getAddress().getIp()).toReverseDNSLookupString()).join().orElse(null)); } else { From 2aad41b943e62cdd364ff2236358d3ebc647b84b Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 28 Dec 2024 23:54:03 +0800 Subject: [PATCH 036/160] =?UTF-8?q?=E4=BF=AE=E5=A4=8DTelegram=E7=9A=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E5=8D=87=E7=BA=A7=E7=9A=84?= =?UTF-8?q?=E6=BC=8F=E7=BD=91=E4=B9=8B=E9=B1=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../peerbanhelper/config/MainConfigUpdateScript.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/ghostchu/peerbanhelper/config/MainConfigUpdateScript.java b/src/main/java/com/ghostchu/peerbanhelper/config/MainConfigUpdateScript.java index 63989565e..1a55bf169 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/config/MainConfigUpdateScript.java +++ b/src/main/java/com/ghostchu/peerbanhelper/config/MainConfigUpdateScript.java @@ -81,6 +81,11 @@ public void pushProvidersCleanup() { single.set("sendkey", sendKey); single.set("send-key", null); } + var chatId = single.get("chat-id"); + if (chatId != null) { + single.set("chatid", chatId); + single.set("chat-id", null); + } pushNotification.set(key, single); } conf.set("push-notification", pushNotification); From 064cf26737bdb50d656a1c920dc10f5d7f395a71 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sun, 29 Dec 2024 18:58:25 +0800 Subject: [PATCH 037/160] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20BTN=20=E7=9A=84=20?= =?UTF-8?q?ConfigResult?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ghostchu/peerbanhelper/btn/BtnNetwork.java | 7 +++++++ .../peerbanhelper/module/impl/rule/BtnNetworkOnline.java | 1 + 2 files changed, 8 insertions(+) diff --git a/src/main/java/com/ghostchu/peerbanhelper/btn/BtnNetwork.java b/src/main/java/com/ghostchu/peerbanhelper/btn/BtnNetwork.java index 231d1d908..cfb14379e 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/btn/BtnNetwork.java +++ b/src/main/java/com/ghostchu/peerbanhelper/btn/BtnNetwork.java @@ -42,6 +42,7 @@ public class BtnNetwork implements Reloadable { private final Map, BtnAbility> abilities = new HashMap<>(); private final ScriptEngine scriptEngine; private final AtomicBoolean configSuccess = new AtomicBoolean(false); + private String configResult; private boolean scriptExecute; @Getter private ScheduledExecutorService executeService = null; @@ -108,6 +109,7 @@ public void configBtnNetwork() { HttpResponse resp = HTTPUtil.retryableSend(httpClient, MutableRequest.GET(configUrl), HttpResponse.BodyHandlers.ofString()).join(); if (resp.statusCode() != 200) { log.error(tlUI(Lang.BTN_CONFIG_FAILS, resp.statusCode() + " - " + resp.body(), 600)); + configResult = "Unsuccessful HTTP request to " + configUrl + " with status code " + resp.statusCode()+": "+resp.body(); return; } statusCode = resp.statusCode(); @@ -118,10 +120,12 @@ public void configBtnNetwork() { } int min_protocol_version = json.get("min_protocol_version").getAsInt(); if (Main.PBH_BTN_PROTOCOL_IMPL_VERSION < min_protocol_version) { + configResult = "Incompatible protocol version: " + Main.PBH_BTN_PROTOCOL_IMPL_VERSION + " < " + min_protocol_version; throw new IllegalStateException(tlUI(Lang.BTN_INCOMPATIBLE_SERVER)); } int max_protocol_version = json.get("max_protocol_version").getAsInt(); if (Main.PBH_BTN_PROTOCOL_IMPL_VERSION > max_protocol_version) { + configResult = "Incompatible protocol version: " + Main.PBH_BTN_PROTOCOL_IMPL_VERSION + " > " + max_protocol_version; throw new IllegalStateException(tlUI(Lang.BTN_INCOMPATIBLE_SERVER)); } resetScheduler(); @@ -157,8 +161,11 @@ public void configBtnNetwork() { } }); configSuccess.set(true); + configResult = "Successfully configured"; } catch (Throwable e) { log.error(tlUI(Lang.BTN_CONFIG_FAILS, statusCode+" - "+response, 600), e); + configResult = "Failed to configure: "+e.getClass().getName()+": "+e.getMessage(); + configSuccess.set(false); } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java index e82c0e901..9f60d757c 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java @@ -103,6 +103,7 @@ private void status(Context context) { } info.put("configSuccess", btnNetwork.getConfigSuccess()); + info.put("configResult", btnNetwork.getConfigResult()); var abilities = new ArrayList<>(); for (Map.Entry, BtnAbility> entry : btnNetwork.getAbilities().entrySet()) { Map abilityStatus = new HashMap<>(); From 3e921a7a69ce81c6a18b8bb5e1a6ac657451e101 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Mon, 30 Dec 2024 00:11:56 +0800 Subject: [PATCH 038/160] =?UTF-8?q?=E6=98=AF=E5=90=A6=E6=8F=A1=E6=89=8B?= =?UTF-8?q?=E4=BA=A4=E7=BB=99=20Peer=20=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../peerbanhelper/downloader/impl/biglybt/BiglyBT.java | 3 ++- .../peerbanhelper/downloader/impl/bitcomet/BitComet.java | 3 ++- .../peerbanhelper/downloader/impl/deluge/DelugePeer.java | 5 +++++ .../impl/qbittorrent/impl/QBittorrentPeer.java | 5 +++++ .../qbittorrent/impl/enhanced/QBittorrentEEPeer.java | 5 +++++ .../downloader/impl/transmission/TRPeer.java | 5 +++++ .../peerbanhelper/module/AbstractRuleFeatureModule.java | 2 +- src/main/java/com/ghostchu/peerbanhelper/peer/Peer.java | 6 ++++++ .../java/com/ghostchu/peerbanhelper/peer/PeerImpl.java | 9 ++++++++- 9 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java index 16b4f2fc9..51e2bf8b9 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java @@ -255,7 +255,8 @@ public List getPeers(Torrent torrent) { peer.getStats().getTotalSent(), peer.getPercentDoneInThousandNotation() / 1000d, null, - supportedMessages + supportedMessages, + peer.getState() != 30 && peer.getState() != 40 )); } return peersList; diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/BitComet.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/BitComet.java index 589685503..5c8b5fdbe 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/BitComet.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/bitcomet/BitComet.java @@ -355,7 +355,8 @@ public List getPeers(Torrent torrent) { peer.getDlSize() != null ? peer.getDlSize() : -1, // 兼容 2.10 peer.getUpRate(), peer.getUpSize() != null ? peer.getUpSize() : -1, // 兼容 2.10 - peer.getPermillage() / 1000.0d, null, Collections.emptyList()) + peer.getPermillage() / 1000.0d, null, Collections.emptyList(), + peer.getDlRate() <= 0 && peer.getUpRate() <= 0) ).collect(Collectors.toList()); } catch (Exception e) { throw new IllegalStateException(e); diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/DelugePeer.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/DelugePeer.java index 126e90459..070ed120d 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/DelugePeer.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/DelugePeer.java @@ -28,6 +28,11 @@ public String getRawIp() { return peerAddress.getIp(); } + @Override + public boolean isHandshaking() { + return downloadSpeed <= 0 && uploadSpeed <= 0; + } + @Override public List getSupportedMessages() { return Collections.emptyList(); diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/QBittorrentPeer.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/QBittorrentPeer.java index 74f6ddb31..5db6f8554 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/QBittorrentPeer.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/QBittorrentPeer.java @@ -104,6 +104,11 @@ public PeerFlag getFlags() { return new PeerFlag(flags); } + @Override + public boolean isHandshaking() { + return upSpeed <= 0 && dlSpeed <= 0; + } + @Override public List getSupportedMessages() { return Collections.emptyList(); diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/enhanced/QBittorrentEEPeer.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/enhanced/QBittorrentEEPeer.java index a85d57135..1f64712c2 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/enhanced/QBittorrentEEPeer.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/impl/enhanced/QBittorrentEEPeer.java @@ -106,6 +106,11 @@ public PeerFlag getFlags() { return new PeerFlag(flags); } + @Override + public boolean isHandshaking() { + return dlSpeed <= 0 && upSpeed <= 0; + } + @Override public List getSupportedMessages() { return Collections.emptyList(); diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/TRPeer.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/TRPeer.java index ffcf3c295..95751d559 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/TRPeer.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/TRPeer.java @@ -66,6 +66,11 @@ public PeerFlag getFlags() { return new PeerFlag(backend.getFlagStr()); } + @Override + public boolean isHandshaking() { + return getDownloadSpeed() <= 0 && getUploadSpeed() <= 0; + } + @Override public List getSupportedMessages() { return Collections.emptyList(); diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/AbstractRuleFeatureModule.java b/src/main/java/com/ghostchu/peerbanhelper/module/AbstractRuleFeatureModule.java index bfa1fcd61..fccc4f951 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/AbstractRuleFeatureModule.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/AbstractRuleFeatureModule.java @@ -23,7 +23,7 @@ public abstract class AbstractRuleFeatureModule extends AbstractFeatureModule im public boolean isHandShaking(Peer peer) { // 跳过此 Peer,速度都是0,可能是没有完成握手 - return peer.getDownloadSpeed() <= 0 && peer.getUploadSpeed() <= 0; + return peer.isHandshaking(); } /** diff --git a/src/main/java/com/ghostchu/peerbanhelper/peer/Peer.java b/src/main/java/com/ghostchu/peerbanhelper/peer/Peer.java index cea6ec9c5..2aac62b51 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/peer/Peer.java +++ b/src/main/java/com/ghostchu/peerbanhelper/peer/Peer.java @@ -73,6 +73,12 @@ public interface Peer extends Comparable { @Nullable PeerFlag getFlags(); + /** + * 对等体是否连接中或者握手中(总之就是还没准备好传输数据) + * @return 是否连接中或者握手中 + */ + boolean isHandshaking(); + /** * 获取此 Peer 支持的消息集合,需要下载器支持 * 不支持的下载器此处将返回空集合 diff --git a/src/main/java/com/ghostchu/peerbanhelper/peer/PeerImpl.java b/src/main/java/com/ghostchu/peerbanhelper/peer/PeerImpl.java index 260a21600..898a42083 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/peer/PeerImpl.java +++ b/src/main/java/com/ghostchu/peerbanhelper/peer/PeerImpl.java @@ -18,8 +18,9 @@ public class PeerImpl implements Peer { private double progress; private PeerFlag flags; private List supportedMessages; + private boolean handshaking; - public PeerImpl(PeerAddress peerAddress, String rawIp, String peerId, String clientName, long downloadSpeed, long downloaded, long uploadSpeed, long uploaded, double progress, PeerFlag flags, List supportedMessages) { + public PeerImpl(PeerAddress peerAddress, String rawIp, String peerId, String clientName, long downloadSpeed, long downloaded, long uploadSpeed, long uploaded, double progress, PeerFlag flags, List supportedMessages, boolean handshaking) { this.peerAddress = peerAddress; this.rawIp = rawIp; this.peerId = peerId; @@ -31,6 +32,7 @@ public PeerImpl(PeerAddress peerAddress, String rawIp, String peerId, String cli this.progress = progress; this.flags = flags; this.supportedMessages = supportedMessages; + this.handshaking = handshaking; } @Override @@ -78,6 +80,11 @@ public PeerFlag getFlags() { return flags; } + @Override + public boolean isHandshaking() { + return handshaking; + } + @Override public String getRawIp() { return rawIp; From 6a1d5fa1441c88e731d3bb01b8e0554c5f7d4a0f Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Mon, 30 Dec 2024 00:43:56 +0800 Subject: [PATCH 039/160] Register PTRBlacklist module #834 --- .../java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java index 25c7d01d8..72d111813 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java +++ b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java @@ -680,6 +680,7 @@ private void registerModules() { moduleManager.register(BtnNetworkOnline.class); moduleManager.register(BlockListController.class); moduleManager.register(IPBlackRuleList.class); + moduleManager.register(PTRBlacklist.class); moduleManager.register(PBHMetricsController.class); moduleManager.register(PBHBanController.class); moduleManager.register(PBHMetadataController.class); @@ -699,6 +700,7 @@ private void registerModules() { moduleManager.register(PBHPushController.class); moduleManager.register(PBHLabController.class); moduleManager.register(PBHEasterEggController.class); + } public Map>> collectPeers() { From 1291ef497b7caec5ccccbea4b23789b423a37b88 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 29 Dec 2024 19:55:52 +0000 Subject: [PATCH 040/160] Update dependency @octokit/request-error to v6.1.6 (#835) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/pnpm-lock.yaml | 201 ++++++++++++++++++++++--------------------- 1 file changed, 104 insertions(+), 97 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index a8be45a7d..c13dd6b5b 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -30,7 +30,7 @@ importers: version: 6.1.2 '@octokit/request-error': specifier: ^6.1.5 - version: 6.1.5 + version: 6.1.6 '@vueuse/core': specifier: ^12.0.0 version: 12.0.0(typescript@5.6.3) @@ -406,145 +406,145 @@ packages: resolution: {integrity: sha512-XqVAi0O/KITtznpMK5TP4D+rWfwst5lrsbPbes5c5SPMGjwK7fuvlTdEmG2XUrxzYqDTIPshywyzdVYKooGdGA==} '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==, tarball: https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz} + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==, tarball: https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz} + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} engines: {node: '>=18'} cpu: [arm64] os: [android] '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==, tarball: https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz} + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} engines: {node: '>=18'} cpu: [arm] os: [android] '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==, tarball: https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz} + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} engines: {node: '>=18'} cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==, tarball: https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz} + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==, tarball: https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz} + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==, tarball: https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz} + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==, tarball: https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz} + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==, tarball: https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz} + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==, tarball: https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz} + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} engines: {node: '>=18'} cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==, tarball: https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz} + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==, tarball: https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz} + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} engines: {node: '>=18'} cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==, tarball: https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz} + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==, tarball: https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz} + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==, tarball: https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz} + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==, tarball: https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz} + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} engines: {node: '>=18'} cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==, tarball: https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz} + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} engines: {node: '>=18'} cpu: [x64] os: [linux] '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==, tarball: https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz} + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==, tarball: https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz} + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==, tarball: https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz} + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==, tarball: https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz} + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==, tarball: https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz} + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==, tarball: https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz} + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==, tarball: https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz} + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -664,15 +664,15 @@ packages: monaco-editor: '>= 0.21.0 < 1' '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, tarball: https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz} + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, tarball: https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz} + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, tarball: https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz} + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} '@octokit/auth-token@5.1.1': @@ -694,8 +694,8 @@ packages: '@octokit/openapi-types@22.2.0': resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} - '@octokit/request-error@6.1.5': - resolution: {integrity: sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==} + '@octokit/request-error@6.1.6': + resolution: {integrity: sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==} engines: {node: '>= 18'} '@octokit/request@9.1.1': @@ -705,6 +705,9 @@ packages: '@octokit/types@13.5.0': resolution: {integrity: sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==} + '@octokit/types@13.6.2': + resolution: {integrity: sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==} + '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} @@ -736,92 +739,92 @@ packages: optional: true '@rollup/rollup-android-arm-eabi@4.27.4': - resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==, tarball: https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz} + resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==} cpu: [arm] os: [android] '@rollup/rollup-android-arm64@4.27.4': - resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==, tarball: https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz} + resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==} cpu: [arm64] os: [android] '@rollup/rollup-darwin-arm64@4.27.4': - resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==, tarball: https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz} + resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==} cpu: [arm64] os: [darwin] '@rollup/rollup-darwin-x64@4.27.4': - resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==, tarball: https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz} + resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==} cpu: [x64] os: [darwin] '@rollup/rollup-freebsd-arm64@4.27.4': - resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==, tarball: https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz} + resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==} cpu: [arm64] os: [freebsd] '@rollup/rollup-freebsd-x64@4.27.4': - resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==, tarball: https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz} + resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==} cpu: [x64] os: [freebsd] '@rollup/rollup-linux-arm-gnueabihf@4.27.4': - resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz} + resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} cpu: [arm] os: [linux] '@rollup/rollup-linux-arm-musleabihf@4.27.4': - resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz} + resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} cpu: [arm] os: [linux] '@rollup/rollup-linux-arm64-gnu@4.27.4': - resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz} + resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} cpu: [arm64] os: [linux] '@rollup/rollup-linux-arm64-musl@4.27.4': - resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz} + resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} cpu: [arm64] os: [linux] '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': - resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz} + resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} cpu: [ppc64] os: [linux] '@rollup/rollup-linux-riscv64-gnu@4.27.4': - resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz} + resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} cpu: [riscv64] os: [linux] '@rollup/rollup-linux-s390x-gnu@4.27.4': - resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz} + resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} cpu: [s390x] os: [linux] '@rollup/rollup-linux-x64-gnu@4.27.4': - resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz} + resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} cpu: [x64] os: [linux] '@rollup/rollup-linux-x64-musl@4.27.4': - resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz} + resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} cpu: [x64] os: [linux] '@rollup/rollup-win32-arm64-msvc@4.27.4': - resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==, tarball: https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz} + resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} cpu: [arm64] os: [win32] '@rollup/rollup-win32-ia32-msvc@4.27.4': - resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==, tarball: https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz} + resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==} cpu: [ia32] os: [win32] '@rollup/rollup-win32-x64-msvc@4.27.4': - resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==, tarball: https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz} + resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==} cpu: [x64] os: [win32] @@ -875,7 +878,7 @@ packages: resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} '@typescript-eslint/eslint-plugin@8.17.0': - resolution: {integrity: sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==, tarball: https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.17.0.tgz} + resolution: {integrity: sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -886,7 +889,7 @@ packages: optional: true '@typescript-eslint/parser@8.17.0': - resolution: {integrity: sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.17.0.tgz} + resolution: {integrity: sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -896,11 +899,11 @@ packages: optional: true '@typescript-eslint/scope-manager@8.17.0': - resolution: {integrity: sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==, tarball: https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz} + resolution: {integrity: sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/type-utils@8.17.0': - resolution: {integrity: sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==, tarball: https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz} + resolution: {integrity: sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -910,11 +913,11 @@ packages: optional: true '@typescript-eslint/types@8.17.0': - resolution: {integrity: sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==, tarball: https://registry.npmjs.org/@typescript-eslint/types/-/types-8.17.0.tgz} + resolution: {integrity: sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.17.0': - resolution: {integrity: sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz} + resolution: {integrity: sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -923,7 +926,7 @@ packages: optional: true '@typescript-eslint/utils@8.17.0': - resolution: {integrity: sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==, tarball: https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.17.0.tgz} + resolution: {integrity: sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -933,7 +936,7 @@ packages: optional: true '@typescript-eslint/visitor-keys@8.17.0': - resolution: {integrity: sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==, tarball: https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz} + resolution: {integrity: sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitejs/plugin-vue@5.2.1': @@ -1089,7 +1092,7 @@ packages: engines: {node: '>=16'} anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, tarball: https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz} + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} argparse@2.0.1: @@ -1121,7 +1124,7 @@ packages: resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, tarball: https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz} + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} birpc@0.2.19: @@ -1143,7 +1146,7 @@ packages: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, tarball: https://registry.npmjs.org/braces/-/braces-3.0.3.tgz} + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} brorand@1.1.0: @@ -1209,7 +1212,7 @@ packages: engines: {node: '>=10'} chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, tarball: https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz} + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} cipher-base@1.0.4: @@ -1375,7 +1378,7 @@ packages: engines: {node: '>=0.12'} errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==, tarball: https://registry.npmjs.org/errno/-/errno-0.1.8.tgz} + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true error-stack-parser-es@0.1.5: @@ -1390,7 +1393,7 @@ packages: engines: {node: '>= 0.4'} esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==, tarball: https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz} + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} engines: {node: '>=18'} hasBin: true @@ -1486,7 +1489,7 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, tarball: https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz} + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -1496,7 +1499,7 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, tarball: https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz} + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} figures@6.1.0: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} @@ -1507,7 +1510,7 @@ packages: engines: {node: '>=16.0.0'} fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, tarball: https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz} + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} find-up@5.0.0: @@ -1529,7 +1532,7 @@ packages: engines: {node: '>=14.14'} fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz} + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -1553,7 +1556,7 @@ packages: engines: {node: '>=18'} glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, tarball: https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz} + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} glob-parent@6.0.2: @@ -1576,10 +1579,10 @@ packages: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, tarball: https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz} + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, tarball: https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz} + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -1657,12 +1660,12 @@ packages: engines: {node: '>= 4'} image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==, tarball: https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz} + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} engines: {node: '>=0.10.0'} hasBin: true immutable@4.3.7: - resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==, tarball: https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz} + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -1687,7 +1690,7 @@ packages: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, tarball: https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz} + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} is-callable@1.2.7: @@ -1732,7 +1735,7 @@ packages: engines: {node: '>= 0.4'} is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, tarball: https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz} + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} is-plain-obj@4.1.0: @@ -1860,7 +1863,7 @@ packages: engines: {node: '>=12'} make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, tarball: https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz} + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} markdown-it@14.1.0: @@ -1878,11 +1881,11 @@ packages: engines: {node: '>= 0.10.0'} merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, tarball: https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz} + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, tarball: https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz} + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} miller-rabin@4.0.1: @@ -1890,7 +1893,7 @@ packages: hasBin: true mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, tarball: https://registry.npmjs.org/mime/-/mime-1.6.0.tgz} + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true @@ -1940,7 +1943,7 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==, tarball: https://registry.npmjs.org/needle/-/needle-3.3.1.tgz} + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} engines: {node: '>= 4.4.x'} hasBin: true @@ -1952,7 +1955,7 @@ packages: engines: {node: '>=10'} normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, tarball: https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz} + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} normalize.css@8.0.1: @@ -2079,7 +2082,7 @@ packages: engines: {node: '>=6'} pinia@2.3.0: - resolution: {integrity: sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==, tarball: https://registry.npmjs.org/pinia/-/pinia-2.3.0.tgz} + resolution: {integrity: sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==} peerDependencies: typescript: '>=4.4.4' vue: ^2.7.0 || ^3.5.11 @@ -2108,7 +2111,7 @@ packages: engines: {node: '>= 0.8.0'} prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==, tarball: https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz} + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} engines: {node: '>=14'} hasBin: true @@ -2149,7 +2152,7 @@ packages: engines: {node: '>=0.4.x'} queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, tarball: https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz} + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -2169,7 +2172,7 @@ packages: engines: {node: '>= 6'} readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, tarball: https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz} + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} resize-observer-polyfill@1.5.1: @@ -2184,7 +2187,7 @@ packages: hasBin: true reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, tarball: https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz} + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rfdc@1.4.1: @@ -2194,7 +2197,7 @@ packages: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} rollup@4.27.4: - resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==, tarball: https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz} + resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2203,7 +2206,7 @@ packages: engines: {node: '>=18'} run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, tarball: https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz} + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -2215,7 +2218,7 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} sass@1.77.8: - resolution: {integrity: sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==, tarball: https://registry.npmjs.org/sass/-/sass-1.77.8.tgz} + resolution: {integrity: sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==} engines: {node: '>=14.0.0'} hasBin: true @@ -2285,7 +2288,7 @@ packages: engines: {node: '>=0.10.0'} source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, tarball: https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz} + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} speakingurl@14.0.1: @@ -2351,7 +2354,7 @@ packages: engines: {node: '>=4'} to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, tarball: https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz} + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} toggle-selection@1.0.6: @@ -2362,7 +2365,7 @@ packages: engines: {node: '>=6'} ts-api-utils@1.4.1: - resolution: {integrity: sha512-5RU2/lxTA3YUZxju61HO2U6EoZLvBLtmV2mbTvqyu4a/7s7RmJPT+1YekhMVsQhznRWk/czIwDUg+V8Q9ZuG4w==, tarball: https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.1.tgz} + resolution: {integrity: sha512-5RU2/lxTA3YUZxju61HO2U6EoZLvBLtmV2mbTvqyu4a/7s7RmJPT+1YekhMVsQhznRWk/czIwDUg+V8Q9ZuG4w==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -2385,7 +2388,7 @@ packages: engines: {node: '>=10'} typescript-eslint@8.17.0: - resolution: {integrity: sha512-409VXvFd/f1br1DCbuKNFqQpXICoTB+V51afcwG1pn1a3Cp92MqAUges3YjwEdQ0cMUoCIodjVDAYzyD8h3SYA==, tarball: https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.17.0.tgz} + resolution: {integrity: sha512-409VXvFd/f1br1DCbuKNFqQpXICoTB+V51afcwG1pn1a3Cp92MqAUges3YjwEdQ0cMUoCIodjVDAYzyD8h3SYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2481,7 +2484,7 @@ packages: vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 vite@6.0.3: - resolution: {integrity: sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==, tarball: https://registry.npmjs.org/vite/-/vite-6.0.3.tgz} + resolution: {integrity: sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -2538,7 +2541,7 @@ packages: optional: true vue-demi@0.14.10: - resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==, tarball: https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz} + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} engines: {node: '>=12'} hasBin: true peerDependencies: @@ -3151,7 +3154,7 @@ snapshots: '@octokit/auth-token': 5.1.1 '@octokit/graphql': 8.1.1 '@octokit/request': 9.1.1 - '@octokit/request-error': 6.1.5 + '@octokit/request-error': 6.1.6 '@octokit/types': 13.5.0 before-after-hook: 3.0.2 universal-user-agent: 7.0.2 @@ -3169,14 +3172,14 @@ snapshots: '@octokit/openapi-types@22.2.0': {} - '@octokit/request-error@6.1.5': + '@octokit/request-error@6.1.6': dependencies: - '@octokit/types': 13.5.0 + '@octokit/types': 13.6.2 '@octokit/request@9.1.1': dependencies: '@octokit/endpoint': 10.1.1 - '@octokit/request-error': 6.1.5 + '@octokit/request-error': 6.1.6 '@octokit/types': 13.5.0 universal-user-agent: 7.0.2 @@ -3184,6 +3187,10 @@ snapshots: dependencies: '@octokit/openapi-types': 22.2.0 + '@octokit/types@13.6.2': + dependencies: + '@octokit/openapi-types': 22.2.0 + '@polka/url@1.0.0-next.28': {} '@rollup/plugin-inject@5.0.5(rollup@4.27.4)': From 7d18ca9c60bfb1af15669482a5e2ad23c2ea0be0 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Mon, 30 Dec 2024 13:27:25 +0800 Subject: [PATCH 041/160] =?UTF-8?q?=E5=9B=BE=E6=A0=87=E5=B9=B2=E6=8E=89?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=88=B7=E6=96=B0=20fix=20#829?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/router/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webui/src/router/index.ts b/webui/src/router/index.ts index 45600787c..e99f4baed 100644 --- a/webui/src/router/index.ts +++ b/webui/src/router/index.ts @@ -178,7 +178,8 @@ export const routerOptions: RouteRecordRaw[] = [ name: 'charts', meta: { label: 'router.metrics.charts', - needLogin: true + needLogin: true, + disableAutoUpdate: true }, component: () => import('@/views/charts/index.vue') }, From cef6880af94ef17c7435accd313d4f291e93a65f Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Mon, 30 Dec 2024 13:39:37 +0800 Subject: [PATCH 042/160] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=80=92=E8=AE=A1?= =?UTF-8?q?=E6=97=B6=E5=8F=AF=E8=83=BD=E4=B8=BA=E7=A9=BA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/components/plus/plusTryModal.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/webui/src/components/plus/plusTryModal.vue b/webui/src/components/plus/plusTryModal.vue index de914dde4..45298b658 100644 --- a/webui/src/components/plus/plusTryModal.vue +++ b/webui/src/components/plus/plusTryModal.vue @@ -74,5 +74,9 @@ const handleOk = async () => { } const handleCancel = () => { visible.value = false + if (timer.value) { + clearInterval(timer.value) + timer.value = null + } } From 6c8d371b0f7cc6372122a4287cefca74eaa830f8 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Mon, 30 Dec 2024 14:09:03 +0800 Subject: [PATCH 043/160] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=BB=9A=E5=8A=A8=20?= =?UTF-8?q?=20fix=20#847?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/stores/endpoint.ts | 2 +- .../components/info/components/logViewer.vue | 59 ++++++++++--------- webui/vite.config.ts | 3 +- 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/webui/src/stores/endpoint.ts b/webui/src/stores/endpoint.ts index b740f02ef..b216494fc 100644 --- a/webui/src/stores/endpoint.ts +++ b/webui/src/stores/endpoint.ts @@ -147,7 +147,7 @@ export const useEndpointStore = defineStore('endpoint', () => { const getPlusStatus = async () => { const result = await getPBHPlusStatus() plusStatus.value = result.data - if (result.data.activated) { + if (result?.data?.activated) { console.log('PBH Plus Activated! Thanks for your support ❤️') } } diff --git a/webui/src/views/settings/components/info/components/logViewer.vue b/webui/src/views/settings/components/info/components/logViewer.vue index bf1326db2..667233500 100644 --- a/webui/src/views/settings/components/info/components/logViewer.vue +++ b/webui/src/views/settings/components/info/components/logViewer.vue @@ -14,20 +14,7 @@ - - - - + + + + ([]) -const logBuffer = reactive([] as Log[]) +const threadList = computed((): SelectOptionData[] => + Array.from(modules.value).map((it) => ({ + value: it, + tagProps: { color: getThreadColor(it) } + })) +) +const modules = ref(new Set()) +const logBuffer = ref([] as Log[]) useRequest(GetHistoryLogs, { onSuccess: (data) => { - logBuffer.splice(0, logBuffer.length) - logBuffer.push(...data.data) + logBuffer.value.splice(0, logBuffer.value.length) + logBuffer.value.push(...data.data) loading.value = false // calculate modules - const modules = new Set() - data.data.forEach((log) => modules.add(log.thread)) - threadList.value = Array.from(modules).map((it) => ({ - value: it, - tagProps: { color: getThreadColor(it) } - })) + data.data.forEach((log) => modules.value.add(log.thread)) } }) const list = computed(() => - logBuffer + logBuffer.value .filter((log) => options.showLevel[log.level]) .filter((log) => !options.hideThreads.includes(log.thread)) ) @@ -139,13 +139,14 @@ const changeAutoRefresh = async (enable: boolean | string | number) => { if (enable) { console.log('open auto refresh') return ws.open( - logBuffer.length > 0 ? logBuffer[logBuffer.length - 1].offset : 0, + logBuffer.value.length > 0 ? logBuffer.value[logBuffer.value.length - 1].offset : 0, (newLog) => { - logBuffer.push(newLog) - console.log('scroll to', logBuffer.length - 1) + logBuffer.value.push(newLog) + modules.value.add(newLog.thread) + console.log('scroll to', logBuffer.value.length - 1) if (options.autoScroll) { logList.value?.scrollIntoView({ - index: logBuffer.length - 1, + index: logBuffer.value.length - 1, align: 'bottom' } as ScrollIntoViewOptions) } diff --git a/webui/vite.config.ts b/webui/vite.config.ts index 8550b4d34..791d0aa0a 100644 --- a/webui/vite.config.ts +++ b/webui/vite.config.ts @@ -13,6 +13,7 @@ import VueDevTools from 'vite-plugin-vue-devtools' const exec = promisify(execCallBack) const isAnalyze = process.env.ANALYZE === 'true' +const isProduction = process.env.NODE_ENV === 'production' // https://vitejs.dev/config/ export default defineConfig({ base: '', @@ -24,7 +25,7 @@ export default defineConfig({ }), nodePolyfills({ include: ['path'] }), ...(isAnalyze ? [analyzer()] : []), - removeConsole() + ...(isProduction ? [removeConsole()] : []) ], define: { __APP_VERSION__: JSON.stringify(process.env.npm_package_version), From ecced7627418efa9de6fa9dd5398ce0d481c2be2 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Mon, 30 Dec 2024 14:12:19 +0800 Subject: [PATCH 044/160] fixed size --- .../views/settings/components/info/components/logViewer.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/webui/src/views/settings/components/info/components/logViewer.vue b/webui/src/views/settings/components/info/components/logViewer.vue index 667233500..2641281ea 100644 --- a/webui/src/views/settings/components/info/components/logViewer.vue +++ b/webui/src/views/settings/components/info/components/logViewer.vue @@ -47,8 +47,7 @@ scrollbar :virtual-list-props="{ height: 650, - buffer: 50, - fixedSize: true + buffer: 50 }" :data="list" > From f6c79bcd17aabe27b331f6c1e7d7964c4b1c0c0e Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Mon, 30 Dec 2024 14:23:38 +0800 Subject: [PATCH 045/160] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=80=E4=B8=8B?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E9=81=BF=E5=85=8D=E5=87=BA=E7=8E=B0=E6=BB=9A?= =?UTF-8?q?=E5=8A=A8=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/views/data-view/ipList/index.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webui/src/views/data-view/ipList/index.vue b/webui/src/views/data-view/ipList/index.vue index 49d878926..bab4e625f 100644 --- a/webui/src/views/data-view/ipList/index.vue +++ b/webui/src/views/data-view/ipList/index.vue @@ -278,8 +278,8 @@ onMounted(() => { justify-content: center; } .searchBox { - transform: scale(2); - width: 400px; + transform: scale(1.5); + width: 30rem; } .result-container { margin-top: 1em; From 0f06875f595fd4467b7fb30d9d2e9982e6f841c5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Dec 2024 08:32:55 +0000 Subject: [PATCH 046/160] Update dependency @formatjs/intl-durationformat to ^0.7.0 --- webui/package.json | 2 +- webui/pnpm-lock.yaml | 42 ++++++++++++++++++++++++------------------ 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/webui/package.json b/webui/package.json index 2618f3e23..102cc14a9 100644 --- a/webui/package.json +++ b/webui/package.json @@ -17,7 +17,7 @@ "dependencies": { "@arco-design/web-vue": "^2.56.3", "@dzangolab/flag-icon-css": "^3.4.5", - "@formatjs/intl-durationformat": "^0.6.4", + "@formatjs/intl-durationformat": "^0.7.0", "@guolao/vue-monaco-editor": "^1.5.4", "@octokit/core": "^6.1.2", "@octokit/request-error": "^6.1.5", diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index c13dd6b5b..4b02a4400 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -20,8 +20,8 @@ importers: specifier: ^3.4.5 version: 3.4.5 '@formatjs/intl-durationformat': - specifier: ^0.6.4 - version: 0.6.4 + specifier: ^0.7.0 + version: 0.7.1 '@guolao/vue-monaco-editor': specifier: ^1.5.4 version: 1.5.4(monaco-editor@0.52.0)(vue@3.5.13(typescript@5.6.3)) @@ -583,17 +583,17 @@ packages: resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@formatjs/ecma402-abstract@2.2.4': - resolution: {integrity: sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==} + '@formatjs/ecma402-abstract@2.3.1': + resolution: {integrity: sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw==} - '@formatjs/fast-memoize@2.2.3': - resolution: {integrity: sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==} + '@formatjs/fast-memoize@2.2.5': + resolution: {integrity: sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g==} - '@formatjs/intl-durationformat@0.6.4': - resolution: {integrity: sha512-kpYLechF9ZvECzzMsvikBl48GkbCEAbZJN4kG/4x0FTVZkBuOWrBlj6DghCn7YsW3Bgsr0n9E0RYO373Kg3m+Q==} + '@formatjs/intl-durationformat@0.7.1': + resolution: {integrity: sha512-tM/sscHRcVMVAn0qMJlmq5mf3MaqA0jSz73NT4SYBHZuZqfU0EKWjJCwZBYeNRfvO6y20Yo0RzGxom0KvSVUlA==} - '@formatjs/intl-localematcher@0.5.8': - resolution: {integrity: sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==} + '@formatjs/intl-localematcher@0.5.9': + resolution: {integrity: sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==} '@guolao/vue-monaco-editor@1.5.4': resolution: {integrity: sha512-eyBAqxJeDpV4mZYZSpNvh3xUgKCld5eEe0dBtjJhsy2+L0MB6PYFZ/FbPHNwskgp2RoIpfn1DLrIhXXE3lVbwQ==} @@ -1331,6 +1331,9 @@ packages: supports-color: optional: true + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -3059,23 +3062,24 @@ snapshots: dependencies: levn: 0.4.1 - '@formatjs/ecma402-abstract@2.2.4': + '@formatjs/ecma402-abstract@2.3.1': dependencies: - '@formatjs/fast-memoize': 2.2.3 - '@formatjs/intl-localematcher': 0.5.8 + '@formatjs/fast-memoize': 2.2.5 + '@formatjs/intl-localematcher': 0.5.9 + decimal.js: 10.4.3 tslib: 2.8.1 - '@formatjs/fast-memoize@2.2.3': + '@formatjs/fast-memoize@2.2.5': dependencies: tslib: 2.8.1 - '@formatjs/intl-durationformat@0.6.4': + '@formatjs/intl-durationformat@0.7.1': dependencies: - '@formatjs/ecma402-abstract': 2.2.4 - '@formatjs/intl-localematcher': 0.5.8 + '@formatjs/ecma402-abstract': 2.3.1 + '@formatjs/intl-localematcher': 0.5.9 tslib: 2.8.1 - '@formatjs/intl-localematcher@0.5.8': + '@formatjs/intl-localematcher@0.5.9': dependencies: tslib: 2.8.1 @@ -3903,6 +3907,8 @@ snapshots: dependencies: ms: 2.1.3 + decimal.js@10.4.3: {} + deep-is@0.1.4: {} default-browser-id@5.0.0: {} From 2eedef5c5dce272187213d80121479433275e413 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Dec 2024 08:33:07 +0000 Subject: [PATCH 047/160] Update dependency @vueuse/core to v12.2.0 --- webui/pnpm-lock.yaml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index c13dd6b5b..ccdbb46ca 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -33,7 +33,7 @@ importers: version: 6.1.6 '@vueuse/core': specifier: ^12.0.0 - version: 12.0.0(typescript@5.6.3) + version: 12.2.0(typescript@5.6.3) antlr4: specifier: ^4.13.2 version: 4.13.2 @@ -1045,14 +1045,14 @@ packages: vue: optional: true - '@vueuse/core@12.0.0': - resolution: {integrity: sha512-C12RukhXiJCbx4MGhjmd/gH52TjJsc3G0E0kQj/kb19H3Nt6n1CA4DRWuTdWWcaFRdlTe0npWDS942mvacvNBw==} + '@vueuse/core@12.2.0': + resolution: {integrity: sha512-jksyNu+5EGwggNkRWd6xX+8qBkYbmrwdFQMgCABsz+wq8bKF6w3soPFLB8vocFp3wFIzn0OYkSPM9JP+AFKwsg==} - '@vueuse/metadata@12.0.0': - resolution: {integrity: sha512-Yzimd1D3sjxTDOlF05HekU5aSGdKjxhuhRFHA7gDWLn57PRbBIh+SF5NmjhJ0WRgF3my7T8LBucyxdFJjIfRJQ==} + '@vueuse/metadata@12.2.0': + resolution: {integrity: sha512-x6zynZtTh1l52m0y8d/EgzpshnMjg8cNZ2KWoncJ62Z5qPSGoc4FUunmMVrrRM/I/5542rTEY89CGftngZvrkQ==} - '@vueuse/shared@12.0.0': - resolution: {integrity: sha512-3i6qtcq2PIio5i/vVYidkkcgvmTjCqrf26u+Fd4LhnbBmIT6FN8y6q/GJERp8lfcB9zVEfjdV0Br0443qZuJpw==} + '@vueuse/shared@12.2.0': + resolution: {integrity: sha512-SRr4AZwv/giS+EmyA1ZIzn3/iALjjnWAGaBNmoDTMEob9JwQaevAocuaMDnPAvU7Z35Y5g3CFRusCWgp1gVJ3Q==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -3562,18 +3562,18 @@ snapshots: typescript: 5.6.3 vue: 3.5.13(typescript@5.6.3) - '@vueuse/core@12.0.0(typescript@5.6.3)': + '@vueuse/core@12.2.0(typescript@5.6.3)': dependencies: '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 12.0.0 - '@vueuse/shared': 12.0.0(typescript@5.6.3) + '@vueuse/metadata': 12.2.0 + '@vueuse/shared': 12.2.0(typescript@5.6.3) vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - typescript - '@vueuse/metadata@12.0.0': {} + '@vueuse/metadata@12.2.0': {} - '@vueuse/shared@12.0.0(typescript@5.6.3)': + '@vueuse/shared@12.2.0(typescript@5.6.3)': dependencies: vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: From e249c947f133e555428ed4b98553928f56eac9e6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Dec 2024 08:33:18 +0000 Subject: [PATCH 048/160] Update dependency echarts to v5.6.0 --- webui/pnpm-lock.yaml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index c13dd6b5b..e57ea48ad 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -48,7 +48,7 @@ importers: version: 1.11.13 echarts: specifier: ^5.5.1 - version: 5.5.1 + version: 5.6.0 is-in-subnet: specifier: ^4.0.1 version: 4.0.1 @@ -81,7 +81,7 @@ importers: version: 3.5.13(typescript@5.6.3) vue-echarts: specifier: ^7.0.3 - version: 7.0.3(@vue/runtime-core@3.5.13)(echarts@5.5.1)(vue@3.5.13(typescript@5.6.3)) + version: 7.0.3(@vue/runtime-core@3.5.13)(echarts@5.6.0)(vue@3.5.13(typescript@5.6.3)) vue-i18n: specifier: ^10.0.5 version: 10.0.5(vue@3.5.13(typescript@5.6.3)) @@ -1364,8 +1364,8 @@ packages: resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==} engines: {node: '>=10'} - echarts@5.5.1: - resolution: {integrity: sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==} + echarts@5.6.0: + resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} electron-to-chromium@1.5.66: resolution: {integrity: sha512-pI2QF6+i+zjPbqRzJwkMvtvkdI7MjVbSh2g8dlMguDJIXEPw+kwasS1Jl+YGPEBfGVxsVgGUratAKymPdPo2vQ==} @@ -2639,8 +2639,8 @@ packages: resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} engines: {node: '>=18'} - zrender@5.6.0: - resolution: {integrity: sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==} + zrender@5.6.1: + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} snapshots: @@ -3939,10 +3939,10 @@ snapshots: domain-browser@4.23.0: {} - echarts@5.5.1: + echarts@5.6.0: dependencies: tslib: 2.3.0 - zrender: 5.6.0 + zrender: 5.6.1 electron-to-chromium@1.5.66: {} @@ -5136,9 +5136,9 @@ snapshots: dependencies: vue: 3.5.13(typescript@5.6.3) - vue-echarts@7.0.3(@vue/runtime-core@3.5.13)(echarts@5.5.1)(vue@3.5.13(typescript@5.6.3)): + vue-echarts@7.0.3(@vue/runtime-core@3.5.13)(echarts@5.6.0)(vue@3.5.13(typescript@5.6.3)): dependencies: - echarts: 5.5.1 + echarts: 5.6.0 vue: 3.5.13(typescript@5.6.3) vue-demi: 0.13.11(vue@3.5.13(typescript@5.6.3)) optionalDependencies: @@ -5221,6 +5221,6 @@ snapshots: yoctocolors@2.1.1: {} - zrender@5.6.0: + zrender@5.6.1: dependencies: tslib: 2.3.0 From 6cb22698f61b5a3d60dfee1658a31fa8d1deb12e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Dec 2024 08:33:30 +0000 Subject: [PATCH 049/160] Update dependency vue-i18n to v11 --- webui/package.json | 2 +- webui/pnpm-lock.yaml | 38 +++++++++++++++++++------------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/webui/package.json b/webui/package.json index 2618f3e23..03eeecabf 100644 --- a/webui/package.json +++ b/webui/package.json @@ -38,7 +38,7 @@ "uuid": "^11.0.3", "vue": "^3.5.13", "vue-echarts": "^7.0.3", - "vue-i18n": "^10.0.5", + "vue-i18n": "^11.0.0", "vue-request": "^2.0.4", "vue-router": "^4.5.0" }, diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index c13dd6b5b..a4ccd23bc 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -83,8 +83,8 @@ importers: specifier: ^7.0.3 version: 7.0.3(@vue/runtime-core@3.5.13)(echarts@5.5.1)(vue@3.5.13(typescript@5.6.3)) vue-i18n: - specifier: ^10.0.5 - version: 10.0.5(vue@3.5.13(typescript@5.6.3)) + specifier: ^11.0.0 + version: 11.0.1(vue@3.5.13(typescript@5.6.3)) vue-request: specifier: ^2.0.4 version: 2.0.4(patch_hash=imva7qnbqmkxs76or73cwn5jom)(vue@3.5.13(typescript@5.6.3)) @@ -625,16 +625,16 @@ packages: resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} engines: {node: '>=18.18'} - '@intlify/core-base@10.0.5': - resolution: {integrity: sha512-F3snDTQs0MdvnnyzTDTVkOYVAZOE/MHwRvF7mn7Jw1yuih4NrFYLNYIymGlLmq4HU2iIdzYsZ7f47bOcwY73XQ==} + '@intlify/core-base@11.0.1': + resolution: {integrity: sha512-NAmhw1l/llM0HZRpagR/ChJTNymW4ll6/4EDSJML5c8L5Hl/+k6UyF8EIgE6DeHpfheQujkSRngauViHqq6jJQ==} engines: {node: '>= 16'} - '@intlify/message-compiler@10.0.5': - resolution: {integrity: sha512-6GT1BJ852gZ0gItNZN2krX5QAmea+cmdjMvsWohArAZ3GmHdnNANEcF9JjPXAMRtQ6Ux5E269ymamg/+WU6tQA==} + '@intlify/message-compiler@11.0.1': + resolution: {integrity: sha512-5RFH8x+Mn3mbjcHXnb6KCXGiczBdiQkWkv99iiA0JpKrNuTAQeW59Pjq/uObMB0eR0shnKYGTkIJxum+DbL3sw==} engines: {node: '>= 16'} - '@intlify/shared@10.0.5': - resolution: {integrity: sha512-bmsP4L2HqBF6i6uaMqJMcFBONVjKt+siGluRq4Ca4C0q7W2eMaVZr8iCgF9dKbcVXutftkC7D6z2SaSMmLiDyA==} + '@intlify/shared@11.0.1': + resolution: {integrity: sha512-lH164+aDDptHZ3dBDbIhRa1dOPQUp+83iugpc+1upTOWCnwyC1PVis6rSWNMMJ8VQxvtHQB9JMib48K55y0PvQ==} engines: {node: '>= 16'} '@jridgewell/gen-mapping@0.3.5': @@ -2567,8 +2567,8 @@ packages: peerDependencies: eslint: '>=6.0.0' - vue-i18n@10.0.5: - resolution: {integrity: sha512-9/gmDlCblz3i8ypu/afiIc/SUIfTTE1mr0mZhb9pk70xo2csHAM9mp2gdQ3KD2O0AM3Hz/5ypb+FycTj/lHlPQ==} + vue-i18n@11.0.1: + resolution: {integrity: sha512-pWAT8CusK8q9/EpN7V3oxwHwxWm6+Kp2PeTZmRGvdZTkUzMQDpbbmHp0TwQ8xw04XKm23cr6B4GL72y3W8Yekg==} engines: {node: '>= 16'} peerDependencies: vue: ^3.0.0 @@ -3099,17 +3099,17 @@ snapshots: '@humanwhocodes/retry@0.4.1': {} - '@intlify/core-base@10.0.5': + '@intlify/core-base@11.0.1': dependencies: - '@intlify/message-compiler': 10.0.5 - '@intlify/shared': 10.0.5 + '@intlify/message-compiler': 11.0.1 + '@intlify/shared': 11.0.1 - '@intlify/message-compiler@10.0.5': + '@intlify/message-compiler@11.0.1': dependencies: - '@intlify/shared': 10.0.5 + '@intlify/shared': 11.0.1 source-map-js: 1.2.1 - '@intlify/shared@10.0.5': {} + '@intlify/shared@11.0.1': {} '@jridgewell/gen-mapping@0.3.5': dependencies: @@ -5159,10 +5159,10 @@ snapshots: transitivePeerDependencies: - supports-color - vue-i18n@10.0.5(vue@3.5.13(typescript@5.6.3)): + vue-i18n@11.0.1(vue@3.5.13(typescript@5.6.3)): dependencies: - '@intlify/core-base': 10.0.5 - '@intlify/shared': 10.0.5 + '@intlify/core-base': 11.0.1 + '@intlify/shared': 11.0.1 '@vue/devtools-api': 6.6.4 vue: 3.5.13(typescript@5.6.3) From d18779a8e384312d3568f5a9b9e7fa9dc5564204 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Mon, 30 Dec 2024 17:00:32 +0800 Subject: [PATCH 050/160] upgrade desp --- webui/package.json | 26 +- webui/pnpm-lock.yaml | 949 +++++++++++++++++++++++-------------------- 2 files changed, 519 insertions(+), 456 deletions(-) diff --git a/webui/package.json b/webui/package.json index 0628d6fcf..cd0f65969 100644 --- a/webui/package.json +++ b/webui/package.json @@ -17,16 +17,16 @@ "dependencies": { "@arco-design/web-vue": "^2.56.3", "@dzangolab/flag-icon-css": "^3.4.5", - "@formatjs/intl-durationformat": "^0.7.0", + "@formatjs/intl-durationformat": "^0.7.1", "@guolao/vue-monaco-editor": "^1.5.4", "@octokit/core": "^6.1.2", - "@octokit/request-error": "^6.1.5", - "@vueuse/core": "^12.0.0", + "@octokit/request-error": "^6.1.6", + "@vueuse/core": "^12.2.0", "antlr4": "^4.13.2", "compare-versions": "^6.1.1", "copy-to-clipboard": "^3.3.3", "dayjs": "^1.11.13", - "echarts": "^5.5.1", + "echarts": "^5.6.0", "is-in-subnet": "^4.0.1", "is-ip": "^5.0.1", "lodash": "^4.17.21", @@ -38,38 +38,38 @@ "uuid": "^11.0.3", "vue": "^3.5.13", "vue-echarts": "^7.0.3", - "vue-i18n": "^11.0.0", + "vue-i18n": "^11.0.1", "vue-request": "^2.0.4", "vue-router": "^4.5.0" }, "devDependencies": { "@arco-plugins/vite-vue": "^1.4.5", - "@eslint/js": "^9.16.0", + "@eslint/js": "^9.17.0", "@rushstack/eslint-patch": "^1.10.4", "@tsconfig/node20": "^20.1.4", "@types/eslint__js": "^8.42.3", "@types/lodash": "^4.17.13", "@types/markdown-it": "^14.1.2", - "@types/node": "^22.10.1", + "@types/node": "^22.10.2", "@types/uuid": "^10.0.0", - "@typescript-eslint/parser": "^8.17.0", + "@typescript-eslint/parser": "^8.18.2", "@vitejs/plugin-vue": "^5.2.1", "@vue/tsconfig": "^0.7.0", - "eslint": "9.16.0", + "eslint": "9.17.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-vue": "^9.32.0", "husky": "^9.1.7", "less": "^4.2.1", - "monaco-editor": "^0.52.0", - "npm-run-all2": "^7.0.1", + "monaco-editor": "^0.52.2", + "npm-run-all2": "^7.0.2", "prettier": "^3.4.2", "typescript": "~5.6.3", "typescript-eslint": "^8.17.0", - "vite": "^6.0.3", + "vite": "^6.0.6", "vite-bundle-analyzer": "^0.15.2", "vite-plugin-node-polyfills": "^0.22.0", "vite-plugin-remove-console": "^2.2.0", - "vite-plugin-vue-devtools": "^7.6.7", + "vite-plugin-vue-devtools": "^7.6.8", "vue-eslint-parser": "^9.4.3", "vue-tsc": "^2.1.10" }, diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index 9e70c6a03..585390b75 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -20,19 +20,19 @@ importers: specifier: ^3.4.5 version: 3.4.5 '@formatjs/intl-durationformat': - specifier: ^0.7.0 + specifier: ^0.7.1 version: 0.7.1 '@guolao/vue-monaco-editor': specifier: ^1.5.4 - version: 1.5.4(monaco-editor@0.52.0)(vue@3.5.13(typescript@5.6.3)) + version: 1.5.4(monaco-editor@0.52.2)(vue@3.5.13(typescript@5.6.3)) '@octokit/core': specifier: ^6.1.2 version: 6.1.2 '@octokit/request-error': - specifier: ^6.1.5 + specifier: ^6.1.6 version: 6.1.6 '@vueuse/core': - specifier: ^12.0.0 + specifier: ^12.2.0 version: 12.2.0(typescript@5.6.3) antlr4: specifier: ^4.13.2 @@ -47,7 +47,7 @@ importers: specifier: ^1.11.13 version: 1.11.13 echarts: - specifier: ^5.5.1 + specifier: ^5.6.0 version: 5.6.0 is-in-subnet: specifier: ^4.0.1 @@ -83,7 +83,7 @@ importers: specifier: ^7.0.3 version: 7.0.3(@vue/runtime-core@3.5.13)(echarts@5.6.0)(vue@3.5.13(typescript@5.6.3)) vue-i18n: - specifier: ^11.0.0 + specifier: ^11.0.1 version: 11.0.1(vue@3.5.13(typescript@5.6.3)) vue-request: specifier: ^2.0.4 @@ -96,8 +96,8 @@ importers: specifier: ^1.4.5 version: 1.4.5 '@eslint/js': - specifier: ^9.16.0 - version: 9.16.0 + specifier: ^9.17.0 + version: 9.17.0 '@rushstack/eslint-patch': specifier: ^1.10.4 version: 1.10.4 @@ -114,29 +114,29 @@ importers: specifier: ^14.1.2 version: 14.1.2 '@types/node': - specifier: ^22.10.1 - version: 22.10.1 + specifier: ^22.10.2 + version: 22.10.2 '@types/uuid': specifier: ^10.0.0 version: 10.0.0 '@typescript-eslint/parser': - specifier: ^8.17.0 - version: 8.17.0(eslint@9.16.0)(typescript@5.6.3) + specifier: ^8.18.2 + version: 8.18.2(eslint@9.17.0)(typescript@5.6.3) '@vitejs/plugin-vue': specifier: ^5.2.1 - version: 5.2.1(vite@6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + version: 5.2.1(vite@6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) '@vue/tsconfig': specifier: ^0.7.0 version: 0.7.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)) eslint: - specifier: 9.16.0 - version: 9.16.0 + specifier: 9.17.0 + version: 9.17.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@9.16.0) + version: 9.1.0(eslint@9.17.0) eslint-plugin-vue: specifier: ^9.32.0 - version: 9.32.0(eslint@9.16.0) + version: 9.32.0(eslint@9.17.0) husky: specifier: ^9.1.7 version: 9.1.7 @@ -144,11 +144,11 @@ importers: specifier: ^4.2.1 version: 4.2.1 monaco-editor: - specifier: ^0.52.0 - version: 0.52.0 + specifier: ^0.52.2 + version: 0.52.2 npm-run-all2: - specifier: ^7.0.1 - version: 7.0.1 + specifier: ^7.0.2 + version: 7.0.2 prettier: specifier: ^3.4.2 version: 3.4.2 @@ -157,25 +157,25 @@ importers: version: 5.6.3 typescript-eslint: specifier: ^8.17.0 - version: 8.17.0(eslint@9.16.0)(typescript@5.6.3) + version: 8.17.0(eslint@9.17.0)(typescript@5.6.3) vite: - specifier: ^6.0.3 - version: 6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8) + specifier: ^6.0.6 + version: 6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8) vite-bundle-analyzer: specifier: ^0.15.2 version: 0.15.2 vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.27.4)(vite@6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)) + version: 0.22.0(rollup@4.27.4)(vite@6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8)) vite-plugin-remove-console: specifier: ^2.2.0 version: 2.2.0 vite-plugin-vue-devtools: - specifier: ^7.6.7 - version: 7.6.7(rollup@4.27.4)(vite@6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + specifier: ^7.6.8 + version: 7.6.8(rollup@4.27.4)(vite@6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) vue-eslint-parser: specifier: ^9.4.3 - version: 9.4.3(eslint@9.16.0) + version: 9.4.3(eslint@9.17.0) vue-tsc: specifier: ^2.1.10 version: 2.1.10(typescript@5.6.3) @@ -183,11 +183,11 @@ importers: packages: '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, tarball: https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz} engines: {node: '>=6.0.0'} '@antfu/utils@0.7.10': - resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==, tarball: https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz} '@arco-design/color@0.4.0': resolution: {integrity: sha512-s7p9MSwJgHeL8DwcATaXvWT3m2SigKpxx4JA1BGPHL4gfvaQsmQfrLBDpjOJFJuJ2jG2dMt3R3P8Pm9E65q18g==} @@ -205,15 +205,15 @@ packages: engines: {node: '>=6.9.0'} '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==, tarball: https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz} engines: {node: '>=6.9.0'} '@babel/compat-data@7.26.2': - resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==, tarball: https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz} engines: {node: '>=6.9.0'} '@babel/core@7.26.0': - resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==, tarball: https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz} engines: {node: '>=6.9.0'} '@babel/generator@7.24.4': @@ -221,19 +221,19 @@ packages: engines: {node: '>=6.9.0'} '@babel/generator@7.26.2': - resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==, tarball: https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==, tarball: https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.25.9': - resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==, tarball: https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz} engines: {node: '>=6.9.0'} '@babel/helper-create-class-features-plugin@7.25.9': - resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==, tarball: https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -251,7 +251,7 @@ packages: engines: {node: '>=6.9.0'} '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==, tarball: https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.24.3': @@ -259,31 +259,31 @@ packages: engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==, tarball: https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz} engines: {node: '>=6.9.0'} '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==, tarball: https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==, tarball: https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz} engines: {node: '>=6.9.0'} '@babel/helper-plugin-utils@7.25.9': - resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==, tarball: https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz} engines: {node: '>=6.9.0'} '@babel/helper-replace-supers@7.25.9': - resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} + resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==, tarball: https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==, tarball: https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz} engines: {node: '>=6.9.0'} '@babel/helper-split-export-declaration@7.22.6': @@ -311,11 +311,11 @@ packages: engines: {node: '>=6.9.0'} '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==, tarball: https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz} engines: {node: '>=6.9.0'} '@babel/helpers@7.26.0': - resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==, tarball: https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz} engines: {node: '>=6.9.0'} '@babel/highlight@7.24.2': @@ -338,42 +338,42 @@ packages: hasBin: true '@babel/plugin-proposal-decorators@7.25.9': - resolution: {integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==} + resolution: {integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==, tarball: https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-decorators@7.25.9': - resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==} + resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==, tarball: https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==, tarball: https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, tarball: https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-jsx@7.25.9': - resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==, tarball: https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-typescript@7.25.9': - resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==, tarball: https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-typescript@7.25.9': - resolution: {integrity: sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==} + resolution: {integrity: sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==, tarball: https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -383,7 +383,7 @@ packages: engines: {node: '>=6.9.0'} '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==, tarball: https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz} engines: {node: '>=6.9.0'} '@babel/traverse@7.24.1': @@ -391,7 +391,7 @@ packages: engines: {node: '>=6.9.0'} '@babel/traverse@7.25.9': - resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==, tarball: https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz} engines: {node: '>=6.9.0'} '@babel/types@7.24.0': @@ -405,146 +405,152 @@ packages: '@dzangolab/flag-icon-css@3.4.5': resolution: {integrity: sha512-XqVAi0O/KITtznpMK5TP4D+rWfwst5lrsbPbes5c5SPMGjwK7fuvlTdEmG2XUrxzYqDTIPshywyzdVYKooGdGA==} - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==, tarball: https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==, tarball: https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==, tarball: https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==, tarball: https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==, tarball: https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==, tarball: https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==, tarball: https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==, tarball: https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==, tarball: https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==, tarball: https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==, tarball: https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==, tarball: https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==, tarball: https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==, tarball: https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==, tarball: https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==, tarball: https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==, tarball: https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==, tarball: https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==, tarball: https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==, tarball: https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==, tarball: https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==, tarball: https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==, tarball: https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==, tarball: https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==, tarball: https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -556,44 +562,44 @@ packages: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==, tarball: https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/config-array@0.19.0': - resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} + resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==, tarball: https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.9.0': - resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} + resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==, tarball: https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==, tarball: https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.16.0': - resolution: {integrity: sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==} + '@eslint/js@9.17.0': + resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==, tarball: https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==, tarball: https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/plugin-kit@0.2.3': - resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} + resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==, tarball: https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@formatjs/ecma402-abstract@2.3.1': - resolution: {integrity: sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw==} + resolution: {integrity: sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw==, tarball: https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.1.tgz} '@formatjs/fast-memoize@2.2.5': - resolution: {integrity: sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g==} + resolution: {integrity: sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g==, tarball: https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.5.tgz} '@formatjs/intl-durationformat@0.7.1': - resolution: {integrity: sha512-tM/sscHRcVMVAn0qMJlmq5mf3MaqA0jSz73NT4SYBHZuZqfU0EKWjJCwZBYeNRfvO6y20Yo0RzGxom0KvSVUlA==} + resolution: {integrity: sha512-tM/sscHRcVMVAn0qMJlmq5mf3MaqA0jSz73NT4SYBHZuZqfU0EKWjJCwZBYeNRfvO6y20Yo0RzGxom0KvSVUlA==, tarball: https://registry.npmjs.org/@formatjs/intl-durationformat/-/intl-durationformat-0.7.1.tgz} '@formatjs/intl-localematcher@0.5.9': - resolution: {integrity: sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==} + resolution: {integrity: sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==, tarball: https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.9.tgz} '@guolao/vue-monaco-editor@1.5.4': resolution: {integrity: sha512-eyBAqxJeDpV4mZYZSpNvh3xUgKCld5eEe0dBtjJhsy2+L0MB6PYFZ/FbPHNwskgp2RoIpfn1DLrIhXXE3lVbwQ==} @@ -606,35 +612,35 @@ packages: optional: true '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, tarball: https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz} engines: {node: '>=18.18.0'} '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==, tarball: https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, tarball: https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz} engines: {node: '>=12.22'} '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==, tarball: https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz} engines: {node: '>=18.18'} '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==, tarball: https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz} engines: {node: '>=18.18'} '@intlify/core-base@11.0.1': - resolution: {integrity: sha512-NAmhw1l/llM0HZRpagR/ChJTNymW4ll6/4EDSJML5c8L5Hl/+k6UyF8EIgE6DeHpfheQujkSRngauViHqq6jJQ==} + resolution: {integrity: sha512-NAmhw1l/llM0HZRpagR/ChJTNymW4ll6/4EDSJML5c8L5Hl/+k6UyF8EIgE6DeHpfheQujkSRngauViHqq6jJQ==, tarball: https://registry.npmjs.org/@intlify/core-base/-/core-base-11.0.1.tgz} engines: {node: '>= 16'} '@intlify/message-compiler@11.0.1': - resolution: {integrity: sha512-5RFH8x+Mn3mbjcHXnb6KCXGiczBdiQkWkv99iiA0JpKrNuTAQeW59Pjq/uObMB0eR0shnKYGTkIJxum+DbL3sw==} + resolution: {integrity: sha512-5RFH8x+Mn3mbjcHXnb6KCXGiczBdiQkWkv99iiA0JpKrNuTAQeW59Pjq/uObMB0eR0shnKYGTkIJxum+DbL3sw==, tarball: https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-11.0.1.tgz} engines: {node: '>= 16'} '@intlify/shared@11.0.1': - resolution: {integrity: sha512-lH164+aDDptHZ3dBDbIhRa1dOPQUp+83iugpc+1upTOWCnwyC1PVis6rSWNMMJ8VQxvtHQB9JMib48K55y0PvQ==} + resolution: {integrity: sha512-lH164+aDDptHZ3dBDbIhRa1dOPQUp+83iugpc+1upTOWCnwyC1PVis6rSWNMMJ8VQxvtHQB9JMib48K55y0PvQ==, tarball: https://registry.npmjs.org/@intlify/shared/-/shared-11.0.1.tgz} engines: {node: '>= 16'} '@jridgewell/gen-mapping@0.3.5': @@ -695,7 +701,7 @@ packages: resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} '@octokit/request-error@6.1.6': - resolution: {integrity: sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==} + resolution: {integrity: sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==, tarball: https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.6.tgz} engines: {node: '>= 18'} '@octokit/request@9.1.1': @@ -706,10 +712,10 @@ packages: resolution: {integrity: sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==} '@octokit/types@13.6.2': - resolution: {integrity: sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==} + resolution: {integrity: sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==, tarball: https://registry.npmjs.org/@octokit/types/-/types-13.6.2.tgz} '@polka/url@1.0.0-next.28': - resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==, tarball: https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz} '@rollup/plugin-inject@5.0.5': resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} @@ -730,7 +736,7 @@ packages: optional: true '@rollup/pluginutils@5.1.3': - resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==, tarball: https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -739,92 +745,92 @@ packages: optional: true '@rollup/rollup-android-arm-eabi@4.27.4': - resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==} + resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==, tarball: https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz} cpu: [arm] os: [android] '@rollup/rollup-android-arm64@4.27.4': - resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==} + resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==, tarball: https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz} cpu: [arm64] os: [android] '@rollup/rollup-darwin-arm64@4.27.4': - resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==} + resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==, tarball: https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz} cpu: [arm64] os: [darwin] '@rollup/rollup-darwin-x64@4.27.4': - resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==} + resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==, tarball: https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz} cpu: [x64] os: [darwin] '@rollup/rollup-freebsd-arm64@4.27.4': - resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==} + resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==, tarball: https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz} cpu: [arm64] os: [freebsd] '@rollup/rollup-freebsd-x64@4.27.4': - resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==} + resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==, tarball: https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz} cpu: [x64] os: [freebsd] '@rollup/rollup-linux-arm-gnueabihf@4.27.4': - resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} + resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz} cpu: [arm] os: [linux] '@rollup/rollup-linux-arm-musleabihf@4.27.4': - resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} + resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz} cpu: [arm] os: [linux] '@rollup/rollup-linux-arm64-gnu@4.27.4': - resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} + resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz} cpu: [arm64] os: [linux] '@rollup/rollup-linux-arm64-musl@4.27.4': - resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} + resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz} cpu: [arm64] os: [linux] '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': - resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} + resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz} cpu: [ppc64] os: [linux] '@rollup/rollup-linux-riscv64-gnu@4.27.4': - resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} + resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz} cpu: [riscv64] os: [linux] '@rollup/rollup-linux-s390x-gnu@4.27.4': - resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} + resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz} cpu: [s390x] os: [linux] '@rollup/rollup-linux-x64-gnu@4.27.4': - resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} + resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz} cpu: [x64] os: [linux] '@rollup/rollup-linux-x64-musl@4.27.4': - resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} + resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz} cpu: [x64] os: [linux] '@rollup/rollup-win32-arm64-msvc@4.27.4': - resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} + resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==, tarball: https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz} cpu: [arm64] os: [win32] '@rollup/rollup-win32-ia32-msvc@4.27.4': - resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==} + resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==, tarball: https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz} cpu: [ia32] os: [win32] '@rollup/rollup-win32-x64-msvc@4.27.4': - resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==} + resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==, tarball: https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz} cpu: [x64] os: [win32] @@ -832,10 +838,10 @@ packages: resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==, tarball: https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz} '@sindresorhus/merge-streams@4.0.0': - resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==, tarball: https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz} engines: {node: '>=18'} '@tsconfig/node20@20.1.4': @@ -866,16 +872,16 @@ packages: resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} '@types/node@16.18.121': - resolution: {integrity: sha512-Gk/pOy8H0cvX8qNrwzElYIECpcUn87w4EAEFXFvPJ8qsP9QR/YqukUORSy0zmyDyvdo149idPpy4W6iC5aSbQA==} + resolution: {integrity: sha512-Gk/pOy8H0cvX8qNrwzElYIECpcUn87w4EAEFXFvPJ8qsP9QR/YqukUORSy0zmyDyvdo149idPpy4W6iC5aSbQA==, tarball: https://registry.npmjs.org/@types/node/-/node-16.18.121.tgz} - '@types/node@22.10.1': - resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} + '@types/node@22.10.2': + resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==, tarball: https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz} '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} '@types/web-bluetooth@0.0.20': - resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==, tarball: https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz} '@typescript-eslint/eslint-plugin@8.17.0': resolution: {integrity: sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==} @@ -889,7 +895,7 @@ packages: optional: true '@typescript-eslint/parser@8.17.0': - resolution: {integrity: sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==} + resolution: {integrity: sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.17.0.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -898,10 +904,21 @@ packages: typescript: optional: true + '@typescript-eslint/parser@8.18.2': + resolution: {integrity: sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.2.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/scope-manager@8.17.0': resolution: {integrity: sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.18.2': + resolution: {integrity: sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==, tarball: https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.2.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@8.17.0': resolution: {integrity: sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -916,6 +933,10 @@ packages: resolution: {integrity: sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.18.2': + resolution: {integrity: sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==, tarball: https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.2.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.17.0': resolution: {integrity: sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -925,6 +946,12 @@ packages: typescript: optional: true + '@typescript-eslint/typescript-estree@8.18.2': + resolution: {integrity: sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.2.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/utils@8.17.0': resolution: {integrity: sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -939,6 +966,10 @@ packages: resolution: {integrity: sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.18.2': + resolution: {integrity: sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==, tarball: https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.2.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@vitejs/plugin-vue@5.2.1': resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -956,10 +987,10 @@ packages: resolution: {integrity: sha512-6xkIYJ5xxghVBhVywMoPMidDDAFT1OoQeXwa27HSgJ6AiIKRe61RXLoik+14Z7r0JvnblXVsjsRLmCr42SGzqg==} '@vue/babel-helper-vue-transform-on@1.2.5': - resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==} + resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==, tarball: https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz} '@vue/babel-plugin-jsx@1.2.5': - resolution: {integrity: sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==} + resolution: {integrity: sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==, tarball: https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz} peerDependencies: '@babel/core': ^7.0.0-0 peerDependenciesMeta: @@ -967,7 +998,7 @@ packages: optional: true '@vue/babel-plugin-resolve-type@1.2.5': - resolution: {integrity: sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==} + resolution: {integrity: sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==, tarball: https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz} peerDependencies: '@babel/core': ^7.0.0-0 @@ -995,16 +1026,16 @@ packages: '@vue/devtools-api@6.6.4': resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} - '@vue/devtools-core@7.6.7': - resolution: {integrity: sha512-6fW8Q0H1NHDXdEcuV6dylT5U2Yxg3SdMnVCey99Y6S4R2PNgFL2vC+VU9U9rHIiaoEUkeza42S7FfHxV4VI3Jg==} + '@vue/devtools-core@7.6.8': + resolution: {integrity: sha512-8X4roysTwzQ94o7IobjVcOd1aZF5iunikrMrHPI2uUdigZCi2kFTQc7ffYiFiTNaLElCpjOhCnM7bo7aK1yU7A==, tarball: https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.6.8.tgz} peerDependencies: vue: ^3.0.0 - '@vue/devtools-kit@7.6.7': - resolution: {integrity: sha512-V8/jrXY/swHgnblABG9U4QCbE60c6RuPasmv2d9FvVqc5d94t1vDiESuvRmdNJBdWz4/D3q6ffgyAfRVjwHYEw==} + '@vue/devtools-kit@7.6.8': + resolution: {integrity: sha512-JhJ8M3sPU+v0P2iZBF2DkdmR9L0dnT5RXJabJqX6o8KtFs3tebdvfoXV2Dm3BFuqeECuMJIfF1aCzSt+WQ4wrw==, tarball: https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.6.8.tgz} - '@vue/devtools-shared@7.6.7': - resolution: {integrity: sha512-QggO6SviAsolrePAXZ/sA1dSicSPt4TueZibCvydfhNDieL1lAuyMTgQDGst7TEvMGb4vgYv2I+1sDkO4jWNnw==} + '@vue/devtools-shared@7.6.8': + resolution: {integrity: sha512-9MBPO5Z3X1nYGFqTJyohl6Gmf/J7UNN1oicHdyzBVZP4jnhZ4c20MgtaHDIzWmHDHCMYVS5bwKxT3jxh7gOOKA==, tarball: https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.6.8.tgz} '@vue/language-core@2.1.10': resolution: {integrity: sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==} @@ -1046,13 +1077,13 @@ packages: optional: true '@vueuse/core@12.2.0': - resolution: {integrity: sha512-jksyNu+5EGwggNkRWd6xX+8qBkYbmrwdFQMgCABsz+wq8bKF6w3soPFLB8vocFp3wFIzn0OYkSPM9JP+AFKwsg==} + resolution: {integrity: sha512-jksyNu+5EGwggNkRWd6xX+8qBkYbmrwdFQMgCABsz+wq8bKF6w3soPFLB8vocFp3wFIzn0OYkSPM9JP+AFKwsg==, tarball: https://registry.npmjs.org/@vueuse/core/-/core-12.2.0.tgz} '@vueuse/metadata@12.2.0': - resolution: {integrity: sha512-x6zynZtTh1l52m0y8d/EgzpshnMjg8cNZ2KWoncJ62Z5qPSGoc4FUunmMVrrRM/I/5542rTEY89CGftngZvrkQ==} + resolution: {integrity: sha512-x6zynZtTh1l52m0y8d/EgzpshnMjg8cNZ2KWoncJ62Z5qPSGoc4FUunmMVrrRM/I/5542rTEY89CGftngZvrkQ==, tarball: https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.2.0.tgz} '@vueuse/shared@12.2.0': - resolution: {integrity: sha512-SRr4AZwv/giS+EmyA1ZIzn3/iALjjnWAGaBNmoDTMEob9JwQaevAocuaMDnPAvU7Z35Y5g3CFRusCWgp1gVJ3Q==} + resolution: {integrity: sha512-SRr4AZwv/giS+EmyA1ZIzn3/iALjjnWAGaBNmoDTMEob9JwQaevAocuaMDnPAvU7Z35Y5g3CFRusCWgp1gVJ3Q==, tarball: https://registry.npmjs.org/@vueuse/shared/-/shared-12.2.0.tgz} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -1065,12 +1096,12 @@ packages: hasBin: true acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==, tarball: https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz} engines: {node: '>=0.4.0'} hasBin: true ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, tarball: https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz} alien-signals@0.2.0: resolution: {integrity: sha512-StlonZhBBrsPPwrDjiPAiVTf/rolxffLxVPT60Qv/t88BZ81BvUVzHgGqEFvJ1ii8HXtm1+zU2Icr59tfWEcag==} @@ -1080,11 +1111,11 @@ packages: engines: {node: '>=4'} ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, tarball: https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz} engines: {node: '>=8'} ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, tarball: https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz} engines: {node: '>=12'} antlr4@4.13.2: @@ -1092,7 +1123,7 @@ packages: engines: {node: '>=16'} anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, tarball: https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz} engines: {node: '>= 8'} argparse@2.0.1: @@ -1124,11 +1155,11 @@ packages: resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, tarball: https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz} engines: {node: '>=8'} birpc@0.2.19: - resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} + resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==, tarball: https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz} bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} @@ -1140,7 +1171,7 @@ packages: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, tarball: https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -1175,7 +1206,7 @@ packages: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} browserslist@4.24.2: - resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==, tarball: https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1189,7 +1220,7 @@ packages: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==, tarball: https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz} engines: {node: '>=18'} call-bind@1.0.7: @@ -1197,22 +1228,22 @@ packages: engines: {node: '>= 0.4'} callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, tarball: https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz} engines: {node: '>=6'} caniuse-lite@1.0.30001684: - resolution: {integrity: sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==} + resolution: {integrity: sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==, tarball: https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, tarball: https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz} engines: {node: '>=10'} chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, tarball: https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz} engines: {node: '>= 8.10.0'} cipher-base@1.0.4: @@ -1226,7 +1257,7 @@ packages: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, tarball: https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz} engines: {node: '>=7.0.0'} color-name@1.1.3: @@ -1248,7 +1279,7 @@ packages: resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, tarball: https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz} console-browserify@1.2.0: resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} @@ -1261,13 +1292,13 @@ packages: engines: {node: '>=12'} convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, tarball: https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz} copy-anything@2.0.6: resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} copy-anything@3.0.5: - resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==, tarball: https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz} engines: {node: '>=12.13'} copy-to-clipboard@3.3.3: @@ -1288,10 +1319,6 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cross-spawn@7.0.5: - resolution: {integrity: sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==} - engines: {node: '>= 8'} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1332,17 +1359,17 @@ packages: optional: true decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==, tarball: https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz} deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, tarball: https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz} default-browser-id@5.0.0: - resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==, tarball: https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz} engines: {node: '>=18'} default-browser@5.2.1: - resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==, tarball: https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz} engines: {node: '>=18'} define-data-property@1.1.4: @@ -1350,7 +1377,7 @@ packages: engines: {node: '>= 0.4'} define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==, tarball: https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz} engines: {node: '>=12'} define-properties@1.2.1: @@ -1368,10 +1395,10 @@ packages: engines: {node: '>=10'} echarts@5.6.0: - resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} + resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==, tarball: https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz} electron-to-chromium@1.5.66: - resolution: {integrity: sha512-pI2QF6+i+zjPbqRzJwkMvtvkdI7MjVbSh2g8dlMguDJIXEPw+kwasS1Jl+YGPEBfGVxsVgGUratAKymPdPo2vQ==} + resolution: {integrity: sha512-pI2QF6+i+zjPbqRzJwkMvtvkdI7MjVbSh2g8dlMguDJIXEPw+kwasS1Jl+YGPEBfGVxsVgGUratAKymPdPo2vQ==, tarball: https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.66.tgz} elliptic@6.6.0: resolution: {integrity: sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==} @@ -1381,11 +1408,11 @@ packages: engines: {node: '>=0.12'} errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==, tarball: https://registry.npmjs.org/errno/-/errno-0.1.8.tgz} hasBin: true error-stack-parser-es@0.1.5: - resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==} + resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==, tarball: https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz} es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} @@ -1395,13 +1422,13 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==, tarball: https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz} engines: {node: '>=18'} hasBin: true escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, tarball: https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz} engines: {node: '>=6'} escape-string-regexp@1.0.5: @@ -1409,7 +1436,7 @@ packages: engines: {node: '>=0.8.0'} escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, tarball: https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz} engines: {node: '>=10'} eslint-config-prettier@9.1.0: @@ -1429,7 +1456,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==, tarball: https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: @@ -1440,8 +1467,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.16.0: - resolution: {integrity: sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==} + eslint@9.17.0: + resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==, tarball: https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1451,7 +1478,7 @@ packages: optional: true espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==, tarball: https://registry.npmjs.org/espree/-/espree-10.3.0.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} espree@9.6.1: @@ -1474,7 +1501,7 @@ packages: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, tarball: https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz} engines: {node: '>=0.10.0'} events@3.3.0: @@ -1485,31 +1512,31 @@ packages: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} execa@9.5.1: - resolution: {integrity: sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==} + resolution: {integrity: sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==, tarball: https://registry.npmjs.org/execa/-/execa-9.5.1.tgz} engines: {node: ^18.19.0 || >=20.5.0} fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, tarball: https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz} fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, tarball: https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz} fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, tarball: https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz} fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} figures@6.1.0: - resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==, tarball: https://registry.npmjs.org/figures/-/figures-6.1.0.tgz} engines: {node: '>=18'} file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, tarball: https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz} engines: {node: '>=16.0.0'} fill-range@7.1.1: @@ -1521,21 +1548,21 @@ packages: engines: {node: '>=10'} flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, tarball: https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz} engines: {node: '>=16'} flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==, tarball: https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz} for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==, tarball: https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz} engines: {node: '>=14.14'} fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -1547,7 +1574,7 @@ packages: engines: {node: '>=14.16'} gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, tarball: https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz} engines: {node: '>=6.9.0'} get-intrinsic@1.2.4: @@ -1555,7 +1582,7 @@ packages: engines: {node: '>= 0.4'} get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==, tarball: https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz} engines: {node: '>=18'} glob-parent@5.1.2: @@ -1563,7 +1590,7 @@ packages: engines: {node: '>= 6'} glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, tarball: https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz} engines: {node: '>=10.13.0'} globals@11.12.0: @@ -1575,14 +1602,14 @@ packages: engines: {node: '>=8'} globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, tarball: https://registry.npmjs.org/globals/-/globals-14.0.0.tgz} engines: {node: '>=18'} gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, tarball: https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz} graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -1592,7 +1619,7 @@ packages: engines: {node: '>=4'} has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, tarball: https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz} engines: {node: '>=8'} has-property-descriptors@1.0.2: @@ -1633,17 +1660,17 @@ packages: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==, tarball: https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz} html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==, tarball: https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz} engines: {node: '>=8'} https-browserify@1.0.0: resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} human-signals@8.0.0: - resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} + resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==, tarball: https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz} engines: {node: '>=18.18.0'} husky@9.1.7: @@ -1663,19 +1690,19 @@ packages: engines: {node: '>= 4'} image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==, tarball: https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz} engines: {node: '>=0.10.0'} hasBin: true immutable@4.3.7: - resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==, tarball: https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz} import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, tarball: https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz} engines: {node: '>=6'} imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, tarball: https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz} engines: {node: '>=0.8.19'} inherits@2.0.4: @@ -1693,7 +1720,7 @@ packages: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, tarball: https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz} engines: {node: '>=8'} is-callable@1.2.7: @@ -1704,7 +1731,7 @@ packages: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==, tarball: https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true @@ -1725,7 +1752,7 @@ packages: engines: {node: '>=10.23.0'} is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==, tarball: https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz} engines: {node: '>=14.16'} hasBin: true @@ -1742,7 +1769,7 @@ packages: engines: {node: '>=0.12.0'} is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, tarball: https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz} engines: {node: '>=12'} is-regexp@3.1.0: @@ -1750,7 +1777,7 @@ packages: engines: {node: '>=12'} is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==, tarball: https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz} engines: {node: '>=18'} is-typed-array@1.1.13: @@ -1758,18 +1785,18 @@ packages: engines: {node: '>= 0.4'} is-unicode-supported@2.1.0: - resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==, tarball: https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz} engines: {node: '>=18'} is-what@3.14.1: resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, tarball: https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz} engines: {node: '>=12.13'} is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==, tarball: https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz} engines: {node: '>=16'} isarray@1.0.0: @@ -1779,7 +1806,7 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==, tarball: https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz} engines: {node: '>=16'} isomorphic-timers-promises@1.0.1: @@ -1790,7 +1817,7 @@ packages: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, tarball: https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz} hasBin: true jsesc@2.5.2: @@ -1799,36 +1826,36 @@ packages: hasBin: true jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==, tarball: https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz} engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, tarball: https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz} json-parse-even-better-errors@4.0.0: - resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==} + resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==, tarball: https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz} engines: {node: ^18.17.0 || >=20.5.0} json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, tarball: https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz} json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, tarball: https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz} json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, tarball: https://registry.npmjs.org/json5/-/json5-2.2.3.tgz} engines: {node: '>=6'} hasBin: true jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, tarball: https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz} keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, tarball: https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz} kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==, tarball: https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz} less@4.2.1: resolution: {integrity: sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg==} @@ -1836,7 +1863,7 @@ packages: hasBin: true levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, tarball: https://registry.npmjs.org/levn/-/levn-0.4.1.tgz} engines: {node: '>= 0.8.0'} linkify-it@5.0.0: @@ -1847,26 +1874,26 @@ packages: engines: {node: '>=10'} lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, tarball: https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz} lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz} magic-string@0.30.12: resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} magic-string@0.30.14: - resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} + resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==, tarball: https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz} magic-string@0.30.9: resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} engines: {node: '>=12'} make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, tarball: https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz} engines: {node: '>=6'} markdown-it@14.1.0: @@ -1880,7 +1907,7 @@ packages: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==, tarball: https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz} engines: {node: '>= 0.10.0'} merge2@1.4.1: @@ -1896,7 +1923,7 @@ packages: hasBin: true mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, tarball: https://registry.npmjs.org/mime/-/mime-1.6.0.tgz} engines: {node: '>=4'} hasBin: true @@ -1907,7 +1934,7 @@ packages: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, tarball: https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz} minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} @@ -1916,11 +1943,11 @@ packages: mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - monaco-editor@0.52.0: - resolution: {integrity: sha512-OeWhNpABLCeTqubfqLMXGsqf6OmPU6pHM85kF3dhy6kq5hnhuVS1p3VrEW/XhWHc71P2tHyS5JFySD8mgs1crw==} + monaco-editor@0.52.2: + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==, tarball: https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz} mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==, tarball: https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz} engines: {node: '>=10'} ms@2.1.2: @@ -1933,12 +1960,12 @@ packages: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==, tarball: https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true nanoid@5.0.9: - resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==} + resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==, tarball: https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz} engines: {node: ^18 || >=20} hasBin: true @@ -1946,35 +1973,35 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==, tarball: https://registry.npmjs.org/needle/-/needle-3.3.1.tgz} engines: {node: '>= 4.4.x'} hasBin: true node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==, tarball: https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz} node-stdlib-browser@1.2.0: resolution: {integrity: sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==} engines: {node: '>=10'} normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, tarball: https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz} engines: {node: '>=0.10.0'} normalize.css@8.0.1: resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==} npm-normalize-package-bin@4.0.0: - resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} + resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==, tarball: https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz} engines: {node: ^18.17.0 || >=20.5.0} - npm-run-all2@7.0.1: - resolution: {integrity: sha512-Adbv+bJQ8UTAM03rRODqrO5cx0YU5KCG2CvHtSURiadvdTjjgGJXdbc1oQ9CXBh9dnGfHSoSB1Web/0Dzp6kOQ==} + npm-run-all2@7.0.2: + resolution: {integrity: sha512-7tXR+r9hzRNOPNTvXegM+QzCuMjzUIIq66VDunL6j60O4RrExx32XUhlrS7UK4VcdGw5/Wxzb3kfNcFix9JKDA==, tarball: https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-7.0.2.tgz} engines: {node: ^18.17.0 || >=20.5.0, npm: '>= 9'} hasBin: true npm-run-path@6.0.0: - resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==, tarball: https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz} engines: {node: '>=18'} nth-check@2.1.1: @@ -1999,11 +2026,11 @@ packages: engines: {node: '>= 0.4'} open@10.1.0: - resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==, tarball: https://registry.npmjs.org/open/-/open-10.1.0.tgz} engines: {node: '>=18'} optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, tarball: https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz} engines: {node: '>= 0.8.0'} os-browserify@0.3.0: @@ -2021,7 +2048,7 @@ packages: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, tarball: https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz} engines: {node: '>=6'} parse-asn1@5.1.7: @@ -2029,7 +2056,7 @@ packages: engines: {node: '>= 0.10'} parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==, tarball: https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz} engines: {node: '>=18'} parse-node-version@1.0.1: @@ -2048,21 +2075,21 @@ packages: engines: {node: '>=8'} path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, tarball: https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz} engines: {node: '>=12'} path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==, tarball: https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz} pbkdf2@3.1.2: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==, tarball: https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2072,11 +2099,11 @@ packages: engines: {node: '>=8.6'} picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==, tarball: https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz} engines: {node: '>=12'} pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==, tarball: https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz} engines: {node: '>=0.10'} hasBin: true @@ -2106,11 +2133,11 @@ packages: engines: {node: '>=4'} postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==, tarball: https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, tarball: https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz} engines: {node: '>= 0.8.0'} prettier@3.4.2: @@ -2119,7 +2146,7 @@ packages: hasBin: true pretty-ms@9.2.0: - resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==, tarball: https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz} engines: {node: '>=18'} process-nextick-args@2.0.1: @@ -2143,7 +2170,7 @@ packages: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, tarball: https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz} engines: {node: '>=6'} qs@6.12.1: @@ -2164,7 +2191,7 @@ packages: resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} read-package-json-fast@4.0.0: - resolution: {integrity: sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==} + resolution: {integrity: sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==, tarball: https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz} engines: {node: ^18.17.0 || >=20.5.0} readable-stream@2.3.8: @@ -2175,14 +2202,14 @@ packages: engines: {node: '>= 6'} readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, tarball: https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz} engines: {node: '>=8.10.0'} resize-observer-polyfill@1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, tarball: https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz} engines: {node: '>=4'} resolve@1.22.8: @@ -2194,18 +2221,18 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==, tarball: https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz} ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} rollup@4.27.4: - resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} + resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==, tarball: https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==, tarball: https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz} engines: {node: '>=18'} run-parallel@1.2.0: @@ -2221,7 +2248,7 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} sass@1.77.8: - resolution: {integrity: sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==} + resolution: {integrity: sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==, tarball: https://registry.npmjs.org/sass/-/sass-1.77.8.tgz} engines: {node: '>=14.0.0'} hasBin: true @@ -2236,7 +2263,7 @@ packages: hasBin: true semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, tarball: https://registry.npmjs.org/semver/-/semver-6.3.1.tgz} hasBin: true semver@7.6.2: @@ -2269,21 +2296,21 @@ packages: engines: {node: '>=8'} shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==, tarball: https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, tarball: https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz} engines: {node: '>=14'} simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} sirv@3.0.0: - resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==, tarball: https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz} engines: {node: '>=18'} source-map-js@1.2.1: @@ -2291,11 +2318,11 @@ packages: engines: {node: '>=0.10.0'} source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, tarball: https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz} engines: {node: '>=0.10.0'} speakingurl@14.0.1: - resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==, tarball: https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz} engines: {node: '>=0.10.0'} state-local@1.0.7: @@ -2314,11 +2341,11 @@ packages: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} strip-final-newline@4.0.0: - resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==, tarball: https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz} engines: {node: '>=18'} strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, tarball: https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz} engines: {node: '>=8'} super-regex@0.2.0: @@ -2326,7 +2353,7 @@ packages: engines: {node: '>=14.16'} superjson@2.2.1: - resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==, tarball: https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz} engines: {node: '>=16'} supports-color@5.5.0: @@ -2334,7 +2361,7 @@ packages: engines: {node: '>=4'} supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, tarball: https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz} engines: {node: '>=8'} supports-preserve-symlinks-flag@1.0.0: @@ -2342,7 +2369,7 @@ packages: engines: {node: '>= 0.4'} svg-tags@1.0.0: - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==, tarball: https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz} time-span@5.1.0: resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} @@ -2364,7 +2391,7 @@ packages: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==, tarball: https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz} engines: {node: '>=6'} ts-api-utils@1.4.1: @@ -2374,7 +2401,7 @@ packages: typescript: '>=4.2.0' tslib@2.3.0: - resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==, tarball: https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -2383,7 +2410,7 @@ packages: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, tarball: https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz} engines: {node: '>= 0.8.0'} type-fest@0.20.2: @@ -2409,27 +2436,27 @@ packages: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==, tarball: https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz} unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==, tarball: https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz} engines: {node: '>=18'} universal-user-agent@7.0.2: resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, tarball: https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz} engines: {node: '>= 10.0.0'} update-browserslist-db@1.1.1: - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==, tarball: https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz} hasBin: true peerDependencies: browserslist: '>= 4.21.0' uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, tarball: https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz} url-join@5.0.0: resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} @@ -2453,16 +2480,16 @@ packages: hasBin: true vite-hot-client@0.2.4: - resolution: {integrity: sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==} + resolution: {integrity: sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==, tarball: https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-0.2.4.tgz} peerDependencies: vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 - vite-plugin-inspect@0.8.8: - resolution: {integrity: sha512-aZlBuXsWUPJFmMK92GIv6lH7LrwG2POu4KJ+aEdcqnu92OAf+rhBnfMDQvxIJPEB7hE2t5EyY/PMgf5aDLT8EA==} + vite-plugin-inspect@0.8.9: + resolution: {integrity: sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==, tarball: https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz} engines: {node: '>=14'} peerDependencies: '@nuxt/kit': '*' - vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 + vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1 peerDependenciesMeta: '@nuxt/kit': optional: true @@ -2475,19 +2502,19 @@ packages: vite-plugin-remove-console@2.2.0: resolution: {integrity: sha512-qgjh5pz75MdE9Kzs8J0kBwaCfifHV0ezRbB9rpGsIOxam+ilcGV7WOk91vFJXquzRmiKrFh3Hxlh0JJWAmXTbQ==} - vite-plugin-vue-devtools@7.6.7: - resolution: {integrity: sha512-H1ZyjtpWjP5mHA5R15sQeYgAARuh2Myg3TDFXWZK6QOQRy8s3XjTIt319DogVjU/x3rC3L/jJQjIasRU04mWXA==} + vite-plugin-vue-devtools@7.6.8: + resolution: {integrity: sha512-32aIps8C1Y7UEoqyWf+ES3J1OozsCYMIqTqd+I5qass+R0Tcf8SaA2bX1/rskAzkcKCteVoBjEENmqwTcMebbw==, tarball: https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.6.8.tgz} engines: {node: '>=v14.21.3'} peerDependencies: vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 vite-plugin-vue-inspector@5.3.1: - resolution: {integrity: sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==} + resolution: {integrity: sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==, tarball: https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.1.tgz} peerDependencies: vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 - vite@6.0.3: - resolution: {integrity: sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==} + vite@6.0.6: + resolution: {integrity: sha512-NSjmUuckPmDU18bHz7QZ+bTYhRR0iA72cs2QAxCqDpafJ0S6qetco0LB3WW2OxlMHS0JmAv+yZ/R3uPmMyGTjQ==, tarball: https://registry.npmjs.org/vite/-/vite-6.0.6.tgz} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -2571,7 +2598,7 @@ packages: eslint: '>=6.0.0' vue-i18n@11.0.1: - resolution: {integrity: sha512-pWAT8CusK8q9/EpN7V3oxwHwxWm6+Kp2PeTZmRGvdZTkUzMQDpbbmHp0TwQ8xw04XKm23cr6B4GL72y3W8Yekg==} + resolution: {integrity: sha512-pWAT8CusK8q9/EpN7V3oxwHwxWm6+Kp2PeTZmRGvdZTkUzMQDpbbmHp0TwQ8xw04XKm23cr6B4GL72y3W8Yekg==, tarball: https://registry.npmjs.org/vue-i18n/-/vue-i18n-11.0.1.tgz} engines: {node: '>= 16'} peerDependencies: vue: ^3.0.0 @@ -2615,12 +2642,12 @@ packages: hasBin: true which@5.0.0: - resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==, tarball: https://registry.npmjs.org/which/-/which-5.0.0.tgz} engines: {node: ^18.17.0 || >=20.5.0} hasBin: true word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, tarball: https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz} engines: {node: '>=0.10.0'} xml-name-validator@4.0.0: @@ -2632,18 +2659,18 @@ packages: engines: {node: '>=0.4'} yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, tarball: https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz} yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} yoctocolors@2.1.1: - resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==, tarball: https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz} engines: {node: '>=18'} zrender@5.6.1: - resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==, tarball: https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz} snapshots: @@ -2951,81 +2978,84 @@ snapshots: '@dzangolab/flag-icon-css@3.4.5': {} - '@esbuild/aix-ppc64@0.24.0': + '@esbuild/aix-ppc64@0.24.2': + optional: true + + '@esbuild/android-arm64@0.24.2': optional: true - '@esbuild/android-arm64@0.24.0': + '@esbuild/android-arm@0.24.2': optional: true - '@esbuild/android-arm@0.24.0': + '@esbuild/android-x64@0.24.2': optional: true - '@esbuild/android-x64@0.24.0': + '@esbuild/darwin-arm64@0.24.2': optional: true - '@esbuild/darwin-arm64@0.24.0': + '@esbuild/darwin-x64@0.24.2': optional: true - '@esbuild/darwin-x64@0.24.0': + '@esbuild/freebsd-arm64@0.24.2': optional: true - '@esbuild/freebsd-arm64@0.24.0': + '@esbuild/freebsd-x64@0.24.2': optional: true - '@esbuild/freebsd-x64@0.24.0': + '@esbuild/linux-arm64@0.24.2': optional: true - '@esbuild/linux-arm64@0.24.0': + '@esbuild/linux-arm@0.24.2': optional: true - '@esbuild/linux-arm@0.24.0': + '@esbuild/linux-ia32@0.24.2': optional: true - '@esbuild/linux-ia32@0.24.0': + '@esbuild/linux-loong64@0.24.2': optional: true - '@esbuild/linux-loong64@0.24.0': + '@esbuild/linux-mips64el@0.24.2': optional: true - '@esbuild/linux-mips64el@0.24.0': + '@esbuild/linux-ppc64@0.24.2': optional: true - '@esbuild/linux-ppc64@0.24.0': + '@esbuild/linux-riscv64@0.24.2': optional: true - '@esbuild/linux-riscv64@0.24.0': + '@esbuild/linux-s390x@0.24.2': optional: true - '@esbuild/linux-s390x@0.24.0': + '@esbuild/linux-x64@0.24.2': optional: true - '@esbuild/linux-x64@0.24.0': + '@esbuild/netbsd-arm64@0.24.2': optional: true - '@esbuild/netbsd-x64@0.24.0': + '@esbuild/netbsd-x64@0.24.2': optional: true - '@esbuild/openbsd-arm64@0.24.0': + '@esbuild/openbsd-arm64@0.24.2': optional: true - '@esbuild/openbsd-x64@0.24.0': + '@esbuild/openbsd-x64@0.24.2': optional: true - '@esbuild/sunos-x64@0.24.0': + '@esbuild/sunos-x64@0.24.2': optional: true - '@esbuild/win32-arm64@0.24.0': + '@esbuild/win32-arm64@0.24.2': optional: true - '@esbuild/win32-ia32@0.24.0': + '@esbuild/win32-ia32@0.24.2': optional: true - '@esbuild/win32-x64@0.24.0': + '@esbuild/win32-x64@0.24.2': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.16.0)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0)': dependencies: - eslint: 9.16.0 + eslint: 9.17.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -3054,7 +3084,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.16.0': {} + '@eslint/js@9.17.0': {} '@eslint/object-schema@2.1.4': {} @@ -3083,10 +3113,10 @@ snapshots: dependencies: tslib: 2.8.1 - '@guolao/vue-monaco-editor@1.5.4(monaco-editor@0.52.0)(vue@3.5.13(typescript@5.6.3))': + '@guolao/vue-monaco-editor@1.5.4(monaco-editor@0.52.2)(vue@3.5.13(typescript@5.6.3))': dependencies: - '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.0) - monaco-editor: 0.52.0 + '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.2) + monaco-editor: 0.52.2 vue: 3.5.13(typescript@5.6.3) vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3)) @@ -3134,9 +3164,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@monaco-editor/loader@1.4.0(monaco-editor@0.52.0)': + '@monaco-editor/loader@1.4.0(monaco-editor@0.52.2)': dependencies: - monaco-editor: 0.52.0 + monaco-editor: 0.52.2 state-local: 1.0.7 '@nodelib/fs.scandir@2.1.5': @@ -3309,7 +3339,7 @@ snapshots: '@types/node@16.18.121': {} - '@types/node@22.10.1': + '@types/node@22.10.2': dependencies: undici-types: 6.20.0 @@ -3317,15 +3347,15 @@ snapshots: '@types/web-bluetooth@0.0.20': {} - '@typescript-eslint/eslint-plugin@8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0)(typescript@5.6.3))(eslint@9.16.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.17.0)(typescript@5.6.3))(eslint@9.17.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.17.0(eslint@9.16.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.17.0(eslint@9.17.0)(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.17.0 - '@typescript-eslint/type-utils': 8.17.0(eslint@9.16.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.17.0(eslint@9.16.0)(typescript@5.6.3) + '@typescript-eslint/type-utils': 8.17.0(eslint@9.17.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.17.0(eslint@9.17.0)(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.17.0 - eslint: 9.16.0 + eslint: 9.17.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -3335,30 +3365,47 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.17.0(eslint@9.16.0)(typescript@5.6.3)': + '@typescript-eslint/parser@8.17.0(eslint@9.17.0)(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.17.0 '@typescript-eslint/types': 8.17.0 '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.17.0 debug: 4.3.7 - eslint: 9.16.0 + eslint: 9.17.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.18.2 + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.18.2 + debug: 4.3.7 + eslint: 9.17.0 + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.17.0': dependencies: '@typescript-eslint/types': 8.17.0 '@typescript-eslint/visitor-keys': 8.17.0 - '@typescript-eslint/type-utils@8.17.0(eslint@9.16.0)(typescript@5.6.3)': + '@typescript-eslint/scope-manager@8.18.2': + dependencies: + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/visitor-keys': 8.18.2 + + '@typescript-eslint/type-utils@8.17.0(eslint@9.17.0)(typescript@5.6.3)': dependencies: '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.17.0(eslint@9.16.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.17.0(eslint@9.17.0)(typescript@5.6.3) debug: 4.3.7 - eslint: 9.16.0 + eslint: 9.17.0 ts-api-utils: 1.4.1(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -3367,6 +3414,8 @@ snapshots: '@typescript-eslint/types@8.17.0': {} + '@typescript-eslint/types@8.18.2': {} + '@typescript-eslint/typescript-estree@8.17.0(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 8.17.0 @@ -3382,13 +3431,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.17.0(eslint@9.16.0)(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.18.2(typescript@5.6.3)': + dependencies: + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/visitor-keys': 8.18.2 + debug: 4.3.7 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.1(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.17.0(eslint@9.17.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) '@typescript-eslint/scope-manager': 8.17.0 '@typescript-eslint/types': 8.17.0 '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.6.3) - eslint: 9.16.0 + eslint: 9.17.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -3399,9 +3462,14 @@ snapshots: '@typescript-eslint/types': 8.17.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-vue@5.2.1(vite@6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@typescript-eslint/visitor-keys@8.18.2': + dependencies: + '@typescript-eslint/types': 8.18.2 + eslint-visitor-keys: 4.2.0 + + '@vitejs/plugin-vue@5.2.1(vite@6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: - vite: 6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8) + vite: 6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8) vue: 3.5.13(typescript@5.6.3) '@volar/language-core@2.4.8': @@ -3496,21 +3564,21 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.6.7(vite@6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@vue/devtools-core@7.6.8(vite@6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: - '@vue/devtools-kit': 7.6.7 - '@vue/devtools-shared': 7.6.7 + '@vue/devtools-kit': 7.6.8 + '@vue/devtools-shared': 7.6.8 mitt: 3.0.1 nanoid: 5.0.9 pathe: 1.1.2 - vite-hot-client: 0.2.4(vite@6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)) + vite-hot-client: 0.2.4(vite@6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8)) vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - vite - '@vue/devtools-kit@7.6.7': + '@vue/devtools-kit@7.6.8': dependencies: - '@vue/devtools-shared': 7.6.7 + '@vue/devtools-shared': 7.6.8 birpc: 0.2.19 hookable: 5.5.3 mitt: 3.0.1 @@ -3518,7 +3586,7 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.1 - '@vue/devtools-shared@7.6.7': + '@vue/devtools-shared@7.6.8': dependencies: rfdc: 1.4.1 @@ -3865,12 +3933,6 @@ snapshots: create-require@1.1.1: {} - cross-spawn@7.0.5: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -3977,32 +4039,33 @@ snapshots: es-errors@1.3.0: {} - esbuild@0.24.0: + esbuild@0.24.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 escalade@3.2.0: {} @@ -4010,20 +4073,20 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@9.1.0(eslint@9.16.0): + eslint-config-prettier@9.1.0(eslint@9.17.0): dependencies: - eslint: 9.16.0 + eslint: 9.17.0 - eslint-plugin-vue@9.32.0(eslint@9.16.0): + eslint-plugin-vue@9.32.0(eslint@9.17.0): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0) - eslint: 9.16.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) + eslint: 9.17.0 globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 semver: 7.6.3 - vue-eslint-parser: 9.4.3(eslint@9.16.0) + vue-eslint-parser: 9.4.3(eslint@9.17.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color @@ -4042,14 +4105,14 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.16.0: + eslint@9.17.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.0 '@eslint/core': 0.9.0 '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.16.0 + '@eslint/js': 9.17.0 '@eslint/plugin-kit': 0.2.3 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -4516,7 +4579,7 @@ snapshots: mitt@3.0.1: {} - monaco-editor@0.52.0: {} + monaco-editor@0.52.2: {} mrmime@2.0.0: {} @@ -4577,10 +4640,10 @@ snapshots: npm-normalize-package-bin@4.0.0: {} - npm-run-all2@7.0.1: + npm-run-all2@7.0.2: dependencies: ansi-styles: 6.2.1 - cross-spawn: 7.0.5 + cross-spawn: 7.0.6 memorystream: 0.3.1 minimatch: 9.0.5 pidtree: 0.6.0 @@ -5004,12 +5067,12 @@ snapshots: type-fest@0.20.2: {} - typescript-eslint@8.17.0(eslint@9.16.0)(typescript@5.6.3): + typescript-eslint@8.17.0(eslint@9.17.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0)(typescript@5.6.3))(eslint@9.16.0)(typescript@5.6.3) - '@typescript-eslint/parser': 8.17.0(eslint@9.16.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.17.0(eslint@9.16.0)(typescript@5.6.3) - eslint: 9.16.0 + '@typescript-eslint/eslint-plugin': 8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.17.0)(typescript@5.6.3))(eslint@9.17.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.17.0(eslint@9.17.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.17.0(eslint@9.17.0)(typescript@5.6.3) + eslint: 9.17.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -5058,11 +5121,11 @@ snapshots: vite-bundle-analyzer@0.15.2: {} - vite-hot-client@0.2.4(vite@6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)): + vite-hot-client@0.2.4(vite@6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8)): dependencies: - vite: 6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8) + vite: 6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8) - vite-plugin-inspect@0.8.8(rollup@4.27.4)(vite@6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)): + vite-plugin-inspect@0.8.9(rollup@4.27.4)(vite@6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.3(rollup@4.27.4) @@ -5073,38 +5136,38 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 3.0.0 - vite: 6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8) + vite: 6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - rollup - supports-color - vite-plugin-node-polyfills@0.22.0(rollup@4.27.4)(vite@6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)): + vite-plugin-node-polyfills@0.22.0(rollup@4.27.4)(vite@6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.27.4) node-stdlib-browser: 1.2.0 - vite: 6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8) + vite: 6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - rollup vite-plugin-remove-console@2.2.0: {} - vite-plugin-vue-devtools@7.6.7(rollup@4.27.4)(vite@6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): + vite-plugin-vue-devtools@7.6.8(rollup@4.27.4)(vite@6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): dependencies: - '@vue/devtools-core': 7.6.7(vite@6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) - '@vue/devtools-kit': 7.6.7 - '@vue/devtools-shared': 7.6.7 + '@vue/devtools-core': 7.6.8(vite@6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + '@vue/devtools-kit': 7.6.8 + '@vue/devtools-shared': 7.6.8 execa: 9.5.1 sirv: 3.0.0 - vite: 6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8) - vite-plugin-inspect: 0.8.8(rollup@4.27.4)(vite@6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)) - vite-plugin-vue-inspector: 5.3.1(vite@6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)) + vite: 6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8) + vite-plugin-inspect: 0.8.9(rollup@4.27.4)(vite@6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8)) + vite-plugin-vue-inspector: 5.3.1(vite@6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.3.1(vite@6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)): + vite-plugin-vue-inspector@5.3.1(vite@6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8)): dependencies: '@babel/core': 7.26.0 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) @@ -5115,17 +5178,17 @@ snapshots: '@vue/compiler-dom': 3.5.13 kolorist: 1.8.0 magic-string: 0.30.14 - vite: 6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8) + vite: 6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - supports-color - vite@6.0.3(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8): + vite@6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8): dependencies: - esbuild: 0.24.0 + esbuild: 0.24.2 postcss: 8.4.49 rollup: 4.27.4 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 fsevents: 2.3.3 less: 4.2.1 sass: 1.77.8 @@ -5152,10 +5215,10 @@ snapshots: transitivePeerDependencies: - '@vue/composition-api' - vue-eslint-parser@9.4.3(eslint@9.16.0): + vue-eslint-parser@9.4.3(eslint@9.17.0): dependencies: debug: 4.3.6 - eslint: 9.16.0 + eslint: 9.17.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 From e6d07fe71b1d7916c650aa8a6fdb96c755c5e295 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Mon, 30 Dec 2024 17:06:09 +0800 Subject: [PATCH 051/160] upgrade deps --- webui/package.json | 2 +- webui/pnpm-lock.yaml | 151 +++++++++---------------------------------- 2 files changed, 33 insertions(+), 120 deletions(-) diff --git a/webui/package.json b/webui/package.json index cd0f65969..cce01077e 100644 --- a/webui/package.json +++ b/webui/package.json @@ -64,7 +64,7 @@ "npm-run-all2": "^7.0.2", "prettier": "^3.4.2", "typescript": "~5.6.3", - "typescript-eslint": "^8.17.0", + "typescript-eslint": "^8.18.2", "vite": "^6.0.6", "vite-bundle-analyzer": "^0.15.2", "vite-plugin-node-polyfills": "^0.22.0", diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index 585390b75..1eaf77079 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -156,8 +156,8 @@ importers: specifier: ~5.6.3 version: 5.6.3 typescript-eslint: - specifier: ^8.17.0 - version: 8.17.0(eslint@9.17.0)(typescript@5.6.3) + specifier: ^8.18.2 + version: 8.18.2(eslint@9.17.0)(typescript@5.6.3) vite: specifier: ^6.0.6 version: 6.0.6(@types/node@22.10.2)(less@4.2.1)(sass@1.77.8) @@ -883,26 +883,13 @@ packages: '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==, tarball: https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz} - '@typescript-eslint/eslint-plugin@8.17.0': - resolution: {integrity: sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==} + '@typescript-eslint/eslint-plugin@8.18.2': + resolution: {integrity: sha512-adig4SzPLjeQ0Tm+jvsozSGiCliI2ajeURDGHjZ2llnA+A67HihCQ+a3amtPhUakd1GlwHxSRvzOZktbEvhPPg==, tarball: https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.2.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@8.17.0': - resolution: {integrity: sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.17.0.tgz} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/parser@8.18.2': resolution: {integrity: sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.2.tgz} @@ -911,60 +898,33 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.17.0': - resolution: {integrity: sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.18.2': resolution: {integrity: sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==, tarball: https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.2.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.17.0': - resolution: {integrity: sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==} + '@typescript-eslint/type-utils@8.18.2': + resolution: {integrity: sha512-AB/Wr1Lz31bzHfGm/jgbFR0VB0SML/hd2P1yxzKDM48YmP7vbyJNHRExUE/wZsQj2wUCvbWH8poNHFuxLqCTnA==, tarball: https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.2.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@8.17.0': - resolution: {integrity: sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/types@8.18.2': resolution: {integrity: sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==, tarball: https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.2.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.17.0': - resolution: {integrity: sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@8.18.2': resolution: {integrity: sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.2.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.17.0': - resolution: {integrity: sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==} + '@typescript-eslint/utils@8.18.2': + resolution: {integrity: sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==, tarball: https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.2.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/visitor-keys@8.17.0': - resolution: {integrity: sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/visitor-keys@8.18.2': resolution: {integrity: sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==, tarball: https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.2.tgz} @@ -1612,7 +1572,7 @@ packages: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, tarball: https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz} graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, tarball: https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz} has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -2417,15 +2377,12 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - typescript-eslint@8.17.0: - resolution: {integrity: sha512-409VXvFd/f1br1DCbuKNFqQpXICoTB+V51afcwG1pn1a3Cp92MqAUges3YjwEdQ0cMUoCIodjVDAYzyD8h3SYA==} + typescript-eslint@8.18.2: + resolution: {integrity: sha512-KuXezG6jHkvC3MvizeXgupZzaG5wjhU3yE8E7e6viOvAvD9xAWYp8/vy0WULTGe9DYDWcQu7aW03YIV3mSitrQ==, tarball: https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.18.2.tgz} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' typescript@5.6.3: resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} @@ -3347,33 +3304,19 @@ snapshots: '@types/web-bluetooth@0.0.20': {} - '@typescript-eslint/eslint-plugin@8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.17.0)(typescript@5.6.3))(eslint@9.17.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.18.2(@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.6.3))(eslint@9.17.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.17.0(eslint@9.17.0)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.17.0 - '@typescript-eslint/type-utils': 8.17.0(eslint@9.17.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.17.0(eslint@9.17.0)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.17.0 + '@typescript-eslint/parser': 8.18.2(eslint@9.17.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.18.2 + '@typescript-eslint/type-utils': 8.18.2(eslint@9.17.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.18.2(eslint@9.17.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.18.2 eslint: 9.17.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 ts-api-utils: 1.4.1(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.17.0(eslint@9.17.0)(typescript@5.6.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.17.0 - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.17.0 - debug: 4.3.7 - eslint: 9.17.0 - optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -3390,47 +3333,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.17.0': - dependencies: - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/visitor-keys': 8.17.0 - '@typescript-eslint/scope-manager@8.18.2': dependencies: '@typescript-eslint/types': 8.18.2 '@typescript-eslint/visitor-keys': 8.18.2 - '@typescript-eslint/type-utils@8.17.0(eslint@9.17.0)(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.18.2(eslint@9.17.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.17.0(eslint@9.17.0)(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.6.3) + '@typescript-eslint/utils': 8.18.2(eslint@9.17.0)(typescript@5.6.3) debug: 4.3.7 eslint: 9.17.0 ts-api-utils: 1.4.1(typescript@5.6.3) - optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.17.0': {} - '@typescript-eslint/types@8.18.2': {} - '@typescript-eslint/typescript-estree@8.17.0(typescript@5.6.3)': - dependencies: - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/visitor-keys': 8.17.0 - debug: 4.3.7 - fast-glob: 3.3.2 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.4.1(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.18.2(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 8.18.2 @@ -3445,23 +3365,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.17.0(eslint@9.17.0)(typescript@5.6.3)': + '@typescript-eslint/utils@8.18.2(eslint@9.17.0)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) - '@typescript-eslint/scope-manager': 8.17.0 - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.18.2 + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.6.3) eslint: 9.17.0 - optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.17.0': - dependencies: - '@typescript-eslint/types': 8.17.0 - eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.18.2': dependencies: '@typescript-eslint/types': 8.18.2 @@ -5067,13 +4981,12 @@ snapshots: type-fest@0.20.2: {} - typescript-eslint@8.17.0(eslint@9.17.0)(typescript@5.6.3): + typescript-eslint@8.18.2(eslint@9.17.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.17.0)(typescript@5.6.3))(eslint@9.17.0)(typescript@5.6.3) - '@typescript-eslint/parser': 8.17.0(eslint@9.17.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.17.0(eslint@9.17.0)(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.18.2(@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.6.3))(eslint@9.17.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.18.2(eslint@9.17.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.18.2(eslint@9.17.0)(typescript@5.6.3) eslint: 9.17.0 - optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color From 425015390425443006fb8e3325af0bdcc98f5121 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Mon, 30 Dec 2024 18:29:53 +0800 Subject: [PATCH 052/160] cleanup --- .../peerbanhelper/module/impl/webapi/PBHPeerController.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHPeerController.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHPeerController.java index a69d4f202..4c5a5e2e4 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHPeerController.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHPeerController.java @@ -78,7 +78,6 @@ public void onEnable() { private void handleInfo(Context ctx) throws SQLException { // 转换 IP 格式到 PBH 统一内部格式 activeMonitoringModule.flush(); - @SuppressWarnings("DataFlowIssue") String ip = IPAddressUtil.getIPAddress(ctx.pathParam("ip")).toString(); long banCount = historyDao.queryBuilder() .where() @@ -153,7 +152,6 @@ private void handleInfo(Context ctx) throws SQLException { private void handleBanHistory(Context ctx) throws SQLException { - @SuppressWarnings("DataFlowIssue") String ip = IPAddressUtil.getIPAddress(ctx.pathParam("ip")).toString(); Pageable pageable = new Pageable(ctx); var builder = historyDao.queryBuilder() @@ -169,7 +167,6 @@ private void handleBanHistory(Context ctx) throws SQLException { private void handleAccessHistory(Context ctx) throws SQLException { activeMonitoringModule.flush(); - @SuppressWarnings("DataFlowIssue") String ip = IPAddressUtil.getIPAddress(ctx.pathParam("ip")).toString(); Pageable pageable = new Pageable(ctx); var builder = peerRecordDao.queryBuilder() From 65f33c561ace0ae2e92bb67b9363b2f91c5c2cb6 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Mon, 30 Dec 2024 19:32:24 +0800 Subject: [PATCH 053/160] =?UTF-8?q?=E6=94=AF=E6=8C=81=20DOH?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 82b8a8c62..da965a794 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -181,7 +181,7 @@ decentralized: # Publish current banlist to IPFS to allow others subscribe your banlist, time unit: milliseconds, set to -1 to disable publish-banlist: 3600000 -# 自定义 DNS 解析器,暂不支持 DoH/DoT/DoQ +# 自定义 DNS 解析器,暂不支持 DoT/DoQ # 留空则使用系统 DNS # 部分 DNS 存在速率限制,建议使用与系统 DNS 不同的 DNS,以避免影响正常上网解析 # 要使此配置生效,需要启用 DNSJava 实验 From bdddb3042cb15a8e9925e327e70a96acd8b8914f Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Mon, 30 Dec 2024 19:38:20 +0800 Subject: [PATCH 054/160] =?UTF-8?q?=E6=9A=82=E5=81=9C=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ghostchu/peerbanhelper/downloader/AbstractDownloader.java | 1 + .../ghostchu/peerbanhelper/downloader/DownloaderLastStatus.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/AbstractDownloader.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/AbstractDownloader.java index 4edd1b778..71dbbdadf 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/AbstractDownloader.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/AbstractDownloader.java @@ -28,6 +28,7 @@ public AbstractDownloader(String name, AlertManager alertManager) { @Override public DownloaderLoginResult login() { if(isPaused()){ + lastStatus = DownloaderLastStatus.PAUSED; return new DownloaderLoginResult(DownloaderLoginResult.Status.PAUSED, new TranslationComponent(Lang.DOWNLOADER_PAUSED)); } if (nextLoginTry >= System.currentTimeMillis()) { diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/DownloaderLastStatus.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/DownloaderLastStatus.java index 9f0daf2da..db10bcedd 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/DownloaderLastStatus.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/DownloaderLastStatus.java @@ -2,6 +2,7 @@ public enum DownloaderLastStatus { HEALTHY, + PAUSED, NEED_TAKE_ACTION, ERROR, UNKNOWN From 1a8f7973f3141241873bfada28078c51b24ec70a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Dec 2024 14:06:45 +0000 Subject: [PATCH 055/160] Bump com.github.mizosoft.methanol:methanol from 1.7.0 to 1.8.0 Bumps [com.github.mizosoft.methanol:methanol](https://github.com/mizosoft/methanol) from 1.7.0 to 1.8.0. - [Release notes](https://github.com/mizosoft/methanol/releases) - [Changelog](https://github.com/mizosoft/methanol/blob/master/CHANGELOG.md) - [Commits](https://github.com/mizosoft/methanol/compare/v1.7.0...v1.8.0) --- updated-dependencies: - dependency-name: com.github.mizosoft.methanol:methanol dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 136059688..dd9c770ba 100644 --- a/pom.xml +++ b/pom.xml @@ -313,7 +313,7 @@ com.github.mizosoft.methanol methanol - 1.7.0 + 1.8.0 From 036288a021d06f8acdeb02cdf6507b48e9876b80 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 31 Dec 2024 22:32:28 +0800 Subject: [PATCH 056/160] Fix NPE bug --- .../ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java index 181bb5549..f04d94a96 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/PTRBlacklist.java @@ -42,6 +42,7 @@ public class PTRBlacklist extends AbstractRuleFeatureModule implements Reloadabl @Autowired private DNSLookup dnsLookup; private long banDuration; + @Autowired private Laboratory laboratory; @Override From 3ec3528e069a9ba377ca83ac2d8b78149504ad06 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 31 Dec 2024 22:36:54 +0800 Subject: [PATCH 057/160] =?UTF-8?q?IP=20=E9=BB=91=E5=90=8D=E5=8D=95?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=B0=81=E7=A6=81=E5=85=81=E8=AE=B8=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=B0=81=E7=A6=81=E5=8E=9F=E5=9B=A0=EF=BC=88=E8=A1=8C?= =?UTF-8?q?=E5=B0=BE=E6=B3=A8=E9=87=8A=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 腾讯问卷调研建议 --- .../btn/BtnExceptionRuleParsed.java | 13 ++-- .../peerbanhelper/btn/BtnRuleParsed.java | 11 ++-- .../module/impl/rule/IPBlackRuleList.java | 61 +++++++++++-------- .../peerbanhelper/util/rule/MatchResult.java | 8 +-- .../util/rule/MatchResultEnum.java | 7 +++ .../util/rule/matcher/IPMatcher.java | 19 +++--- src/main/resources/lang/en_us/messages.yml | 2 +- src/main/resources/lang/messages_fallback.yml | 2 +- src/main/resources/lang/zh_cn/messages.yml | 2 +- 9 files changed, 68 insertions(+), 57 deletions(-) create mode 100644 src/main/java/com/ghostchu/peerbanhelper/util/rule/MatchResultEnum.java diff --git a/src/main/java/com/ghostchu/peerbanhelper/btn/BtnExceptionRuleParsed.java b/src/main/java/com/ghostchu/peerbanhelper/btn/BtnExceptionRuleParsed.java index e7ad7c426..0e1c5ec06 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/btn/BtnExceptionRuleParsed.java +++ b/src/main/java/com/ghostchu/peerbanhelper/btn/BtnExceptionRuleParsed.java @@ -3,12 +3,9 @@ import com.ghostchu.peerbanhelper.text.Lang; import com.ghostchu.peerbanhelper.text.TranslationComponent; import com.ghostchu.peerbanhelper.util.IPAddressUtil; -import com.ghostchu.peerbanhelper.util.rule.AbstractMatcher; -import com.ghostchu.peerbanhelper.util.rule.MatchResult; -import com.ghostchu.peerbanhelper.util.rule.Rule; -import com.ghostchu.peerbanhelper.util.rule.RuleParser; +import com.ghostchu.peerbanhelper.util.rule.*; import com.ghostchu.peerbanhelper.util.rule.matcher.IPMatcher; -import inet.ipaddr.format.util.DualIPv4v6Tries; +import inet.ipaddr.format.util.DualIPv4v6AssociativeTries; import lombok.Data; import org.jetbrains.annotations.NotNull; @@ -42,7 +39,7 @@ private Map> parsePortRule(Map> portRul @Override public @NotNull MatchResult match0(@NotNull String content) { boolean hit = Integer.parseInt(content) == s; - return hit ? MatchResult.TRUE : MatchResult.DEFAULT; + return hit ? new MatchResult(MatchResultEnum.TRUE, "Port matched") : new MatchResult(MatchResultEnum.DEFAULT, "Port seems OK"); } @Override @@ -69,7 +66,7 @@ public String matcherIdentifier() { public Map> parseIPRule(Map> raw) { Map> rules = new HashMap<>(); raw.forEach((k, v) -> { - DualIPv4v6Tries tries = new DualIPv4v6Tries(); + DualIPv4v6AssociativeTries tries = new DualIPv4v6AssociativeTries<>(); v.stream().map(IPAddressUtil::getIPAddress).forEach(tries::add); rules.put(k, List.of(new BtnRuleIpMatcher(version, k, k, List.of(tries)))); }); @@ -86,7 +83,7 @@ public static class BtnRuleIpMatcher extends IPMatcher { private final String version; - public BtnRuleIpMatcher(String version, String ruleId, String ruleName, List ruleData) { + public BtnRuleIpMatcher(String version, String ruleId, String ruleName, List> ruleData) { super(ruleId, ruleName, ruleData); this.version = version; } diff --git a/src/main/java/com/ghostchu/peerbanhelper/btn/BtnRuleParsed.java b/src/main/java/com/ghostchu/peerbanhelper/btn/BtnRuleParsed.java index 40e037f02..baa5353ba 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/btn/BtnRuleParsed.java +++ b/src/main/java/com/ghostchu/peerbanhelper/btn/BtnRuleParsed.java @@ -5,12 +5,9 @@ import com.ghostchu.peerbanhelper.text.Lang; import com.ghostchu.peerbanhelper.text.TranslationComponent; import com.ghostchu.peerbanhelper.util.IPAddressUtil; -import com.ghostchu.peerbanhelper.util.rule.AbstractMatcher; -import com.ghostchu.peerbanhelper.util.rule.MatchResult; -import com.ghostchu.peerbanhelper.util.rule.Rule; -import com.ghostchu.peerbanhelper.util.rule.RuleParser; +import com.ghostchu.peerbanhelper.util.rule.*; import com.ghostchu.peerbanhelper.util.rule.matcher.IPMatcher; -import inet.ipaddr.format.util.DualIPv4v6Tries; +import inet.ipaddr.format.util.DualIPv4v6AssociativeTries; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; @@ -70,7 +67,7 @@ private Map> parsePortRule(Map> portRul @Override public @NotNull MatchResult match0(@NotNull String content) { boolean hit = Integer.parseInt(content) == s; - return hit ? MatchResult.TRUE : MatchResult.DEFAULT; + return hit ? new MatchResult(MatchResultEnum.TRUE, "Port matched") : new MatchResult(MatchResultEnum.DEFAULT, "Port seems OK"); } @Override @@ -97,7 +94,7 @@ public String matcherIdentifier() { public Map parseIPRule(Map> raw) { Map rules = new HashMap<>(); raw.forEach((k, v) -> { - DualIPv4v6Tries tries = new DualIPv4v6Tries(); + DualIPv4v6AssociativeTries tries = new DualIPv4v6AssociativeTries<>(); v.stream().map(IPAddressUtil::getIPAddress).forEach(tries::add); rules.put(k,new IPMatcher(version, k, List.of(tries))); }); diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java index 550c73c49..e03d37c4a 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java @@ -21,6 +21,7 @@ import com.ghostchu.peerbanhelper.util.paging.Page; import com.ghostchu.peerbanhelper.util.paging.Pageable; import com.ghostchu.peerbanhelper.util.rule.MatchResult; +import com.ghostchu.peerbanhelper.util.rule.MatchResultEnum; import com.ghostchu.peerbanhelper.util.rule.ModuleMatchCache; import com.ghostchu.peerbanhelper.util.rule.matcher.IPMatcher; import com.ghostchu.peerbanhelper.web.wrapper.StdResp; @@ -32,13 +33,15 @@ import com.google.common.io.Files; import com.j256.ormlite.stmt.SelectArg; import inet.ipaddr.IPAddress; -import inet.ipaddr.format.util.DualIPv4v6Tries; +import inet.ipaddr.format.util.DualIPv4v6AssociativeTries; import io.ipfs.cid.Cid; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.bspfsystems.yamlconfiguration.configuration.ConfigurationSection; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.springframework.stereotype.Component; import java.io.File; @@ -122,28 +125,21 @@ public ReloadResult reloadModule() throws Exception { @Override public @NotNull CheckResult shouldBanPeer(@NotNull Torrent torrent, @NotNull Peer peer, @NotNull Downloader downloader, @NotNull ExecutorService ruleExecuteExecutor) { return getCache().readCacheButWritePassOnly(this, peer.getPeerAddress().getIp(), () -> { - long t1 = System.currentTimeMillis(); String ip = peer.getPeerAddress().getIp(); List results = new ArrayList<>(); ipBanMatchers.forEach(rule -> results.add(new IPBanResult(rule.getRuleName(), rule.match(ip)))); - AtomicReference matchRule = new AtomicReference<>(); - boolean mr = results.stream().anyMatch(ipBanResult -> { + for (IPBanResult ipBanResult : results) { try { - if (ipBanResult == null) return false; - boolean match = ipBanResult.matchResult() == MatchResult.TRUE; + if (ipBanResult == null) return pass(); + boolean match = ipBanResult.matchResult().result() == MatchResultEnum.TRUE; if (match) { - matchRule.set(ipBanResult); + return new CheckResult(getClass(), PeerAction.BAN, banDuration, new TranslationComponent(ipBanResult.ruleName()), new TranslationComponent(Lang.MODULE_IBL_MATCH_IP_RULE, ipBanResult.ruleName(), ip, Optional.ofNullable(ipBanResult.matchResult().comment()).orElse("Unknown"))); } - return match; + return pass(); } catch (Exception e) { log.error(tlUI(Lang.IP_BAN_RULE_MATCH_ERROR), e); - return false; + return pass(); } - }); - long t2 = System.currentTimeMillis(); - log.debug(tlUI(Lang.IP_BAN_RULE_MATCH_TIME, t2 - t1)); - if (mr) { - return new CheckResult(getClass(), PeerAction.BAN, banDuration, new TranslationComponent(matchRule.get().ruleName()), new TranslationComponent(Lang.MODULE_IBL_MATCH_IP_RULE, matchRule.get().ruleName(), ip)); } return pass(); }, true); @@ -203,7 +199,7 @@ public StdResp updateRule(String locale, @NotNull ConfigurationSection rule, IPB File dir = new File(Main.getDataDirectory(), "/sub"); dir.mkdirs(); File ruleFile = new File(dir, ruleFileName); - DualIPv4v6Tries ipAddresses = new DualIPv4v6Tries(); + DualIPv4v6AssociativeTries ipAddresses = new DualIPv4v6AssociativeTries<>(); getResource(url) .whenComplete((dataUpdateResult, throwable) -> { if (throwable != null) { @@ -300,15 +296,15 @@ private CompletableFuture getResource(String url) { } // IPNS if (uri.getScheme().equalsIgnoreCase("ipns")) { - var ipnsCid = uri.getHost(); + var ipnsCid = uri.getHost(); var ipfs = decentralizedManager.getIpfs(); if (ipfs == null) { throw new IllegalStateException(tlUI(Lang.MODULE_IBL_UPDATE_IPFS_NOT_AVAILABLE)); } try { - var cid = ipfs.name.resolve(Cid.decode(ipnsCid), true); - var data = ipfs.cat(Cid.decode(StringUtils.substringAfter(cid,"/ipfs/"))); - return new DataUpdateResult(200, "Data get from IPFS via IPNS", data); + var cid = ipfs.name.resolve(Cid.decode(ipnsCid), true); + var data = ipfs.cat(Cid.decode(StringUtils.substringAfter(cid, "/ipfs/"))); + return new DataUpdateResult(200, "Data get from IPFS via IPNS", data); } catch (IOException e) { throw new RuntimeException(e); } @@ -339,7 +335,7 @@ private CompletableFuture getResource(String url) { * @param ips ip列表 * @return 加载的行数 */ - private int fileToIPList(File ruleFile, DualIPv4v6Tries ips) throws IOException { + private int fileToIPList(File ruleFile, DualIPv4v6AssociativeTries ips) throws IOException { AtomicInteger count = new AtomicInteger(); Files.readLines(ruleFile, StandardCharsets.UTF_8).stream().filter(s -> !s.isBlank()).forEach(ele -> { if (ele.startsWith("#")) { @@ -349,7 +345,7 @@ private int fileToIPList(File ruleFile, DualIPv4v6Tries ips) throws IOException var parsedIp = parseRuleLine(ele); if (parsedIp != null) { count.getAndIncrement(); - ips.add(parsedIp); + ips.put(parsedIp.getLeft(), parsedIp.getRight()); } } catch (Exception e) { log.error("Unable parse rule: {}", ele, e); @@ -365,7 +361,7 @@ private int fileToIPList(File ruleFile, DualIPv4v6Tries ips) throws IOException * @param ips ip列表 * @return 加载的行数 */ - private int stringToIPList(String data, DualIPv4v6Tries ips) throws IOException { + private int stringToIPList(String data, DualIPv4v6AssociativeTries ips) throws IOException { AtomicInteger count = new AtomicInteger(); Arrays.stream(data.split("\n")).filter(s -> !s.isBlank()).forEach(ele -> { if (ele.startsWith("#")) { @@ -375,7 +371,7 @@ private int stringToIPList(String data, DualIPv4v6Tries ips) throws IOException var parsedIp = parseRuleLine(ele); if (parsedIp != null) { count.getAndIncrement(); - ips.add(parsedIp); + ips.put(parsedIp.getLeft(), parsedIp.getRight()); } } catch (Exception e) { log.error("Unable parse rule: {}", ele, e); @@ -384,7 +380,7 @@ private int stringToIPList(String data, DualIPv4v6Tries ips) throws IOException return count.get(); } - private IPAddress parseRuleLine(String ele) { + private Pair parseRuleLine(String ele) { // 注释? if (ele.startsWith("#")) return null; // 检查是否是 DAT/eMule 格式 @@ -398,11 +394,24 @@ private IPAddress parseRuleLine(String ele) { IPAddress start = IPAddressUtil.getIPAddress(spilted[0]); IPAddress end = IPAddressUtil.getIPAddress(spilted[1]); int level = Integer.parseInt(spilted[2]); + String comment = spilted.length > 3 ? spilted[3] : null; if (level >= 128) return null; if (start == null || end == null) return null; - return start.spanWithRange(end).coverWithPrefixBlock(); + return Pair.of(start.spanWithRange(end).coverWithPrefixBlock(), comment); + }else{ + // ip #end-line-comment + String ip; + if (ele.contains("#")) { + ip = ele.substring(0, ele.indexOf("#")); + String comment = null; + if (ele.contains("#")) { + comment = ele.substring(ele.indexOf("#") + 1); + } + return Pair.of(IPAddressUtil.getIPAddress(ip), comment); + }else{ + return Pair.of(IPAddressUtil.getIPAddress(ele), null); + } } - return IPAddressUtil.getIPAddress(ele); } /** diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/MatchResult.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/MatchResult.java index 13cb3ccc3..8f1707bd5 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/MatchResult.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/MatchResult.java @@ -1,7 +1,7 @@ package com.ghostchu.peerbanhelper.util.rule; -public enum MatchResult { - DEFAULT, - TRUE, - FALSE +import org.jetbrains.annotations.Nullable; + +public record MatchResult(MatchResultEnum result, @Nullable String comment) { + } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/MatchResultEnum.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/MatchResultEnum.java new file mode 100644 index 000000000..9728fdf0f --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/MatchResultEnum.java @@ -0,0 +1,7 @@ +package com.ghostchu.peerbanhelper.util.rule; + +public enum MatchResultEnum { + DEFAULT, + TRUE, + FALSE +} diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/IPMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/IPMatcher.java index f9f9e4126..39c5dff80 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/IPMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/IPMatcher.java @@ -4,9 +4,10 @@ import com.ghostchu.peerbanhelper.text.TranslationComponent; import com.ghostchu.peerbanhelper.util.IPAddressUtil; import com.ghostchu.peerbanhelper.util.rule.MatchResult; +import com.ghostchu.peerbanhelper.util.rule.MatchResultEnum; import com.ghostchu.peerbanhelper.util.rule.RuleMatcher; import inet.ipaddr.IPAddress; -import inet.ipaddr.format.util.DualIPv4v6Tries; +import inet.ipaddr.format.util.DualIPv4v6AssociativeTries; import lombok.EqualsAndHashCode; import lombok.ToString; import lombok.extern.slf4j.Slf4j; @@ -17,10 +18,10 @@ @Slf4j @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class IPMatcher extends RuleMatcher { - private DualIPv4v6Tries ips; +public class IPMatcher extends RuleMatcher> { + private DualIPv4v6AssociativeTries ips; - public IPMatcher(String ruleId, String ruleName, List ruleData) { + public IPMatcher(String ruleId, String ruleName, List> ruleData) { super(ruleId, ruleName, ruleData); this.ips = ruleData.getFirst(); } @@ -31,7 +32,7 @@ public IPMatcher(String ruleId, String ruleName, List ruleData) * @param ruleName 规则名 * @param ruleData 规则数据 */ - public void setData(String ruleName, List ruleData) { + public void setData(String ruleName, List> ruleData) { setRuleName(ruleName); this.ips = ruleData.getFirst(); } @@ -43,14 +44,14 @@ public long size() { @Override public @NotNull MatchResult match0(@NotNull String content) { final IPAddress ip = IPAddressUtil.getIPAddress(content); - if (ip == null) return MatchResult.DEFAULT; + if (ip == null) return new MatchResult(MatchResultEnum.DEFAULT, "IP is null"); if (ips == null) { - return MatchResult.DEFAULT; + new MatchResult(MatchResultEnum.DEFAULT, "IPs set is null"); } if (ips.elementContains(ip)) { - return MatchResult.TRUE; + return new MatchResult(MatchResultEnum.DEFAULT, ips.get(ip)); } - return MatchResult.DEFAULT; + return new MatchResult(MatchResultEnum.DEFAULT, "Given IP not in IPs set"); } @Override diff --git a/src/main/resources/lang/en_us/messages.yml b/src/main/resources/lang/en_us/messages.yml index 1630d307c..bb138fd4e 100644 --- a/src/main/resources/lang/en_us/messages.yml +++ b/src/main/resources/lang/en_us/messages.yml @@ -18,7 +18,7 @@ CHECK_COMPLETED: "[Completed] Checked {} downloaders with {} active torrents and ERR_INVALID_RULE_SYNTAX: "The expression of rule {} is invalid, please check for spelling errors" MODULE_CNB_MATCH_CLIENT_NAME: "Match ClientName (UserAgent): {}" MODULE_IBL_MATCH_IP: "Match IP rule: {}" -MODULE_IBL_MATCH_IP_RULE: "Match IP blacklist subscription rule: {}, IP address: {}" +MODULE_IBL_MATCH_IP_RULE: "Match IP blacklist subscription rule: {}, IP address: {}, Comment: {}" MODULE_IBL_MATCH_ASN: "Match ASN rule: {}" MODULE_IBL_MATCH_REGION: "Match country or city ISO code rule: {}" MODULE_IBL_MATCH_CITY: "Match city rule: {}" diff --git a/src/main/resources/lang/messages_fallback.yml b/src/main/resources/lang/messages_fallback.yml index 6eb0a64eb..257968c45 100644 --- a/src/main/resources/lang/messages_fallback.yml +++ b/src/main/resources/lang/messages_fallback.yml @@ -18,7 +18,7 @@ CHECK_COMPLETED: "[完成] 已检查 {} 的 {} 个活跃 Torrent 和 {} 个对 ERR_INVALID_RULE_SYNTAX: "规则 {} 的表达式无效,请检查是否存在拼写错误" MODULE_CNB_MATCH_CLIENT_NAME: "匹配 ClientName (UserAgent): {}" MODULE_IBL_MATCH_IP: "匹配 IP 规则: {}" -MODULE_IBL_MATCH_IP_RULE: "匹配 IP黑名单订阅 规则: {}, IP 地址: {}" +MODULE_IBL_MATCH_IP_RULE: "匹配 IP黑名单订阅 规则: {}, IP 地址: {}, 备注: {}" MODULE_IBL_MATCH_ASN: "匹配 ASN 规则: {}" MODULE_IBL_MATCH_REGION: "匹配国家或地区 ISO 代码规则: {}" MODULE_IBL_EXCEPTION_GEOIP: "匹配 GeoIP 信息时出现异常,请反馈错误给开发者" diff --git a/src/main/resources/lang/zh_cn/messages.yml b/src/main/resources/lang/zh_cn/messages.yml index 445c161d3..5b90b44ba 100644 --- a/src/main/resources/lang/zh_cn/messages.yml +++ b/src/main/resources/lang/zh_cn/messages.yml @@ -18,7 +18,7 @@ CHECK_COMPLETED: "[完成] 已检查 {} 的 {} 个活跃 Torrent 和 {} 个对 ERR_INVALID_RULE_SYNTAX: "规则 {} 的表达式无效,请检查是否存在拼写错误" MODULE_CNB_MATCH_CLIENT_NAME: "匹配 ClientName (UserAgent): {}" MODULE_IBL_MATCH_IP: "匹配 IP 规则: {}" -MODULE_IBL_MATCH_IP_RULE: "匹配 IP黑名单订阅 规则: {}, IP 地址: {}" +MODULE_IBL_MATCH_IP_RULE: "匹配 IP黑名单订阅 规则: {}, IP 地址: {}, 备注: {}" MODULE_IBL_MATCH_ASN: "匹配 ASN 规则: {}" MODULE_IBL_MATCH_REGION: "匹配国家或地区 ISO 代码规则: {}" MODULE_IBL_EXCEPTION_GEOIP: "匹配 GeoIP 信息时出现异常,请反馈错误给开发者" From dfabc2f4734e885f6a98d0b84e310c6a41d93230 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 31 Dec 2024 22:41:23 +0800 Subject: [PATCH 058/160] =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=A7=84=E5=88=99?= =?UTF-8?q?=E5=89=8D=E5=8D=95=E8=A1=8C=E3=80=81=E5=A4=9A=E8=A1=8C=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/impl/rule/IPBlackRuleList.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java index e03d37c4a..1eb0beebb 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java @@ -51,10 +51,7 @@ import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; @@ -363,26 +360,30 @@ private int fileToIPList(File ruleFile, DualIPv4v6AssociativeTries ips) */ private int stringToIPList(String data, DualIPv4v6AssociativeTries ips) throws IOException { AtomicInteger count = new AtomicInteger(); - Arrays.stream(data.split("\n")).filter(s -> !s.isBlank()).forEach(ele -> { + StringJoiner sj = new StringJoiner("\n"); + for (String ele : data.split("\n")) { + if(ele.isBlank()) continue; if (ele.startsWith("#")) { - return; // 注释 + // add into sj but without hashtag prefix + sj.add(ele.substring(1)); + continue; } try { - var parsedIp = parseRuleLine(ele); + var parsedIp = parseRuleLine(ele, sj.toString()); if (parsedIp != null) { count.getAndIncrement(); ips.put(parsedIp.getLeft(), parsedIp.getRight()); } } catch (Exception e) { log.error("Unable parse rule: {}", ele, e); + }finally { + sj = new StringJoiner("\n"); } - }); + } return count.get(); } - private Pair parseRuleLine(String ele) { - // 注释? - if (ele.startsWith("#")) return null; + private Pair parseRuleLine(String ele, String preReadComment) { // 检查是否是 DAT/eMule 格式 // 016.000.000.000 , 016.255.255.255 , 200 , Yet another organization // 032.000.000.000 , 032.255.255.255 , 200 , And another @@ -394,7 +395,7 @@ private int stringToIPList(String data, DualIPv4v6AssociativeTries ips) IPAddress start = IPAddressUtil.getIPAddress(spilted[0]); IPAddress end = IPAddressUtil.getIPAddress(spilted[1]); int level = Integer.parseInt(spilted[2]); - String comment = spilted.length > 3 ? spilted[3] : null; + String comment = spilted.length > 3 ? spilted[3] : preReadComment; if (level >= 128) return null; if (start == null || end == null) return null; return Pair.of(start.spanWithRange(end).coverWithPrefixBlock(), comment); @@ -407,9 +408,9 @@ private int stringToIPList(String data, DualIPv4v6AssociativeTries ips) if (ele.contains("#")) { comment = ele.substring(ele.indexOf("#") + 1); } - return Pair.of(IPAddressUtil.getIPAddress(ip), comment); + return Pair.of(IPAddressUtil.getIPAddress(ip), Optional.ofNullable(comment).orElse(preReadComment)); }else{ - return Pair.of(IPAddressUtil.getIPAddress(ele), null); + return Pair.of(IPAddressUtil.getIPAddress(ele), preReadComment); } } } From a322e55203fd7927234b1772857ea7a484add741 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 31 Dec 2024 22:43:33 +0800 Subject: [PATCH 059/160] =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=A7=84=E5=88=99?= =?UTF-8?q?=E5=89=8D=E5=8D=95=E8=A1=8C=E3=80=81=E5=A4=9A=E8=A1=8C=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/impl/rule/IPBlackRuleList.java | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java index 1eb0beebb..3cff8d028 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java @@ -51,7 +51,10 @@ import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; import java.sql.SQLException; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.StringJoiner; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; @@ -334,20 +337,27 @@ private CompletableFuture getResource(String url) { */ private int fileToIPList(File ruleFile, DualIPv4v6AssociativeTries ips) throws IOException { AtomicInteger count = new AtomicInteger(); - Files.readLines(ruleFile, StandardCharsets.UTF_8).stream().filter(s -> !s.isBlank()).forEach(ele -> { + StringJoiner sj = new StringJoiner("\n"); + var lines = Files.readLines(ruleFile, StandardCharsets.UTF_8); + for (String ele : lines) { + if (ele.isBlank()) continue; if (ele.startsWith("#")) { - return; // 注释 + // add into sj but without hashtag prefix + sj.add(ele.substring(1)); + continue; } try { - var parsedIp = parseRuleLine(ele); + var parsedIp = parseRuleLine(ele, sj.toString()); if (parsedIp != null) { count.getAndIncrement(); ips.put(parsedIp.getLeft(), parsedIp.getRight()); } } catch (Exception e) { log.error("Unable parse rule: {}", ele, e); + } finally { + sj = new StringJoiner("\n"); } - }); + } return count.get(); } @@ -362,7 +372,7 @@ private int stringToIPList(String data, DualIPv4v6AssociativeTries ips) AtomicInteger count = new AtomicInteger(); StringJoiner sj = new StringJoiner("\n"); for (String ele : data.split("\n")) { - if(ele.isBlank()) continue; + if (ele.isBlank()) continue; if (ele.startsWith("#")) { // add into sj but without hashtag prefix sj.add(ele.substring(1)); @@ -376,7 +386,7 @@ private int stringToIPList(String data, DualIPv4v6AssociativeTries ips) } } catch (Exception e) { log.error("Unable parse rule: {}", ele, e); - }finally { + } finally { sj = new StringJoiner("\n"); } } @@ -399,7 +409,7 @@ private int stringToIPList(String data, DualIPv4v6AssociativeTries ips) if (level >= 128) return null; if (start == null || end == null) return null; return Pair.of(start.spanWithRange(end).coverWithPrefixBlock(), comment); - }else{ + } else { // ip #end-line-comment String ip; if (ele.contains("#")) { @@ -409,7 +419,7 @@ private int stringToIPList(String data, DualIPv4v6AssociativeTries ips) comment = ele.substring(ele.indexOf("#") + 1); } return Pair.of(IPAddressUtil.getIPAddress(ip), Optional.ofNullable(comment).orElse(preReadComment)); - }else{ + } else { return Pair.of(IPAddressUtil.getIPAddress(ele), preReadComment); } } From aba4a84c831d2b2947686a597def7dc3a939b10d Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 31 Dec 2024 22:54:04 +0800 Subject: [PATCH 060/160] fix build --- .../module/impl/rule/BtnNetworkOnline.java | 7 ++----- .../util/rule/AbstractJsonMatcher.java | 4 ++-- .../util/rule/RuleMatchResult.java | 4 +++- .../peerbanhelper/util/rule/RuleParser.java | 21 +++++++++---------- .../rule/matcher/StringContainsMatcher.java | 10 ++++----- .../rule/matcher/StringEndsWithMatcher.java | 10 ++++----- .../rule/matcher/StringEqualsMatcher.java | 11 +++++----- .../rule/matcher/StringLengthMatcher.java | 11 +++++----- .../util/rule/matcher/StringRegexMatcher.java | 10 ++++----- .../rule/matcher/StringStartsWithMatcher.java | 10 ++++----- 10 files changed, 47 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java index 9f60d757c..7e8136a7d 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/BtnNetworkOnline.java @@ -21,10 +21,7 @@ import com.ghostchu.peerbanhelper.util.NullUtil; import com.ghostchu.peerbanhelper.util.SharedObject; import com.ghostchu.peerbanhelper.util.context.IgnoreScan; -import com.ghostchu.peerbanhelper.util.rule.MatchResult; -import com.ghostchu.peerbanhelper.util.rule.Rule; -import com.ghostchu.peerbanhelper.util.rule.RuleMatchResult; -import com.ghostchu.peerbanhelper.util.rule.RuleParser; +import com.ghostchu.peerbanhelper.util.rule.*; import com.ghostchu.peerbanhelper.web.JavalinWebContainer; import com.ghostchu.peerbanhelper.web.Role; import com.ghostchu.peerbanhelper.web.wrapper.StdResp; @@ -413,7 +410,7 @@ private CheckResult checkIpRule(BtnRuleParsed rule, @NotNull Torrent torrent, @N for (String category : rule.getIpRules().keySet()) { var ipMatcher = rule.getIpRules().get(category); MatchResult matchResult = ipMatcher.match(pa.toString()); - if (matchResult == MatchResult.TRUE) { + if (matchResult.result() == MatchResultEnum.TRUE) { return new CheckResult(getClass(), PeerAction.BAN, banDuration, new TranslationComponent(Lang.BTN_BTN_RULE, category, category), new TranslationComponent(Lang.MODULE_BTN_BAN, "IP", category, pa.toString())); } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/AbstractJsonMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/AbstractJsonMatcher.java index d4f264d5e..f9f48f55a 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/AbstractJsonMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/AbstractJsonMatcher.java @@ -24,8 +24,8 @@ public AbstractJsonMatcher(JsonObject rule) { content = ""; } if (condition != null) { - if (condition.match(content) == MatchResult.FALSE) { - return MatchResult.FALSE; + if (condition.match(content).result() == MatchResultEnum.FALSE) { + return new MatchResult(MatchResultEnum.FALSE, "Condition not met: " + condition.toPrintableText(Main.DEF_LOCALE) + " on " + toPrintableText(Main.DEF_LOCALE)); } } return match0(content); diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleMatchResult.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleMatchResult.java index 5e5ad129a..c768b7f8d 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleMatchResult.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleMatchResult.java @@ -1,4 +1,6 @@ package com.ghostchu.peerbanhelper.util.rule; -public record RuleMatchResult(boolean hit, Rule rule) { +import org.jetbrains.annotations.Nullable; + +public record RuleMatchResult(boolean hit, Rule rule, @Nullable String comment) { } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleParser.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleParser.java index bbd13f874..c1eb30bac 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleParser.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleParser.java @@ -9,7 +9,6 @@ import org.jetbrains.annotations.NotNull; import java.util.List; -import java.util.Map; @Slf4j public class RuleParser { @@ -21,14 +20,14 @@ public static List parse(List string) { } public static RuleMatchResult matchRule(List rules, String content) { - RuleMatchResult matchResult = new RuleMatchResult(false, null); + RuleMatchResult matchResult = new RuleMatchResult(false, null, null); for (Rule rule : rules) { MatchResult result = rule.match(content); - if (result == MatchResult.FALSE) { // 规则的优先级最高 - return new RuleMatchResult(false, rule); + if (result.result() == MatchResultEnum.FALSE) { // 规则的优先级最高 + return new RuleMatchResult(false, rule, result.comment()); } - if (result == MatchResult.TRUE) { // 其次,可被覆盖 - matchResult = new RuleMatchResult(true, rule); + if (result.result() == MatchResultEnum.TRUE) { // 其次,可被覆盖 + matchResult = new RuleMatchResult(true, rule,result.comment()); } } @@ -41,7 +40,7 @@ public static Rule parse(JsonElement element) { return new Rule() { @Override public @NotNull MatchResult match(@NotNull String content) { - return MatchResult.TRUE; + return new MatchResult(MatchResultEnum.TRUE, null); } @Override @@ -59,7 +58,7 @@ public String matcherIdentifier() { return new Rule() { @Override public @NotNull MatchResult match(@NotNull String content) { - return MatchResult.DEFAULT; + return new MatchResult(MatchResultEnum.TRUE, null); } @Override @@ -79,7 +78,7 @@ public String matcherIdentifier() { return new Rule() { @Override public @NotNull MatchResult match(@NotNull String content) { - return primitive.getAsBoolean() ? MatchResult.TRUE : MatchResult.FALSE; + return primitive.getAsBoolean() ? new MatchResult(MatchResultEnum.TRUE, "Boolean condition") : new MatchResult(MatchResultEnum.FALSE, "Boolean condition"); } @Override @@ -97,7 +96,7 @@ public String matcherIdentifier() { return new Rule() { @Override public @NotNull MatchResult match(@NotNull String content) { - return primitive.getAsInt() != 0 ? MatchResult.TRUE : MatchResult.FALSE; + return primitive.getAsBoolean() ? new MatchResult(MatchResultEnum.TRUE, "Boolean (by Integer) condition") : new MatchResult(MatchResultEnum.FALSE, "Boolean (by Integer) condition"); } @Override @@ -116,7 +115,7 @@ public String matcherIdentifier() { @Override public @NotNull MatchResult match(@NotNull String content) { String str = primitive.getAsString(); - return Boolean.parseBoolean(str) ? MatchResult.TRUE : MatchResult.FALSE; + return Boolean.parseBoolean(str) ? new MatchResult(MatchResultEnum.TRUE, "Boolean (by String) condition") : new MatchResult(MatchResultEnum.FALSE, "Boolean (by String) condition"); } @Override diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringContainsMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringContainsMatcher.java index cbd200ae3..e27a9bcdd 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringContainsMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringContainsMatcher.java @@ -4,30 +4,30 @@ import com.ghostchu.peerbanhelper.text.TranslationComponent; import com.ghostchu.peerbanhelper.util.rule.AbstractJsonMatcher; import com.ghostchu.peerbanhelper.util.rule.MatchResult; +import com.ghostchu.peerbanhelper.util.rule.MatchResultEnum; import com.google.gson.JsonObject; import lombok.EqualsAndHashCode; import lombok.ToString; import org.jetbrains.annotations.NotNull; import java.util.Locale; -import java.util.Map; @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class StringContainsMatcher extends AbstractJsonMatcher { private static final TranslationComponent nameComponent = new TranslationComponent(Lang.RULE_MATCHER_STRING_CONTAINS); private final String rule; - private MatchResult hit = MatchResult.TRUE; - private MatchResult miss = MatchResult.DEFAULT; + private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, "StringContains Hit"); + private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, "StringContains Miss"); public StringContainsMatcher(JsonObject syntax) { super(syntax); this.rule = syntax.get("content").getAsString().toLowerCase(Locale.ROOT); if (syntax.has("hit")) { - this.hit = MatchResult.valueOf(syntax.get("hit").getAsString()); + this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), "StringContains Hit"); } if (syntax.has("miss")) { - this.miss = MatchResult.valueOf(syntax.get("miss").getAsString()); + this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), "StringContains Miss"); } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEndsWithMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEndsWithMatcher.java index a4337e381..86e0a1b63 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEndsWithMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEndsWithMatcher.java @@ -4,30 +4,30 @@ import com.ghostchu.peerbanhelper.text.TranslationComponent; import com.ghostchu.peerbanhelper.util.rule.AbstractJsonMatcher; import com.ghostchu.peerbanhelper.util.rule.MatchResult; +import com.ghostchu.peerbanhelper.util.rule.MatchResultEnum; import com.google.gson.JsonObject; import lombok.EqualsAndHashCode; import lombok.ToString; import org.jetbrains.annotations.NotNull; import java.util.Locale; -import java.util.Map; @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class StringEndsWithMatcher extends AbstractJsonMatcher { private static final TranslationComponent nameComponent = new TranslationComponent(Lang.RULE_MATCHER_STRING_ENDS_WITH); private final String rule; - private MatchResult hit = MatchResult.TRUE; - private MatchResult miss = MatchResult.DEFAULT; + private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, "StringEndsWith Hit"); + private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, "StringEndsWith Miss"); public StringEndsWithMatcher(JsonObject syntax) { super(syntax); this.rule = syntax.get("content").getAsString().toLowerCase(Locale.ROOT); if (syntax.has("hit")) { - this.hit = MatchResult.valueOf(syntax.get("hit").getAsString()); + this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), "StringEndsWith Hit"); } if (syntax.has("miss")) { - this.miss = MatchResult.valueOf(syntax.get("miss").getAsString()); + this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), "StringEndsWith Miss"); } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEqualsMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEqualsMatcher.java index d7306bdce..7569fff71 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEqualsMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEqualsMatcher.java @@ -4,29 +4,28 @@ import com.ghostchu.peerbanhelper.text.TranslationComponent; import com.ghostchu.peerbanhelper.util.rule.AbstractJsonMatcher; import com.ghostchu.peerbanhelper.util.rule.MatchResult; +import com.ghostchu.peerbanhelper.util.rule.MatchResultEnum; import com.google.gson.JsonObject; import lombok.EqualsAndHashCode; import lombok.ToString; import org.jetbrains.annotations.NotNull; -import java.util.Map; - @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class StringEqualsMatcher extends AbstractJsonMatcher { private static final TranslationComponent nameComponent = new TranslationComponent(Lang.RULE_MATCHER_STRING_EQUALS); private final String rule; - private MatchResult hit = MatchResult.TRUE; - private MatchResult miss = MatchResult.DEFAULT; + private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, "StringEquals Hit"); + private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, "StringEquals Miss"); public StringEqualsMatcher(JsonObject syntax) { super(syntax); this.rule = syntax.get("content").getAsString(); if (syntax.has("hit")) { - this.hit = MatchResult.valueOf(syntax.get("hit").getAsString()); + this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), "StringEndsWith Hit"); } if (syntax.has("miss")) { - this.miss = MatchResult.valueOf(syntax.get("miss").getAsString()); + this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), "StringEndsWith Miss"); } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringLengthMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringLengthMatcher.java index c740bb219..4c1443be9 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringLengthMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringLengthMatcher.java @@ -4,31 +4,30 @@ import com.ghostchu.peerbanhelper.text.TranslationComponent; import com.ghostchu.peerbanhelper.util.rule.AbstractJsonMatcher; import com.ghostchu.peerbanhelper.util.rule.MatchResult; +import com.ghostchu.peerbanhelper.util.rule.MatchResultEnum; import com.google.gson.JsonObject; import lombok.EqualsAndHashCode; import lombok.ToString; import org.jetbrains.annotations.NotNull; -import java.util.Map; - @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class StringLengthMatcher extends AbstractJsonMatcher { private static final TranslationComponent nameComponent = new TranslationComponent(Lang.RULE_MATCHER_STRING_LENGTH); private final int min; private final int max; - private MatchResult hit = MatchResult.TRUE; - private MatchResult miss = MatchResult.DEFAULT; + private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, "StringLength Hit"); + private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, "StringLength Miss"); public StringLengthMatcher(JsonObject syntax) { super(syntax); this.min = syntax.get("min").getAsInt(); this.max = syntax.get("max").getAsInt(); if (syntax.has("hit")) { - this.hit = MatchResult.valueOf(syntax.get("hit").getAsString()); + this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), "StringLength Hit"); } if (syntax.has("miss")) { - this.miss = MatchResult.valueOf(syntax.get("miss").getAsString()); + this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), "StringLength Miss"); } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringRegexMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringRegexMatcher.java index 116bc5f74..b1efacf98 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringRegexMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringRegexMatcher.java @@ -4,12 +4,12 @@ import com.ghostchu.peerbanhelper.text.TranslationComponent; import com.ghostchu.peerbanhelper.util.rule.AbstractJsonMatcher; import com.ghostchu.peerbanhelper.util.rule.MatchResult; +import com.ghostchu.peerbanhelper.util.rule.MatchResultEnum; import com.google.gson.JsonObject; import lombok.EqualsAndHashCode; import lombok.ToString; import org.jetbrains.annotations.NotNull; -import java.util.Map; import java.util.regex.Pattern; @EqualsAndHashCode(callSuper = true) @@ -17,17 +17,17 @@ public class StringRegexMatcher extends AbstractJsonMatcher { private static final TranslationComponent nameComponent = new TranslationComponent(Lang.RULE_MATCHER_STRING_REGEX); private final Pattern rule; - private MatchResult hit = MatchResult.TRUE; - private MatchResult miss = MatchResult.DEFAULT; + private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, "StringRegex Hit"); + private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, "StringRegex Miss"); public StringRegexMatcher(JsonObject syntax) { super(syntax); this.rule = Pattern.compile(syntax.get("content").getAsString()); if (syntax.has("hit")) { - this.hit = MatchResult.valueOf(syntax.get("hit").getAsString()); + this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), "StringRegex Hit"); } if (syntax.has("miss")) { - this.miss = MatchResult.valueOf(syntax.get("miss").getAsString()); + this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), "StringRegex Miss"); } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringStartsWithMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringStartsWithMatcher.java index 82b179c15..229bc92ff 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringStartsWithMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringStartsWithMatcher.java @@ -4,30 +4,30 @@ import com.ghostchu.peerbanhelper.text.TranslationComponent; import com.ghostchu.peerbanhelper.util.rule.AbstractJsonMatcher; import com.ghostchu.peerbanhelper.util.rule.MatchResult; +import com.ghostchu.peerbanhelper.util.rule.MatchResultEnum; import com.google.gson.JsonObject; import lombok.EqualsAndHashCode; import lombok.ToString; import org.jetbrains.annotations.NotNull; import java.util.Locale; -import java.util.Map; @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class StringStartsWithMatcher extends AbstractJsonMatcher { private static final TranslationComponent nameComponent = new TranslationComponent(Lang.RULE_MATCHER_STRING_STARTS_WITH); private final String rule; - private MatchResult hit = MatchResult.TRUE; - private MatchResult miss = MatchResult.DEFAULT; + private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, "StringStatsWith Hit"); + private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, "StringStatsWith Miss"); public StringStartsWithMatcher(JsonObject syntax) { super(syntax); this.rule = syntax.get("content").getAsString().toLowerCase(Locale.ROOT); if (syntax.has("hit")) { - this.hit = MatchResult.valueOf(syntax.get("hit").getAsString()); + this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), "StringStatsWith Hit"); } if (syntax.has("miss")) { - this.miss = MatchResult.valueOf(syntax.get("miss").getAsString()); + this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), "StringStatsWith Miss"); } } From 22e553db400f32d4f0d7110506ce8f549395995d Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 31 Dec 2024 23:12:04 +0800 Subject: [PATCH 061/160] =?UTF-8?q?=E6=94=AF=E6=8C=81=20i18n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../peerbanhelper/btn/BtnExceptionRuleParsed.java | 2 +- .../ghostchu/peerbanhelper/btn/BtnRuleParsed.java | 2 +- .../module/impl/rule/IPBlackRuleList.java | 2 +- .../java/com/ghostchu/peerbanhelper/text/Lang.java | 2 +- .../util/rule/AbstractJsonMatcher.java | 4 +++- .../peerbanhelper/util/rule/MatchResult.java | 3 ++- .../peerbanhelper/util/rule/RuleMatchResult.java | 3 ++- .../peerbanhelper/util/rule/RuleParser.java | 8 +++++--- .../peerbanhelper/util/rule/matcher/IPMatcher.java | 8 ++++---- .../util/rule/matcher/StringContainsMatcher.java | 8 ++++---- .../util/rule/matcher/StringEndsWithMatcher.java | 8 ++++---- .../util/rule/matcher/StringEqualsMatcher.java | 8 ++++---- .../util/rule/matcher/StringLengthMatcher.java | 8 ++++---- .../util/rule/matcher/StringRegexMatcher.java | 8 ++++---- .../util/rule/matcher/StringStartsWithMatcher.java | 8 ++++---- src/main/resources/lang/messages_fallback.yml | 14 +++++++++++++- 16 files changed, 57 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/btn/BtnExceptionRuleParsed.java b/src/main/java/com/ghostchu/peerbanhelper/btn/BtnExceptionRuleParsed.java index 0e1c5ec06..0282f10de 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/btn/BtnExceptionRuleParsed.java +++ b/src/main/java/com/ghostchu/peerbanhelper/btn/BtnExceptionRuleParsed.java @@ -39,7 +39,7 @@ private Map> parsePortRule(Map> portRul @Override public @NotNull MatchResult match0(@NotNull String content) { boolean hit = Integer.parseInt(content) == s; - return hit ? new MatchResult(MatchResultEnum.TRUE, "Port matched") : new MatchResult(MatchResultEnum.DEFAULT, "Port seems OK"); + return hit ? new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_CONDITION_PORT_MATCH)) : new MatchResult(MatchResultEnum.DEFAULT, new TranslationComponent("Port seems OK")); } @Override diff --git a/src/main/java/com/ghostchu/peerbanhelper/btn/BtnRuleParsed.java b/src/main/java/com/ghostchu/peerbanhelper/btn/BtnRuleParsed.java index baa5353ba..62ad5ca7e 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/btn/BtnRuleParsed.java +++ b/src/main/java/com/ghostchu/peerbanhelper/btn/BtnRuleParsed.java @@ -67,7 +67,7 @@ private Map> parsePortRule(Map> portRul @Override public @NotNull MatchResult match0(@NotNull String content) { boolean hit = Integer.parseInt(content) == s; - return hit ? new MatchResult(MatchResultEnum.TRUE, "Port matched") : new MatchResult(MatchResultEnum.DEFAULT, "Port seems OK"); + return hit ? new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_CONDITION_PORT_MATCH)) : new MatchResult(MatchResultEnum.DEFAULT, new TranslationComponent("Port seems OK")); } @Override diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java index 3cff8d028..c87d0e3b1 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java @@ -133,7 +133,7 @@ public ReloadResult reloadModule() throws Exception { if (ipBanResult == null) return pass(); boolean match = ipBanResult.matchResult().result() == MatchResultEnum.TRUE; if (match) { - return new CheckResult(getClass(), PeerAction.BAN, banDuration, new TranslationComponent(ipBanResult.ruleName()), new TranslationComponent(Lang.MODULE_IBL_MATCH_IP_RULE, ipBanResult.ruleName(), ip, Optional.ofNullable(ipBanResult.matchResult().comment()).orElse("Unknown"))); + return new CheckResult(getClass(), PeerAction.BAN, banDuration, new TranslationComponent(ipBanResult.ruleName()), new TranslationComponent(Lang.MODULE_IBL_MATCH_IP_RULE, ipBanResult.ruleName(), ip, Optional.ofNullable(ipBanResult.matchResult().comment()).orElse(new TranslationComponent(Lang.MODULE_IBL_COMMENT_UNKNOWN)))); } return pass(); } catch (Exception e) { diff --git a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java index 0eea9ec56..9be8516f5 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java +++ b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java @@ -480,7 +480,7 @@ public enum Lang { SQLITE_VACUUM_BACKUP_COMPLETED, SQLITE_VACUUM_IN_PROGRESS, SQLITE_VACUUM_SUCCESS, - MODULE_PTR_MATCH_PTR_RULE; + MODULE_PTR_MATCH_PTR_RULE, MATCH_CONDITION_PORT_MATCH, MODULE_IBL_COMMENT_UNKNOWN, JSON_MATCHER_NOT_MET, MATCH_CONDITION_BOOLEAN, MATCH_CONDITION_BOOLEAN_BY_INTEGER, MATCH_CONDITION_BOOLEAN_BY_STRING, MATCH_STRING_CONTAINS, MATCH_STRING_ENDS_WITH, MATCH_STRING_LENGTH, MATCH_STRING_EQUALS, MATCH_STRING_REGEX; public String getKey() { return name(); diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/AbstractJsonMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/AbstractJsonMatcher.java index f9f48f55a..347cde260 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/AbstractJsonMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/AbstractJsonMatcher.java @@ -1,6 +1,8 @@ package com.ghostchu.peerbanhelper.util.rule; import com.ghostchu.peerbanhelper.Main; +import com.ghostchu.peerbanhelper.text.Lang; +import com.ghostchu.peerbanhelper.text.TranslationComponent; import com.google.gson.JsonObject; import lombok.EqualsAndHashCode; import lombok.ToString; @@ -25,7 +27,7 @@ public AbstractJsonMatcher(JsonObject rule) { } if (condition != null) { if (condition.match(content).result() == MatchResultEnum.FALSE) { - return new MatchResult(MatchResultEnum.FALSE, "Condition not met: " + condition.toPrintableText(Main.DEF_LOCALE) + " on " + toPrintableText(Main.DEF_LOCALE)); + return new MatchResult(MatchResultEnum.FALSE, new TranslationComponent(Lang.JSON_MATCHER_NOT_MET, condition.toPrintableText(Main.DEF_LOCALE), toPrintableText(Main.DEF_LOCALE))); } } return match0(content); diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/MatchResult.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/MatchResult.java index 8f1707bd5..f98a23a53 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/MatchResult.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/MatchResult.java @@ -1,7 +1,8 @@ package com.ghostchu.peerbanhelper.util.rule; +import com.ghostchu.peerbanhelper.text.TranslationComponent; import org.jetbrains.annotations.Nullable; -public record MatchResult(MatchResultEnum result, @Nullable String comment) { +public record MatchResult(MatchResultEnum result, @Nullable TranslationComponent comment) { } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleMatchResult.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleMatchResult.java index c768b7f8d..1e8b3c1d7 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleMatchResult.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleMatchResult.java @@ -1,6 +1,7 @@ package com.ghostchu.peerbanhelper.util.rule; +import com.ghostchu.peerbanhelper.text.TranslationComponent; import org.jetbrains.annotations.Nullable; -public record RuleMatchResult(boolean hit, Rule rule, @Nullable String comment) { +public record RuleMatchResult(boolean hit, Rule rule, @Nullable TranslationComponent comment) { } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleParser.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleParser.java index c1eb30bac..1b4d2472e 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleParser.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/RuleParser.java @@ -1,5 +1,7 @@ package com.ghostchu.peerbanhelper.util.rule; +import com.ghostchu.peerbanhelper.text.Lang; +import com.ghostchu.peerbanhelper.text.TranslationComponent; import com.ghostchu.peerbanhelper.util.rule.matcher.*; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -78,7 +80,7 @@ public String matcherIdentifier() { return new Rule() { @Override public @NotNull MatchResult match(@NotNull String content) { - return primitive.getAsBoolean() ? new MatchResult(MatchResultEnum.TRUE, "Boolean condition") : new MatchResult(MatchResultEnum.FALSE, "Boolean condition"); + return primitive.getAsBoolean() ? new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_CONDITION_BOOLEAN)) : new MatchResult(MatchResultEnum.FALSE, new TranslationComponent(Lang.MATCH_CONDITION_BOOLEAN)); } @Override @@ -96,7 +98,7 @@ public String matcherIdentifier() { return new Rule() { @Override public @NotNull MatchResult match(@NotNull String content) { - return primitive.getAsBoolean() ? new MatchResult(MatchResultEnum.TRUE, "Boolean (by Integer) condition") : new MatchResult(MatchResultEnum.FALSE, "Boolean (by Integer) condition"); + return primitive.getAsBoolean() ? new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_CONDITION_BOOLEAN_BY_INTEGER)) : new MatchResult(MatchResultEnum.FALSE, new TranslationComponent(Lang.MATCH_CONDITION_BOOLEAN_BY_INTEGER)); } @Override @@ -115,7 +117,7 @@ public String matcherIdentifier() { @Override public @NotNull MatchResult match(@NotNull String content) { String str = primitive.getAsString(); - return Boolean.parseBoolean(str) ? new MatchResult(MatchResultEnum.TRUE, "Boolean (by String) condition") : new MatchResult(MatchResultEnum.FALSE, "Boolean (by String) condition"); + return Boolean.parseBoolean(str) ? new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_CONDITION_BOOLEAN_BY_STRING)) : new MatchResult(MatchResultEnum.FALSE, new TranslationComponent(Lang.MATCH_CONDITION_BOOLEAN_BY_STRING)); } @Override diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/IPMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/IPMatcher.java index 39c5dff80..05e65f75e 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/IPMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/IPMatcher.java @@ -44,14 +44,14 @@ public long size() { @Override public @NotNull MatchResult match0(@NotNull String content) { final IPAddress ip = IPAddressUtil.getIPAddress(content); - if (ip == null) return new MatchResult(MatchResultEnum.DEFAULT, "IP is null"); + if (ip == null) return new MatchResult(MatchResultEnum.DEFAULT, new TranslationComponent("IP is null")); if (ips == null) { - new MatchResult(MatchResultEnum.DEFAULT, "IPs set is null"); + new MatchResult(MatchResultEnum.DEFAULT, new TranslationComponent("IPs set is null")); } if (ips.elementContains(ip)) { - return new MatchResult(MatchResultEnum.DEFAULT, ips.get(ip)); + return new MatchResult(MatchResultEnum.DEFAULT, new TranslationComponent(ips.get(ip))); } - return new MatchResult(MatchResultEnum.DEFAULT, "Given IP not in IPs set"); + return new MatchResult(MatchResultEnum.DEFAULT, new TranslationComponent("Given IP not in IPs set")); } @Override diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringContainsMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringContainsMatcher.java index e27a9bcdd..b496e5636 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringContainsMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringContainsMatcher.java @@ -17,17 +17,17 @@ public class StringContainsMatcher extends AbstractJsonMatcher { private static final TranslationComponent nameComponent = new TranslationComponent(Lang.RULE_MATCHER_STRING_CONTAINS); private final String rule; - private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, "StringContains Hit"); - private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, "StringContains Miss"); + private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_STRING_CONTAINS, "")); + private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, new TranslationComponent(Lang.MATCH_STRING_CONTAINS, "")); public StringContainsMatcher(JsonObject syntax) { super(syntax); this.rule = syntax.get("content").getAsString().toLowerCase(Locale.ROOT); if (syntax.has("hit")) { - this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), "StringContains Hit"); + this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), new TranslationComponent(Lang.MATCH_STRING_CONTAINS, "Hit-" + rule)); } if (syntax.has("miss")) { - this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), "StringContains Miss"); + this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), new TranslationComponent(Lang.MATCH_STRING_CONTAINS, "Miss-" + rule)); } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEndsWithMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEndsWithMatcher.java index 86e0a1b63..e5409fbac 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEndsWithMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEndsWithMatcher.java @@ -17,17 +17,17 @@ public class StringEndsWithMatcher extends AbstractJsonMatcher { private static final TranslationComponent nameComponent = new TranslationComponent(Lang.RULE_MATCHER_STRING_ENDS_WITH); private final String rule; - private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, "StringEndsWith Hit"); - private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, "StringEndsWith Miss"); + private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_STRING_ENDS_WITH, "")); + private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, new TranslationComponent(Lang.MATCH_STRING_ENDS_WITH, "")); public StringEndsWithMatcher(JsonObject syntax) { super(syntax); this.rule = syntax.get("content").getAsString().toLowerCase(Locale.ROOT); if (syntax.has("hit")) { - this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), "StringEndsWith Hit"); + this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), new TranslationComponent(Lang.MATCH_STRING_ENDS_WITH, "Hit-" + rule)); } if (syntax.has("miss")) { - this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), "StringEndsWith Miss"); + this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), new TranslationComponent(Lang.MATCH_STRING_ENDS_WITH, "Miss-" + rule)); } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEqualsMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEqualsMatcher.java index 7569fff71..99c9eb037 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEqualsMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringEqualsMatcher.java @@ -15,17 +15,17 @@ public class StringEqualsMatcher extends AbstractJsonMatcher { private static final TranslationComponent nameComponent = new TranslationComponent(Lang.RULE_MATCHER_STRING_EQUALS); private final String rule; - private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, "StringEquals Hit"); - private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, "StringEquals Miss"); + private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_STRING_EQUALS, "")); + private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, new TranslationComponent(Lang.MATCH_STRING_EQUALS, "")); public StringEqualsMatcher(JsonObject syntax) { super(syntax); this.rule = syntax.get("content").getAsString(); if (syntax.has("hit")) { - this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), "StringEndsWith Hit"); + this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), new TranslationComponent(Lang.MATCH_STRING_EQUALS, "Hit-" + rule)); } if (syntax.has("miss")) { - this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), "StringEndsWith Miss"); + this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), new TranslationComponent(Lang.MATCH_STRING_EQUALS, "Miss-" + rule)); } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringLengthMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringLengthMatcher.java index 4c1443be9..5cfc20007 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringLengthMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringLengthMatcher.java @@ -16,18 +16,18 @@ public class StringLengthMatcher extends AbstractJsonMatcher { private static final TranslationComponent nameComponent = new TranslationComponent(Lang.RULE_MATCHER_STRING_LENGTH); private final int min; private final int max; - private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, "StringLength Hit"); - private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, "StringLength Miss"); + private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_STRING_LENGTH, "")); + private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, new TranslationComponent(Lang.MATCH_STRING_LENGTH, "")); public StringLengthMatcher(JsonObject syntax) { super(syntax); this.min = syntax.get("min").getAsInt(); this.max = syntax.get("max").getAsInt(); if (syntax.has("hit")) { - this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), "StringLength Hit"); + this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), new TranslationComponent(Lang.MATCH_STRING_LENGTH, "Hit-Min-" + min + ", Max-" + max)); } if (syntax.has("miss")) { - this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), "StringLength Miss"); + this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), new TranslationComponent(Lang.MATCH_STRING_LENGTH, "Miss-Min-" + min + ", Max-" + max)); } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringRegexMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringRegexMatcher.java index b1efacf98..6de4bdf92 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringRegexMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringRegexMatcher.java @@ -17,17 +17,17 @@ public class StringRegexMatcher extends AbstractJsonMatcher { private static final TranslationComponent nameComponent = new TranslationComponent(Lang.RULE_MATCHER_STRING_REGEX); private final Pattern rule; - private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, "StringRegex Hit"); - private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, "StringRegex Miss"); + private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, new TranslationComponent(Lang.MATCH_STRING_REGEX, "")); + private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, new TranslationComponent(Lang.MATCH_STRING_REGEX, "")); public StringRegexMatcher(JsonObject syntax) { super(syntax); this.rule = Pattern.compile(syntax.get("content").getAsString()); if (syntax.has("hit")) { - this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), "StringRegex Hit"); + this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), new TranslationComponent(Lang.MATCH_STRING_REGEX, "Hit=" + rule.pattern())); } if (syntax.has("miss")) { - this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), "StringRegex Miss"); + this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), new TranslationComponent(Lang.MATCH_STRING_REGEX, "Miss=" + rule.pattern())); } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringStartsWithMatcher.java b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringStartsWithMatcher.java index 229bc92ff..d076a341e 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringStartsWithMatcher.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/rule/matcher/StringStartsWithMatcher.java @@ -17,17 +17,17 @@ public class StringStartsWithMatcher extends AbstractJsonMatcher { private static final TranslationComponent nameComponent = new TranslationComponent(Lang.RULE_MATCHER_STRING_STARTS_WITH); private final String rule; - private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, "StringStatsWith Hit"); - private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, "StringStatsWith Miss"); + private MatchResult hit = new MatchResult(MatchResultEnum.TRUE, new TranslationComponent("StringStatsWith Hit")); + private MatchResult miss = new MatchResult(MatchResultEnum.FALSE, new TranslationComponent("StringStatsWith Miss")); public StringStartsWithMatcher(JsonObject syntax) { super(syntax); this.rule = syntax.get("content").getAsString().toLowerCase(Locale.ROOT); if (syntax.has("hit")) { - this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), "StringStatsWith Hit"); + this.hit = new MatchResult(MatchResultEnum.valueOf(syntax.get("hit").getAsString()), new TranslationComponent("StringStatsWith Hit")); } if (syntax.has("miss")) { - this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), "StringStatsWith Miss"); + this.miss = new MatchResult(MatchResultEnum.valueOf(syntax.get("miss").getAsString()), new TranslationComponent("StringStatsWith Miss")); } } diff --git a/src/main/resources/lang/messages_fallback.yml b/src/main/resources/lang/messages_fallback.yml index 257968c45..111342a54 100644 --- a/src/main/resources/lang/messages_fallback.yml +++ b/src/main/resources/lang/messages_fallback.yml @@ -545,4 +545,16 @@ SQLITE_VACUUM_BACKUP_COMPLETED: "SQLite 数据库文件备份完成,准备进 SQLITE_VACUUM_BACKUP_FAILED: "SQLite 数据库文件备份失败,无法进行真空操作,这可能是由于磁盘空间不足,IO 错误或者权限不足导致的,请检查错误信息。" SQLITE_VACUUM_IN_PROGRESS: "正在对 SQLite 数据库进行真空操作,请勿关闭 PeerBanHelper 否则将可能导致数据库损坏! 【进行中】...." SQLITE_VACUUM_SUCCESS: "SQLite 数据库已成功真空,原文件大小: {} 真空后文件大小: {}" -MODULE_PTR_MATCH_PTR_RULE: "匹配 PTR 规则: {}" \ No newline at end of file +MODULE_PTR_MATCH_PTR_RULE: "匹配 PTR 规则: {}" + +MATCH_CONDITION_PORT_MATCH: "端口匹配" +MATCH_CONDITION_BOOLEAN: "布尔值" +MATCH_CONDITION_BOOLEAN_BY_INTEGER: "布尔值 (整数转换)" +MATCH_CONDITION_BOOLEAN_BY_STRING: "布尔值 (字符串转换)" +MATCH_STRING_CONTAINS: "字符串包含: {}" +MATCH_STRING_ENDS_WITH: "字符串结尾: {}" +MATCH_STRING_EQUALS: "字符串结尾: {}" +MATCH_STRING_LENGTH: "字符串长度: {}" +MATCH_STRING_REGEX: "字符串正则表达式: {}" +MODULE_IBL_COMMENT_UNKNOWN: "未提供" +JSON_MATCHER_NOT_MET: "表达式未满足: {} 于 {} 上" \ No newline at end of file From 7f12faa0de5aaba4b904d91dcb708ea3b73941cf Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 31 Dec 2024 23:13:35 +0800 Subject: [PATCH 062/160] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/lang/en_us/messages.yml | 14 +++++++++++++- src/main/resources/lang/messages_fallback.yml | 2 +- src/main/resources/lang/zh_cn/messages.yml | 14 +++++++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/main/resources/lang/en_us/messages.yml b/src/main/resources/lang/en_us/messages.yml index bb138fd4e..a76e35776 100644 --- a/src/main/resources/lang/en_us/messages.yml +++ b/src/main/resources/lang/en_us/messages.yml @@ -545,4 +545,16 @@ SQLITE_VACUUM_BACKUP_COMPLETED: "SQLite database file backup completed, preparin SQLITE_VACUUM_BACKUP_FAILED: "SQLite database file backup failed, unable to perform vacuum operation. This may be due to insufficient disk space, IO errors, or insufficient permissions. Please check the error message." SQLITE_VACUUM_IN_PROGRESS: "Vacuuming SQLite database in progress, do not close PeerBanHelper as it may cause database corruption! [In Progress]...." SQLITE_VACUUM_SUCCESS: "SQLite database vacuumed successfully, original file size: {} vacuumed file size: {}" -MODULE_PTR_MATCH_PTR_RULE: "Match PTR rule: {}" \ No newline at end of file +MODULE_PTR_MATCH_PTR_RULE: "Match PTR rule: {}" + +MATCH_CONDITION_PORT_MATCH: "Port Match" +MATCH_CONDITION_BOOLEAN: "Boolean" +MATCH_CONDITION_BOOLEAN_BY_INTEGER: "Boolean (by Integer)" +MATCH_CONDITION_BOOLEAN_BY_STRING: "Boolean (by String)" +MATCH_STRING_CONTAINS: "String Contains: {}" +MATCH_STRING_ENDS_WITH: "String EndsWith: {}" +MATCH_STRING_EQUALS: "String Equals: {}" +MATCH_STRING_LENGTH: "String Length: {}" +MATCH_STRING_REGEX: "String Regex: {}" +MODULE_IBL_COMMENT_UNKNOWN: "Not Provided" +JSON_MATCHER_NOT_MET: "Condition not meet: {} on {}" \ No newline at end of file diff --git a/src/main/resources/lang/messages_fallback.yml b/src/main/resources/lang/messages_fallback.yml index 111342a54..c684e3a00 100644 --- a/src/main/resources/lang/messages_fallback.yml +++ b/src/main/resources/lang/messages_fallback.yml @@ -553,7 +553,7 @@ MATCH_CONDITION_BOOLEAN_BY_INTEGER: "布尔值 (整数转换)" MATCH_CONDITION_BOOLEAN_BY_STRING: "布尔值 (字符串转换)" MATCH_STRING_CONTAINS: "字符串包含: {}" MATCH_STRING_ENDS_WITH: "字符串结尾: {}" -MATCH_STRING_EQUALS: "字符串结尾: {}" +MATCH_STRING_EQUALS: "字符串匹配: {}" MATCH_STRING_LENGTH: "字符串长度: {}" MATCH_STRING_REGEX: "字符串正则表达式: {}" MODULE_IBL_COMMENT_UNKNOWN: "未提供" diff --git a/src/main/resources/lang/zh_cn/messages.yml b/src/main/resources/lang/zh_cn/messages.yml index 5b90b44ba..0af39ef6a 100644 --- a/src/main/resources/lang/zh_cn/messages.yml +++ b/src/main/resources/lang/zh_cn/messages.yml @@ -542,4 +542,16 @@ SQLITE_VACUUM_BACKUP_COMPLETED: "SQLite 数据库文件备份完成,准备进 SQLITE_VACUUM_BACKUP_FAILED: "SQLite 数据库文件备份失败,无法进行真空操作,这可能是由于磁盘空间不足,IO 错误或者权限不足导致的,请检查错误信息。" SQLITE_VACUUM_IN_PROGRESS: "正在对 SQLite 数据库进行真空操作,请勿关闭 PeerBanHelper 否则将可能导致数据库损坏! 【进行中】...." SQLITE_VACUUM_SUCCESS: "SQLite 数据库已成功真空,原文件大小: {} 真空后文件大小: {}" -MODULE_PTR_MATCH_PTR_RULE: "匹配 PTR 规则: {}" \ No newline at end of file +MODULE_PTR_MATCH_PTR_RULE: "匹配 PTR 规则: {}" + +MATCH_CONDITION_PORT_MATCH: "端口匹配" +MATCH_CONDITION_BOOLEAN: "布尔值" +MATCH_CONDITION_BOOLEAN_BY_INTEGER: "布尔值 (整数转换)" +MATCH_CONDITION_BOOLEAN_BY_STRING: "布尔值 (字符串转换)" +MATCH_STRING_CONTAINS: "字符串包含: {}" +MATCH_STRING_ENDS_WITH: "字符串结尾: {}" +MATCH_STRING_EQUALS: "字符串匹配: {}" +MATCH_STRING_LENGTH: "字符串长度: {}" +MATCH_STRING_REGEX: "字符串正则表达式: {}" +MODULE_IBL_COMMENT_UNKNOWN: "未提供" +JSON_MATCHER_NOT_MET: "表达式未满足: {} 于 {} 上" \ No newline at end of file From da6a0a1bc974a79a456518f7b69fdaf1ae4cb58f Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Thu, 2 Jan 2025 00:46:05 +0800 Subject: [PATCH 063/160] =?UTF-8?q?=E5=BF=BD=E7=95=A5=20webui/vite.config.?= =?UTF-8?q?ts.timestamp-xxx=20=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/webui/.gitignore b/webui/.gitignore index 8ee54e8d3..0dddfa739 100644 --- a/webui/.gitignore +++ b/webui/.gitignore @@ -28,3 +28,4 @@ coverage *.sw? *.tsbuildinfo +vite.config.ts.timestamp* From f25d198b2fbd81736bc44d9151b6f0bf0beb4493 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Thu, 2 Jan 2025 00:50:07 +0800 Subject: [PATCH 064/160] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A7=A3=E5=B0=81?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install4j/project.install4j~ | 1610 +++++++++++++++++ .../module/impl/webapi/PBHBanController.java | 12 +- .../src/views/banlist/components/banList.vue | 49 +- webui/src/views/banlist/locale/en-US.ts | 1 + webui/src/views/banlist/locale/zh-CN.ts | 1 + 5 files changed, 1658 insertions(+), 15 deletions(-) create mode 100644 install4j/project.install4j~ diff --git a/install4j/project.install4j~ b/install4j/project.install4j~ new file mode 100644 index 000000000..5e362a4e6 --- /dev/null +++ b/install4j/project.install4j~ @@ -0,0 +1,1610 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${i18n:components.peerbanhelper.description} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sys.installationDir + + + context.getBooleanVariable("sys.confirmedUpdateInstallation") + + + + + + ${form:welcomeMessage} + + !context.isConsole() + + + + + + String message = context.getMessage("ConsoleWelcomeLabel", context.getApplicationName()); +return console.askOkCancel(message, true); + + + + + + + + updateCheck + + + + + ${i18n:ClickNext} + + + + + + !context.getBooleanVariable("sys.confirmedUpdateInstallation") + + + + + sys.installationDir + + + context.getVariable("sys.responseFile") == null + + + + + + ${i18n:SelectDirLabel(${compiler:sys.fullName})} + + + + + + + + suggestAppDir + validateApplicationId + existingDirWarning + checkWritable + manualEntryAllowed + checkFreeSpace + showRequiredDiskSpace + showFreeDiskSpace + allowSpacesOnUnix + validationScript + standardValidation + + + + + + + + + ${i18n:SelectComponentsLabel2} + + !context.isConsole() + + + + + + + selectionChangedScript + + + + + + + + + ${form:confirmationMessage} + + !context.isConsole() + + + + ${i18n:CreateDesktopIcon} + createDesktopLinkAction + + + + + ${i18n:checkbox.followsystemstartup} + startupWhenLoggedIn + + + + + ${i18n:checkbox.registersystemservice} + registerSystemService + + + + + + context.getBooleanVariable("registerSystemService") + + + + ${i18n:InfoBeforeClickLabel} + + !context.isConsole() + + + + ${i18n:systemservice.note} + + + + + textSource + displayedText + displayedTextFile + variableName + + + + + + + console.waitForEnter(); +return true; + + + + + + + + + + + + + ${i18n:UninstallerMenuEntry(${compiler:sys.fullName})} + + !context.getBooleanVariable("sys.programGroupDisabled") + + + + + + + PeerBanHelper-GUI + + + ${compiler:sys.fullName} + + + . + + + + + ./icon.png + + + + + ./icon.ico + + + + context.getBooleanVariable("createDesktopLinkAction") + + + + + + PeerBanHelper-GUI-Silent + + + PeerBanHelper + + context.getBooleanVariable("startupWhenLoggedIn") + + + + ${compiler:sys.fullName} ${compiler:sys.version} + + + + + + 70 + com.ghostchu.peerbanhelper.PBHService + + + + + context.getBooleanVariable("registerSystemService") + + + + + 70 + + context.getBooleanVariable("registerSystemService") + + + + + + ${i18n:WizardPreparing} + + + + + + + + + 26 + + context.getBooleanVariable("executeLauncherAction") && (!context.isUnattended()) + + + + + + ${form:finishedMessage} + + + + + ${i18n:RunEntryExec("${compiler:sys.fullName}")} + + executeLauncherAction + + + + + + + + + ${i18n:UninstallerMenuEntry(${compiler:sys.fullName})} + + + + + + + + + + + + + + + + + + + + ${form:welcomeMessage} + + !context.isConsole() + + + + + + String message = context.getMessage("ConfirmUninstall", context.getApplicationName()); +return console.askYesNo(message, true); + + + + + + + + + + + + 70 + + + + + + + + + libraries + + + + + + + + + + ${i18n:UninstallerPreparing} + + + + + + + + + + ${form:successMessage} + + + + + + + + + + + + ${compiler:sys.install4jHome}/resource/updater_16.png + + + + + ${compiler:sys.install4jHome}/resource/updater_32.png + + + + + ${compiler:sys.install4jHome}/resource/updater_48.png + + + + + ${compiler:sys.install4jHome}/resource/updater_128.png + + + + + ${compiler:sys.install4jHome}/resource/updater_256.png + + + + bgupdater + + -Dapple.awt.UIElement=true + ${compiler:sys.fullName} + + + + + + + + + import java.nio.file.*; + +Path dir = context.getInstallationDirectory().toPath(); +// quit if the current installation is on a read only file system, for example a disk image on macOS +// or if the directory is not writeable on Linux/Unix. +// If there is no "Request privileges" action in the installer, the condition should also +// check Files.isWritable(dir) +return !Files.getFileStore(dir).isReadOnly() && ((Util.isWindows() && !Util.isArchive()) || Util.isMacOS() || (Util.isLinux() && !Util.isArchive())); + + + + + + + + + ${installer:updatesUrl?:${compiler:sys.updatesUrl}} + updateDescriptor + + + + + + + + UpdateDescriptorEntry entry = ((UpdateDescriptor)context.getVariable("updateDescriptor")).getPossibleUpdateEntry(); + +if (entry == null) { + return null; +} else if (entry.isArchive() && !entry.isSingleBundle()) { + // only installers and single bundle archives on macOS are supported + return null; +} else if (entry.isDownloaded()) { + // update has been downloaded already + return null; +} else { + return entry; +} + + + updateDescriptorEntry + + + + + + + context.getVariable("updateDescriptorEntry") != null + + + + + + + + + ((UpdateDescriptorEntry)context.getVariable("updateDescriptorEntry")).getNewVersion() + + + updaterNewVersion + + + + + + + ((UpdateDescriptorEntry)context.getVariable("updateDescriptorEntry")).getURL().toExternalForm() + + + updaterDownloadUrl + + + + + + + context.getVariable("sys.updateStorageDir") + File.separator + ((UpdateDescriptorEntry)context.getVariable("updateDescriptorEntry")).getFileName() + + + updaterDownloadFile + + + + + + + ${installer:updaterDownloadFile} + + + ${installer:updaterDownloadUrl} + + + + + + + !((UpdateDescriptorEntry)context.getVariable("updateDescriptorEntry")).isArchive() + + + + + + + + + + ${installer:updaterDownloadFile} + + + + 755 + + + + + + + ${installer:updaterDownloadFile} + + + ${installer:updaterNewVersion} + + + + + + + + + ((UpdateDescriptorEntry)context.getVariable("updateDescriptorEntry")).isArchive() + + + + + + + + + String dirName = context.getVariable("updaterDownloadFile") + "_dir"; +new File(dirName).mkdirs(); +return dirName; + + + updaterStagingDir + + + + + + + + + ${installer:updaterStagingDir} + + + + + + new File((String)context.getVariable("updaterStagingDir")).exists() + + + + + + ${installer:updaterDownloadFile} + + + + + ${installer:updaterStagingDir} + + + + + // only extract app bundle, no other top level files + +import com.install4j.api.unix.UnixFileSystem; + +File realFile = new File(dmgMountPoint, file.getPath()); + +return file.getParent() != null || (file.getName().endsWith(".app") && realFile.isDirectory() && !UnixFileSystem.getFileInformation(realFile).isLink()); + + + + ((String)context.getVariable("updaterDownloadFile")).endsWith(".dmg") + + + + + + ${installer:updaterDownloadFile} + + + + + ${installer:updaterStagingDir} + + + + + // only extract app bundle, no other top level files +file.getParent() != null || (file.getName().endsWith(".app") && directory) + + + + !((String)context.getVariable("updaterDownloadFile")).endsWith(".dmg") + + + + + + ${installer:updaterStagingDir} + + + ${installer:updaterNewVersion} + + + + + + + + + ${installer:updaterDownloadFile} + + + + + + + + + + + + + + + + + + + ${compiler:sys.install4jHome}/resource/updater_16.png + + + + + ${compiler:sys.install4jHome}/resource/updater_32.png + + + + + ${compiler:sys.install4jHome}/resource/updater_48.png + + + + + ${compiler:sys.install4jHome}/resource/updater_128.png + + + + + ${compiler:sys.install4jHome}/resource/updater_256.png + + + + updater + + ${i18n:updater.WindowTitle("${compiler:sys.fullName}")} + + + + + + + + + + + ${i18n:updater.WelcomeTitle("${compiler:sys.fullName}")} + + + + + + ${i18n:updater.WelcomeInfoText("${compiler:sys.fullName}")} + + !context.isConsole() + + labelText + + + + + + + ${i18n:updater.CheckForUpdateSubtitle} + ${i18n:updater.CheckForUpdateTitle} + + context.getWizardContext().setControlButtonVisible(ControlButtonType.NEXT, false); +context.getWizardContext().setControlButtonVisible(ControlButtonType.PREVIOUS, false); +context.goForward(1, true, true); + + + + + + + + + + ${installer:updatesUrl?:${compiler:sys.updatesUrl}} + updateDescriptor + + + + + + + + ((UpdateDescriptor)context.getVariable("updateDescriptor")).getPossibleUpdateEntry() + + + updateDescriptorEntry + + + + + + + context.getVariable("updateDescriptorEntry") != null + + + + + + + + + ((UpdateDescriptorEntry)context.getVariable("updateDescriptorEntry")).getNewVersion() + + + updaterNewVersion + + + + + + + ((UpdateDescriptorEntry)context.getVariable("updateDescriptorEntry")).getFileSizeVerbose() + + + updaterDownloadSize + + + + + + + ((UpdateDescriptorEntry)context.getVariable("updateDescriptorEntry")).getComment() + + + updaterComment + + + + + + + ((UpdateDescriptorEntry)context.getVariable("updateDescriptorEntry")).getURL().toExternalForm() + + + updaterDownloadUrl + + + + + + + ((UpdateDescriptorEntry)context.getVariable("updateDescriptorEntry")).isArchive() ? Boolean.TRUE : Boolean.FALSE + + + isArchive + + + + + + + ((UpdateDescriptorEntry)context.getVariable("updateDescriptorEntry")).getFileName().toLowerCase().endsWith(".dmg") + + + isDmg + + + + + + + + + ${i18n:updater.CheckForUpdateLabel} + + + statusVisible + initialStatusMessage + + + + + + + + + context.getVariable("updateDescriptorEntry") == null + + + + + + + ${i18n:updater.UpToDateTitle} + + + + + + ${i18n:updater.UpToDateInfoText("${compiler:sys.fullName}")} + + !context.isConsole() + + labelText + + + + + + + + + + + context.getVariable("updateDescriptorEntry") != null + + + + + + + ${i18n:updater.NewVersionAvailableSubtitle("${compiler:sys.fullName}")} + ${i18n:updater.NewVersionAvailableTitle} + + !context.getBooleanVariable("skipNewVersionAvailable") + + + + ${i18n:updater.CurrentVersionLabel} + + + 128 + 0 + 0 + 255 + + + + + ${installer:sys.version} + + + + + + + ${i18n:updater.NewVersionLabel} + + + 0 + 128 + 0 + 255 + + + + + ${installer:updaterNewVersion} + + + + + + + context.goForward(1, false, false); + + + ${i18n:updater.ShowComments} + + ((String)context.getVariable("updaterComment")).length() > 0 + + + + + + + ${i18n:updater.DownloadLocationLabel} + + + + + ${installer:sys.downloadsDir} + ${i18n:updater.DownloadToLabel} + + updaterDownloadLocation + + + + + ${i18n:updater.DownloadSizeLabel} + ${installer:updaterDownloadSize} + + + + + + + + ${i18n:updater.CommentsSubTitle} + ${i18n:updater.CommentsTitle} + + false // This screen is only shown if the user clicks the "Show comments" hyperlink label in the previous screen. + + if (context.isConsole()) { + context.goBackInHistory(1); +} +return true; + WizardContext wizardContext = context.getWizardContext(); +wizardContext.setControlButtonVisible(ControlButtonType.NEXT, false); +wizardContext.setControlButtonVisible(ControlButtonType.CANCEL, false); + + + + + ${i18n:updater.CommentsLabel} + + !context.isConsole() + + labelText + + + + + ${installer:updaterComment} + + + + + textSource + displayedText + displayedTextFile + variableName + + + + + + + console.waitForEnter(); +return true; + + + + + + + + + + ${i18n:updater.DownloadSubTitle} + ${i18n:updater.DownloadTitle} + + context.getWizardContext().setControlButtonVisible(ControlButtonType.NEXT, false); +context.getWizardContext().setControlButtonVisible(ControlButtonType.PREVIOUS, false); +context.goForward(1, true, true); + + + + + + + context.getVariable("updaterDownloadLocation") + File.separator + ((UpdateDescriptorEntry)context.getVariable("updateDescriptorEntry")).getFileName() + + + updaterDownloadFile + + + + + + + ${installer:updaterDownloadFile} + + + ${installer:updaterDownloadUrl} + + + + + + + + ${installer:updaterDownloadFile} + + + + 755 + + + + + + + statusVisible + initialStatusMessage + + + + + + + + + ${i18n:updater.FinishTitle} + + !(context.getBooleanVariable("isArchive") && context.getBooleanVariable("isDmg")) + + + + + + !context.getBooleanVariable("isArchive") && ((Integer)context.getVariable("updaterLaunchSelection")).intValue() == 0 + + + + + + + + + List<String> args = new ArrayList<String>(); +String installationDirectory = context.getInstallationDirectory().getPath(); +if (context.isUnattended()) { + args.add("-q"); + args.add("-wait"); + args.add("20"); + ProgressInterface progressInterface = context.getProgressInterface(); + if (progressInterface.isUnattendedProgressDialog()) { + if (progressInterface.isAlertsShown()) { + args.add("-alerts"); + } + args.add("-splash"); + args.add("Installing"); + } +} else if (context.isConsole()) { + args.add("-c"); +} + args.add("-dir"); + args.add(installationDirectory); + + return args.toArray(new String[args.size()]); + + + + installerArguments + + + + + + + ${installer:installerArguments} + + + + ${installer:updaterDownloadFile} + + + + + ${installer:updaterDownloadLocation} + + + + + + + + + + + + + !context.isConsole() + + labelText + + + + + + ${i18n:updater.FinishInfoText("${compiler:sys.fullName}")} + + !context.isConsole() + + labelText + + + + + ${i18n:updater.LaunchUpdaterQuestion} + + + + + + + + + + + ${i18n:updater.LaunchUpdaterLabel} + ${i18n:updater.DoNotLaunchUpdaterLabel} + + updaterLaunchSelection + + !context.getBooleanVariable("isArchive") + + + + + + Util.showPath((String)context.getVariable("updaterDownloadFile")); + + + ${i18n:updater.OpenContainingFolderLabel} + + !context.isConsole() + + + + + + + + + + + + ${i18n:updater.FinishTitle} + + context.getBooleanVariable("isArchive") && context.getBooleanVariable("isDmg") + + + + + + context.getBooleanVariable("updaterOpenDmg") + + + + + + + + + + Util.showPath((String)context.getVariable("updaterDownloadFile")); +return true; + + + + + + + + + + + + + !context.isConsole() + + labelText + + + + + + ${i18n:updater.FinishInfoText("${compiler:sys.fullName}")} + + !context.isConsole() + + labelText + + + + + ${i18n:updater.LaunchUpdaterQuestion} + + + + + + + + + + ${i18n:updater.OpenContainingFolderLabel} + + updaterOpenDmg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHBanController.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHBanController.java index 3e7538fc6..344be682c 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHBanController.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHBanController.java @@ -71,9 +71,13 @@ public void onEnable() { private void handleBanDelete(Context context) { List request = Arrays.asList(context.bodyAsClass(String[].class)); List pendingRemovals = new ArrayList<>(); - for (PeerAddress address : getServer().getBannedPeers().keySet()) { - if (request.contains(address.getIp())) { - pendingRemovals.add(address); + if (request.contains("*")) { + pendingRemovals.addAll(getServer().getBannedPeers().keySet()); + } else { + for (PeerAddress address : getServer().getBannedPeers().keySet()) { + if (request.contains(address.getIp())) { + pendingRemovals.add(address); + } } } pendingRemovals.forEach(pa -> getServer().scheduleUnBanPeer(pa)); @@ -116,7 +120,7 @@ public void onDisable() { .entrySet() .stream() .filter(b -> { - if(!ignoreBanForDisconnect) return true; + if (!ignoreBanForDisconnect) return true; return !b.getValue().isBanForDisconnect(); }) .map(entry -> new BanResponse(entry.getKey().getAddress().toString(), new BakedBanMetadata(locale, entry.getValue()))) diff --git a/webui/src/views/banlist/components/banList.vue b/webui/src/views/banlist/components/banList.vue index e42e4123f..a3c576ba5 100644 --- a/webui/src/views/banlist/components/banList.vue +++ b/webui/src/views/banlist/components/banList.vue @@ -2,13 +2,20 @@ {{ t('page.banlist.banlist.description') }} - + + + + {{ t('page.banlist.banlist.listItem.unbanall') }} + + + +
- {{ - t('page.banlist.banlist.bottomReached') - }} + {{ t('page.banlist.banlist.bottomReached') }} +
@@ -47,7 +54,7 @@ - + diff --git a/webui/src/views/dashboard/locale/en-US.ts b/webui/src/views/dashboard/locale/en-US.ts index 1021f2187..dec3a0f76 100644 --- a/webui/src/views/dashboard/locale/en-US.ts +++ b/webui/src/views/dashboard/locale/en-US.ts @@ -1,6 +1,10 @@ export default { 'page.dashboard.description': 'This page displays the basic data since PeerBanHelper started.', 'page.dashboard.runningStatus': 'Running Status', + 'page.dashboard.pauseAll': 'Pause', + 'page.dashboard.pauseAll.tips': + "This will stop PeerBanhelper's all functions and unban all Peers, suitable for modifying downloader configuration", + 'page.dashboard.pauseAll.result': 'Global pause mode has been started', 'page.dashboard.clientStatus.title': 'Connected Downloaders', 'page.dashboard.clientStatus.card.title': 'Downloader Status', 'page.dashboard.clientStatus.card.status': 'Status', diff --git a/webui/src/views/dashboard/locale/zh-CN.ts b/webui/src/views/dashboard/locale/zh-CN.ts index 5929922ee..8fa0c97e3 100644 --- a/webui/src/views/dashboard/locale/zh-CN.ts +++ b/webui/src/views/dashboard/locale/zh-CN.ts @@ -1,6 +1,10 @@ export default { 'page.dashboard.description': '此页面展示 PeerBanHelper 自启动以来的基本数据。', 'page.dashboard.runningStatus': '运行状态', + 'page.dashboard.pauseAll': '暂停', + 'page.dashboard.pauseAll.tips': + '这将停止 PeerBanhelper 的全部功能并解封全部 Peer,适用于修改下载器配置', + 'page.dashboard.pauseAll.result': '全局暂停模式已启动', 'page.dashboard.clientStatus.title': '已连接的下载器', 'page.dashboard.clientStatus.card.title': '下载器状态', 'page.dashboard.clientStatus.card.status': '状态', From 454ad788b33711bb7c09ebe12c9c9ba2550337ee Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Fri, 3 Jan 2025 15:27:14 +0800 Subject: [PATCH 077/160] warning --- webui/src/views/dashboard/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webui/src/views/dashboard/index.vue b/webui/src/views/dashboard/index.vue index 228f73121..44dcac26a 100644 --- a/webui/src/views/dashboard/index.vue +++ b/webui/src/views/dashboard/index.vue @@ -58,7 +58,7 @@ const [_r, _c, goto] = useViewRoute() const pauseAll = async (): Promise => { try { await endpointStore.updateGlobalConfig({ globalPaused: true }) - Message.info(t('page.dashboard.pauseAll.result')) + Message.warning(t('page.dashboard.pauseAll.result')) return true } catch (e) { if (e instanceof Error) { From 317d016b34c16261ffe82278e579a3c328a2ad99 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Fri, 3 Jan 2025 16:13:11 +0800 Subject: [PATCH 078/160] add dns settings --- webui/src/api/model/config.ts | 6 ++ .../components/config/components/network.vue | 92 +++++++++++++++++++ .../components/config/components/proxy.vue | 66 ------------- .../settings/components/config/index.vue | 7 +- .../components/config/locale/en-US.ts | 4 + .../components/config/locale/zh-CN.ts | 4 + 6 files changed, 110 insertions(+), 69 deletions(-) create mode 100644 webui/src/views/settings/components/config/components/network.vue delete mode 100644 webui/src/views/settings/components/config/components/proxy.vue diff --git a/webui/src/api/model/config.ts b/webui/src/api/model/config.ts index 87ea66279..e0b5c83fe 100644 --- a/webui/src/api/model/config.ts +++ b/webui/src/api/model/config.ts @@ -12,6 +12,7 @@ export interface Config { proxy: Proxy privacy: Privacy performance: Performance + resolvers: Resolvers } export interface Server { @@ -79,6 +80,11 @@ export interface Proxy { non_proxy_hosts?: string // non-proxy hosts, split by | } +export interface Resolvers { + use_system: boolean + servers: string[] +} + export interface Privacy { error_reporting: boolean } diff --git a/webui/src/views/settings/components/config/components/network.vue b/webui/src/views/settings/components/config/components/network.vue new file mode 100644 index 000000000..73060c8fd --- /dev/null +++ b/webui/src/views/settings/components/config/components/network.vue @@ -0,0 +1,92 @@ + + diff --git a/webui/src/views/settings/components/config/components/proxy.vue b/webui/src/views/settings/components/config/components/proxy.vue deleted file mode 100644 index e300ba720..000000000 --- a/webui/src/views/settings/components/config/components/proxy.vue +++ /dev/null @@ -1,66 +0,0 @@ - - diff --git a/webui/src/views/settings/components/config/index.vue b/webui/src/views/settings/components/config/index.vue index b85df4c7a..2e954f115 100644 --- a/webui/src/views/settings/components/config/index.vue +++ b/webui/src/views/settings/components/config/index.vue @@ -45,7 +45,7 @@ - + @@ -76,9 +76,9 @@ import btn from './components/btn.vue' import ipDatabase from './components/ipDatabase.vue' import logger from './components/logger.vue' import lookup from './components/lookup.vue' +import network from './components/network.vue' import performance from './components/performance.vue' import persist from './components/persist.vue' -import proxy from './components/proxy.vue' import push from './components/push.vue' import webui from './components/webui.vue' @@ -92,7 +92,8 @@ const form = reactive({ ip_database: {}, privacy: {}, proxy: {}, - performance: {} + performance: {}, + resolvers: {} } as Config) const { loading } = useRequest(GetConfig, { onSuccess: (data) => { diff --git a/webui/src/views/settings/components/config/locale/en-US.ts b/webui/src/views/settings/components/config/locale/en-US.ts index f3feb77d0..f12bcd96a 100644 --- a/webui/src/views/settings/components/config/locale/en-US.ts +++ b/webui/src/views/settings/components/config/locale/en-US.ts @@ -60,6 +60,10 @@ export default { 'page.settings.tab.config.ipDatabase.city': 'City Database', 'page.settings.tab.config.ipDatabase.asn': 'ASN Database', + 'page.settings.tab.config.network': 'Network', + + 'page.settings.tab.config.reslolver.useSystem': 'Use system DNS', + 'page.settings.tab.config.reslolver.customServer': 'Custom DNS server', 'page.settings.tab.config.proxy': 'Proxy', 'page.settings.tab.config.proxy.type': 'Proxy type', 'page.settings.tab.config.proxy.type.0': 'No proxy', diff --git a/webui/src/views/settings/components/config/locale/zh-CN.ts b/webui/src/views/settings/components/config/locale/zh-CN.ts index e7244f252..52386441c 100644 --- a/webui/src/views/settings/components/config/locale/zh-CN.ts +++ b/webui/src/views/settings/components/config/locale/zh-CN.ts @@ -59,6 +59,10 @@ export default { 'page.settings.tab.config.ipDatabase.city': '城市数据库', 'page.settings.tab.config.ipDatabase.asn': 'ASN 数据库', + 'page.settings.tab.config.network': '网络', + + 'page.settings.tab.config.reslolver.useSystem': '使用系统 DNS', + 'page.settings.tab.config.reslolver.customServer': '自定义 DNS 服务器', 'page.settings.tab.config.proxy': '代理', 'page.settings.tab.config.proxy.type': '代理类型', 'page.settings.tab.config.proxy.type.0': '不使用代理', From a04d310d947e6286b3f853079ec5710ceb9c73b0 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Fri, 3 Jan 2025 16:19:06 +0800 Subject: [PATCH 079/160] add btn config result --- webui/src/api/model/status.ts | 1 + .../src/views/settings/components/info/index.vue | 16 +++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/webui/src/api/model/status.ts b/webui/src/api/model/status.ts index 73df15141..c415c2319 100644 --- a/webui/src/api/model/status.ts +++ b/webui/src/api/model/status.ts @@ -71,6 +71,7 @@ export interface BTNStatus { * BTN 配置文件获取 URL */ configUrl: string + configResult: string } export interface Ability { diff --git a/webui/src/views/settings/components/info/index.vue b/webui/src/views/settings/components/info/index.vue index b0dc77e79..38d175376 100644 --- a/webui/src/views/settings/components/info/index.vue +++ b/webui/src/views/settings/components/info/index.vue @@ -413,13 +413,15 @@ - - {{ - btnStatus?.data.configSuccess - ? t('page.settings.tab.info.btn.status.success') - : t('page.settings.tab.info.btn.status.fail') - }} - + + + {{ + btnStatus?.data.configSuccess + ? t('page.settings.tab.info.btn.status.success') + : t('page.settings.tab.info.btn.status.fail') + }} + + Date: Fri, 3 Jan 2025 16:27:35 +0800 Subject: [PATCH 080/160] fix #867 --- .../src/views/settings/components/config/components/network.vue | 2 +- webui/src/views/settings/components/config/components/webui.vue | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/webui/src/views/settings/components/config/components/network.vue b/webui/src/views/settings/components/config/components/network.vue index 73060c8fd..2dc4bde94 100644 --- a/webui/src/views/settings/components/config/components/network.vue +++ b/webui/src/views/settings/components/config/components/network.vue @@ -15,7 +15,7 @@ v-if="!resolverModel.use_system" v-model="resolverModel.servers" :label="t('page.settings.tab.config.reslolver.customServer')" - :pagination-props="{ pageSize: 10, total: resolverModel.servers.length }" + :pagination-props="{ pageSize: 10, total: resolverModel?.servers?.length ?? 0 }" />
diff --git a/webui/src/views/settings/components/config/components/webui.vue b/webui/src/views/settings/components/config/components/webui.vue index 99702e59f..6aa39d258 100644 --- a/webui/src/views/settings/components/config/components/webui.vue +++ b/webui/src/views/settings/components/config/components/webui.vue @@ -8,7 +8,6 @@ field="server.address" required validate-trigger="focus" - :rules="[{ type: 'ip', required: true }]" >
From c5564f6bed918ebfd2947bd173004886b8efb241 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Fri, 3 Jan 2025 18:42:42 +0800 Subject: [PATCH 081/160] bump version --- .../com/ghostchu/peerbanhelper/config/ProfileUpdateScript.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/config/ProfileUpdateScript.java b/src/main/java/com/ghostchu/peerbanhelper/config/ProfileUpdateScript.java index 6df28083a..8a5c9283a 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/config/ProfileUpdateScript.java +++ b/src/main/java/com/ghostchu/peerbanhelper/config/ProfileUpdateScript.java @@ -25,7 +25,7 @@ public ProfileUpdateScript(YamlConfiguration conf) { this.conf = conf; } - @UpdateScript(version = 23) + @UpdateScript(version = 24) public void ptrBlacklistAndUpdateTorExitNodeList(YamlConfiguration bundled) { conf.set("module.ptr-blacklist", bundled.get("module.ptr-blacklist")); if("https://cdn.jsdelivr.net/gh/platformcosmo/Tor-IP-Addresses/tor-exit-nodes.lst".equals(conf.getString("module.ip-address-blocker-rules.rules.tor-exit-nodes.url"))){ From 5fa39b6be3c6efccc643f476792570f49bd6c064 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Fri, 3 Jan 2025 18:42:47 +0800 Subject: [PATCH 082/160] remove useless console.log --- webui/src/stores/endpoint.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/webui/src/stores/endpoint.ts b/webui/src/stores/endpoint.ts index 439e47cf2..e2993f210 100644 --- a/webui/src/stores/endpoint.ts +++ b/webui/src/stores/endpoint.ts @@ -149,9 +149,6 @@ export const useEndpointStore = defineStore('endpoint', () => { const getPlusStatus = async () => { const result = await getPBHPlusStatus() plusStatus.value = result.data - if (result?.data?.activated) { - console.log('PBH Plus Activated! Thanks for your support ❤️') - } } const setPlusKey = async (key: string) => { const result = await setPHBPlusKey(key) From ce516cb73918b13bcebd51f81776e8f1054ce99c Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Fri, 3 Jan 2025 18:55:30 +0800 Subject: [PATCH 083/160] =?UTF-8?q?=E5=88=97=E8=A1=A8=E4=B8=BA=E7=A9=BA?= =?UTF-8?q?=E6=97=B6=E7=A6=81=E7=94=A8=E2=80=9C=E8=A7=A3=E5=B0=81=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E2=80=9D=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/views/banlist/components/banList.vue | 7 ++++++- webui/src/views/dashboard/index.vue | 2 ++ webui/src/views/dashboard/locale/zh-CN.ts | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/webui/src/views/banlist/components/banList.vue b/webui/src/views/banlist/components/banList.vue index 037c15ee0..f17f782a3 100644 --- a/webui/src/views/banlist/components/banList.vue +++ b/webui/src/views/banlist/components/banList.vue @@ -8,7 +8,12 @@ once :async-fn="() => handleUnban('*')" > - + {{ t('page.banlist.banlist.listItem.unbanall') }} diff --git a/webui/src/views/dashboard/index.vue b/webui/src/views/dashboard/index.vue index 44dcac26a..0af8490ee 100644 --- a/webui/src/views/dashboard/index.vue +++ b/webui/src/views/dashboard/index.vue @@ -45,6 +45,7 @@ + + diff --git a/webui/src/components/pageHeader.vue b/webui/src/components/pageHeader.vue index 1441ac7a3..708771450 100644 --- a/webui/src/components/pageHeader.vue +++ b/webui/src/components/pageHeader.vue @@ -98,6 +98,9 @@ + + +
Date: Fri, 3 Jan 2025 23:28:27 +0800 Subject: [PATCH 087/160] clean code --- webui/src/App.vue | 4 +- webui/src/components/globalPauseBtn.vue | 83 +++++++---------------- webui/src/components/pageHeader.vue | 6 +- webui/src/locale/en-US.ts | 11 ++- webui/src/locale/zh-CN.ts | 9 ++- webui/src/views/dashboard/index.vue | 56 ++------------- webui/src/views/dashboard/locale/en-US.ts | 5 -- webui/src/views/dashboard/locale/zh-CN.ts | 5 -- 8 files changed, 52 insertions(+), 127 deletions(-) diff --git a/webui/src/App.vue b/webui/src/App.vue index c2e655ab4..d9c2c285d 100644 --- a/webui/src/App.vue +++ b/webui/src/App.vue @@ -1,6 +1,6 @@