Pārlūkot izejas kodu

feat: xcat generateSysLog

Cat 1 gadu atpakaļ
revīzija
eb9e72730d
100 mainītis faili ar 16391 papildinājumiem un 0 dzēšanām
  1. 2 0
      .github/FUNDING.yml
  2. 20 0
      .github/ISSUE_TEMPLATE/bug_report.md
  3. 11 0
      .github/ISSUE_TEMPLATE/feature_request.md
  4. 6 0
      .github/dependabot.yml
  5. BIN
      .github/do.png
  6. BIN
      .github/jetbrains.png
  7. BIN
      .github/patreon.png
  8. BIN
      .github/vultr.png
  9. 36 0
      .github/workflows/lint.yml
  10. 22 0
      .github/workflows/lockdown.yml
  11. 37 0
      .github/workflows/minify.yml
  12. 39 0
      .github/workflows/sonarcloud.yml
  13. 22 0
      .github/workflows/stale.yml
  14. 48 0
      .github/workflows/unit.yaml
  15. 50 0
      .gitignore
  16. 85 0
      CONTRIBUTING.md
  17. 21 0
      LICENSE
  18. 77 0
      README.md
  19. 1 0
      SECURITY.md
  20. 7 0
      app/predefine.php
  21. 338 0
      app/routes.php
  22. 76 0
      composer.json
  23. 10547 0
      composer.lock
  24. 148 0
      config/.config.example.php
  25. 756 0
      config/appprofile.example.php
  26. 52 0
      config/clients.json
  27. 1541 0
      config/settings.json
  28. 416 0
      db/migrations/2023020100-init.php
  29. 32 0
      db/migrations/2023021600-drop_user_token.php
  30. 22 0
      db/migrations/2023030500-add_paylist_invoice_id.php
  31. 32 0
      db/migrations/2023031700-add_user_money_log.php
  32. 22 0
      db/migrations/2023031701-add_paylist_gateway.php
  33. 49 0
      db/migrations/2023032600-online_log_per_user-ip.php
  34. 24 0
      db/migrations/2023050800-add_user_transfer_today.php
  35. 22 0
      db/migrations/2023053000-add_user_coupon_use_time.php
  36. 64 0
      db/migrations/2023060300-add_user_locale_and_update_data_type.php
  37. 168 0
      db/migrations/2023061800-update_new_shop_data_type.php
  38. 34 0
      db/migrations/2023063000-add_user_is_inactive.php
  39. 55 0
      db/migrations/2023071000-drop_temp_tables.php
  40. 32 0
      db/migrations/2023071600-drop_stream_media.php
  41. 30 0
      db/migrations/2023071700-add_user_is_shadow_banned.php
  42. 48 0
      db/migrations/2023072000-add_sub_log.php
  43. 27 0
      db/migrations/2023080900-update_user_im_type.php
  44. 26 0
      db/migrations/2023081800-add_user_contact_method.php
  45. 26 0
      db/migrations/2023082000-remove_user_expire_in.php
  46. 28 0
      db/migrations/2023102200-add_node_dynamic_rate.php
  47. 28 0
      db/migrations/2023111700-remove_node_info_status.php
  48. 28 0
      db/migrations/2023111800-remove_user_invite_code_at.php
  49. 28 0
      db/migrations/2023111801-remove_detect_ban_log_user_info.php
  50. 26 0
      db/migrations/2023120700-add_node_dynamic_rate.php
  51. 26 0
      db/migrations/2024012000-add_payback_invoice_id.php
  52. 26 0
      db/migrations/2024012300-remove_user_invite_num.php
  53. 43 0
      db/migrations/2024012700-add_hourly_usage.php
  54. 37 0
      db/migrations/2024021900-add_missing_indexes.php
  55. 30 0
      db/migrations/2024030300-update_node_ip.php
  56. 33 0
      db/migrations/2024031000-remove_user_forbidden.php
  57. 41 0
      db/migrations/2024031700-update_data_type.php
  58. 38 0
      db/migrations/2024040500-add_invoice_type.php
  59. 42 0
      db/migrations/2024041000-add_syslog.php
  60. 39 0
      phpinsights.php
  61. 27 0
      phpunit.xml
  62. 98 0
      public/assets/js/fuck.js
  63. 1 0
      public/assets/js/fuck.min.js
  64. 0 0
      public/clients/.gitkeep
  65. BIN
      public/favicon.ico
  66. BIN
      public/images/alipay.png
  67. BIN
      public/images/qqpay.png
  68. BIN
      public/images/uim-logo-round_1536x1536.png
  69. BIN
      public/images/uim-logo-round_192x192.png
  70. BIN
      public/images/uim-logo-round_384x384.png
  71. BIN
      public/images/uim-logo-round_48x48.png
  72. BIN
      public/images/uim-logo-round_768x768.png
  73. BIN
      public/images/uim-logo-round_96x96.png
  74. BIN
      public/images/uim-logo_1600x1600.png
  75. BIN
      public/images/uim-logo_200x200.png
  76. BIN
      public/images/uim-logo_400x400.png
  77. BIN
      public/images/uim-logo_800x800.png
  78. BIN
      public/images/usdt.png
  79. BIN
      public/images/wechat.png
  80. 40 0
      public/index.php
  81. 0 0
      public/theme/tabler/.gitkeep
  82. 35 0
      resources/email/finance.tpl
  83. 25 0
      resources/email/footer.tpl
  84. 45 0
      resources/email/header.tpl
  85. 35 0
      resources/email/new_user.tpl
  86. 37 0
      resources/email/password_reset.tpl
  87. 35 0
      resources/email/test.tpl
  88. 49 0
      resources/email/traffic_report.tpl
  89. 37 0
      resources/email/verify_code.tpl
  90. 35 0
      resources/email/warn.tpl
  91. 1 0
      resources/locale/en-US.json
  92. 1 0
      resources/locale/ja-JP.json
  93. 1 0
      resources/locale/zh-CN.json
  94. 1 0
      resources/locale/zh-TW.json
  95. 22 0
      resources/views/tabler/404.tpl
  96. 22 0
      resources/views/tabler/405.tpl
  97. 22 0
      resources/views/tabler/500.tpl
  98. 91 0
      resources/views/tabler/admin/announcement/create.tpl
  99. 66 0
      resources/views/tabler/admin/announcement/edit.tpl
  100. 101 0
      resources/views/tabler/admin/announcement/index.tpl

+ 2 - 0
.github/FUNDING.yml

@@ -0,0 +1,2 @@
+# These are supported funding model platforms
+patreon: catdev

+ 20 - 0
.github/ISSUE_TEMPLATE/bug_report.md

@@ -0,0 +1,20 @@
+---
+name: Bug report
+about: Create a bug report
+title: "[BUG] 在这里填入你所遇到问题的概述"
+labels: bug-user-report
+
+---
+
+**Environment 环境**
+
+OS:   
+HTTPS enabled:   
+PHP version:    
+DB version:  
+Redis version:    
+Commit:    
+
+**Bug Info**
+
+Describe the issue you run into. 请描述你遇到的问题。

+ 11 - 0
.github/ISSUE_TEMPLATE/feature_request.md

@@ -0,0 +1,11 @@
+---
+name: Feature request
+about: Suggest a new idea for this project
+title: "[Feature Request] 在这里填入你所希望添加功能的概述"
+labels: feature-request
+
+---
+
+**Feature 功能请求**
+
+Describe the feature you want. 请描述你想要的功能。

+ 6 - 0
.github/dependabot.yml

@@ -0,0 +1,6 @@
+version: 2
+updates:
+  - package-ecosystem: "composer"
+    directory: "/"
+    schedule:
+      interval: "monthly"

BIN
.github/do.png


BIN
.github/jetbrains.png


BIN
.github/patreon.png


BIN
.github/vultr.png


+ 36 - 0
.github/workflows/lint.yml

@@ -0,0 +1,36 @@
+name: Lint PHP Code
+on:
+  push:
+  pull_request:
+    types: [opened, reopened, synchronize]
+
+jobs:
+  php-file-changed:
+    runs-on: ubuntu-latest
+    outputs:
+      php: ${{ steps.filter.outputs.php }}
+    steps:
+    - uses: actions/checkout@v4
+      with:
+        fetch-depth: 0
+    - uses: dorny/paths-filter@v3
+      id: filter
+      with:
+        filters: |
+          php:
+            - '**/*.php'
+  lint:
+    needs: php-file-changed
+    if: ${{ needs.php-file-changed.outputs.php == 'true' }}
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - uses: shivammathur/setup-php@v2
+        with:
+          php-version: 8.3
+      - run: |
+          composer install --no-interaction --no-progress --no-suggest --quiet
+          php vendor/bin/phpinsights analyse --no-interaction --format=github-action \
+          --min-style=100 --min-architecture=100 --min-quality=100

+ 22 - 0
.github/workflows/lockdown.yml

@@ -0,0 +1,22 @@
+name: Lockdown Issue
+
+on:
+  issues:
+    types: [opened]
+  issue_comment:
+    types: [created]
+
+jobs:
+  closeAndlock:
+    runs-on: ubuntu-latest
+    permissions:
+      issues: write
+      pull-requests: write
+    steps:
+    - name: Close & Lock Issue
+      run: |
+        gh issue close --reason "not planned" ${{ github.event.issue.number }}
+        gh issue lock --reason "spam" ${{ github.event.issue.number }}
+      env:
+        GH_REPO: ${{ github.repository }}
+        GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

+ 37 - 0
.github/workflows/minify.yml

@@ -0,0 +1,37 @@
+name: Auto Minify CSS/JS file
+
+on:
+  push:
+    paths:
+      - 'public/assets/css/**'
+      - 'public/assets/js/**'
+      - 'public/theme/**'
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          token: ${{ secrets.GITHUB_TOKEN }}
+      - name: Auto minify tabler theme CSS file
+        uses: nizarmah/auto-minify@v3
+        with:
+          directory: 'public/theme/tabler/css'
+      - name: Auto minify tabler theme JS file
+        uses: nizarmah/auto-minify@v3
+        with:
+          directory: 'public/theme/tabler/js'
+      - name: Auto minify asset CSS file
+        uses: nizarmah/auto-minify@v3
+        with:
+          directory: 'public/assets/css'
+      - name: Auto minify asset JS file
+        uses: nizarmah/auto-minify@v3
+        with:
+          directory: 'public/assets/js'
+      - name: Auto committing minified files
+        uses: stefanzweifel/git-auto-commit-action@v5
+        with:
+          repository: 'public'
+          commit_message: "chore: auto minified theme CSS/JS files"

+ 39 - 0
.github/workflows/sonarcloud.yml

@@ -0,0 +1,39 @@
+name: SonarCloud
+
+on:
+  push:
+  pull_request:
+    types: [ opened, reopened, synchronize ]
+
+permissions:
+  pull-requests: read
+
+jobs:
+  Analysis:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: Setup PHP with Xdebug
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: '8.3'
+          coverage: xdebug
+      - name: Install dependencies with composer
+        run: composer update --no-interaction --no-progress --no-suggest --quiet
+      - name: Run tests with phpunit/phpunit
+        run: vendor/bin/phpunit --coverage-clover=coverage.xml
+      - name: Fix code coverage paths
+        run: sed -i 's@'$GITHUB_WORKSPACE'@/github/workspace@g' coverage.xml
+      - name: Analyze with SonarCloud
+        uses: SonarSource/sonarcloud-github-action@master
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
+        with:
+          args:
+            -Dsonar.projectKey=sspanel-uim_SSPanel-Uim-Dev
+            -Dsonar.organization=sspanel-uim
+            -Dsonar.php.coverage.reportPaths=coverage.xml

+ 22 - 0
.github/workflows/stale.yml

@@ -0,0 +1,22 @@
+name: Mark stale issues and pull requests
+
+on:
+  schedule:
+  - cron: '0 0 * * *'
+
+jobs:
+  stale:
+    runs-on: ubuntu-latest
+    permissions:
+      issues: write
+      pull-requests: write
+    steps:
+    - uses: actions/stale@v9
+      with:
+        repo-token: ${{ secrets.GITHUB_TOKEN }}
+        days-before-stale: 180
+        days-before-close: 14
+        stale-issue-message: 'This issue has had no activity for over 180 days and will be closed in 14 days.'
+        stale-pr-message: 'This PR has had no activity for over 180 days and will be closed in 14 days.'
+        stale-issue-label: 'staled'
+        stale-pr-label: 'staled'

+ 48 - 0
.github/workflows/unit.yaml

@@ -0,0 +1,48 @@
+name: PHP Unit Tests
+
+on:
+  push:
+  pull_request:
+    types: [ opened, reopened, synchronize ]
+
+jobs:
+  php-file-changed:
+    runs-on: ubuntu-latest
+    outputs:
+      php: ${{ steps.filter.outputs.php }}
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - uses: dorny/paths-filter@v3
+        id: filter
+        with:
+          filters: |
+            php:
+              - '**/*.php'
+
+  php8.2:
+    needs: php-file-changed
+    if: ${{ needs.php-file-changed.outputs.php == 'true' }}
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v4
+    - uses: shivammathur/setup-php@v2
+      with:
+        php-version: 8.2
+    - run: |
+        composer install --no-interaction --no-progress --no-suggest --quiet
+        php vendor/bin/phpunit
+
+  php8.3:
+    needs: php-file-changed
+    if: ${{ needs.php-file-changed.outputs.php == 'true' }}
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - uses: shivammathur/setup-php@v2
+        with:
+          php-version: 8.3
+      - run: |
+          composer install --no-interaction --no-progress --no-suggest --quiet
+          php vendor/bin/phpunit

+ 50 - 0
.gitignore

@@ -0,0 +1,50 @@
+.idea
+.htaccess
+*/.DS_Store
+.DS_Store
+.env
+
+vendor
+
+.vs/
+.vscode
+.editorconfig
+
+.stylelintrc.json
+.stylelintignore
+
+php_errors.log
+composer.phar
+
+404.html
+index.html
+
+config/.config.php
+config/.config.php.bak
+config/appprofile.php
+
+public/clients/*.*
+!public/clients/.gitkeep
+
+storage/framework/smarty/cache/*
+storage/framework/smarty/compile/*
+storage/framework/twig/cache/*
+!storage/framework/smarty/cache/.gitkeep
+!storage/framework/smarty/compile/.gitkeep
+!storage/framework/twig/cache/.gitkeep
+
+.user.ini
+public/.user.ini
+
+.envrc.local
+.envrc
+flake.lock
+flake.nix
+.direnv/
+
+node_modules
+package.json
+package-lock.json
+
+*.cache
+

+ 85 - 0
CONTRIBUTING.md

@@ -0,0 +1,85 @@
+# How to Contribute / 如何贡献代码
+
+[English](#English)  
+[简体中文](#简体中文)
+
+## English
+
+### Pull Requests
+
+1. Fork the repository
+2. Create a new branch for each feature or improvement
+3. Send a pull request from each feature branch against the dev branch.
+
+It is very important to separate new features or improvements into separate feature branches, and to send a
+pull request for each branch. This allows each feature or improvement to be reviewed and merged individually.
+
+### Coding Style
+
+All pull requests and commits **must** adhere to the [PSR-2 standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) at least.  
+And we **recommend** adhering to the [PSR-12 standard](https://github.com/php-fig/fig-standards/blob/master/proposed/extended-coding-style-guide.md).
+
+### Commit message
+
+The Commit message must concisely contain all your changes.  
+Please **do not** use words like "fix", "improve" only.    
+Please try to use **English** in the Commit message and use the following Type tags.
+- feat: add or modify a feature (feature)
+- fix: fix bugs (bug fix)
+- docs: documents (documentation)
+- style: formatting    
+        changes that do not affect the operation of the code, e.g. white-space, formatting, missing semicolons
+- refactor: refactoring    
+        Code changes that do not add features or fix bugs
+- perf: improves performance
+- test: when adding missing tests
+- chore: maintenance    
+        Changes to builders or helpers that do not affect the operation of the code, e.g., changes to config, Grunt Task management tools
+- revert: undo a previous commit    
+        Example: revert: type(scope):subject
+
+### Rule
+
+If you want to add a new function for router callback, please follow the structure of the HomeController.  
+Please use the function from PSR-7 like `$request->getParsedBodyParam()`, `getParsedBodyParam()` as possible.
+
+## 简体中文
+
+### Pull Request
+
+1. Fork 本项目
+2. 为每一项新特性或改进创建一个新的分支
+3. 为每一项新特性或改进创建一个独立的 Pull Request 至 dev 分支
+
+我们建议你将不同的新特性置于不同的分支并以不同的 Pull Request 提交,这将有利于我们独立审查代码并独立合并。
+
+### 代码风格
+
+所有的 Pull request 和 commit 都至少**必须**遵守 [PSR-2 标准](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)。  
+我们建议**最好**遵守 [PSR-12 标准](https://github.com/php-fig/fig-standards/blob/master/proposed/extended-coding-style-guide.md)。
+
+### Commit 消息
+
+Commit 消息必须简洁地包含你所有的修改。请**不要**仅使用「修复」、「改进」等字样。    
+在 Commit 消息中请尽量使用**英文**,并且使用以下 Type 标签:
+- feat:新增或修改功能(feature)
+- fix:修补 bug(bug fix)
+- docs:文件(documentation)
+- style:格式    
+        不影响程式码运行的变动,例如:white-space, formatting, missing semi colons
+- refactor:重构    
+        不是新增功能,也非修补 bug 的程式码变动
+- perf:改善效能(improves performance)
+- test:增加测试(when adding missing tests)
+- chore:维护    
+        不影响程式码运行,建构程序或辅助工具的变动,例如修改 config、Grunt Task 任务管理工具
+- revert:撤销回覆先前的 commit    
+        例如:revert:type(scope):subject
+
+### 规范
+
+若你需要新增/修改 Router callback,请依照类似 HomeController 的形式。  
+如无必要,请不要使用`$request->getParam()`并尽量使用 PSR-7 中的`$request->getParsedBodyParam()`、`getParsedBodyParam()`等一系列用于获取参数的方法。
+
+参考资料:    
+<https://heidiliu2020.github.io/git-commit-message>

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 SSPanel-UIM Dev Team
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 77 - 0
README.md

@@ -0,0 +1,77 @@
+<img src="public/images/uim-logo-round_192x192.png" alt="logo" width="150" height="150" align="left" />
+
+<h1>SSPanel UIM</h1>
+
+> Across the Great Wall we can reach every corner in the world
+
+<br>
+<br>
+
+![GitHub repo size](https://img.shields.io/github/repo-size/SSPanel-UIM/SSPanel-UIM-Dev?style=flat-square)
+![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/Anankke/SSPanel-Uim?style=flat-square)
+![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/SSPanel-UIM/SSPanel-UIM-Dev/lint.yml?branch=dev&label=lint&style=flat-square)
+![Sonar Quality Gate](https://img.shields.io/sonar/quality_gate/sspanel-uim_SSPanel-Uim-Dev/dev?server=https%3A%2F%2Fsonarcloud.io&style=flat-square)
+![Sonar Coverage](https://img.shields.io/sonar/coverage/sspanel-uim_SSPanel-Uim-Dev/dev?server=https%3A%2F%2Fsonarcloud.io&style=flat-square)
+
+[![Release](https://img.shields.io/badge/Telegram-Release-blue?style=flat-square)](https://t.me/sspanel_uim)
+[![Dev](https://img.shields.io/badge/Telegram-Dev-blue?style=flat-square)](https://t.me/sspanel_uim_dev)
+[![Discord](https://img.shields.io/discord/1049692075085549600?color=5865F2&label=Discord&style=flat-square)](https://discord.gg/A7uFKCvf8V)
+[![Dev Blog](https://img.shields.io/badge/Dev-Blog-blue?style=flat-square)](https://blog.sspanel.org)
+
+## TL;DR
+
+SSPanel UIM is a multi-purpose proxy service management system designed for Shadowsocks(2022) / V2Ray / Trojan / TUIC protocol.
+
+## Features
+
+- Integrate multiple payment systems such as Alipay F2F, PayPal, Stripe, etc.
+- Support multiple mail services, built-in mail queue function, no third-party components are required to use
+- Built-in tabler theme based on Bootstrap 5, template engine support
+- Support Shadowsocks 2022, TUIC, and other latest proxy protocols
+- Universal subscription interface, one-click json/clash/sip008/sing-box format subscription distribution
+- Custom node configuration, modular subscription system, support multiple client-specific subscription formats
+- Refactored store system, support billing modes including but not limited to annual/monthly, pay-as-you-go, access type billing, etc.
+- Refactored scheduled task system, one command can automatically complete all scheduled tasks
+- Deep integration of large language models, support intelligent replies to tickets, document generation, and other functions
+- One-click access to OpenAI, Google AI, Vertex AI, Hugging Face Hosted API, Cloudflare Workers AI, Anthropic, and other large language model services
+
+## Installation
+
+SSPanel UIM requires the following programs to be installed and run normally:
+
+- Git
+- Nginx(HTTPS is REQUIRED)
+- PHP 8.2+ (OPcache+JIT is highly recommended)
+- MariaDB 10.11+(Disable strict mode)
+- Redis 7.0+
+
+## Documentation
+
+> We install, we update, we develop
+
+[SSPanel UIM Wiki](https://wiki.sspanel.org)
+
+## Related Projects
+
+SSPanel-UIM is not just a panel, it also includes a series of peripheral projects to help you use it better.
+
+You can view other projects maintained by our developers on the [SSPanel-UIM Project](https://github.com/SSPanel-UIM) page.
+
+## Support Developers
+
+### M1Screw
+
+<a href="https://www.patreon.com/catdev"><img src=".github/patreon.png" width="300"></a>
+
+<a href="https://www.vultr.com/?ref=8941355-8H"><img src=".github/vultr.png" width="300"></a>
+
+<a href="https://www.digitalocean.com/?refcode=50f1a3b6244c"><img src=".github/do.png" width="300"></a>
+
+
+## Sponsors
+
+[![](.github/jetbrains.png)](https://www.jetbrains.com/?from=SSPanel-UIM)
+
+## License
+
+[MIT License](blob/dev/LICENSE)

+ 1 - 0
SECURITY.md

@@ -0,0 +1 @@
+All reports gose to here: [email protected] & [email protected]

+ 7 - 0
app/predefine.php

@@ -0,0 +1,7 @@
+<?php
+
+declare(strict_types=1);
+
+// Global constants
+const BASE_PATH = __DIR__ . '/..';
+const VERSION = '2024.1';

+ 338 - 0
app/routes.php

@@ -0,0 +1,338 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Middleware\Admin;
+use App\Middleware\Guest;
+use App\Middleware\NodeToken;
+use App\Middleware\User;
+use Slim\Routing\RouteCollectorProxy;
+
+return static function (Slim\App $app): void {
+    // Home
+    $app->get('/', App\Controllers\HomeController::class . ':index');
+    $app->get('/tos', App\Controllers\HomeController::class . ':tos');
+    $app->get('/staff', App\Controllers\HomeController::class . ':staff');
+    // Error Page
+    $app->get('/404', App\Controllers\HomeController::class . ':notFound');
+    $app->get('/405', App\Controllers\HomeController::class . ':methodNotAllowed');
+    $app->get('/500', App\Controllers\HomeController::class . ':internalServerError');
+    // Bot Callback
+    $app->post('/callback/{type}', App\Controllers\CallbackController::class . ':index');
+    // OAuth
+    $app->post('/oauth/{type}', App\Controllers\OAuthController::class . ':index');
+    $app->get('/oauth/{type}', App\Controllers\OAuthController::class . ':index');
+    // 通用订阅
+    $app->get('/sub/{token}/{subtype}', App\Controllers\SubController::class . ':index');
+
+    // User
+    $app->group('/user', static function (RouteCollectorProxy $group): void {
+        $group->get('', App\Controllers\UserController::class . ':index');
+        $group->get('/', App\Controllers\UserController::class . ':index');
+        // 签到
+        $group->post('/checkin', App\Controllers\UserController::class . ':checkin');
+        // 公告
+        $group->get('/announcement', App\Controllers\UserController::class . ':announcement');
+        // 文档
+        $group->get('/docs', App\Controllers\User\DocsController::class . ':index');
+        $group->get('/docs/{id:[0-9]+}/view', App\Controllers\User\DocsController::class . ':detail');
+        // 个人资料
+        $group->get('/profile', App\Controllers\UserController::class . ':profile');
+        // Invite
+        $group->get('/invite', App\Controllers\User\InviteController::class . ':index');
+        $group->post('/invite/reset', App\Controllers\User\InviteController::class . ':reset');
+        // 封禁
+        $group->get('/banned', App\Controllers\UserController::class . ':banned');
+        // 节点
+        $group->get('/server', App\Controllers\User\ServerController::class . ':index');
+        // 动态倍率
+        $group->get('/rate', App\Controllers\User\RateController::class . ':index');
+        $group->post('/rate', App\Controllers\User\RateController::class . ':ajax');
+        // 审计
+        $group->get('/detect', App\Controllers\User\DetectRuleController::class . ':index');
+        $group->get('/detect/log', App\Controllers\User\DetectLogController::class . ':index');
+        // 工单
+        $group->get('/ticket', App\Controllers\User\TicketController::class . ':index');
+        $group->get('/ticket/create', App\Controllers\User\TicketController::class . ':create');
+        $group->post('/ticket', App\Controllers\User\TicketController::class . ':add');
+        $group->get('/ticket/{id:[0-9]+}/view', App\Controllers\User\TicketController::class . ':detail');
+        $group->put('/ticket/{id:[0-9]+}', App\Controllers\User\TicketController::class . ':update');
+        // 资料编辑
+        $group->get('/edit', App\Controllers\User\InfoController::class . ':index');
+        $group->post('/email', App\Controllers\User\InfoController::class . ':updateEmail');
+        $group->post('/username', App\Controllers\User\InfoController::class . ':updateUsername');
+        $group->post('/unbind_im', App\Controllers\User\InfoController::class . ':unbindIM');
+        $group->post('/password', App\Controllers\User\InfoController::class . ':updatePassword');
+        $group->post('/passwd_reset', App\Controllers\User\InfoController::class . ':resetPasswd');
+        $group->post('/apitoken_reset', App\Controllers\User\InfoController::class . ':resetApiToken');
+        $group->post('/method', App\Controllers\User\InfoController::class . ':updateMethod');
+        $group->post('/url_reset', App\Controllers\User\InfoController::class . ':resetURL');
+        $group->post('/daily_mail', App\Controllers\User\InfoController::class . ':updateDailyMail');
+        $group->post('/contact_method', App\Controllers\User\InfoController::class . ':updateContactMethod');
+        $group->post('/theme', App\Controllers\User\InfoController::class . ':updateTheme');
+        $group->post('/kill', App\Controllers\User\InfoController::class . ':sendToGulag');
+        // 发送验证邮件
+        $group->post('/send', App\Controllers\AuthController::class . ':sendVerify');
+        // MFA
+        $group->post('/ga_check', App\Controllers\User\MFAController::class . ':checkGa');
+        $group->post('/ga_set', App\Controllers\User\MFAController::class . ':setGa');
+        $group->post('/ga_reset', App\Controllers\User\MFAController::class . ':resetGa');
+        // 深色模式切换
+        $group->post('/switch_theme_mode', App\Controllers\UserController::class . ':switchThemeMode');
+        // 订阅记录
+        $group->get('/subscribe', App\Controllers\User\SubLogController::class . ':index');
+        // 流量记录
+        $group->get('/traffic', App\Controllers\User\TrafficLogController::class . ':index');
+        // 账户余额
+        $group->get('/money', App\Controllers\User\MoneyController::class . ':index');
+        $group->post('/giftcard', App\Controllers\User\MoneyController::class . ':applyGiftCard');
+        // 产品页面
+        $group->get('/product', App\Controllers\User\ProductController::class . ':index');
+        // 订单页面
+        $group->get('/order', App\Controllers\User\OrderController::class . ':index');
+        $group->get('/order/create', App\Controllers\User\OrderController::class . ':create');
+        $group->post('/order/create', App\Controllers\User\OrderController::class . ':process');
+        $group->get('/order/{id:[0-9]+}/view', App\Controllers\User\OrderController::class . ':detail');
+        $group->post('/order/ajax', App\Controllers\User\OrderController::class . ':ajax');
+        // 账单页面
+        $group->get('/invoice', App\Controllers\User\InvoiceController::class . ':index');
+        $group->get('/invoice/{id:[0-9]+}/view', App\Controllers\User\InvoiceController::class . ':detail');
+        $group->post('/invoice/pay_balance', App\Controllers\User\InvoiceController::class . ':payBalance');
+        $group->post('/invoice/ajax', App\Controllers\User\InvoiceController::class . ':ajax');
+        // 新优惠码系统
+        $group->post('/coupon', App\Controllers\User\CouponController::class . ':check');
+        // 支付
+        $group->post('/payment/purchase/{type}', App\Services\Payment::class . ':purchase');
+        $group->get('/payment/purchase/{type}', App\Services\Payment::class . ':purchase');
+        $group->get('/payment/return/{type}', App\Services\Payment::class . ':returnHTML');
+        // Get Clients
+        $group->get('/clients/{name}', App\Controllers\User\ClientController::class . ':getClients');
+        // 登出
+        $group->get('/logout', App\Controllers\UserController::class . ':logout');
+    })->add(new User());
+
+    $app->group('/payment', static function (RouteCollectorProxy $group): void {
+        $group->get('/notify/{type}', App\Services\Payment::class . ':notify');
+        $group->post('/notify/{type}', App\Services\Payment::class . ':notify');
+        $group->post('/status/{type}', App\Services\Payment::class . ':getStatus');
+    });
+
+    // Auth
+    $app->group('/auth', static function (RouteCollectorProxy $group): void {
+        $group->get('/login', App\Controllers\AuthController::class . ':login');
+        $group->post('/login', App\Controllers\AuthController::class . ':loginHandle');
+        $group->get('/register', App\Controllers\AuthController::class . ':register');
+        $group->post('/register', App\Controllers\AuthController::class . ':registerHandle');
+        $group->post('/send', App\Controllers\AuthController::class . ':sendVerify');
+        $group->get('/logout', App\Controllers\AuthController::class . ':logout');
+    })->add(new Guest());
+
+    // Password
+    $app->group('/password', static function (RouteCollectorProxy $group): void {
+        $group->get('/reset', App\Controllers\PasswordController::class . ':reset');
+        $group->post('/reset', App\Controllers\PasswordController::class . ':handleReset');
+        $group->get('/token/{token}', App\Controllers\PasswordController::class . ':token');
+        $group->post('/token/{token}', App\Controllers\PasswordController::class . ':handleToken');
+    })->add(new Guest());
+
+    // Admin
+    $app->group('/admin', static function (RouteCollectorProxy $group): void {
+        $group->get('', App\Controllers\AdminController::class . ':index');
+        $group->get('/', App\Controllers\AdminController::class . ':index');
+        // Node
+        $group->get('/node', App\Controllers\Admin\NodeController::class . ':index');
+        $group->get('/node/create', App\Controllers\Admin\NodeController::class . ':create');
+        $group->post('/node', App\Controllers\Admin\NodeController::class . ':add');
+        $group->get('/node/{id:[0-9]+}/edit', App\Controllers\Admin\NodeController::class . ':edit');
+        $group->post(
+            '/node/{id:[0-9]+}/reset_password',
+            App\Controllers\Admin\NodeController::class . ':resetPassword'
+        );
+        $group->post(
+            '/node/{id:[0-9]+}/reset_bandwidth',
+            App\Controllers\Admin\NodeController::class . ':resetBandwidth'
+        );
+        $group->post('/node/{id:[0-9]+}/copy', App\Controllers\Admin\NodeController::class . ':copy');
+        $group->put('/node/{id:[0-9]+}', App\Controllers\Admin\NodeController::class . ':update');
+        $group->delete('/node/{id:[0-9]+}', App\Controllers\Admin\NodeController::class . ':delete');
+        $group->post('/node/ajax', App\Controllers\Admin\NodeController::class . ':ajax');
+        // Ticket
+        $group->get('/ticket', App\Controllers\Admin\TicketController::class . ':index');
+        $group->post('/ticket', App\Controllers\Admin\TicketController::class . ':add');
+        $group->get('/ticket/{id:[0-9]+}/view', App\Controllers\Admin\TicketController::class . ':detail');
+        $group->put('/ticket/{id:[0-9]+}/close', App\Controllers\Admin\TicketController::class . ':close');
+        $group->put('/ticket/{id:[0-9]+}', App\Controllers\Admin\TicketController::class . ':update');
+        $group->put('/ticket/{id:[0-9]+}/ai', App\Controllers\Admin\TicketController::class . ':updateAI');
+        $group->delete('/ticket/{id:[0-9]+}', App\Controllers\Admin\TicketController::class . ':delete');
+        $group->post('/ticket/ajax', App\Controllers\Admin\TicketController::class . ':ajax');
+        // Ann
+        $group->get('/announcement', App\Controllers\Admin\AnnController::class . ':index');
+        $group->get('/announcement/create', App\Controllers\Admin\AnnController::class . ':create');
+        $group->post('/announcement', App\Controllers\Admin\AnnController::class . ':add');
+        $group->get('/announcement/{id:[0-9]+}/edit', App\Controllers\Admin\AnnController::class . ':edit');
+        $group->put('/announcement/{id:[0-9]+}', App\Controllers\Admin\AnnController::class . ':update');
+        $group->delete('/announcement/{id:[0-9]+}', App\Controllers\Admin\AnnController::class . ':delete');
+        $group->post('/announcement/ajax', App\Controllers\Admin\AnnController::class . ':ajax');
+        // Docs
+        $group->get('/docs', App\Controllers\Admin\DocsController::class . ':index');
+        $group->get('/docs/create', App\Controllers\Admin\DocsController::class . ':create');
+        $group->post('/docs', App\Controllers\Admin\DocsController::class . ':add');
+        $group->post('/docs/generate', App\Controllers\Admin\DocsController::class . ':generate');
+        $group->get('/docs/{id:[0-9]+}/edit', App\Controllers\Admin\DocsController::class . ':edit');
+        $group->put('/docs/{id:[0-9]+}', App\Controllers\Admin\DocsController::class . ':update');
+        $group->delete('/docs/{id:[0-9]+}', App\Controllers\Admin\DocsController::class . ':delete');
+        $group->post('/docs/ajax', App\Controllers\Admin\DocsController::class . ':ajax');
+        // 审计规则
+        $group->get('/detect', App\Controllers\Admin\DetectRuleController::class . ':index');
+        $group->get('/detect/create', App\Controllers\Admin\DetectRuleController::class . ':create');
+        $group->post('/detect/add', App\Controllers\Admin\DetectRuleController::class . ':add');
+        $group->delete('/detect/{id:[0-9]+}', App\Controllers\Admin\DetectRuleController::class . ':delete');
+        $group->post('/detect/ajax', App\Controllers\Admin\DetectRuleController::class . ':ajax');
+        // 审计触发日志
+        $group->get('/detect/log', App\Controllers\Admin\DetectLogController::class . ':index');
+        $group->post('/detect/log/ajax', App\Controllers\Admin\DetectLogController::class . ':ajax');
+        // 审计封禁日志
+        $group->get('/detect/ban', App\Controllers\Admin\DetectBanLogController::class . ':index');
+        $group->post('/detect/ban/ajax', App\Controllers\Admin\DetectBanLogController::class . ':ajax');
+        // User
+        $group->get('/user', App\Controllers\Admin\UserController::class . ':index');
+        $group->get('/user/{id:[0-9]+}/edit', App\Controllers\Admin\UserController::class . ':edit');
+        $group->put('/user/{id:[0-9]+}', App\Controllers\Admin\UserController::class . ':update');
+        $group->post('/user/create', App\Controllers\Admin\UserController::class . ':create');
+        $group->delete('/user/{id}', App\Controllers\Admin\UserController::class . ':delete');
+        $group->post('/user/ajax', App\Controllers\Admin\UserController::class . ':ajax');
+        // Coupon
+        $group->get('/coupon', App\Controllers\Admin\CouponController::class . ':index');
+        $group->post('/coupon', App\Controllers\Admin\CouponController::class . ':add');
+        $group->post('/coupon/ajax', App\Controllers\Admin\CouponController::class . ':ajax');
+        $group->delete('/coupon/{id:[0-9]+}', App\Controllers\Admin\CouponController::class . ':delete');
+        $group->post('/coupon/{id:[0-9]+}/disable', App\Controllers\Admin\CouponController::class . ':disable');
+        // 登录日志
+        $group->get('/login', App\Controllers\Admin\LoginLogController::class . ':index');
+        $group->post('/login/ajax', App\Controllers\Admin\LoginLogController::class . ':ajax');
+        // 在线IP日志
+        $group->get('/online', App\Controllers\Admin\OnlineLogController::class . ':index');
+        $group->post('/online/ajax', App\Controllers\Admin\OnlineLogController::class . ':ajax');
+        // 订阅日志
+        $group->get('/subscribe', App\Controllers\Admin\SubLogController::class . ':index');
+        $group->post('/subscribe/ajax', App\Controllers\Admin\SubLogController::class . ':ajax');
+        // 返利日志
+        $group->get('/payback', App\Controllers\Admin\PaybackController::class . ':index');
+        $group->post('/payback/ajax', App\Controllers\Admin\PaybackController::class . ':ajax');
+        // 用户余额日志
+        $group->get('/money', App\Controllers\Admin\MoneyLogController::class . ':index');
+        $group->post('/money/ajax', App\Controllers\Admin\MoneyLogController::class . ':ajax');
+        // 支付网关日志
+        $group->get('/gateway', App\Controllers\Admin\PaylistController::class . ':index');
+        $group->post('/gateway/ajax', App\Controllers\Admin\PaylistController::class . ':ajax');
+        // 系统日志
+        $group->get('/syslog', App\Controllers\Admin\SysLogController::class . ':index');
+        $group->get('/syslog/{id:[0-9]+}/view', App\Controllers\Admin\SysLogController::class . ':detail');
+        $group->post('/syslog/ajax', App\Controllers\Admin\SysLogController::class . ':ajax');
+        // 系统状态
+        $group->get('/system', App\Controllers\Admin\SystemController::class . ':index');
+        $group->post('/system/check_update', App\Controllers\Admin\SystemController::class . ':checkUpdate');
+        // 设置中心
+        $group->get('/setting/billing', App\Controllers\Admin\Setting\BillingController::class . ':index');
+        $group->post('/setting/billing', App\Controllers\Admin\Setting\BillingController::class . ':save');
+        $group->post(
+            '/setting/billing/set_stripe_webhook',
+            App\Controllers\Admin\Setting\BillingController::class . ':setStripeWebhook'
+        );
+        $group->get('/setting/captcha', App\Controllers\Admin\Setting\CaptchaController::class . ':index');
+        $group->post('/setting/captcha', App\Controllers\Admin\Setting\CaptchaController::class . ':save');
+        $group->get('/setting/cron', App\Controllers\Admin\Setting\CronController::class . ':index');
+        $group->post('/setting/cron', App\Controllers\Admin\Setting\CronController::class . ':save');
+        $group->get('/setting/email', App\Controllers\Admin\Setting\EmailController::class . ':index');
+        $group->post('/setting/email', App\Controllers\Admin\Setting\EmailController::class . ':save');
+        $group->get('/setting/feature', App\Controllers\Admin\Setting\FeatureController::class . ':index');
+        $group->post('/setting/feature', App\Controllers\Admin\Setting\FeatureController::class . ':save');
+        $group->get('/setting/im', App\Controllers\Admin\Setting\ImController::class . ':index');
+        $group->post('/setting/im', App\Controllers\Admin\Setting\ImController::class . ':save');
+        $group->get('/setting/ref', App\Controllers\Admin\Setting\RefController::class . ':index');
+        $group->post('/setting/ref', App\Controllers\Admin\Setting\RefController::class . ':save');
+        $group->get('/setting/reg', App\Controllers\Admin\Setting\RegController::class . ':index');
+        $group->post('/setting/reg', App\Controllers\Admin\Setting\RegController::class . ':save');
+        $group->get('/setting/sub', App\Controllers\Admin\Setting\SubController::class . ':index');
+        $group->post('/setting/sub', App\Controllers\Admin\Setting\SubController::class . ':save');
+        $group->get('/setting/support', App\Controllers\Admin\Setting\SupportController::class . ':index');
+        $group->post('/setting/support', App\Controllers\Admin\Setting\SupportController::class . ':save');
+        // 设置测试
+        $group->post(
+            '/setting/test/email',
+            App\Controllers\Admin\Setting\EmailController::class . ':testEmail'
+        );
+        $group->post(
+            '/setting/test/telegram',
+            App\Controllers\Admin\Setting\ImController::class . ':testTelegram'
+        );
+        $group->post(
+            '/setting/test/discord',
+            App\Controllers\Admin\Setting\ImController::class . ':testDiscord'
+        );
+        $group->post(
+            '/setting/test/slack',
+            App\Controllers\Admin\Setting\ImController::class . ':testSlack'
+        );
+        // 礼品卡
+        $group->get('/giftcard', App\Controllers\Admin\GiftCardController::class . ':index');
+        $group->post('/giftcard', App\Controllers\Admin\GiftCardController::class . ':add');
+        $group->post('/giftcard/ajax', App\Controllers\Admin\GiftCardController::class . ':ajax');
+        $group->delete('/giftcard/{id:[0-9]+}', App\Controllers\Admin\GiftCardController::class . ':delete');
+        // 商品
+        $group->get('/product', App\Controllers\Admin\ProductController::class . ':index');
+        $group->get('/product/create', App\Controllers\Admin\ProductController::class . ':create');
+        $group->post('/product', App\Controllers\Admin\ProductController::class . ':add');
+        $group->get('/product/{id:[0-9]+}/edit', App\Controllers\Admin\ProductController::class . ':edit');
+        $group->post('/product/{id:[0-9]+}/copy', App\Controllers\Admin\ProductController::class . ':copy');
+        $group->put('/product/{id:[0-9]+}', App\Controllers\Admin\ProductController::class . ':update');
+        $group->delete('/product/{id:[0-9]+}', App\Controllers\Admin\ProductController::class . ':delete');
+        $group->post('/product/ajax', App\Controllers\Admin\ProductController::class . ':ajax');
+        // 订单
+        $group->get('/order', App\Controllers\Admin\OrderController::class . ':index');
+        $group->get('/order/{id:[0-9]+}/view', App\Controllers\Admin\OrderController::class . ':detail');
+        $group->post('/order/{id:[0-9]+}/cancel', App\Controllers\Admin\OrderController::class . ':cancel');
+        $group->delete('/order/{id:[0-9]+}', App\Controllers\Admin\OrderController::class . ':delete');
+        $group->post('/order/ajax', App\Controllers\Admin\OrderController::class . ':ajax');
+        // 账单
+        $group->get('/invoice', App\Controllers\Admin\InvoiceController::class . ':index');
+        $group->get('/invoice/{id:[0-9]+}/view', App\Controllers\Admin\InvoiceController::class . ':detail');
+        $group->post('/invoice/{id:[0-9]+}/mark_paid', App\Controllers\Admin\InvoiceController::class . ':markPaid');
+        $group->post('/invoice/ajax', App\Controllers\Admin\InvoiceController::class . ':ajax');
+    })->add(new Admin());
+
+    // WebAPI
+    $app->group('/mod_mu', static function (RouteCollectorProxy $group): void {
+        // 节点
+        $group->get('/nodes/{id:[0-9]+}/info', App\Controllers\WebAPI\NodeController::class . ':getInfo');
+        // 用户
+        $group->get('/users', App\Controllers\WebAPI\UserController::class . ':index');
+        $group->post('/users/traffic', App\Controllers\WebAPI\UserController::class . ':addTraffic');
+        $group->post('/users/aliveip', App\Controllers\WebAPI\UserController::class . ':addAliveIp');
+        $group->post('/users/detectlog', App\Controllers\WebAPI\UserController::class . ':addDetectLog');
+        // 审计 & 杂七杂八的功能
+        $group->get('/func/detect_rules', App\Controllers\WebAPI\FuncController::class . ':getDetectRules');
+        $group->get('/func/ping', App\Controllers\WebAPI\FuncController::class . ':ping');
+    })->add(new NodeToken());
+
+    // Admin REST API
+    //$app->group('/admin/api/v1', function (RouteCollectorProxy $group): void {
+    //    $group->post('/{action}', App\Controllers\Api\AdminApiV1Controller::class . ':actionHandler');
+    //})->add(new AdminApi());
+
+    // User REST API
+    //$app->group('/user/api/v1', function (RouteCollectorProxy $group): void {
+    //    $group->post('/{action}', App\Controllers\Api\UserApiV1Controller::class . ':actionHandler');
+    //})->add(new UserApi());
+
+    // WebAPI V2(Aka Node API V1)
+    //$app->group('/node/api/v1', function (RouteCollectorProxy $group): void {
+    //    $group->put('/heartbeat', App\Controllers\Api\NodeApiV1Controller::class . ':getHeartbeat');
+    //    $group->get('/info', App\Controllers\Api\NodeApiV1Controller::class . ':getInfo');
+    //    $group->get('/user', App\Controllers\Api\NodeApiV1Controller::class . ':getUser');
+    //    $group->get('/detect_rule', App\Controllers\Api\NodeApiV1Controller::class . ':getDetectRule');
+    //    $group->post('/user/traffic', App\Controllers\Api\NodeApiV1Controller::class . ':addUserTraffic');
+    //    $group->post('/user/online_ip', App\Controllers\Api\NodeApiV1Controller::class . ':addUserOnlineIp');
+    //    $group->post('/user/detect_log', App\Controllers\Api\NodeApiV1Controller::class . ':addUserDetectLog');
+    //})->add(new NodeApi());
+};

+ 76 - 0
composer.json

@@ -0,0 +1,76 @@
+{
+    "require": {
+        "php": "^8.2",
+        "ext-bcmath": "*",
+        "ext-curl": "*",
+        "ext-fileinfo": "*",
+        "ext-json": "*",
+        "ext-mbstring": "*",
+        "ext-mysqli": "*",
+        "ext-openssl": "*",
+        "ext-pdo": "*",
+        "ext-posix": "*",
+        "ext-redis": "*",
+        "ext-xml": "*",
+        "ext-yaml": "*",
+        "ext-zip": "*",
+        "alibabacloud/dm-20170622": "^1",
+        "alipaysdk/openapi": "*@dev",
+        "aws/aws-sdk-php": "^3",
+        "geoip2/geoip2": "^3",
+        "guzzlehttp/guzzle": "^7",
+        "guzzlehttp/psr7": "^2",
+        "illuminate/database": "^11",
+        "illuminate/pagination": "^11",
+        "irazasyed/telegram-bot-sdk": "^3",
+        "lcobucci/jwt": "^5",
+        "mailchimp/transactional": "^1",
+        "mailgun/mailgun-php": "^4",
+        "monolog/monolog": "^3",
+        "nikolaposa/rate-limit": "^3",
+        "openai-php/client": "^0",
+        "phpmailer/phpmailer": "^6",
+        "postal/postal": "^2",
+        "ramsey/uuid": "^4",
+        "sendgrid/sendgrid": "^8",
+        "sentry/sdk": "^4",
+        "slim/http": "^1",
+        "slim/slim": "^4",
+        "smarty/smarty": "^5",
+        "srmklive/paypal": "^3",
+        "stripe/stripe-php": "^14",
+        "symfony/http-client": "^7",
+        "symfony/translation": "^7",
+        "tronovav/geoip2-update": "^2",
+        "twig/twig": "^3",
+        "vectorface/googleauthenticator": "^3",
+        "voku/anti-xss": "^4"
+    },
+    "autoload": {
+        "psr-4": {
+            "App\\": "src/"
+        }
+    },
+    "config": {
+        "sort-packages": true,
+        "optimize-autoloader": true,
+        "allow-plugins": {
+            "dealerdirect/phpcodesniffer-composer-installer": true,
+            "php-http/discovery": true
+        }
+    },
+    "require-dev": {
+        "dg/bypass-finals": "^1",
+        "nunomaduro/phpinsights": "*",
+        "phpunit/phpunit": "^10"
+    },
+    "scripts": {
+        "update-dev-windows": [
+            "composer update --ignore-platform-req=ext-posix --ignore-platform-req=ext-redis --ignore-platform-req=ext-yaml"
+        ],
+        "install-dev-windows": [
+            "composer install --ignore-platform-req=ext-posix --ignore-platform-req=ext-redis --ignore-platform-req=ext-yaml"
+        ]
+    },
+    "type": "project"
+}

+ 10547 - 0
composer.lock

@@ -0,0 +1,10547 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "34ca74bb5a6b4627ae767e84dbbea2c5",
+    "packages": [
+        {
+            "name": "adbario/php-dot-notation",
+            "version": "2.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/adbario/php-dot-notation.git",
+                "reference": "081e2cca50c84bfeeea2e3ef9b2c8d206d80ccae"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/adbario/php-dot-notation/zipball/081e2cca50c84bfeeea2e3ef9b2c8d206d80ccae",
+                "reference": "081e2cca50c84bfeeea2e3ef9b2c8d206d80ccae",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "php": "^5.5 || ^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8|^5.7|^6.6|^7.5|^8.5|^9.5",
+                "squizlabs/php_codesniffer": "^3.6"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/helpers.php"
+                ],
+                "psr-4": {
+                    "Adbar\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Riku Särkinen",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "PHP dot notation access to arrays",
+            "homepage": "https://github.com/adbario/php-dot-notation",
+            "keywords": [
+                "ArrayAccess",
+                "dotnotation"
+            ],
+            "support": {
+                "issues": "https://github.com/adbario/php-dot-notation/issues",
+                "source": "https://github.com/adbario/php-dot-notation/tree/2.5.0"
+            },
+            "time": "2022-10-14T20:31:46+00:00"
+        },
+        {
+            "name": "alibabacloud/credentials",
+            "version": "1.1.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/aliyun/credentials-php.git",
+                "reference": "1d8383ceef695974a88a3859c42e235fd2e3981a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/aliyun/credentials-php/zipball/1d8383ceef695974a88a3859c42e235fd2e3981a",
+                "reference": "1d8383ceef695974a88a3859c42e235fd2e3981a",
+                "shasum": ""
+            },
+            "require": {
+                "adbario/php-dot-notation": "^2.2",
+                "alibabacloud/tea": "^3.0",
+                "ext-curl": "*",
+                "ext-json": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-openssl": "*",
+                "ext-simplexml": "*",
+                "ext-xmlwriter": "*",
+                "guzzlehttp/guzzle": "^6.3|^7.0",
+                "php": ">=5.6"
+            },
+            "require-dev": {
+                "composer/composer": "^1.8",
+                "drupal/coder": "^8.3",
+                "ext-dom": "*",
+                "ext-pcre": "*",
+                "ext-sockets": "*",
+                "ext-spl": "*",
+                "mikey179/vfsstream": "^1.6",
+                "monolog/monolog": "^1.24",
+                "phpunit/phpunit": "^5.7|^6.6|^7.5",
+                "psr/cache": "^1.0",
+                "symfony/dotenv": "^3.4",
+                "symfony/var-dumper": "^3.4"
+            },
+            "suggest": {
+                "ext-sockets": "To use client-side monitoring"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "AlibabaCloud\\Credentials\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "[email protected]",
+                    "homepage": "http://www.alibabacloud.com"
+                }
+            ],
+            "description": "Alibaba Cloud Credentials for PHP",
+            "homepage": "https://www.alibabacloud.com/",
+            "keywords": [
+                "alibaba",
+                "alibabacloud",
+                "aliyun",
+                "client",
+                "cloud",
+                "credentials",
+                "library",
+                "sdk",
+                "tool"
+            ],
+            "support": {
+                "issues": "https://github.com/aliyun/credentials-php/issues",
+                "source": "https://github.com/aliyun/credentials-php"
+            },
+            "time": "2023-04-11T02:12:12+00:00"
+        },
+        {
+            "name": "alibabacloud/darabonba-openapi",
+            "version": "0.2.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alibabacloud-sdk-php/darabonba-openapi.git",
+                "reference": "88f42443e1b5c9d086d0444baa4a874f8636f7bb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alibabacloud-sdk-php/darabonba-openapi/zipball/88f42443e1b5c9d086d0444baa4a874f8636f7bb",
+                "reference": "88f42443e1b5c9d086d0444baa4a874f8636f7bb",
+                "shasum": ""
+            },
+            "require": {
+                "alibabacloud/credentials": "^1.1",
+                "alibabacloud/gateway-spi": "^1",
+                "alibabacloud/openapi-util": "^0.1.10|^0.2.1",
+                "alibabacloud/tea-utils": "^0.2.19",
+                "alibabacloud/tea-xml": "^0.2",
+                "php": ">5.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Darabonba\\OpenApi\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Alibaba Cloud OpenApi Client",
+            "support": {
+                "issues": "https://github.com/alibabacloud-sdk-php/darabonba-openapi/issues",
+                "source": "https://github.com/alibabacloud-sdk-php/darabonba-openapi/tree/0.2.10"
+            },
+            "time": "2023-11-23T07:01:20+00:00"
+        },
+        {
+            "name": "alibabacloud/dm-20170622",
+            "version": "1.2.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alibabacloud-sdk-php/dm-20170622.git",
+                "reference": "400f9de65896f7fd2b854bb6a6c51bfe5d56e324"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alibabacloud-sdk-php/dm-20170622/zipball/400f9de65896f7fd2b854bb6a6c51bfe5d56e324",
+                "reference": "400f9de65896f7fd2b854bb6a6c51bfe5d56e324",
+                "shasum": ""
+            },
+            "require": {
+                "alibabacloud/darabonba-openapi": "^0.2.10",
+                "alibabacloud/endpoint-util": "^0.1.0",
+                "alibabacloud/openapi-util": "^0.1.10|^0.2.1",
+                "alibabacloud/tea-utils": "^0.2.19",
+                "php": ">5.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "AlibabaCloud\\SDK\\Dm\\V20170622\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Alibaba Cloud Dm (20170622) SDK Library for PHP",
+            "support": {
+                "source": "https://github.com/alibabacloud-sdk-php/dm-20170622/tree/1.2.2"
+            },
+            "time": "2024-04-10T17:15:45+00:00"
+        },
+        {
+            "name": "alibabacloud/endpoint-util",
+            "version": "0.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alibabacloud-sdk-php/endpoint-util.git",
+                "reference": "f3fe88a25d8df4faa3b0ae14ff202a9cc094e6c5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alibabacloud-sdk-php/endpoint-util/zipball/f3fe88a25d8df4faa3b0ae14ff202a9cc094e6c5",
+                "reference": "f3fe88a25d8df4faa3b0ae14ff202a9cc094e6c5",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">5.5"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35|^5.4.3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "AlibabaCloud\\Endpoint\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Alibaba Cloud Endpoint Library for PHP",
+            "support": {
+                "source": "https://github.com/alibabacloud-sdk-php/endpoint-util/tree/0.1.1"
+            },
+            "time": "2020-06-04T10:57:15+00:00"
+        },
+        {
+            "name": "alibabacloud/gateway-spi",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alibabacloud-sdk-php/alibabacloud-gateway-spi.git",
+                "reference": "7440f77750c329d8ab252db1d1d967314ccd1fcb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alibabacloud-sdk-php/alibabacloud-gateway-spi/zipball/7440f77750c329d8ab252db1d1d967314ccd1fcb",
+                "reference": "7440f77750c329d8ab252db1d1d967314ccd1fcb",
+                "shasum": ""
+            },
+            "require": {
+                "alibabacloud/credentials": "^1.1",
+                "php": ">5.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Darabonba\\GatewaySpi\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Alibaba Cloud Gateway SPI Client",
+            "support": {
+                "source": "https://github.com/alibabacloud-sdk-php/alibabacloud-gateway-spi/tree/1.0.0"
+            },
+            "time": "2022-07-14T05:31:35+00:00"
+        },
+        {
+            "name": "alibabacloud/openapi-util",
+            "version": "0.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alibabacloud-sdk-php/openapi-util.git",
+                "reference": "f31f7bcd835e08ca24b6b8ba33637eb4eceb093a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alibabacloud-sdk-php/openapi-util/zipball/f31f7bcd835e08ca24b6b8ba33637eb4eceb093a",
+                "reference": "f31f7bcd835e08ca24b6b8ba33637eb4eceb093a",
+                "shasum": ""
+            },
+            "require": {
+                "alibabacloud/tea": "^3.1",
+                "alibabacloud/tea-utils": "^0.2",
+                "lizhichao/one-sm": "^1.5",
+                "php": ">5.5"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "AlibabaCloud\\OpenApiUtil\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Alibaba Cloud OpenApi Util",
+            "support": {
+                "issues": "https://github.com/alibabacloud-sdk-php/openapi-util/issues",
+                "source": "https://github.com/alibabacloud-sdk-php/openapi-util/tree/0.2.1"
+            },
+            "time": "2023-01-10T09:10:10+00:00"
+        },
+        {
+            "name": "alibabacloud/tea",
+            "version": "3.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/aliyun/tea-php.git",
+                "reference": "1619cb96c158384f72b873e1f85de8b299c9c367"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/aliyun/tea-php/zipball/1619cb96c158384f72b873e1f85de8b299c9c367",
+                "reference": "1619cb96c158384f72b873e1f85de8b299c9c367",
+                "shasum": ""
+            },
+            "require": {
+                "adbario/php-dot-notation": "^2.4",
+                "ext-curl": "*",
+                "ext-json": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-openssl": "*",
+                "ext-simplexml": "*",
+                "ext-xmlwriter": "*",
+                "guzzlehttp/guzzle": "^6.3|^7.0",
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "*",
+                "symfony/dotenv": "^3.4",
+                "symfony/var-dumper": "^3.4"
+            },
+            "suggest": {
+                "ext-sockets": "To use client-side monitoring"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "AlibabaCloud\\Tea\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "[email protected]",
+                    "homepage": "http://www.alibabacloud.com"
+                }
+            ],
+            "description": "Client of Tea for PHP",
+            "homepage": "https://www.alibabacloud.com/",
+            "keywords": [
+                "alibabacloud",
+                "client",
+                "cloud",
+                "tea"
+            ],
+            "support": {
+                "issues": "https://github.com/aliyun/tea-php/issues",
+                "source": "https://github.com/aliyun/tea-php"
+            },
+            "time": "2023-05-16T06:43:41+00:00"
+        },
+        {
+            "name": "alibabacloud/tea-utils",
+            "version": "0.2.19",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alibabacloud-sdk-php/tea-utils.git",
+                "reference": "8dfc1a93e9415818e93a621b644abbb84981aea4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alibabacloud-sdk-php/tea-utils/zipball/8dfc1a93e9415818e93a621b644abbb84981aea4",
+                "reference": "8dfc1a93e9415818e93a621b644abbb84981aea4",
+                "shasum": ""
+            },
+            "require": {
+                "alibabacloud/tea": "^3.1",
+                "php": ">5.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "AlibabaCloud\\Tea\\Utils\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Alibaba Cloud Tea Utils for PHP",
+            "support": {
+                "issues": "https://github.com/aliyun/tea-util/issues",
+                "source": "https://github.com/aliyun/tea-util"
+            },
+            "time": "2023-06-26T09:49:19+00:00"
+        },
+        {
+            "name": "alibabacloud/tea-xml",
+            "version": "0.2.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alibabacloud-sdk-php/tea-xml.git",
+                "reference": "3e0c000bf536224eebbac913c371bef174c0a16a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alibabacloud-sdk-php/tea-xml/zipball/3e0c000bf536224eebbac913c371bef174c0a16a",
+                "reference": "3e0c000bf536224eebbac913c371bef174c0a16a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">5.5"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "*",
+                "symfony/var-dumper": "*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "AlibabaCloud\\Tea\\XML\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Alibaba Cloud Tea XML Library for PHP",
+            "support": {
+                "source": "https://github.com/alibabacloud-sdk-php/tea-xml/tree/0.2.4"
+            },
+            "time": "2022-08-02T04:12:58+00:00"
+        },
+        {
+            "name": "alipaysdk/openapi",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alipay/alipay-sdk-php-all.git",
+                "reference": "7a3573290641ba87dca5973aa2941f40b48d842a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alipay/alipay-sdk-php-all/zipball/7a3573290641ba87dca5973aa2941f40b48d842a",
+                "reference": "7a3573290641ba87dca5973aa2941f40b48d842a",
+                "shasum": ""
+            },
+            "require": {
+                "ext-bcmath": "*",
+                "ext-curl": "*",
+                "ext-dom": "*",
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "ext-openssl": "*",
+                "guzzlehttp/guzzle": "^7.3",
+                "guzzlehttp/psr7": "^1.7 || ^2.0",
+                "php": "^7.4 || ^8.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^3.5",
+                "phpunit/phpunit": "^8.0 || ^9.0"
+            },
+            "default-branch": true,
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Alipay\\OpenAPISDK\\": "v3/src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "unlicense"
+            ],
+            "authors": [
+                {
+                    "name": "OpenAPI-Generator contributors",
+                    "homepage": "https://openapi-generator.tech"
+                }
+            ],
+            "description": "支付宝开放平台v3协议文档",
+            "homepage": "https://openapi-generator.tech",
+            "keywords": [
+                "api",
+                "openapi",
+                "openapi-generator",
+                "openapitools",
+                "php",
+                "rest",
+                "sdk"
+            ],
+            "support": {
+                "source": "https://github.com/alipay/alipay-sdk-php-all/tree/master"
+            },
+            "time": "2024-04-25T10:01:48+00:00"
+        },
+        {
+            "name": "aws/aws-crt-php",
+            "version": "v1.2.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/awslabs/aws-crt-php.git",
+                "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/0ea1f04ec5aa9f049f97e012d1ed63b76834a31b",
+                "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5",
+                "yoast/phpunit-polyfills": "^1.0"
+            },
+            "suggest": {
+                "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality."
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "AWS SDK Common Runtime Team",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "AWS Common Runtime for PHP",
+            "homepage": "https://github.com/awslabs/aws-crt-php",
+            "keywords": [
+                "amazon",
+                "aws",
+                "crt",
+                "sdk"
+            ],
+            "support": {
+                "issues": "https://github.com/awslabs/aws-crt-php/issues",
+                "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.5"
+            },
+            "time": "2024-04-19T21:30:56+00:00"
+        },
+        {
+            "name": "aws/aws-sdk-php",
+            "version": "3.305.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/aws/aws-sdk-php.git",
+                "reference": "fc26a2ebf720e0b75a353d7e8fe206796671e00b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/fc26a2ebf720e0b75a353d7e8fe206796671e00b",
+                "reference": "fc26a2ebf720e0b75a353d7e8fe206796671e00b",
+                "shasum": ""
+            },
+            "require": {
+                "aws/aws-crt-php": "^1.2.3",
+                "ext-json": "*",
+                "ext-pcre": "*",
+                "ext-simplexml": "*",
+                "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5",
+                "guzzlehttp/promises": "^1.4.0 || ^2.0",
+                "guzzlehttp/psr7": "^1.9.1 || ^2.4.5",
+                "mtdowling/jmespath.php": "^2.6",
+                "php": ">=7.2.5",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "require-dev": {
+                "andrewsville/php-token-reflection": "^1.4",
+                "aws/aws-php-sns-message-validator": "~1.0",
+                "behat/behat": "~3.0",
+                "composer/composer": "^1.10.22",
+                "dms/phpunit-arraysubset-asserts": "^0.4.0",
+                "doctrine/cache": "~1.4",
+                "ext-dom": "*",
+                "ext-openssl": "*",
+                "ext-pcntl": "*",
+                "ext-sockets": "*",
+                "nette/neon": "^2.3",
+                "paragonie/random_compat": ">= 2",
+                "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5",
+                "psr/cache": "^1.0",
+                "psr/simple-cache": "^1.0",
+                "sebastian/comparator": "^1.2.3 || ^4.0",
+                "yoast/phpunit-polyfills": "^1.0"
+            },
+            "suggest": {
+                "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications",
+                "doctrine/cache": "To use the DoctrineCacheAdapter",
+                "ext-curl": "To send requests using cURL",
+                "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages",
+                "ext-sockets": "To use client-side monitoring"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions.php"
+                ],
+                "psr-4": {
+                    "Aws\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Amazon Web Services",
+                    "homepage": "http://aws.amazon.com"
+                }
+            ],
+            "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project",
+            "homepage": "http://aws.amazon.com/sdkforphp",
+            "keywords": [
+                "amazon",
+                "aws",
+                "cloud",
+                "dynamodb",
+                "ec2",
+                "glacier",
+                "s3",
+                "sdk"
+            ],
+            "support": {
+                "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
+                "issues": "https://github.com/aws/aws-sdk-php/issues",
+                "source": "https://github.com/aws/aws-sdk-php/tree/3.305.4"
+            },
+            "time": "2024-04-26T18:06:31+00:00"
+        },
+        {
+            "name": "bacon/bacon-qr-code",
+            "version": "v3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Bacon/BaconQrCode.git",
+                "reference": "510de6eca6248d77d31b339d62437cc995e2fb41"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/510de6eca6248d77d31b339d62437cc995e2fb41",
+                "reference": "510de6eca6248d77d31b339d62437cc995e2fb41",
+                "shasum": ""
+            },
+            "require": {
+                "dasprid/enum": "^1.0.3",
+                "ext-iconv": "*",
+                "php": "^8.1"
+            },
+            "require-dev": {
+                "phly/keep-a-changelog": "^2.12",
+                "phpunit/phpunit": "^10.5.11 || 11.0.4",
+                "spatie/phpunit-snapshot-assertions": "^5.1.5",
+                "squizlabs/php_codesniffer": "^3.9"
+            },
+            "suggest": {
+                "ext-imagick": "to generate QR code images"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "BaconQrCode\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Ben Scholzen 'DASPRiD'",
+                    "email": "[email protected]",
+                    "homepage": "https://dasprids.de/",
+                    "role": "Developer"
+                }
+            ],
+            "description": "BaconQrCode is a QR code generator for PHP.",
+            "homepage": "https://github.com/Bacon/BaconQrCode",
+            "support": {
+                "issues": "https://github.com/Bacon/BaconQrCode/issues",
+                "source": "https://github.com/Bacon/BaconQrCode/tree/v3.0.0"
+            },
+            "time": "2024-04-18T11:16:25+00:00"
+        },
+        {
+            "name": "beberlei/assert",
+            "version": "v3.3.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/beberlei/assert.git",
+                "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/beberlei/assert/zipball/cb70015c04be1baee6f5f5c953703347c0ac1655",
+                "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655",
+                "shasum": ""
+            },
+            "require": {
+                "ext-ctype": "*",
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "ext-simplexml": "*",
+                "php": "^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "*",
+                "phpstan/phpstan": "*",
+                "phpunit/phpunit": ">=6.0.0",
+                "yoast/phpunit-polyfills": "^0.1.0"
+            },
+            "suggest": {
+                "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "lib/Assert/functions.php"
+                ],
+                "psr-4": {
+                    "Assert\\": "lib/Assert"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "[email protected]",
+                    "role": "Lead Developer"
+                },
+                {
+                    "name": "Richard Quadling",
+                    "email": "[email protected]",
+                    "role": "Collaborator"
+                }
+            ],
+            "description": "Thin assertion library for input validation in business models.",
+            "keywords": [
+                "assert",
+                "assertion",
+                "validation"
+            ],
+            "support": {
+                "issues": "https://github.com/beberlei/assert/issues",
+                "source": "https://github.com/beberlei/assert/tree/v3.3.2"
+            },
+            "time": "2021-12-16T21:41:27+00:00"
+        },
+        {
+            "name": "brick/math",
+            "version": "0.11.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/brick/math.git",
+                "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478",
+                "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.0"
+            },
+            "require-dev": {
+                "php-coveralls/php-coveralls": "^2.2",
+                "phpunit/phpunit": "^9.0",
+                "vimeo/psalm": "5.0.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Brick\\Math\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Arbitrary-precision arithmetic library",
+            "keywords": [
+                "Arbitrary-precision",
+                "BigInteger",
+                "BigRational",
+                "arithmetic",
+                "bigdecimal",
+                "bignum",
+                "brick",
+                "math"
+            ],
+            "support": {
+                "issues": "https://github.com/brick/math/issues",
+                "source": "https://github.com/brick/math/tree/0.11.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/BenMorel",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-01-15T23:15:59+00:00"
+        },
+        {
+            "name": "carbonphp/carbon-doctrine-types",
+            "version": "3.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git",
+                "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d",
+                "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.1"
+            },
+            "conflict": {
+                "doctrine/dbal": "<4.0.0 || >=5.0.0"
+            },
+            "require-dev": {
+                "doctrine/dbal": "^4.0.0",
+                "nesbot/carbon": "^2.71.0 || ^3.0.0",
+                "phpunit/phpunit": "^10.3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Carbon\\Doctrine\\": "src/Carbon/Doctrine/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "KyleKatarn",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Types to use Carbon in Doctrine",
+            "keywords": [
+                "carbon",
+                "date",
+                "datetime",
+                "doctrine",
+                "time"
+            ],
+            "support": {
+                "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues",
+                "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/kylekatarnls",
+                    "type": "github"
+                },
+                {
+                    "url": "https://opencollective.com/Carbon",
+                    "type": "open_collective"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-02-09T16:56:22+00:00"
+        },
+        {
+            "name": "clue/stream-filter",
+            "version": "v1.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/clue/stream-filter.git",
+                "reference": "049509fef80032cb3f051595029ab75b49a3c2f7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7",
+                "reference": "049509fef80032cb3f051595029ab75b49a3c2f7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "Clue\\StreamFilter\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "A simple and modern approach to stream filtering in PHP",
+            "homepage": "https://github.com/clue/stream-filter",
+            "keywords": [
+                "bucket brigade",
+                "callback",
+                "filter",
+                "php_user_filter",
+                "stream",
+                "stream_filter_append",
+                "stream_filter_register"
+            ],
+            "support": {
+                "issues": "https://github.com/clue/stream-filter/issues",
+                "source": "https://github.com/clue/stream-filter/tree/v1.7.0"
+            },
+            "funding": [
+                {
+                    "url": "https://clue.engineering/support",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/clue",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-12-20T15:40:13+00:00"
+        },
+        {
+            "name": "composer/ca-bundle",
+            "version": "1.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/ca-bundle.git",
+                "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0c5ccfcfea312b5c5a190a21ac5cef93f74baf99",
+                "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99",
+                "shasum": ""
+            },
+            "require": {
+                "ext-openssl": "*",
+                "ext-pcre": "*",
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^1.10",
+                "psr/log": "^1.0",
+                "symfony/phpunit-bridge": "^4.2 || ^5",
+                "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\CaBundle\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "[email protected]",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+            "keywords": [
+                "cabundle",
+                "cacert",
+                "certificate",
+                "ssl",
+                "tls"
+            ],
+            "support": {
+                "irc": "irc://irc.freenode.org/composer",
+                "issues": "https://github.com/composer/ca-bundle/issues",
+                "source": "https://github.com/composer/ca-bundle/tree/1.5.0"
+            },
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-03-15T14:00:32+00:00"
+        },
+        {
+            "name": "dasprid/enum",
+            "version": "1.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/DASPRiD/Enum.git",
+                "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/6faf451159fb8ba4126b925ed2d78acfce0dc016",
+                "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1 <9.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^7 | ^8 | ^9",
+                "squizlabs/php_codesniffer": "*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "DASPRiD\\Enum\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Ben Scholzen 'DASPRiD'",
+                    "email": "[email protected]",
+                    "homepage": "https://dasprids.de/",
+                    "role": "Developer"
+                }
+            ],
+            "description": "PHP 7.1 enum implementation",
+            "keywords": [
+                "enum",
+                "map"
+            ],
+            "support": {
+                "issues": "https://github.com/DASPRiD/Enum/issues",
+                "source": "https://github.com/DASPRiD/Enum/tree/1.0.5"
+            },
+            "time": "2023-08-25T16:18:39+00:00"
+        },
+        {
+            "name": "doctrine/inflector",
+            "version": "2.0.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/inflector.git",
+                "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc",
+                "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^11.0",
+                "phpstan/phpstan": "^1.8",
+                "phpstan/phpstan-phpunit": "^1.1",
+                "phpstan/phpstan-strict-rules": "^1.3",
+                "phpunit/phpunit": "^8.5 || ^9.5",
+                "vimeo/psalm": "^4.25 || ^5.4"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Roman Borschel",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
+            "homepage": "https://www.doctrine-project.org/projects/inflector.html",
+            "keywords": [
+                "inflection",
+                "inflector",
+                "lowercase",
+                "manipulation",
+                "php",
+                "plural",
+                "singular",
+                "strings",
+                "uppercase",
+                "words"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/inflector/issues",
+                "source": "https://github.com/doctrine/inflector/tree/2.0.10"
+            },
+            "funding": [
+                {
+                    "url": "https://www.doctrine-project.org/sponsorship.html",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://www.patreon.com/phpdoctrine",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-02-18T20:23:39+00:00"
+        },
+        {
+            "name": "endroid/qr-code",
+            "version": "5.0.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/endroid/qr-code.git",
+                "reference": "cb6b31a7aa99df9c6c2dc09a5fa2aaa617f6e5bb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/endroid/qr-code/zipball/cb6b31a7aa99df9c6c2dc09a5fa2aaa617f6e5bb",
+                "reference": "cb6b31a7aa99df9c6c2dc09a5fa2aaa617f6e5bb",
+                "shasum": ""
+            },
+            "require": {
+                "bacon/bacon-qr-code": "^3.0",
+                "php": "^8.1"
+            },
+            "require-dev": {
+                "endroid/quality": "dev-main",
+                "ext-gd": "*",
+                "khanamiryan/qrcode-detector-decoder": "^2.0.2",
+                "setasign/fpdf": "^1.8.2"
+            },
+            "suggest": {
+                "ext-gd": "Enables you to write PNG images",
+                "khanamiryan/qrcode-detector-decoder": "Enables you to use the image validator",
+                "roave/security-advisories": "Makes sure package versions with known security issues are not installed",
+                "setasign/fpdf": "Enables you to use the PDF writer"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "5.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Endroid\\QrCode\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jeroen van den Enden",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Endroid QR Code",
+            "homepage": "https://github.com/endroid/qr-code",
+            "keywords": [
+                "code",
+                "endroid",
+                "php",
+                "qr",
+                "qrcode"
+            ],
+            "support": {
+                "issues": "https://github.com/endroid/qr-code/issues",
+                "source": "https://github.com/endroid/qr-code/tree/5.0.8"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/endroid",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-04-19T08:36:52+00:00"
+        },
+        {
+            "name": "geoip2/geoip2",
+            "version": "v3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/maxmind/GeoIP2-php.git",
+                "reference": "1a802ce9356cdd1c6b681c030fd9563750e11e6a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/1a802ce9356cdd1c6b681c030fd9563750e11e6a",
+                "reference": "1a802ce9356cdd1c6b681c030fd9563750e11e6a",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "maxmind-db/reader": "^1.11.1",
+                "maxmind/web-service-common": "~0.8",
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "3.*",
+                "phpstan/phpstan": "*",
+                "phpunit/phpunit": "^10.0",
+                "squizlabs/php_codesniffer": "3.*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "GeoIp2\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Gregory J. Oschwald",
+                    "email": "[email protected]",
+                    "homepage": "https://www.maxmind.com/"
+                }
+            ],
+            "description": "MaxMind GeoIP2 PHP API",
+            "homepage": "https://github.com/maxmind/GeoIP2-php",
+            "keywords": [
+                "IP",
+                "geoip",
+                "geoip2",
+                "geolocation",
+                "maxmind"
+            ],
+            "support": {
+                "issues": "https://github.com/maxmind/GeoIP2-php/issues",
+                "source": "https://github.com/maxmind/GeoIP2-php/tree/v3.0.0"
+            },
+            "time": "2023-12-04T17:16:34+00:00"
+        },
+        {
+            "name": "guzzlehttp/guzzle",
+            "version": "7.8.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle.git",
+                "reference": "41042bc7ab002487b876a0683fc8dce04ddce104"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104",
+                "reference": "41042bc7ab002487b876a0683fc8dce04ddce104",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/promises": "^1.5.3 || ^2.0.1",
+                "guzzlehttp/psr7": "^1.9.1 || ^2.5.1",
+                "php": "^7.2.5 || ^8.0",
+                "psr/http-client": "^1.0",
+                "symfony/deprecation-contracts": "^2.2 || ^3.0"
+            },
+            "provide": {
+                "psr/http-client-implementation": "1.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.2",
+                "ext-curl": "*",
+                "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
+                "php-http/message-factory": "^1.1",
+                "phpunit/phpunit": "^8.5.36 || ^9.6.15",
+                "psr/log": "^1.1 || ^2.0 || ^3.0"
+            },
+            "suggest": {
+                "ext-curl": "Required for CURL handler support",
+                "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+                "psr/log": "Required for using the Log middleware"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "GuzzleHttp\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Jeremy Lindblom",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/jeremeamia"
+                },
+                {
+                    "name": "George Mponos",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/gmponos"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/sagikazarmark"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "Guzzle is a PHP HTTP client library",
+            "keywords": [
+                "client",
+                "curl",
+                "framework",
+                "http",
+                "http client",
+                "psr-18",
+                "psr-7",
+                "rest",
+                "web service"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/guzzle/issues",
+                "source": "https://github.com/guzzle/guzzle/tree/7.8.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-12-03T20:35:24+00:00"
+        },
+        {
+            "name": "guzzlehttp/promises",
+            "version": "2.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/promises.git",
+                "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223",
+                "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.2",
+                "phpunit/phpunit": "^8.5.36 || ^9.6.15"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Promise\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "Guzzle promises library",
+            "keywords": [
+                "promise"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/promises/issues",
+                "source": "https://github.com/guzzle/promises/tree/2.0.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-12-03T20:19:20+00:00"
+        },
+        {
+            "name": "guzzlehttp/psr7",
+            "version": "2.6.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/psr7.git",
+                "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221",
+                "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0",
+                "psr/http-factory": "^1.0",
+                "psr/http-message": "^1.1 || ^2.0",
+                "ralouphie/getallheaders": "^3.0"
+            },
+            "provide": {
+                "psr/http-factory-implementation": "1.0",
+                "psr/http-message-implementation": "1.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.2",
+                "http-interop/http-factory-tests": "^0.9",
+                "phpunit/phpunit": "^8.5.36 || ^9.6.15"
+            },
+            "suggest": {
+                "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Psr7\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "George Mponos",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/gmponos"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/sagikazarmark"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/Tobion"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "[email protected]",
+                    "homepage": "https://sagikazarmark.hu"
+                }
+            ],
+            "description": "PSR-7 message implementation that also provides common utility methods",
+            "keywords": [
+                "http",
+                "message",
+                "psr-7",
+                "request",
+                "response",
+                "stream",
+                "uri",
+                "url"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/psr7/issues",
+                "source": "https://github.com/guzzle/psr7/tree/2.6.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-12-03T20:05:35+00:00"
+        },
+        {
+            "name": "illuminate/collections",
+            "version": "v11.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/illuminate/collections.git",
+                "reference": "19c6554c7eba0efabc3f8aa4c434815b7f6b4b7d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/illuminate/collections/zipball/19c6554c7eba0efabc3f8aa4c434815b7f6b4b7d",
+                "reference": "19c6554c7eba0efabc3f8aa4c434815b7f6b4b7d",
+                "shasum": ""
+            },
+            "require": {
+                "illuminate/conditionable": "^11.0",
+                "illuminate/contracts": "^11.0",
+                "illuminate/macroable": "^11.0",
+                "php": "^8.2"
+            },
+            "suggest": {
+                "symfony/var-dumper": "Required to use the dump method (^7.0)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "11.x-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "helpers.php"
+                ],
+                "psr-4": {
+                    "Illuminate\\Support\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "The Illuminate Collections package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2024-04-15T15:26:05+00:00"
+        },
+        {
+            "name": "illuminate/conditionable",
+            "version": "v11.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/illuminate/conditionable.git",
+                "reference": "8a558fec063b6a63da1c3af1d219c0f998edffeb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/illuminate/conditionable/zipball/8a558fec063b6a63da1c3af1d219c0f998edffeb",
+                "reference": "8a558fec063b6a63da1c3af1d219c0f998edffeb",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.0.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "11.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Illuminate\\Support\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "The Illuminate Conditionable package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2024-04-04T17:36:49+00:00"
+        },
+        {
+            "name": "illuminate/container",
+            "version": "v11.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/illuminate/container.git",
+                "reference": "af979ecfd6dfa6583eae5dfe2e9a8840358f4ca7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/illuminate/container/zipball/af979ecfd6dfa6583eae5dfe2e9a8840358f4ca7",
+                "reference": "af979ecfd6dfa6583eae5dfe2e9a8840358f4ca7",
+                "shasum": ""
+            },
+            "require": {
+                "illuminate/contracts": "^11.0",
+                "php": "^8.2",
+                "psr/container": "^1.1.1|^2.0.1"
+            },
+            "provide": {
+                "psr/container-implementation": "1.1|2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "11.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Illuminate\\Container\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "The Illuminate Container package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2024-04-04T17:36:49+00:00"
+        },
+        {
+            "name": "illuminate/contracts",
+            "version": "v11.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/illuminate/contracts.git",
+                "reference": "8782f75e80ab3e6036842d24dbeead34a16f3a79"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/illuminate/contracts/zipball/8782f75e80ab3e6036842d24dbeead34a16f3a79",
+                "reference": "8782f75e80ab3e6036842d24dbeead34a16f3a79",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.2",
+                "psr/container": "^1.1.1|^2.0.1",
+                "psr/simple-cache": "^1.0|^2.0|^3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "11.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Illuminate\\Contracts\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "The Illuminate Contracts package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2024-04-17T14:09:55+00:00"
+        },
+        {
+            "name": "illuminate/database",
+            "version": "v11.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/illuminate/database.git",
+                "reference": "405b8172fb190ba8c9c3719508dcabc9ae17e0ad"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/illuminate/database/zipball/405b8172fb190ba8c9c3719508dcabc9ae17e0ad",
+                "reference": "405b8172fb190ba8c9c3719508dcabc9ae17e0ad",
+                "shasum": ""
+            },
+            "require": {
+                "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12",
+                "ext-pdo": "*",
+                "illuminate/collections": "^11.0",
+                "illuminate/container": "^11.0",
+                "illuminate/contracts": "^11.0",
+                "illuminate/macroable": "^11.0",
+                "illuminate/support": "^11.0",
+                "php": "^8.2"
+            },
+            "suggest": {
+                "ext-filter": "Required to use the Postgres database driver.",
+                "fakerphp/faker": "Required to use the eloquent factory builder (^1.21).",
+                "illuminate/console": "Required to use the database commands (^11.0).",
+                "illuminate/events": "Required to use the observers with Eloquent (^11.0).",
+                "illuminate/filesystem": "Required to use the migrations (^11.0).",
+                "illuminate/pagination": "Required to paginate the result set (^11.0).",
+                "symfony/finder": "Required to use Eloquent model factories (^7.0)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "11.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Illuminate\\Database\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "The Illuminate Database package.",
+            "homepage": "https://laravel.com",
+            "keywords": [
+                "database",
+                "laravel",
+                "orm",
+                "sql"
+            ],
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2024-04-22T17:15:11+00:00"
+        },
+        {
+            "name": "illuminate/macroable",
+            "version": "v11.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/illuminate/macroable.git",
+                "reference": "e1be58f9b2af73f242dc6a9add1f376b3ec89eef"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/illuminate/macroable/zipball/e1be58f9b2af73f242dc6a9add1f376b3ec89eef",
+                "reference": "e1be58f9b2af73f242dc6a9add1f376b3ec89eef",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "11.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Illuminate\\Support\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "The Illuminate Macroable package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2023-06-08T14:08:27+00:00"
+        },
+        {
+            "name": "illuminate/pagination",
+            "version": "v11.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/illuminate/pagination.git",
+                "reference": "0752b63f17105b7de8fa3dea12acd3c4099db21e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/illuminate/pagination/zipball/0752b63f17105b7de8fa3dea12acd3c4099db21e",
+                "reference": "0752b63f17105b7de8fa3dea12acd3c4099db21e",
+                "shasum": ""
+            },
+            "require": {
+                "ext-filter": "*",
+                "illuminate/collections": "^11.0",
+                "illuminate/contracts": "^11.0",
+                "illuminate/support": "^11.0",
+                "php": "^8.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "11.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Illuminate\\Pagination\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "The Illuminate Pagination package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2024-04-16T14:29:11+00:00"
+        },
+        {
+            "name": "illuminate/support",
+            "version": "v11.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/illuminate/support.git",
+                "reference": "8235189235c4cacb873bddd63d910644518018ea"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/illuminate/support/zipball/8235189235c4cacb873bddd63d910644518018ea",
+                "reference": "8235189235c4cacb873bddd63d910644518018ea",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/inflector": "^2.0",
+                "ext-ctype": "*",
+                "ext-filter": "*",
+                "ext-mbstring": "*",
+                "illuminate/collections": "^11.0",
+                "illuminate/conditionable": "^11.0",
+                "illuminate/contracts": "^11.0",
+                "illuminate/macroable": "^11.0",
+                "nesbot/carbon": "^2.72.2|^3.0",
+                "php": "^8.2",
+                "voku/portable-ascii": "^2.0"
+            },
+            "conflict": {
+                "tightenco/collect": "<5.5.33"
+            },
+            "replace": {
+                "spatie/once": "*"
+            },
+            "suggest": {
+                "illuminate/filesystem": "Required to use the composer class (^11.0).",
+                "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.0.2).",
+                "ramsey/uuid": "Required to use Str::uuid() (^4.7).",
+                "symfony/process": "Required to use the composer class (^7.0).",
+                "symfony/uid": "Required to use Str::ulid() (^7.0).",
+                "symfony/var-dumper": "Required to use the dd function (^7.0).",
+                "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.4.1)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "11.x-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "helpers.php"
+                ],
+                "psr-4": {
+                    "Illuminate\\Support\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "The Illuminate Support package.",
+            "homepage": "https://laravel.com",
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2024-04-18T14:56:27+00:00"
+        },
+        {
+            "name": "irazasyed/telegram-bot-sdk",
+            "version": "v3.14.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/irazasyed/telegram-bot-sdk.git",
+                "reference": "c72ef585556578105c4d5cc56324575ef3677fd2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/irazasyed/telegram-bot-sdk/zipball/c72ef585556578105c4d5cc56324575ef3677fd2",
+                "reference": "c72ef585556578105c4d5cc56324575ef3677fd2",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/guzzle": "^7.5.1",
+                "guzzlehttp/psr7": "^2.5",
+                "illuminate/support": "9 - 11",
+                "league/event": "^2.2 || ^3.0",
+                "php": ">=8.0",
+                "psr/container": "^1.1 || ^2.0",
+                "psr/event-dispatcher": "^1.0"
+            },
+            "require-dev": {
+                "irazasyed/docgen": "^0.2",
+                "pestphp/pest": "^1.22 || ^2.0",
+                "php-parallel-lint/php-parallel-lint": "^1.3",
+                "phpspec/prophecy": "^1.17",
+                "phpspec/prophecy-phpunit": "^2.0",
+                "rector/rector": "^0.16.0 || ^0.17.0 || ^0.18.0 || ^0.19.0 || ^1.0.0"
+            },
+            "suggest": {
+                "illuminate/container": "Hold dependencies to be injected in commands constructors",
+                "irazasyed/larasupport": "Allows you to use any Laravel Package in Lumen by adding support!"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                },
+                "laravel": {
+                    "aliases": {
+                        "Telegram": "Telegram\\Bot\\Laravel\\Facades\\Telegram"
+                    },
+                    "providers": [
+                        "Telegram\\Bot\\Laravel\\TelegramServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Telegram\\Bot\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Irfaq Syed",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/irazasyed"
+                }
+            ],
+            "description": "The Unofficial Telegram Bot API PHP SDK",
+            "homepage": "https://github.com/irazasyed/telegram-bot-sdk",
+            "keywords": [
+                "laravel",
+                "laravel telegram",
+                "telegram",
+                "telegram bot",
+                "telegram bot api",
+                "telegram php",
+                "telegram sdk"
+            ],
+            "support": {
+                "issues": "https://github.com/irazasyed/telegram-bot-sdk/issues",
+                "source": "https://github.com/irazasyed/telegram-bot-sdk/tree/v3.14.0"
+            },
+            "time": "2024-03-11T03:11:26+00:00"
+        },
+        {
+            "name": "jean85/pretty-package-versions",
+            "version": "2.0.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Jean85/pretty-package-versions.git",
+                "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/f9fdd29ad8e6d024f52678b570e5593759b550b4",
+                "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4",
+                "shasum": ""
+            },
+            "require": {
+                "composer-runtime-api": "^2.0.0",
+                "php": "^7.1|^8.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^3.2",
+                "jean85/composer-provided-replaced-stub-package": "^1.0",
+                "phpstan/phpstan": "^1.4",
+                "phpunit/phpunit": "^7.5|^8.5|^9.4",
+                "vimeo/psalm": "^4.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Jean85\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Alessandro Lai",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "A library to get pretty versions strings of installed dependencies",
+            "keywords": [
+                "composer",
+                "package",
+                "release",
+                "versions"
+            ],
+            "support": {
+                "issues": "https://github.com/Jean85/pretty-package-versions/issues",
+                "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.6"
+            },
+            "time": "2024-03-08T09:58:59+00:00"
+        },
+        {
+            "name": "lcobucci/jwt",
+            "version": "5.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/lcobucci/jwt.git",
+                "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/lcobucci/jwt/zipball/08071d8d2c7f4b00222cc4b1fb6aa46990a80f83",
+                "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83",
+                "shasum": ""
+            },
+            "require": {
+                "ext-openssl": "*",
+                "ext-sodium": "*",
+                "php": "~8.1.0 || ~8.2.0 || ~8.3.0",
+                "psr/clock": "^1.0"
+            },
+            "require-dev": {
+                "infection/infection": "^0.27.0",
+                "lcobucci/clock": "^3.0",
+                "lcobucci/coding-standard": "^11.0",
+                "phpbench/phpbench": "^1.2.9",
+                "phpstan/extension-installer": "^1.2",
+                "phpstan/phpstan": "^1.10.7",
+                "phpstan/phpstan-deprecation-rules": "^1.1.3",
+                "phpstan/phpstan-phpunit": "^1.3.10",
+                "phpstan/phpstan-strict-rules": "^1.5.0",
+                "phpunit/phpunit": "^10.2.6"
+            },
+            "suggest": {
+                "lcobucci/clock": ">= 3.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Lcobucci\\JWT\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Luís Cobucci",
+                    "email": "[email protected]",
+                    "role": "Developer"
+                }
+            ],
+            "description": "A simple library to work with JSON Web Token and JSON Web Signature",
+            "keywords": [
+                "JWS",
+                "jwt"
+            ],
+            "support": {
+                "issues": "https://github.com/lcobucci/jwt/issues",
+                "source": "https://github.com/lcobucci/jwt/tree/5.3.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/lcobucci",
+                    "type": "github"
+                },
+                {
+                    "url": "https://www.patreon.com/lcobucci",
+                    "type": "patreon"
+                }
+            ],
+            "time": "2024-04-11T23:07:54+00:00"
+        },
+        {
+            "name": "league/event",
+            "version": "3.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/event.git",
+                "reference": "221867a61087ee265ca07bd39aa757879afca820"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/event/zipball/221867a61087ee265ca07bd39aa757879afca820",
+                "reference": "221867a61087ee265ca07bd39aa757879afca820",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.0",
+                "psr/event-dispatcher": "^1.0"
+            },
+            "provide": {
+                "psr/event-dispatcher-implementation": "1.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^2.16",
+                "phpstan/phpstan": "^0.12.45",
+                "phpunit/phpunit": "^8.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "League\\Event\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Frank de Jonge",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Event package",
+            "keywords": [
+                "emitter",
+                "event",
+                "listener"
+            ],
+            "support": {
+                "issues": "https://github.com/thephpleague/event/issues",
+                "source": "https://github.com/thephpleague/event/tree/3.0.2"
+            },
+            "time": "2022-10-29T09:31:25+00:00"
+        },
+        {
+            "name": "lizhichao/one-sm",
+            "version": "1.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/lizhichao/sm.git",
+                "reference": "687a012a44a5bfd4d9143a0234e1060543be455a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/lizhichao/sm/zipball/687a012a44a5bfd4d9143a0234e1060543be455a",
+                "reference": "687a012a44a5bfd4d9143a0234e1060543be455a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "OneSm\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "tanszhe",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "国密sm3",
+            "keywords": [
+                "php",
+                "sm3"
+            ],
+            "support": {
+                "issues": "https://github.com/lizhichao/sm/issues",
+                "source": "https://github.com/lizhichao/sm/tree/1.10"
+            },
+            "funding": [
+                {
+                    "url": "https://www.vicsdf.com/img/w.jpg",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://www.vicsdf.com/img/z.jpg",
+                    "type": "custom"
+                }
+            ],
+            "time": "2021-05-26T06:19:22+00:00"
+        },
+        {
+            "name": "mailchimp/transactional",
+            "version": "1.0.59",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/mailchimp/mailchimp-transactional-php.git",
+                "reference": "1783927027820dc1c624fd04abf5012a57f96feb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/mailchimp/mailchimp-transactional-php/zipball/1783927027820dc1c624fd04abf5012a57f96feb",
+                "reference": "1783927027820dc1c624fd04abf5012a57f96feb",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "guzzlehttp/guzzle": "^6.4 || ^7.2",
+                "php": ">=7.2"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "~2.12",
+                "phpunit/phpunit": "^7",
+                "squizlabs/php_codesniffer": "~2.6"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "MailchimpTransactional\\": "lib/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "proprietary"
+            ],
+            "authors": [
+                {
+                    "name": "Mailchimp",
+                    "homepage": "https://github.com/mailchimp/mailchimp-transactional-php"
+                }
+            ],
+            "homepage": "http://swagger.io",
+            "keywords": [
+                "api",
+                "php",
+                "sdk",
+                "swagger"
+            ],
+            "support": {
+                "source": "https://github.com/mailchimp/mailchimp-transactional-php/tree/v1.0.59"
+            },
+            "time": "2024-02-10T01:12:26+00:00"
+        },
+        {
+            "name": "mailgun/mailgun-php",
+            "version": "v4.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/mailgun/mailgun-php.git",
+                "reference": "6e31693370a254522118b9961ca675823c76c3c0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/mailgun/mailgun-php/zipball/6e31693370a254522118b9961ca675823c76c3c0",
+                "reference": "6e31693370a254522118b9961ca675823c76c3c0",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.3 || ^8.0",
+                "php-http/client-common": "^2.2.1",
+                "php-http/discovery": "^1.19",
+                "php-http/multipart-stream-builder": "^1.1.2",
+                "psr/http-client": "^1.0",
+                "webmozart/assert": "^1.9.1"
+            },
+            "require-dev": {
+                "nyholm/nsa": "^1.2.1",
+                "nyholm/psr7": "^1.3.1",
+                "phpunit/phpunit": "^9.3",
+                "squizlabs/php_codesniffer": "^3.7",
+                "symfony/http-client": "^5.4 || ^6.3"
+            },
+            "suggest": {
+                "nyholm/psr7": "PSR-7 message implementation",
+                "symfony/http-client": "HTTP client"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Mailgun\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Travis Swientek",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "The Mailgun SDK provides methods for all API functions.",
+            "support": {
+                "issues": "https://github.com/mailgun/mailgun-php/issues",
+                "source": "https://github.com/mailgun/mailgun-php/tree/v4.2.0"
+            },
+            "time": "2024-03-09T11:07:21+00:00"
+        },
+        {
+            "name": "maxmind-db/reader",
+            "version": "v1.11.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
+                "reference": "1e66f73ffcf25e17c7a910a1317e9720a95497c7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/1e66f73ffcf25e17c7a910a1317e9720a95497c7",
+                "reference": "1e66f73ffcf25e17c7a910a1317e9720a95497c7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2"
+            },
+            "conflict": {
+                "ext-maxminddb": "<1.11.1,>=2.0.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "3.*",
+                "php-coveralls/php-coveralls": "^2.1",
+                "phpstan/phpstan": "*",
+                "phpunit/phpcov": ">=6.0.0",
+                "phpunit/phpunit": ">=8.0.0,<10.0.0",
+                "squizlabs/php_codesniffer": "3.*"
+            },
+            "suggest": {
+                "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
+                "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
+                "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "MaxMind\\Db\\": "src/MaxMind/Db"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Gregory J. Oschwald",
+                    "email": "[email protected]",
+                    "homepage": "https://www.maxmind.com/"
+                }
+            ],
+            "description": "MaxMind DB Reader API",
+            "homepage": "https://github.com/maxmind/MaxMind-DB-Reader-php",
+            "keywords": [
+                "database",
+                "geoip",
+                "geoip2",
+                "geolocation",
+                "maxmind"
+            ],
+            "support": {
+                "issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues",
+                "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.11.1"
+            },
+            "time": "2023-12-02T00:09:23+00:00"
+        },
+        {
+            "name": "maxmind/web-service-common",
+            "version": "v0.9.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/maxmind/web-service-common-php.git",
+                "reference": "4dc5a3e8df38aea4ca3b1096cee3a038094e9b53"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/4dc5a3e8df38aea4ca3b1096cee3a038094e9b53",
+                "reference": "4dc5a3e8df38aea4ca3b1096cee3a038094e9b53",
+                "shasum": ""
+            },
+            "require": {
+                "composer/ca-bundle": "^1.0.3",
+                "ext-curl": "*",
+                "ext-json": "*",
+                "php": ">=7.2"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "3.*",
+                "phpstan/phpstan": "*",
+                "phpunit/phpunit": "^8.0 || ^9.0",
+                "squizlabs/php_codesniffer": "3.*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "MaxMind\\Exception\\": "src/Exception",
+                    "MaxMind\\WebService\\": "src/WebService"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Gregory Oschwald",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Internal MaxMind Web Service API",
+            "homepage": "https://github.com/maxmind/web-service-common-php",
+            "support": {
+                "issues": "https://github.com/maxmind/web-service-common-php/issues",
+                "source": "https://github.com/maxmind/web-service-common-php/tree/v0.9.0"
+            },
+            "time": "2022-03-28T17:43:20+00:00"
+        },
+        {
+            "name": "monolog/monolog",
+            "version": "3.6.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/monolog.git",
+                "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654",
+                "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "psr/log": "^2.0 || ^3.0"
+            },
+            "provide": {
+                "psr/log-implementation": "3.0.0"
+            },
+            "require-dev": {
+                "aws/aws-sdk-php": "^3.0",
+                "doctrine/couchdb": "~1.0@dev",
+                "elasticsearch/elasticsearch": "^7 || ^8",
+                "ext-json": "*",
+                "graylog2/gelf-php": "^1.4.2 || ^2.0",
+                "guzzlehttp/guzzle": "^7.4.5",
+                "guzzlehttp/psr7": "^2.2",
+                "mongodb/mongodb": "^1.8",
+                "php-amqplib/php-amqplib": "~2.4 || ^3",
+                "phpstan/phpstan": "^1.9",
+                "phpstan/phpstan-deprecation-rules": "^1.0",
+                "phpstan/phpstan-strict-rules": "^1.4",
+                "phpunit/phpunit": "^10.5.17",
+                "predis/predis": "^1.1 || ^2",
+                "ruflin/elastica": "^7",
+                "symfony/mailer": "^5.4 || ^6",
+                "symfony/mime": "^5.4 || ^6"
+            },
+            "suggest": {
+                "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+                "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+                "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
+                "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+                "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
+                "ext-mbstring": "Allow to work properly with unicode symbols",
+                "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+                "ext-openssl": "Required to send log messages using SSL",
+                "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
+                "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+                "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
+                "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+                "rollbar/rollbar": "Allow sending log messages to Rollbar",
+                "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Monolog\\": "src/Monolog"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "[email protected]",
+                    "homepage": "https://seld.be"
+                }
+            ],
+            "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+            "homepage": "https://github.com/Seldaek/monolog",
+            "keywords": [
+                "log",
+                "logging",
+                "psr-3"
+            ],
+            "support": {
+                "issues": "https://github.com/Seldaek/monolog/issues",
+                "source": "https://github.com/Seldaek/monolog/tree/3.6.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/Seldaek",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-04-12T21:02:21+00:00"
+        },
+        {
+            "name": "mtdowling/jmespath.php",
+            "version": "2.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/jmespath/jmespath.php.git",
+                "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/bbb69a935c2cbb0c03d7f481a238027430f6440b",
+                "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0",
+                "symfony/polyfill-mbstring": "^1.17"
+            },
+            "require-dev": {
+                "composer/xdebug-handler": "^3.0.3",
+                "phpunit/phpunit": "^8.5.33"
+            },
+            "bin": [
+                "bin/jp.php"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/JmesPath.php"
+                ],
+                "psr-4": {
+                    "JmesPath\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "[email protected]",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Declaratively specify how to extract elements from a JSON document",
+            "keywords": [
+                "json",
+                "jsonpath"
+            ],
+            "support": {
+                "issues": "https://github.com/jmespath/jmespath.php/issues",
+                "source": "https://github.com/jmespath/jmespath.php/tree/2.7.0"
+            },
+            "time": "2023-08-25T10:54:48+00:00"
+        },
+        {
+            "name": "nesbot/carbon",
+            "version": "3.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/briannesbitt/Carbon.git",
+                "reference": "7219739c4e01d4680c980545821733b6ed8ee880"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7219739c4e01d4680c980545821733b6ed8ee880",
+                "reference": "7219739c4e01d4680c980545821733b6ed8ee880",
+                "shasum": ""
+            },
+            "require": {
+                "carbonphp/carbon-doctrine-types": "*",
+                "ext-json": "*",
+                "php": "^8.1",
+                "psr/clock": "^1.0",
+                "symfony/clock": "^6.3 || ^7.0",
+                "symfony/polyfill-mbstring": "^1.0",
+                "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0"
+            },
+            "provide": {
+                "psr/clock-implementation": "1.0"
+            },
+            "require-dev": {
+                "doctrine/dbal": "^3.6.3 || ^4.0",
+                "doctrine/orm": "^2.15.2 || ^3.0",
+                "friendsofphp/php-cs-fixer": "^3.52.1",
+                "kylekatarnls/multi-tester": "^2.5.3",
+                "ondrejmirtes/better-reflection": "^6.25.0.4",
+                "phpmd/phpmd": "^2.15.0",
+                "phpstan/extension-installer": "^1.3.1",
+                "phpstan/phpstan": "^1.10.65",
+                "phpunit/phpunit": "^10.5.15",
+                "squizlabs/php_codesniffer": "^3.9.0"
+            },
+            "bin": [
+                "bin/carbon"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.x-dev",
+                    "dev-2.x": "2.x-dev"
+                },
+                "laravel": {
+                    "providers": [
+                        "Carbon\\Laravel\\ServiceProvider"
+                    ]
+                },
+                "phpstan": {
+                    "includes": [
+                        "extension.neon"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Carbon\\": "src/Carbon/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Brian Nesbitt",
+                    "email": "[email protected]",
+                    "homepage": "https://markido.com"
+                },
+                {
+                    "name": "kylekatarnls",
+                    "homepage": "https://github.com/kylekatarnls"
+                }
+            ],
+            "description": "An API extension for DateTime that supports 281 different languages.",
+            "homepage": "https://carbon.nesbot.com",
+            "keywords": [
+                "date",
+                "datetime",
+                "time"
+            ],
+            "support": {
+                "docs": "https://carbon.nesbot.com/docs",
+                "issues": "https://github.com/briannesbitt/Carbon/issues",
+                "source": "https://github.com/briannesbitt/Carbon"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sponsors/kylekatarnls",
+                    "type": "github"
+                },
+                {
+                    "url": "https://opencollective.com/Carbon#sponsor",
+                    "type": "opencollective"
+                },
+                {
+                    "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-04-18T16:35:06+00:00"
+        },
+        {
+            "name": "nikic/fast-route",
+            "version": "v1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nikic/FastRoute.git",
+                "reference": "181d480e08d9476e61381e04a71b34dc0432e812"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812",
+                "reference": "181d480e08d9476e61381e04a71b34dc0432e812",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35|~5.7"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/functions.php"
+                ],
+                "psr-4": {
+                    "FastRoute\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Nikita Popov",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Fast request router for PHP",
+            "keywords": [
+                "router",
+                "routing"
+            ],
+            "support": {
+                "issues": "https://github.com/nikic/FastRoute/issues",
+                "source": "https://github.com/nikic/FastRoute/tree/master"
+            },
+            "time": "2018-02-13T20:26:39+00:00"
+        },
+        {
+            "name": "nikolaposa/rate-limit",
+            "version": "3.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nikolaposa/rate-limit.git",
+                "reference": "fa5d32ff5a31566a8839fa556c51930c0a7b467e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nikolaposa/rate-limit/zipball/fa5d32ff5a31566a8839fa556c51930c0a7b467e",
+                "reference": "fa5d32ff5a31566a8839fa556c51930c0a7b467e",
+                "shasum": ""
+            },
+            "require": {
+                "beberlei/assert": "^3.2",
+                "php": "^8.1"
+            },
+            "require-dev": {
+                "ext-apcu": ">=5.1.12",
+                "ext-redis": "*",
+                "friendsofphp/php-cs-fixer": "3.44",
+                "phpstan/phpstan": "^1.10",
+                "phpstan/phpstan-beberlei-assert": "^1.1",
+                "phpstan/phpstan-phpunit": "^1.3",
+                "phpunit/phpunit": "^10.5",
+                "predis/predis": "^1.1"
+            },
+            "suggest": {
+                "ext-apcu": "In order to use ApcuRateLimiter",
+                "ext-memcached": "In order to use MemcachedRateLimiter",
+                "ext-redis": "In order to use RedisRateLimiter",
+                "predis/predis": "In order to use PredisRateLimiter"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "RateLimit\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nikola Poša",
+                    "email": "[email protected]",
+                    "homepage": "https://www.nikolaposa.in.rs"
+                }
+            ],
+            "description": "General purpose rate limiter implementation.",
+            "keywords": [
+                "rate limit",
+                "redis"
+            ],
+            "support": {
+                "issues": "https://github.com/nikolaposa/rate-limit/issues",
+                "source": "https://github.com/nikolaposa/rate-limit/tree/3.1.0"
+            },
+            "time": "2023-12-29T22:51:49+00:00"
+        },
+        {
+            "name": "openai-php/client",
+            "version": "v0.8.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/openai-php/client.git",
+                "reference": "0f755fafa4d3f8d5c8ed964d3166d078fac0605a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/openai-php/client/zipball/0f755fafa4d3f8d5c8ed964d3166d078fac0605a",
+                "reference": "0f755fafa4d3f8d5c8ed964d3166d078fac0605a",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.1.0",
+                "php-http/discovery": "^1.19.4",
+                "php-http/multipart-stream-builder": "^1.3.0",
+                "psr/http-client": "^1.0.3",
+                "psr/http-client-implementation": "^1.0.1",
+                "psr/http-factory-implementation": "*",
+                "psr/http-message": "^1.1.0|^2.0.0"
+            },
+            "require-dev": {
+                "guzzlehttp/guzzle": "^7.8.1",
+                "guzzlehttp/psr7": "^2.6.2",
+                "laravel/pint": "^1.15.0",
+                "mockery/mockery": "^1.6.11",
+                "nunomaduro/collision": "^7.10.0",
+                "pestphp/pest": "^2.34.6",
+                "pestphp/pest-plugin-arch": "^2.7",
+                "pestphp/pest-plugin-type-coverage": "^2.8.1",
+                "phpstan/phpstan": "^1.10.66",
+                "rector/rector": "^1.0.4",
+                "symfony/var-dumper": "^6.4.4"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/OpenAI.php"
+                ],
+                "psr-4": {
+                    "OpenAI\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nuno Maduro",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Sandro Gehri"
+                }
+            ],
+            "description": "OpenAI PHP is a supercharged PHP API client that allows you to interact with the Open AI API",
+            "keywords": [
+                "GPT-3",
+                "api",
+                "client",
+                "codex",
+                "dall-e",
+                "language",
+                "natural",
+                "openai",
+                "php",
+                "processing",
+                "sdk"
+            ],
+            "support": {
+                "issues": "https://github.com/openai-php/client/issues",
+                "source": "https://github.com/openai-php/client/tree/v0.8.5"
+            },
+            "funding": [
+                {
+                    "url": "https://www.paypal.com/paypalme/enunomaduro",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/gehrisandro",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/nunomaduro",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-04-15T19:11:23+00:00"
+        },
+        {
+            "name": "php-http/client-common",
+            "version": "2.7.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/client-common.git",
+                "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/client-common/zipball/1e19c059b0e4d5f717bf5d524d616165aeab0612",
+                "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0",
+                "php-http/httplug": "^2.0",
+                "php-http/message": "^1.6",
+                "psr/http-client": "^1.0",
+                "psr/http-factory": "^1.0",
+                "psr/http-message": "^1.0 || ^2.0",
+                "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0",
+                "symfony/polyfill-php80": "^1.17"
+            },
+            "require-dev": {
+                "doctrine/instantiator": "^1.1",
+                "guzzlehttp/psr7": "^1.4",
+                "nyholm/psr7": "^1.2",
+                "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+                "phpspec/prophecy": "^1.10.2",
+                "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7"
+            },
+            "suggest": {
+                "ext-json": "To detect JSON responses with the ContentTypePlugin",
+                "ext-libxml": "To detect XML responses with the ContentTypePlugin",
+                "php-http/cache-plugin": "PSR-6 Cache plugin",
+                "php-http/logger-plugin": "PSR-3 Logger plugin",
+                "php-http/stopwatch-plugin": "Symfony Stopwatch plugin"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Http\\Client\\Common\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Common HTTP Client implementations and tools for HTTPlug",
+            "homepage": "http://httplug.io",
+            "keywords": [
+                "client",
+                "common",
+                "http",
+                "httplug"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/client-common/issues",
+                "source": "https://github.com/php-http/client-common/tree/2.7.1"
+            },
+            "time": "2023-11-30T10:31:25+00:00"
+        },
+        {
+            "name": "php-http/discovery",
+            "version": "1.19.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/discovery.git",
+                "reference": "0700efda8d7526335132360167315fdab3aeb599"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/discovery/zipball/0700efda8d7526335132360167315fdab3aeb599",
+                "reference": "0700efda8d7526335132360167315fdab3aeb599",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^1.0|^2.0",
+                "php": "^7.1 || ^8.0"
+            },
+            "conflict": {
+                "nyholm/psr7": "<1.0",
+                "zendframework/zend-diactoros": "*"
+            },
+            "provide": {
+                "php-http/async-client-implementation": "*",
+                "php-http/client-implementation": "*",
+                "psr/http-client-implementation": "*",
+                "psr/http-factory-implementation": "*",
+                "psr/http-message-implementation": "*"
+            },
+            "require-dev": {
+                "composer/composer": "^1.0.2|^2.0",
+                "graham-campbell/phpspec-skip-example-extension": "^5.0",
+                "php-http/httplug": "^1.0 || ^2.0",
+                "php-http/message-factory": "^1.0",
+                "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3",
+                "sebastian/comparator": "^3.0.5 || ^4.0.8",
+                "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "Http\\Discovery\\Composer\\Plugin",
+                "plugin-optional": true
+            },
+            "autoload": {
+                "psr-4": {
+                    "Http\\Discovery\\": "src/"
+                },
+                "exclude-from-classmap": [
+                    "src/Composer/Plugin.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations",
+            "homepage": "http://php-http.org",
+            "keywords": [
+                "adapter",
+                "client",
+                "discovery",
+                "factory",
+                "http",
+                "message",
+                "psr17",
+                "psr7"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/discovery/issues",
+                "source": "https://github.com/php-http/discovery/tree/1.19.4"
+            },
+            "time": "2024-03-29T13:00:05+00:00"
+        },
+        {
+            "name": "php-http/httplug",
+            "version": "2.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/httplug.git",
+                "reference": "625ad742c360c8ac580fcc647a1541d29e257f67"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67",
+                "reference": "625ad742c360c8ac580fcc647a1541d29e257f67",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0",
+                "php-http/promise": "^1.1",
+                "psr/http-client": "^1.0",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "require-dev": {
+                "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0",
+                "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Http\\Client\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Eric GELOEN",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "[email protected]",
+                    "homepage": "https://sagikazarmark.hu"
+                }
+            ],
+            "description": "HTTPlug, the HTTP client abstraction for PHP",
+            "homepage": "http://httplug.io",
+            "keywords": [
+                "client",
+                "http"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/httplug/issues",
+                "source": "https://github.com/php-http/httplug/tree/2.4.0"
+            },
+            "time": "2023-04-14T15:10:03+00:00"
+        },
+        {
+            "name": "php-http/message",
+            "version": "1.16.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/message.git",
+                "reference": "5997f3289332c699fa2545c427826272498a2088"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/message/zipball/5997f3289332c699fa2545c427826272498a2088",
+                "reference": "5997f3289332c699fa2545c427826272498a2088",
+                "shasum": ""
+            },
+            "require": {
+                "clue/stream-filter": "^1.5",
+                "php": "^7.2 || ^8.0",
+                "psr/http-message": "^1.1 || ^2.0"
+            },
+            "provide": {
+                "php-http/message-factory-implementation": "1.0"
+            },
+            "require-dev": {
+                "ergebnis/composer-normalize": "^2.6",
+                "ext-zlib": "*",
+                "guzzlehttp/psr7": "^1.0 || ^2.0",
+                "laminas/laminas-diactoros": "^2.0 || ^3.0",
+                "php-http/message-factory": "^1.0.2",
+                "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+                "slim/slim": "^3.0"
+            },
+            "suggest": {
+                "ext-zlib": "Used with compressor/decompressor streams",
+                "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories",
+                "laminas/laminas-diactoros": "Used with Diactoros Factories",
+                "slim/slim": "Used with Slim Framework PSR-7 implementation"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/filters.php"
+                ],
+                "psr-4": {
+                    "Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "HTTP Message related tools",
+            "homepage": "http://php-http.org",
+            "keywords": [
+                "http",
+                "message",
+                "psr-7"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/message/issues",
+                "source": "https://github.com/php-http/message/tree/1.16.1"
+            },
+            "time": "2024-03-07T13:22:09+00:00"
+        },
+        {
+            "name": "php-http/multipart-stream-builder",
+            "version": "1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/multipart-stream-builder.git",
+                "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/f5938fd135d9fa442cc297dc98481805acfe2b6a",
+                "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0",
+                "php-http/discovery": "^1.15",
+                "psr/http-factory-implementation": "^1.0"
+            },
+            "require-dev": {
+                "nyholm/psr7": "^1.0",
+                "php-http/message": "^1.5",
+                "php-http/message-factory": "^1.0.2",
+                "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Http\\Message\\MultipartStream\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "A builder class that help you create a multipart stream",
+            "homepage": "http://php-http.org",
+            "keywords": [
+                "factory",
+                "http",
+                "message",
+                "multipart stream",
+                "stream"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/multipart-stream-builder/issues",
+                "source": "https://github.com/php-http/multipart-stream-builder/tree/1.3.0"
+            },
+            "time": "2023-04-28T14:10:22+00:00"
+        },
+        {
+            "name": "php-http/promise",
+            "version": "1.3.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/promise.git",
+                "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83",
+                "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3",
+                "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Http\\Promise\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Joel Wurtz",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Promise used for asynchronous HTTP requests",
+            "homepage": "http://httplug.io",
+            "keywords": [
+                "promise"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/promise/issues",
+                "source": "https://github.com/php-http/promise/tree/1.3.1"
+            },
+            "time": "2024-03-15T13:55:21+00:00"
+        },
+        {
+            "name": "phpmailer/phpmailer",
+            "version": "v6.9.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/PHPMailer/PHPMailer.git",
+                "reference": "039de174cd9c17a8389754d3b877a2ed22743e18"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18",
+                "reference": "039de174cd9c17a8389754d3b877a2ed22743e18",
+                "shasum": ""
+            },
+            "require": {
+                "ext-ctype": "*",
+                "ext-filter": "*",
+                "ext-hash": "*",
+                "php": ">=5.5.0"
+            },
+            "require-dev": {
+                "dealerdirect/phpcodesniffer-composer-installer": "^1.0",
+                "doctrine/annotations": "^1.2.6 || ^1.13.3",
+                "php-parallel-lint/php-console-highlighter": "^1.0.0",
+                "php-parallel-lint/php-parallel-lint": "^1.3.2",
+                "phpcompatibility/php-compatibility": "^9.3.5",
+                "roave/security-advisories": "dev-latest",
+                "squizlabs/php_codesniffer": "^3.7.2",
+                "yoast/phpunit-polyfills": "^1.0.4"
+            },
+            "suggest": {
+                "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication",
+                "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses",
+                "ext-openssl": "Needed for secure SMTP sending and DKIM signing",
+                "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication",
+                "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
+                "league/oauth2-google": "Needed for Google XOAUTH2 authentication",
+                "psr/log": "For optional PSR-3 debug logging",
+                "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)",
+                "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "PHPMailer\\PHPMailer\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL-2.1-only"
+            ],
+            "authors": [
+                {
+                    "name": "Marcus Bointon",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Jim Jagielski",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Andy Prevost",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Brent R. Matzelle"
+                }
+            ],
+            "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
+            "support": {
+                "issues": "https://github.com/PHPMailer/PHPMailer/issues",
+                "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/Synchro",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-11-25T22:23:28+00:00"
+        },
+        {
+            "name": "postal/postal",
+            "version": "v2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/postalserver/postal-php.git",
+                "reference": "e361d11aadb724a482092784ebfe00461c492b5d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/postalserver/postal-php/zipball/e361d11aadb724a482092784ebfe00461c492b5d",
+                "reference": "e361d11aadb724a482092784ebfe00461c492b5d",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/guzzle": "^6 || ^7",
+                "php": "^7.4 || ^8.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^1.10",
+                "phpunit/phpunit": "^9.6",
+                "symplify/easy-coding-standard": "^11.3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Postal\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Adam Cooke",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Josh Grant",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "William Hall",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Postal for PHP library.",
+            "homepage": "https://github.com/atech/postal",
+            "keywords": [
+                "mail",
+                "postal"
+            ],
+            "support": {
+                "issues": "https://github.com/postalserver/postal-php/issues",
+                "source": "https://github.com/postalserver/postal-php/tree/v2.0.1"
+            },
+            "time": "2023-12-19T09:49:41+00:00"
+        },
+        {
+            "name": "psr/clock",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/clock.git",
+                "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+                "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.0 || ^8.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Clock\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for reading the clock.",
+            "homepage": "https://github.com/php-fig/clock",
+            "keywords": [
+                "clock",
+                "now",
+                "psr",
+                "psr-20",
+                "time"
+            ],
+            "support": {
+                "issues": "https://github.com/php-fig/clock/issues",
+                "source": "https://github.com/php-fig/clock/tree/1.0.0"
+            },
+            "time": "2022-11-25T14:36:26+00:00"
+        },
+        {
+            "name": "psr/container",
+            "version": "2.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/container.git",
+                "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+                "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Container\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common Container Interface (PHP FIG PSR-11)",
+            "homepage": "https://github.com/php-fig/container",
+            "keywords": [
+                "PSR-11",
+                "container",
+                "container-interface",
+                "container-interop",
+                "psr"
+            ],
+            "support": {
+                "issues": "https://github.com/php-fig/container/issues",
+                "source": "https://github.com/php-fig/container/tree/2.0.2"
+            },
+            "time": "2021-11-05T16:47:00+00:00"
+        },
+        {
+            "name": "psr/event-dispatcher",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/event-dispatcher.git",
+                "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+                "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\EventDispatcher\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Standard interfaces for event handling.",
+            "keywords": [
+                "events",
+                "psr",
+                "psr-14"
+            ],
+            "support": {
+                "issues": "https://github.com/php-fig/event-dispatcher/issues",
+                "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+            },
+            "time": "2019-01-08T18:20:26+00:00"
+        },
+        {
+            "name": "psr/http-client",
+            "version": "1.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-client.git",
+                "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
+                "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.0 || ^8.0",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Client\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP clients",
+            "homepage": "https://github.com/php-fig/http-client",
+            "keywords": [
+                "http",
+                "http-client",
+                "psr",
+                "psr-18"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-client"
+            },
+            "time": "2023-09-23T14:17:50+00:00"
+        },
+        {
+            "name": "psr/http-factory",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-factory.git",
+                "reference": "e616d01114759c4c489f93b099585439f795fe35"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35",
+                "reference": "e616d01114759c4c489f93b099585439f795fe35",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0.0",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interfaces for PSR-7 HTTP message factories",
+            "keywords": [
+                "factory",
+                "http",
+                "message",
+                "psr",
+                "psr-17",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-factory/tree/1.0.2"
+            },
+            "time": "2023-04-10T20:10:41+00:00"
+        },
+        {
+            "name": "psr/http-message",
+            "version": "1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-message.git",
+                "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
+                "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP messages",
+            "homepage": "https://github.com/php-fig/http-message",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-message/tree/1.1"
+            },
+            "time": "2023-04-04T09:50:52+00:00"
+        },
+        {
+            "name": "psr/http-server-handler",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-server-handler.git",
+                "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4",
+                "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Server\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP server-side request handler",
+            "keywords": [
+                "handler",
+                "http",
+                "http-interop",
+                "psr",
+                "psr-15",
+                "psr-7",
+                "request",
+                "response",
+                "server"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2"
+            },
+            "time": "2023-04-10T20:06:20+00:00"
+        },
+        {
+            "name": "psr/http-server-middleware",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-server-middleware.git",
+                "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829",
+                "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0",
+                "psr/http-message": "^1.0 || ^2.0",
+                "psr/http-server-handler": "^1.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Server\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP server-side middleware",
+            "keywords": [
+                "http",
+                "http-interop",
+                "middleware",
+                "psr",
+                "psr-15",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "issues": "https://github.com/php-fig/http-server-middleware/issues",
+                "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2"
+            },
+            "time": "2023-04-11T06:14:47+00:00"
+        },
+        {
+            "name": "psr/log",
+            "version": "3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
+                "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/log/tree/3.0.0"
+            },
+            "time": "2021-07-14T16:46:02+00:00"
+        },
+        {
+            "name": "psr/simple-cache",
+            "version": "3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/simple-cache.git",
+                "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865",
+                "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\SimpleCache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interfaces for simple caching",
+            "keywords": [
+                "cache",
+                "caching",
+                "psr",
+                "psr-16",
+                "simple-cache"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/simple-cache/tree/3.0.0"
+            },
+            "time": "2021-10-29T13:26:27+00:00"
+        },
+        {
+            "name": "ralouphie/getallheaders",
+            "version": "3.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ralouphie/getallheaders.git",
+                "reference": "120b605dfeb996808c31b6477290a714d356e822"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+                "reference": "120b605dfeb996808c31b6477290a714d356e822",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6"
+            },
+            "require-dev": {
+                "php-coveralls/php-coveralls": "^2.1",
+                "phpunit/phpunit": "^5 || ^6.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/getallheaders.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ralph Khattar",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "A polyfill for getallheaders.",
+            "support": {
+                "issues": "https://github.com/ralouphie/getallheaders/issues",
+                "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+            },
+            "time": "2019-03-08T08:55:37+00:00"
+        },
+        {
+            "name": "ramsey/collection",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ramsey/collection.git",
+                "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5",
+                "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.1"
+            },
+            "require-dev": {
+                "captainhook/plugin-composer": "^5.3",
+                "ergebnis/composer-normalize": "^2.28.3",
+                "fakerphp/faker": "^1.21",
+                "hamcrest/hamcrest-php": "^2.0",
+                "jangregor/phpstan-prophecy": "^1.0",
+                "mockery/mockery": "^1.5",
+                "php-parallel-lint/php-console-highlighter": "^1.0",
+                "php-parallel-lint/php-parallel-lint": "^1.3",
+                "phpcsstandards/phpcsutils": "^1.0.0-rc1",
+                "phpspec/prophecy-phpunit": "^2.0",
+                "phpstan/extension-installer": "^1.2",
+                "phpstan/phpstan": "^1.9",
+                "phpstan/phpstan-mockery": "^1.1",
+                "phpstan/phpstan-phpunit": "^1.3",
+                "phpunit/phpunit": "^9.5",
+                "psalm/plugin-mockery": "^1.1",
+                "psalm/plugin-phpunit": "^0.18.4",
+                "ramsey/coding-standard": "^2.0.3",
+                "ramsey/conventional-commits": "^1.3",
+                "vimeo/psalm": "^5.4"
+            },
+            "type": "library",
+            "extra": {
+                "captainhook": {
+                    "force-install": true
+                },
+                "ramsey/conventional-commits": {
+                    "configFile": "conventional-commits.json"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Ramsey\\Collection\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ben Ramsey",
+                    "email": "[email protected]",
+                    "homepage": "https://benramsey.com"
+                }
+            ],
+            "description": "A PHP library for representing and manipulating collections.",
+            "keywords": [
+                "array",
+                "collection",
+                "hash",
+                "map",
+                "queue",
+                "set"
+            ],
+            "support": {
+                "issues": "https://github.com/ramsey/collection/issues",
+                "source": "https://github.com/ramsey/collection/tree/2.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/ramsey",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/ramsey/collection",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-12-31T21:50:55+00:00"
+        },
+        {
+            "name": "ramsey/uuid",
+            "version": "4.7.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ramsey/uuid.git",
+                "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e",
+                "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e",
+                "shasum": ""
+            },
+            "require": {
+                "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11",
+                "ext-json": "*",
+                "php": "^8.0",
+                "ramsey/collection": "^1.2 || ^2.0"
+            },
+            "replace": {
+                "rhumsaa/uuid": "self.version"
+            },
+            "require-dev": {
+                "captainhook/captainhook": "^5.10",
+                "captainhook/plugin-composer": "^5.3",
+                "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+                "doctrine/annotations": "^1.8",
+                "ergebnis/composer-normalize": "^2.15",
+                "mockery/mockery": "^1.3",
+                "paragonie/random-lib": "^2",
+                "php-mock/php-mock": "^2.2",
+                "php-mock/php-mock-mockery": "^1.3",
+                "php-parallel-lint/php-parallel-lint": "^1.1",
+                "phpbench/phpbench": "^1.0",
+                "phpstan/extension-installer": "^1.1",
+                "phpstan/phpstan": "^1.8",
+                "phpstan/phpstan-mockery": "^1.1",
+                "phpstan/phpstan-phpunit": "^1.1",
+                "phpunit/phpunit": "^8.5 || ^9",
+                "ramsey/composer-repl": "^1.4",
+                "slevomat/coding-standard": "^8.4",
+                "squizlabs/php_codesniffer": "^3.5",
+                "vimeo/psalm": "^4.9"
+            },
+            "suggest": {
+                "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.",
+                "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.",
+                "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.",
+                "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
+                "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
+            },
+            "type": "library",
+            "extra": {
+                "captainhook": {
+                    "force-install": true
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions.php"
+                ],
+                "psr-4": {
+                    "Ramsey\\Uuid\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).",
+            "keywords": [
+                "guid",
+                "identifier",
+                "uuid"
+            ],
+            "support": {
+                "issues": "https://github.com/ramsey/uuid/issues",
+                "source": "https://github.com/ramsey/uuid/tree/4.7.5"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/ramsey",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-11-08T05:53:05+00:00"
+        },
+        {
+            "name": "sendgrid/php-http-client",
+            "version": "4.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sendgrid/php-http-client.git",
+                "reference": "ec09bcfccabeb21d69e245a1e1c0e51f2813fc35"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sendgrid/php-http-client/zipball/ec09bcfccabeb21d69e245a1e1c0e51f2813fc35",
+                "reference": "ec09bcfccabeb21d69e245a1e1c0e51f2813fc35",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^2.16",
+                "phpunit/phpunit": "^9",
+                "squizlabs/php_codesniffer": "~2.0"
+            },
+            "suggest": {
+                "composer/ca-bundle": "Including this library will ensure that a valid CA bundle is available for secure connections"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "SendGrid\\": "lib/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Matt Bernier",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Elmer Thomas",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "HTTP REST client, simplified for PHP",
+            "homepage": "http://github.com/sendgrid/php-http-client",
+            "keywords": [
+                "api",
+                "fluent",
+                "http",
+                "rest",
+                "sendgrid"
+            ],
+            "support": {
+                "source": "https://github.com/sendgrid/php-http-client/tree/4.1.1"
+            },
+            "time": "2023-12-14T08:50:59+00:00"
+        },
+        {
+            "name": "sendgrid/sendgrid",
+            "version": "8.1.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sendgrid/sendgrid-php.git",
+                "reference": "6700d2cf50df38915fa2d9a03affbca58c48599f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sendgrid/sendgrid-php/zipball/6700d2cf50df38915fa2d9a03affbca58c48599f",
+                "reference": "6700d2cf50df38915fa2d9a03affbca58c48599f",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "ext-openssl": "*",
+                "php": ">=7.3",
+                "sendgrid/php-http-client": "~4.1",
+                "starkbank/ecdsa": "0.*"
+            },
+            "replace": {
+                "sendgrid/sendgrid-php": "*"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^1.5",
+                "phpunit/phpunit": "^9",
+                "squizlabs/php_codesniffer": "3.*",
+                "swaggest/json-diff": "^3.4"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "SendGrid\\Mail\\": "lib/mail/",
+                    "SendGrid\\Stats\\": "lib/stats/",
+                    "SendGrid\\Helper\\": "lib/helper/",
+                    "SendGrid\\Contacts\\": "lib/contacts/",
+                    "SendGrid\\EventWebhook\\": "lib/eventwebhook/"
+                },
+                "classmap": [
+                    "lib/BaseSendGridClientInterface.php",
+                    "lib/SendGrid.php",
+                    "lib/TwilioEmail.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "This library allows you to quickly and easily send emails through Twilio SendGrid using PHP.",
+            "homepage": "http://github.com/sendgrid/sendgrid-php",
+            "keywords": [
+                "email",
+                "grid",
+                "send",
+                "sendgrid",
+                "twilio sendgrid"
+            ],
+            "support": {
+                "source": "https://github.com/sendgrid/sendgrid-php/tree/8.1.2"
+            },
+            "time": "2024-04-18T11:09:09+00:00"
+        },
+        {
+            "name": "sentry/sdk",
+            "version": "4.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/getsentry/sentry-php-sdk.git",
+                "reference": "fcbca864e8d1dc712f3ecfaa95ea89d024fb2e53"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/fcbca864e8d1dc712f3ecfaa95ea89d024fb2e53",
+                "reference": "fcbca864e8d1dc712f3ecfaa95ea89d024fb2e53",
+                "shasum": ""
+            },
+            "require": {
+                "sentry/sentry": "^4.0"
+            },
+            "type": "metapackage",
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Sentry",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "This is a meta package of sentry/sentry. We recommend using sentry/sentry directly.",
+            "homepage": "http://sentry.io",
+            "keywords": [
+                "crash-reporting",
+                "crash-reports",
+                "error-handler",
+                "error-monitoring",
+                "log",
+                "logging",
+                "sentry"
+            ],
+            "support": {
+                "issues": "https://github.com/getsentry/sentry-php-sdk/issues",
+                "source": "https://github.com/getsentry/sentry-php-sdk/tree/4.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://sentry.io/",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://sentry.io/pricing/",
+                    "type": "custom"
+                }
+            ],
+            "time": "2023-11-06T10:23:19+00:00"
+        },
+        {
+            "name": "sentry/sentry",
+            "version": "4.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/getsentry/sentry-php.git",
+                "reference": "d6769b2a5e6bf19ed3bbfbf52328ceaf8e6fcb1f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/d6769b2a5e6bf19ed3bbfbf52328ceaf8e6fcb1f",
+                "reference": "d6769b2a5e6bf19ed3bbfbf52328ceaf8e6fcb1f",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "guzzlehttp/psr7": "^1.8.4|^2.1.1",
+                "jean85/pretty-package-versions": "^1.5|^2.0.4",
+                "php": "^7.2|^8.0",
+                "psr/log": "^1.0|^2.0|^3.0",
+                "symfony/options-resolver": "^4.4.30|^5.0.11|^6.0|^7.0"
+            },
+            "conflict": {
+                "raven/raven": "*"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^3.4",
+                "guzzlehttp/promises": "^1.0|^2.0",
+                "guzzlehttp/psr7": "^1.8.4|^2.1.1",
+                "monolog/monolog": "^1.6|^2.0|^3.0",
+                "phpbench/phpbench": "^1.0",
+                "phpstan/phpstan": "^1.3",
+                "phpunit/phpunit": "^8.5.14|^9.4",
+                "symfony/phpunit-bridge": "^5.2|^6.0|^7.0",
+                "vimeo/psalm": "^4.17"
+            },
+            "suggest": {
+                "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler."
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/functions.php"
+                ],
+                "psr-4": {
+                    "Sentry\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Sentry",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "PHP SDK for Sentry (http://sentry.io)",
+            "homepage": "http://sentry.io",
+            "keywords": [
+                "crash-reporting",
+                "crash-reports",
+                "error-handler",
+                "error-monitoring",
+                "log",
+                "logging",
+                "profiling",
+                "sentry",
+                "tracing"
+            ],
+            "support": {
+                "issues": "https://github.com/getsentry/sentry-php/issues",
+                "source": "https://github.com/getsentry/sentry-php/tree/4.7.0"
+            },
+            "funding": [
+                {
+                    "url": "https://sentry.io/",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://sentry.io/pricing/",
+                    "type": "custom"
+                }
+            ],
+            "time": "2024-04-10T13:22:13+00:00"
+        },
+        {
+            "name": "slim/http",
+            "version": "1.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/slimphp/Slim-Http.git",
+                "reference": "9542edbe469b7c0f3084c2467efea972387f5beb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/slimphp/Slim-Http/zipball/9542edbe469b7c0f3084c2467efea972387f5beb",
+                "reference": "9542edbe469b7c0f3084c2467efea972387f5beb",
+                "shasum": ""
+            },
+            "require": {
+                "ext-fileinfo": "*",
+                "ext-json": "*",
+                "ext-libxml": "*",
+                "ext-simplexml": "*",
+                "php": "^7.4 || ^8.0",
+                "psr/http-factory": "^1.0",
+                "psr/http-message": "^1.0"
+            },
+            "require-dev": {
+                "adriansuter/php-autoload-override": "^1.3",
+                "laminas/laminas-diactoros": "^2.17",
+                "nyholm/psr7": "^1.5",
+                "php-http/psr7-integration-tests": "dev-master",
+                "phpstan/phpstan": "^1.8",
+                "phpunit/phpunit": "^9.5",
+                "squizlabs/php_codesniffer": "^3.7"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Slim\\Http\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Josh Lockhart",
+                    "email": "[email protected]",
+                    "homepage": "http://joshlockhart.com"
+                },
+                {
+                    "name": "Andrew Smith",
+                    "email": "[email protected]",
+                    "homepage": "http://silentworks.co.uk"
+                },
+                {
+                    "name": "Rob Allen",
+                    "email": "[email protected]",
+                    "homepage": "http://akrabat.com"
+                },
+                {
+                    "name": "Pierre Berube",
+                    "email": "[email protected]",
+                    "homepage": "http://www.lgse.com"
+                }
+            ],
+            "description": "Slim PSR-7 Object Decorators",
+            "homepage": "http://slimframework.com",
+            "keywords": [
+                "http",
+                "psr-7",
+                "psr7"
+            ],
+            "support": {
+                "issues": "https://github.com/slimphp/Slim-Http/issues",
+                "source": "https://github.com/slimphp/Slim-Http/tree/1.3"
+            },
+            "time": "2022-09-14T15:45:07+00:00"
+        },
+        {
+            "name": "slim/slim",
+            "version": "4.13.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/slimphp/Slim.git",
+                "reference": "038fd5713d5a41636fdff0e8dcceedecdd17fc17"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/slimphp/Slim/zipball/038fd5713d5a41636fdff0e8dcceedecdd17fc17",
+                "reference": "038fd5713d5a41636fdff0e8dcceedecdd17fc17",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "nikic/fast-route": "^1.3",
+                "php": "^7.4 || ^8.0",
+                "psr/container": "^1.0 || ^2.0",
+                "psr/http-factory": "^1.0",
+                "psr/http-message": "^1.1 || ^2.0",
+                "psr/http-server-handler": "^1.0",
+                "psr/http-server-middleware": "^1.0",
+                "psr/log": "^1.1 || ^2.0 || ^3.0"
+            },
+            "require-dev": {
+                "adriansuter/php-autoload-override": "^1.4",
+                "ext-simplexml": "*",
+                "guzzlehttp/psr7": "^2.6",
+                "httpsoft/http-message": "^1.1",
+                "httpsoft/http-server-request": "^1.1",
+                "laminas/laminas-diactoros": "^2.17 || ^3",
+                "nyholm/psr7": "^1.8",
+                "nyholm/psr7-server": "^1.1",
+                "phpspec/prophecy": "^1.19",
+                "phpspec/prophecy-phpunit": "^2.1",
+                "phpstan/phpstan": "^1.10",
+                "phpunit/phpunit": "^9.6",
+                "slim/http": "^1.3",
+                "slim/psr7": "^1.6",
+                "squizlabs/php_codesniffer": "^3.9"
+            },
+            "suggest": {
+                "ext-simplexml": "Needed to support XML format in BodyParsingMiddleware",
+                "ext-xml": "Needed to support XML format in BodyParsingMiddleware",
+                "php-di/php-di": "PHP-DI is the recommended container library to be used with Slim",
+                "slim/psr7": "Slim PSR-7 implementation. See https://www.slimframework.com/docs/v4/start/installation.html for more information."
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Slim\\": "Slim"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Josh Lockhart",
+                    "email": "[email protected]",
+                    "homepage": "https://joshlockhart.com"
+                },
+                {
+                    "name": "Andrew Smith",
+                    "email": "[email protected]",
+                    "homepage": "http://silentworks.co.uk"
+                },
+                {
+                    "name": "Rob Allen",
+                    "email": "[email protected]",
+                    "homepage": "http://akrabat.com"
+                },
+                {
+                    "name": "Pierre Berube",
+                    "email": "[email protected]",
+                    "homepage": "http://www.lgse.com"
+                },
+                {
+                    "name": "Gabriel Manricks",
+                    "email": "[email protected]",
+                    "homepage": "http://gabrielmanricks.com"
+                }
+            ],
+            "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
+            "homepage": "https://www.slimframework.com",
+            "keywords": [
+                "api",
+                "framework",
+                "micro",
+                "router"
+            ],
+            "support": {
+                "docs": "https://www.slimframework.com/docs/v4/",
+                "forum": "https://discourse.slimframework.com/",
+                "irc": "irc://irc.freenode.net:6667/slimphp",
+                "issues": "https://github.com/slimphp/Slim/issues",
+                "rss": "https://www.slimframework.com/blog/feed.rss",
+                "slack": "https://slimphp.slack.com/",
+                "source": "https://github.com/slimphp/Slim",
+                "wiki": "https://github.com/slimphp/Slim/wiki"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/slimphp",
+                    "type": "open_collective"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/slim/slim",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-03-03T21:25:30+00:00"
+        },
+        {
+            "name": "smarty/smarty",
+            "version": "v5.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/smarty-php/smarty.git",
+                "reference": "8d53d3cbf2a986f392d680349be0fc22661bf16c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/smarty-php/smarty/zipball/8d53d3cbf2a986f392d680349be0fc22661bf16c",
+                "reference": "8d53d3cbf2a986f392d680349be0fc22661bf16c",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0",
+                "symfony/polyfill-mbstring": "^1.27"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^8.5 || ^7.5",
+                "smarty/smarty-lexer": "^4.0.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.0.x-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions.php"
+                ],
+                "psr-4": {
+                    "Smarty\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL-3.0"
+            ],
+            "authors": [
+                {
+                    "name": "Monte Ohrt",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Uwe Tews",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Rodney Rehm",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Simon Wisselink",
+                    "homepage": "https://www.iwink.nl/"
+                }
+            ],
+            "description": "Smarty - the compiling PHP template engine",
+            "homepage": "https://smarty-php.github.io/smarty/",
+            "keywords": [
+                "templating"
+            ],
+            "support": {
+                "forum": "https://github.com/smarty-php/smarty/discussions",
+                "issues": "https://github.com/smarty-php/smarty/issues",
+                "source": "https://github.com/smarty-php/smarty/tree/v5.1.0"
+            },
+            "time": "2024-04-22T22:22:15+00:00"
+        },
+        {
+            "name": "srmklive/paypal",
+            "version": "3.0.30",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/srmklive/laravel-paypal.git",
+                "reference": "d511038ff01f466e7bfca475c7417b5a6c4d38a5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/srmklive/laravel-paypal/zipball/d511038ff01f466e7bfca475c7417b5a6c4d38a5",
+                "reference": "d511038ff01f466e7bfca475c7417b5a6c4d38a5",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "guzzlehttp/guzzle": "~7.0",
+                "illuminate/support": "~6.0|~7.0|~8.0|~9.0|^10.0|^11.0",
+                "nesbot/carbon": "~2.0|^3.0",
+                "php": ">=7.2|^8.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^1.10",
+                "phpunit/phpunit": "^8.0|^9.0|^10.0",
+                "symfony/var-dumper": "~5.0|^7.0"
+            },
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "providers": [
+                        "Srmklive\\PayPal\\Providers\\PayPalServiceProvider"
+                    ],
+                    "aliases": {
+                        "PayPal": "Srmklive\\PayPal\\Facades\\PayPal"
+                    }
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Srmklive\\PayPal\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Raza Mehdi",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Laravel plugin For Processing Payments Through Paypal Express Checkout. Can Be Used Independently With Other Applications.",
+            "keywords": [
+                "http",
+                "laravel paypal",
+                "paypal",
+                "rest",
+                "web service"
+            ],
+            "support": {
+                "issues": "https://github.com/srmklive/laravel-paypal/issues",
+                "source": "https://github.com/srmklive/laravel-paypal/tree/3.0.30"
+            },
+            "time": "2024-03-03T15:33:56+00:00"
+        },
+        {
+            "name": "starkbank/ecdsa",
+            "version": "0.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/starkbank/ecdsa-php.git",
+                "reference": "484bedac47bac4012dc73df91da221f0a66845cb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/starkbank/ecdsa-php/zipball/484bedac47bac4012dc73df91da221f0a66845cb",
+                "reference": "484bedac47bac4012dc73df91da221f0a66845cb",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/ellipticcurve.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "StarkBank",
+                    "email": "[email protected]",
+                    "homepage": "https://starkbank.com",
+                    "role": "Developer"
+                }
+            ],
+            "description": "fast openSSL-compatible implementation of the Elliptic Curve Digital Signature Algorithm (ECDSA)",
+            "homepage": "https://github.com/starkbank/ecdsa-php",
+            "support": {
+                "issues": "https://github.com/starkbank/ecdsa-php/issues",
+                "source": "https://github.com/starkbank/ecdsa-php/tree/v0.0.5"
+            },
+            "time": "2021-06-06T22:24:49+00:00"
+        },
+        {
+            "name": "stripe/stripe-php",
+            "version": "v14.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/stripe/stripe-php.git",
+                "reference": "044f9dd190967b8fb7e55fd0ea25f11c625c00a4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/stripe/stripe-php/zipball/044f9dd190967b8fb7e55fd0ea25f11c625c00a4",
+                "reference": "044f9dd190967b8fb7e55fd0ea25f11c625c00a4",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "php": ">=5.6.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "3.5.0",
+                "phpstan/phpstan": "^1.2",
+                "phpunit/phpunit": "^5.7 || ^9.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Stripe\\": "lib/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Stripe and contributors",
+                    "homepage": "https://github.com/stripe/stripe-php/contributors"
+                }
+            ],
+            "description": "Stripe PHP Library",
+            "homepage": "https://stripe.com/",
+            "keywords": [
+                "api",
+                "payment processing",
+                "stripe"
+            ],
+            "support": {
+                "issues": "https://github.com/stripe/stripe-php/issues",
+                "source": "https://github.com/stripe/stripe-php/tree/v14.4.0"
+            },
+            "time": "2024-04-25T20:38:24+00:00"
+        },
+        {
+            "name": "symfony/clock",
+            "version": "v7.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/clock.git",
+                "reference": "8b9d08887353d627d5f6c3bf3373b398b49051c2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/clock/zipball/8b9d08887353d627d5f6c3bf3373b398b49051c2",
+                "reference": "8b9d08887353d627d5f6c3bf3373b398b49051c2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "psr/clock": "^1.0",
+                "symfony/polyfill-php83": "^1.28"
+            },
+            "provide": {
+                "psr/clock-implementation": "1.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/now.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\Clock\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Decouples applications from the system clock",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "clock",
+                "psr20",
+                "time"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/clock/tree/v7.0.5"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-03-02T12:46:12+00:00"
+        },
+        {
+            "name": "symfony/deprecation-contracts",
+            "version": "v3.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/deprecation-contracts.git",
+                "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf",
+                "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.4-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "function.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "A generic function and convention to trigger deprecation notices",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-05-23T14:45:45+00:00"
+        },
+        {
+            "name": "symfony/http-client",
+            "version": "v7.0.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-client.git",
+                "reference": "6e70473909f46fe5dd3b994a0f1b20ecb6b2f858"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/http-client/zipball/6e70473909f46fe5dd3b994a0f1b20ecb6b2f858",
+                "reference": "6e70473909f46fe5dd3b994a0f1b20ecb6b2f858",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "psr/log": "^1|^2|^3",
+                "symfony/http-client-contracts": "^3.4.1",
+                "symfony/service-contracts": "^2.5|^3"
+            },
+            "conflict": {
+                "php-http/discovery": "<1.15",
+                "symfony/http-foundation": "<6.4"
+            },
+            "provide": {
+                "php-http/async-client-implementation": "*",
+                "php-http/client-implementation": "*",
+                "psr/http-client-implementation": "1.0",
+                "symfony/http-client-implementation": "3.0"
+            },
+            "require-dev": {
+                "amphp/amp": "^2.5",
+                "amphp/http-client": "^4.2.1",
+                "amphp/http-tunnel": "^1.0",
+                "amphp/socket": "^1.1",
+                "guzzlehttp/promises": "^1.4|^2.0",
+                "nyholm/psr7": "^1.0",
+                "php-http/httplug": "^1.0|^2.0",
+                "psr/http-client": "^1.0",
+                "symfony/dependency-injection": "^6.4|^7.0",
+                "symfony/http-kernel": "^6.4|^7.0",
+                "symfony/messenger": "^6.4|^7.0",
+                "symfony/process": "^6.4|^7.0",
+                "symfony/stopwatch": "^6.4|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\HttpClient\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "http"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/http-client/tree/v7.0.6"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-04-01T20:49:44+00:00"
+        },
+        {
+            "name": "symfony/http-client-contracts",
+            "version": "v3.4.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-client-contracts.git",
+                "reference": "b6b5c876b3a4ed74460e2c5ac53bbce2f12e2a7e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/b6b5c876b3a4ed74460e2c5ac53bbce2f12e2a7e",
+                "reference": "b6b5c876b3a4ed74460e2c5ac53bbce2f12e2a7e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.4-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\HttpClient\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Test/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to HTTP clients",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/http-client-contracts/tree/v3.4.2"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-04-01T18:51:09+00:00"
+        },
+        {
+            "name": "symfony/options-resolver",
+            "version": "v7.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/options-resolver.git",
+                "reference": "700ff4096e346f54cb628ea650767c8130f1001f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/700ff4096e346f54cb628ea650767c8130f1001f",
+                "reference": "700ff4096e346f54cb628ea650767c8130f1001f",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "symfony/deprecation-contracts": "^2.5|^3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\OptionsResolver\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides an improved replacement for the array_replace PHP function",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "config",
+                "configuration",
+                "options"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/options-resolver/tree/v7.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-08-08T10:20:21+00:00"
+        },
+        {
+            "name": "symfony/polyfill-ctype",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-ctype.git",
+                "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4",
+                "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "provide": {
+                "ext-ctype": "*"
+            },
+            "suggest": {
+                "ext-ctype": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Ctype\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Gert de Pagter",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for ctype functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "ctype",
+                "polyfill",
+                "portable"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/polyfill-iconv",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-iconv.git",
+                "reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f",
+                "reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "provide": {
+                "ext-iconv": "*"
+            },
+            "suggest": {
+                "ext-iconv": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Iconv\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Iconv extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "iconv",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-iconv/tree/v1.29.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-grapheme",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+                "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f",
+                "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for intl's grapheme_* functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "grapheme",
+                "intl",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-normalizer",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+                "reference": "bc45c394692b948b4d383a08d7753968bed9a83d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d",
+                "reference": "bc45c394692b948b4d383a08d7753968bed9a83d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for intl's Normalizer class and related functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "intl",
+                "normalizer",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
+                "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "provide": {
+                "ext-mbstring": "*"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php72",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php72.git",
+                "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25",
+                "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php72\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php80",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php80.git",
+                "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
+                "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php80\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ion Bazan",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php83",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php83.git",
+                "reference": "86fcae159633351e5fd145d1c47de6c528f8caff"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff",
+                "reference": "86fcae159633351e5fd145d1c47de6c528f8caff",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1",
+                "symfony/polyfill-php80": "^1.14"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php83\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/service-contracts",
+            "version": "v3.4.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/service-contracts.git",
+                "reference": "11bbf19a0fb7b36345861e85c5768844c552906e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/11bbf19a0fb7b36345861e85c5768844c552906e",
+                "reference": "11bbf19a0fb7b36345861e85c5768844c552906e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "psr/container": "^1.1|^2.0"
+            },
+            "conflict": {
+                "ext-psr": "<1.1|>=2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.4-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Service\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Test/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to writing services",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/service-contracts/tree/v3.4.2"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-12-19T21:51:00+00:00"
+        },
+        {
+            "name": "symfony/translation",
+            "version": "v7.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/translation.git",
+                "reference": "5b75e872f7d135d7abb4613809fadc8d9f3d30a0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/5b75e872f7d135d7abb4613809fadc8d9f3d30a0",
+                "reference": "5b75e872f7d135d7abb4613809fadc8d9f3d30a0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/translation-contracts": "^2.5|^3.0"
+            },
+            "conflict": {
+                "symfony/config": "<6.4",
+                "symfony/console": "<6.4",
+                "symfony/dependency-injection": "<6.4",
+                "symfony/http-client-contracts": "<2.5",
+                "symfony/http-kernel": "<6.4",
+                "symfony/service-contracts": "<2.5",
+                "symfony/twig-bundle": "<6.4",
+                "symfony/yaml": "<6.4"
+            },
+            "provide": {
+                "symfony/translation-implementation": "2.3|3.0"
+            },
+            "require-dev": {
+                "nikic/php-parser": "^4.18|^5.0",
+                "psr/log": "^1|^2|^3",
+                "symfony/config": "^6.4|^7.0",
+                "symfony/console": "^6.4|^7.0",
+                "symfony/dependency-injection": "^6.4|^7.0",
+                "symfony/finder": "^6.4|^7.0",
+                "symfony/http-client-contracts": "^2.5|^3.0",
+                "symfony/http-kernel": "^6.4|^7.0",
+                "symfony/intl": "^6.4|^7.0",
+                "symfony/polyfill-intl-icu": "^1.21",
+                "symfony/routing": "^6.4|^7.0",
+                "symfony/service-contracts": "^2.5|^3",
+                "symfony/yaml": "^6.4|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/functions.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\Translation\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides tools to internationalize your application",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/translation/tree/v7.0.4"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-02-22T20:27:20+00:00"
+        },
+        {
+            "name": "symfony/translation-contracts",
+            "version": "v3.4.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/translation-contracts.git",
+                "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/43810bdb2ddb5400e5c5e778e27b210a0ca83b6b",
+                "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.4-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Translation\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Test/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to translation",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/translation-contracts/tree/v3.4.2"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-01-23T14:51:35+00:00"
+        },
+        {
+            "name": "tronovav/geoip2-update",
+            "version": "v2.3.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/tronovav/geoip2-update.git",
+                "reference": "86fddebc2bd277832846c8d6bb3b059fd093db06"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/tronovav/geoip2-update/zipball/86fddebc2bd277832846c8d6bb3b059fd093db06",
+                "reference": "86fddebc2bd277832846c8d6bb3b059fd093db06",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "ext-json": "*",
+                "php": ">=5.3"
+            },
+            "suggest": {
+                "ext-zip": "Required for updating the CSV databases."
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "tronovav\\GeoIP2Update\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Andrey Tronov",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Update GeoIP2/GeoLite2 databases from your script, program or via composer.",
+            "keywords": [
+                "geoip",
+                "geoip2",
+                "geolite2",
+                "geolocation",
+                "maxmind"
+            ],
+            "support": {
+                "email": "[email protected]",
+                "issues": "https://github.com/tronovav/geoip2-update/issues",
+                "source": "https://github.com/tronovav/geoip2-update/tree/v2.3.1"
+            },
+            "time": "2023-10-25T22:16:50+00:00"
+        },
+        {
+            "name": "twig/twig",
+            "version": "v3.9.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/twigphp/Twig.git",
+                "reference": "a842d75fed59cdbcbd3a3ad7fb9eb768fc350d58"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/twigphp/Twig/zipball/a842d75fed59cdbcbd3a3ad7fb9eb768fc350d58",
+                "reference": "a842d75fed59cdbcbd3a3ad7fb9eb768fc350d58",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/deprecation-contracts": "^2.5|^3",
+                "symfony/polyfill-ctype": "^1.8",
+                "symfony/polyfill-mbstring": "^1.3",
+                "symfony/polyfill-php80": "^1.22"
+            },
+            "require-dev": {
+                "psr/container": "^1.0|^2.0",
+                "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/Resources/core.php",
+                    "src/Resources/debug.php",
+                    "src/Resources/escaper.php",
+                    "src/Resources/string_loader.php"
+                ],
+                "psr-4": {
+                    "Twig\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "[email protected]",
+                    "homepage": "http://fabien.potencier.org",
+                    "role": "Lead Developer"
+                },
+                {
+                    "name": "Twig Team",
+                    "role": "Contributors"
+                },
+                {
+                    "name": "Armin Ronacher",
+                    "email": "[email protected]",
+                    "role": "Project Founder"
+                }
+            ],
+            "description": "Twig, the flexible, fast, and secure template language for PHP",
+            "homepage": "https://twig.symfony.com",
+            "keywords": [
+                "templating"
+            ],
+            "support": {
+                "issues": "https://github.com/twigphp/Twig/issues",
+                "source": "https://github.com/twigphp/Twig/tree/v3.9.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/twig/twig",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-04-18T11:59:33+00:00"
+        },
+        {
+            "name": "vectorface/googleauthenticator",
+            "version": "v3.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Vectorface/GoogleAuthenticator.git",
+                "reference": "c98adc40a5a1df104693d16908de74b85e107a1d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Vectorface/GoogleAuthenticator/zipball/c98adc40a5a1df104693d16908de74b85e107a1d",
+                "reference": "c98adc40a5a1df104693d16908de74b85e107a1d",
+                "shasum": ""
+            },
+            "require": {
+                "endroid/qr-code": "^5.0.0",
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Vectorface\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Kliewe",
+                    "email": "[email protected]",
+                    "homepage": "http://www.phpgangsta.de/",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Francis Lavoie",
+                    "email": "[email protected]",
+                    "homepage": "http://vectorface.com/",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Google Authenticator 2-factor authentication",
+            "keywords": [
+                "googleauthenticator",
+                "rfc6238",
+                "totp"
+            ],
+            "support": {
+                "issues": "https://github.com/Vectorface/GoogleAuthenticator/issues",
+                "source": "https://github.com/Vectorface/GoogleAuthenticator"
+            },
+            "time": "2024-01-31T13:05:32+00:00"
+        },
+        {
+            "name": "voku/anti-xss",
+            "version": "4.1.42",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/voku/anti-xss.git",
+                "reference": "bca1f8607e55a3c5077483615cd93bd8f11bd675"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/voku/anti-xss/zipball/bca1f8607e55a3c5077483615cd93bd8f11bd675",
+                "reference": "bca1f8607e55a3c5077483615cd93bd8f11bd675",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0.0",
+                "voku/portable-utf8": "~6.0.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "voku\\helper\\": "src/voku/helper/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "EllisLab Dev Team",
+                    "homepage": "http://ellislab.com/"
+                },
+                {
+                    "name": "Lars Moelleken",
+                    "email": "[email protected]",
+                    "homepage": "https://www.moelleken.org/"
+                }
+            ],
+            "description": "anti xss-library",
+            "homepage": "https://github.com/voku/anti-xss",
+            "keywords": [
+                "anti-xss",
+                "clean",
+                "security",
+                "xss"
+            ],
+            "support": {
+                "issues": "https://github.com/voku/anti-xss/issues",
+                "source": "https://github.com/voku/anti-xss/tree/4.1.42"
+            },
+            "funding": [
+                {
+                    "url": "https://www.paypal.me/moelleken",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/voku",
+                    "type": "github"
+                },
+                {
+                    "url": "https://opencollective.com/anti-xss",
+                    "type": "open_collective"
+                },
+                {
+                    "url": "https://www.patreon.com/voku",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/voku/anti-xss",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-07-03T14:40:46+00:00"
+        },
+        {
+            "name": "voku/portable-ascii",
+            "version": "2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/voku/portable-ascii.git",
+                "reference": "b56450eed252f6801410d810c8e1727224ae0743"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743",
+                "reference": "b56450eed252f6801410d810c8e1727224ae0743",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
+            },
+            "suggest": {
+                "ext-intl": "Use Intl for transliterator_transliterate() support"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "voku\\": "src/voku/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Lars Moelleken",
+                    "homepage": "http://www.moelleken.org/"
+                }
+            ],
+            "description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
+            "homepage": "https://github.com/voku/portable-ascii",
+            "keywords": [
+                "ascii",
+                "clean",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/voku/portable-ascii/issues",
+                "source": "https://github.com/voku/portable-ascii/tree/2.0.1"
+            },
+            "funding": [
+                {
+                    "url": "https://www.paypal.me/moelleken",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/voku",
+                    "type": "github"
+                },
+                {
+                    "url": "https://opencollective.com/portable-ascii",
+                    "type": "open_collective"
+                },
+                {
+                    "url": "https://www.patreon.com/voku",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-03-08T17:03:00+00:00"
+        },
+        {
+            "name": "voku/portable-utf8",
+            "version": "6.0.13",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/voku/portable-utf8.git",
+                "reference": "b8ce36bf26593e5c2e81b1850ef0ffb299d2043f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/voku/portable-utf8/zipball/b8ce36bf26593e5c2e81b1850ef0ffb299d2043f",
+                "reference": "b8ce36bf26593e5c2e81b1850ef0ffb299d2043f",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0.0",
+                "symfony/polyfill-iconv": "~1.0",
+                "symfony/polyfill-intl-grapheme": "~1.0",
+                "symfony/polyfill-intl-normalizer": "~1.0",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/polyfill-php72": "~1.0",
+                "voku/portable-ascii": "~2.0.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "1.9.*@dev",
+                "phpstan/phpstan-strict-rules": "1.4.*@dev",
+                "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0",
+                "thecodingmachine/phpstan-strict-rules": "1.0.*@dev",
+                "voku/phpstan-rules": "3.1.*@dev"
+            },
+            "suggest": {
+                "ext-ctype": "Use Ctype for e.g. hexadecimal digit detection",
+                "ext-fileinfo": "Use Fileinfo for better binary file detection",
+                "ext-iconv": "Use iconv for best performance",
+                "ext-intl": "Use Intl for best performance",
+                "ext-json": "Use JSON for string detection",
+                "ext-mbstring": "Use Mbstring for best performance"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "voku\\": "src/voku/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "(Apache-2.0 or GPL-2.0)"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Hamid Sarfraz",
+                    "homepage": "http://pageconfig.com/"
+                },
+                {
+                    "name": "Lars Moelleken",
+                    "homepage": "http://www.moelleken.org/"
+                }
+            ],
+            "description": "Portable UTF-8 library - performance optimized (unicode) string functions for php.",
+            "homepage": "https://github.com/voku/portable-utf8",
+            "keywords": [
+                "UTF",
+                "clean",
+                "php",
+                "unicode",
+                "utf-8",
+                "utf8"
+            ],
+            "support": {
+                "issues": "https://github.com/voku/portable-utf8/issues",
+                "source": "https://github.com/voku/portable-utf8/tree/6.0.13"
+            },
+            "funding": [
+                {
+                    "url": "https://www.paypal.me/moelleken",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/voku",
+                    "type": "github"
+                },
+                {
+                    "url": "https://opencollective.com/portable-utf8",
+                    "type": "open_collective"
+                },
+                {
+                    "url": "https://www.patreon.com/voku",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/voku/portable-utf8",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-03-08T08:35:38+00:00"
+        },
+        {
+            "name": "webmozart/assert",
+            "version": "1.11.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/webmozarts/assert.git",
+                "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+                "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
+                "shasum": ""
+            },
+            "require": {
+                "ext-ctype": "*",
+                "php": "^7.2 || ^8.0"
+            },
+            "conflict": {
+                "phpstan/phpstan": "<0.12.20",
+                "vimeo/psalm": "<4.6.1 || 4.6.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^8.5.13"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.10-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Webmozart\\Assert\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Assertions to validate method input/output with nice error messages.",
+            "keywords": [
+                "assert",
+                "check",
+                "validate"
+            ],
+            "support": {
+                "issues": "https://github.com/webmozarts/assert/issues",
+                "source": "https://github.com/webmozarts/assert/tree/1.11.0"
+            },
+            "time": "2022-06-03T18:03:27+00:00"
+        }
+    ],
+    "packages-dev": [
+        {
+            "name": "cmgmyr/phploc",
+            "version": "8.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/cmgmyr/phploc.git",
+                "reference": "e61d4729df46c5920ab61973bfa3f70f81a70b5f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/cmgmyr/phploc/zipball/e61d4729df46c5920ab61973bfa3f70f81a70b5f",
+                "reference": "e61d4729df46c5920ab61973bfa3f70f81a70b5f",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-json": "*",
+                "php": "^7.4 || ^8.0",
+                "phpunit/php-file-iterator": "^3.0|^4.0",
+                "sebastian/cli-parser": "^1.0|^2.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^3.2",
+                "phpunit/phpunit": "^9.0|^10.0",
+                "vimeo/psalm": "^5.7"
+            },
+            "bin": [
+                "phploc"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "8.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Chris Gmyr",
+                    "email": "[email protected]",
+                    "role": "lead"
+                }
+            ],
+            "description": "A tool for quickly measuring the size of a PHP project.",
+            "homepage": "https://github.com/cmgmyr/phploc",
+            "support": {
+                "issues": "https://github.com/cmgmyr/phploc/issues",
+                "source": "https://github.com/cmgmyr/phploc/tree/8.0.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/cmgmyr",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-08-05T16:49:39+00:00"
+        },
+        {
+            "name": "composer/pcre",
+            "version": "3.1.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/pcre.git",
+                "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8",
+                "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.4 || ^8.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^1.3",
+                "phpstan/phpstan-strict-rules": "^1.1",
+                "symfony/phpunit-bridge": "^5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\Pcre\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "[email protected]",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
+            "keywords": [
+                "PCRE",
+                "preg",
+                "regex",
+                "regular expression"
+            ],
+            "support": {
+                "issues": "https://github.com/composer/pcre/issues",
+                "source": "https://github.com/composer/pcre/tree/3.1.3"
+            },
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-03-19T10:26:25+00:00"
+        },
+        {
+            "name": "composer/semver",
+            "version": "3.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/semver.git",
+                "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32",
+                "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.2 || ^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^1.4",
+                "symfony/phpunit-bridge": "^4.2 || ^5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\Semver\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nils Adermann",
+                    "email": "[email protected]",
+                    "homepage": "http://www.naderman.de"
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "[email protected]",
+                    "homepage": "http://seld.be"
+                },
+                {
+                    "name": "Rob Bast",
+                    "email": "[email protected]",
+                    "homepage": "http://robbast.nl"
+                }
+            ],
+            "description": "Semver library that offers utilities, version constraint parsing and validation.",
+            "keywords": [
+                "semantic",
+                "semver",
+                "validation",
+                "versioning"
+            ],
+            "support": {
+                "irc": "ircs://irc.libera.chat:6697/composer",
+                "issues": "https://github.com/composer/semver/issues",
+                "source": "https://github.com/composer/semver/tree/3.4.0"
+            },
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-08-31T09:50:34+00:00"
+        },
+        {
+            "name": "composer/xdebug-handler",
+            "version": "3.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/xdebug-handler.git",
+                "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/4f988f8fdf580d53bdb2d1278fe93d1ed5462255",
+                "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255",
+                "shasum": ""
+            },
+            "require": {
+                "composer/pcre": "^1 || ^2 || ^3",
+                "php": "^7.2.5 || ^8.0",
+                "psr/log": "^1 || ^2 || ^3"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^1.0",
+                "phpstan/phpstan-strict-rules": "^1.1",
+                "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Composer\\XdebugHandler\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "John Stevenson",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Restarts a process without Xdebug.",
+            "keywords": [
+                "Xdebug",
+                "performance"
+            ],
+            "support": {
+                "irc": "ircs://irc.libera.chat:6697/composer",
+                "issues": "https://github.com/composer/xdebug-handler/issues",
+                "source": "https://github.com/composer/xdebug-handler/tree/3.0.4"
+            },
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-03-26T18:29:49+00:00"
+        },
+        {
+            "name": "dealerdirect/phpcodesniffer-composer-installer",
+            "version": "v1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/PHPCSStandards/composer-installer.git",
+                "reference": "4be43904336affa5c2f70744a348312336afd0da"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da",
+                "reference": "4be43904336affa5c2f70744a348312336afd0da",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^1.0 || ^2.0",
+                "php": ">=5.4",
+                "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0"
+            },
+            "require-dev": {
+                "composer/composer": "*",
+                "ext-json": "*",
+                "ext-zip": "*",
+                "php-parallel-lint/php-parallel-lint": "^1.3.1",
+                "phpcompatibility/php-compatibility": "^9.0",
+                "yoast/phpunit-polyfills": "^1.0"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"
+            },
+            "autoload": {
+                "psr-4": {
+                    "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Franck Nijhof",
+                    "email": "[email protected]",
+                    "homepage": "http://www.frenck.nl",
+                    "role": "Developer / IT Manager"
+                },
+                {
+                    "name": "Contributors",
+                    "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors"
+                }
+            ],
+            "description": "PHP_CodeSniffer Standards Composer Installer Plugin",
+            "homepage": "http://www.dealerdirect.com",
+            "keywords": [
+                "PHPCodeSniffer",
+                "PHP_CodeSniffer",
+                "code quality",
+                "codesniffer",
+                "composer",
+                "installer",
+                "phpcbf",
+                "phpcs",
+                "plugin",
+                "qa",
+                "quality",
+                "standard",
+                "standards",
+                "style guide",
+                "stylecheck",
+                "tests"
+            ],
+            "support": {
+                "issues": "https://github.com/PHPCSStandards/composer-installer/issues",
+                "source": "https://github.com/PHPCSStandards/composer-installer"
+            },
+            "time": "2023-01-05T11:28:13+00:00"
+        },
+        {
+            "name": "dg/bypass-finals",
+            "version": "v1.6.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/dg/bypass-finals.git",
+                "reference": "efe2fe04bae9f0de271dd462afc049067889e6d1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/dg/bypass-finals/zipball/efe2fe04bae9f0de271dd462afc049067889e6d1",
+                "reference": "efe2fe04bae9f0de271dd462afc049067889e6d1",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "require-dev": {
+                "nette/tester": "^2.3",
+                "phpstan/phpstan": "^0.12"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause",
+                "GPL-2.0",
+                "GPL-3.0"
+            ],
+            "authors": [
+                {
+                    "name": "David Grudl",
+                    "homepage": "https://davidgrudl.com"
+                }
+            ],
+            "description": "Removes final keyword from source code on-the-fly and allows mocking of final methods and classes",
+            "keywords": [
+                "finals",
+                "mocking",
+                "phpunit",
+                "testing",
+                "unit"
+            ],
+            "support": {
+                "issues": "https://github.com/dg/bypass-finals/issues",
+                "source": "https://github.com/dg/bypass-finals/tree/v1.6.0"
+            },
+            "time": "2023-11-19T22:19:30+00:00"
+        },
+        {
+            "name": "friendsofphp/php-cs-fixer",
+            "version": "v3.54.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
+                "reference": "2aecbc8640d7906c38777b3dcab6f4ca79004d08"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2aecbc8640d7906c38777b3dcab6f4ca79004d08",
+                "reference": "2aecbc8640d7906c38777b3dcab6f4ca79004d08",
+                "shasum": ""
+            },
+            "require": {
+                "composer/semver": "^3.4",
+                "composer/xdebug-handler": "^3.0.3",
+                "ext-filter": "*",
+                "ext-json": "*",
+                "ext-tokenizer": "*",
+                "php": "^7.4 || ^8.0",
+                "sebastian/diff": "^4.0 || ^5.0 || ^6.0",
+                "symfony/console": "^5.4 || ^6.0 || ^7.0",
+                "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0",
+                "symfony/filesystem": "^5.4 || ^6.0 || ^7.0",
+                "symfony/finder": "^5.4 || ^6.0 || ^7.0",
+                "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0",
+                "symfony/polyfill-mbstring": "^1.28",
+                "symfony/polyfill-php80": "^1.28",
+                "symfony/polyfill-php81": "^1.28",
+                "symfony/process": "^5.4 || ^6.0 || ^7.0",
+                "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0"
+            },
+            "require-dev": {
+                "facile-it/paraunit": "^1.3 || ^2.0",
+                "infection/infection": "^0.27.11",
+                "justinrainbow/json-schema": "^5.2",
+                "keradus/cli-executor": "^2.1",
+                "mikey179/vfsstream": "^1.6.11",
+                "php-coveralls/php-coveralls": "^2.7",
+                "php-cs-fixer/accessible-object": "^1.1",
+                "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4",
+                "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4",
+                "phpunit/phpunit": "^9.6 || ^10.5.5 || ^11.0.2",
+                "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0",
+                "symfony/yaml": "^5.4 || ^6.0 || ^7.0"
+            },
+            "suggest": {
+                "ext-dom": "For handling output formats in XML",
+                "ext-mbstring": "For handling non-UTF8 characters."
+            },
+            "bin": [
+                "php-cs-fixer"
+            ],
+            "type": "application",
+            "autoload": {
+                "psr-4": {
+                    "PhpCsFixer\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Dariusz Rumiński",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "A tool to automatically fix PHP code style",
+            "keywords": [
+                "Static code analysis",
+                "fixer",
+                "standards",
+                "static analysis"
+            ],
+            "support": {
+                "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
+                "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.54.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/keradus",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-04-17T08:12:13+00:00"
+        },
+        {
+            "name": "justinrainbow/json-schema",
+            "version": "v5.2.13",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/justinrainbow/json-schema.git",
+                "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793",
+                "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1",
+                "json-schema/json-schema-test-suite": "1.2.0",
+                "phpunit/phpunit": "^4.8.35"
+            },
+            "bin": [
+                "bin/validate-json"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "JsonSchema\\": "src/JsonSchema/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Bruno Prieto Reis",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Justin Rainbow",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Igor Wiedler",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Robert Schönthal",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "A library to validate a json schema.",
+            "homepage": "https://github.com/justinrainbow/json-schema",
+            "keywords": [
+                "json",
+                "schema"
+            ],
+            "support": {
+                "issues": "https://github.com/justinrainbow/json-schema/issues",
+                "source": "https://github.com/justinrainbow/json-schema/tree/v5.2.13"
+            },
+            "time": "2023-09-26T02:20:38+00:00"
+        },
+        {
+            "name": "league/container",
+            "version": "4.2.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/container.git",
+                "reference": "ff346319ca1ff0e78277dc2311a42107cc1aab88"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/container/zipball/ff346319ca1ff0e78277dc2311a42107cc1aab88",
+                "reference": "ff346319ca1ff0e78277dc2311a42107cc1aab88",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0",
+                "psr/container": "^1.1 || ^2.0"
+            },
+            "provide": {
+                "psr/container-implementation": "^1.0"
+            },
+            "replace": {
+                "orno/di": "~2.0"
+            },
+            "require-dev": {
+                "nette/php-generator": "^3.4",
+                "nikic/php-parser": "^4.10",
+                "phpstan/phpstan": "^0.12.47",
+                "phpunit/phpunit": "^8.5.17",
+                "roave/security-advisories": "dev-latest",
+                "scrutinizer/ocular": "^1.8",
+                "squizlabs/php_codesniffer": "^3.6"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.x-dev",
+                    "dev-4.x": "4.x-dev",
+                    "dev-3.x": "3.x-dev",
+                    "dev-2.x": "2.x-dev",
+                    "dev-1.x": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "League\\Container\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Phil Bennett",
+                    "email": "[email protected]",
+                    "role": "Developer"
+                }
+            ],
+            "description": "A fast and intuitive dependency injection container.",
+            "homepage": "https://github.com/thephpleague/container",
+            "keywords": [
+                "container",
+                "dependency",
+                "di",
+                "injection",
+                "league",
+                "provider",
+                "service"
+            ],
+            "support": {
+                "issues": "https://github.com/thephpleague/container/issues",
+                "source": "https://github.com/thephpleague/container/tree/4.2.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/philipobenito",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-13T13:12:53+00:00"
+        },
+        {
+            "name": "myclabs/deep-copy",
+            "version": "1.11.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/myclabs/DeepCopy.git",
+                "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+                "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "conflict": {
+                "doctrine/collections": "<1.6.8",
+                "doctrine/common": "<2.13.3 || >=3,<3.2.2"
+            },
+            "require-dev": {
+                "doctrine/collections": "^1.6.8",
+                "doctrine/common": "^2.13.3 || ^3.2.2",
+                "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/DeepCopy/deep_copy.php"
+                ],
+                "psr-4": {
+                    "DeepCopy\\": "src/DeepCopy/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Create deep copies (clones) of your objects",
+            "keywords": [
+                "clone",
+                "copy",
+                "duplicate",
+                "object",
+                "object graph"
+            ],
+            "support": {
+                "issues": "https://github.com/myclabs/DeepCopy/issues",
+                "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
+            },
+            "funding": [
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-03-08T13:26:56+00:00"
+        },
+        {
+            "name": "nikic/php-parser",
+            "version": "v5.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nikic/PHP-Parser.git",
+                "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13",
+                "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13",
+                "shasum": ""
+            },
+            "require": {
+                "ext-ctype": "*",
+                "ext-json": "*",
+                "ext-tokenizer": "*",
+                "php": ">=7.4"
+            },
+            "require-dev": {
+                "ircmaxell/php-yacc": "^0.0.7",
+                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
+            },
+            "bin": [
+                "bin/php-parse"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PhpParser\\": "lib/PhpParser"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Nikita Popov"
+                }
+            ],
+            "description": "A PHP parser written in PHP",
+            "keywords": [
+                "parser",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/nikic/PHP-Parser/issues",
+                "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2"
+            },
+            "time": "2024-03-05T20:51:40+00:00"
+        },
+        {
+            "name": "nunomaduro/phpinsights",
+            "version": "v2.11.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nunomaduro/phpinsights.git",
+                "reference": "f476219759a61aad988641476259465c77203383"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nunomaduro/phpinsights/zipball/f476219759a61aad988641476259465c77203383",
+                "reference": "f476219759a61aad988641476259465c77203383",
+                "shasum": ""
+            },
+            "require": {
+                "cmgmyr/phploc": "^8.0.3",
+                "composer/semver": "^3.4",
+                "ext-iconv": "*",
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "ext-tokenizer": "*",
+                "friendsofphp/php-cs-fixer": "^3.40.0",
+                "justinrainbow/json-schema": "^5.2.13",
+                "league/container": "^3.2|^4.2",
+                "php": "^7.4|^8.0",
+                "php-parallel-lint/php-parallel-lint": "^1.3.2",
+                "psr/container": "^1.0|^2.0.2",
+                "psr/simple-cache": "^1.0|^2.0|^3.0",
+                "sebastian/diff": "^4.0|^5.0.3",
+                "slevomat/coding-standard": "^8.14.1",
+                "squizlabs/php_codesniffer": "^3.7.2",
+                "symfony/cache": "^5.4|^6.0|^7.0",
+                "symfony/console": "^5.4|^6.4|^7.0",
+                "symfony/finder": "^5.4|^6.0|^7.0",
+                "symfony/http-client": "^5.4|^6.0|^7.0",
+                "symfony/process": "^5.4|^6.4|^7.0"
+            },
+            "require-dev": {
+                "ergebnis/phpstan-rules": "^0.15.3",
+                "illuminate/console": "^5.8|^6.0|^7.0|^8.0|^9.20|^10.0",
+                "illuminate/support": "^5.8|^6.0|^7.0|^8.0|^9.52.16|^10.0",
+                "mockery/mockery": "^1.6.6",
+                "phpstan/phpstan-strict-rules": "^0.12.11",
+                "phpunit/phpunit": "^8.0|^9.0|^10.4.2",
+                "rector/rector": "0.11.56",
+                "symfony/var-dumper": "^5.4|^6.0|^7.0",
+                "thecodingmachine/phpstan-strict-rules": "^0.12.2"
+            },
+            "suggest": {
+                "ext-simplexml": "It is needed for the checkstyle formatter"
+            },
+            "bin": [
+                "bin/phpinsights"
+            ],
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "providers": [
+                        "NunoMaduro\\PhpInsights\\Application\\Adapters\\Laravel\\InsightsServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "NunoMaduro\\PhpInsights\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nuno Maduro",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Instant PHP quality checks from your console.",
+            "keywords": [
+                "Insights",
+                "code",
+                "console",
+                "php",
+                "quality",
+                "source"
+            ],
+            "support": {
+                "issues": "https://github.com/nunomaduro/phpinsights/issues",
+                "source": "https://github.com/nunomaduro/phpinsights/tree/v2.11.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/JustSteveKing",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/cmgmyr",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/nunomaduro",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-11-30T10:54:50+00:00"
+        },
+        {
+            "name": "phar-io/manifest",
+            "version": "2.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phar-io/manifest.git",
+                "reference": "54750ef60c58e43759730615a392c31c80e23176"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+                "reference": "54750ef60c58e43759730615a392c31c80e23176",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-libxml": "*",
+                "ext-phar": "*",
+                "ext-xmlwriter": "*",
+                "phar-io/version": "^3.0.1",
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Arne Blankerts",
+                    "email": "[email protected]",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Sebastian Heuer",
+                    "email": "[email protected]",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+            "support": {
+                "issues": "https://github.com/phar-io/manifest/issues",
+                "source": "https://github.com/phar-io/manifest/tree/2.0.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/theseer",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-03T12:33:53+00:00"
+        },
+        {
+            "name": "phar-io/version",
+            "version": "3.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phar-io/version.git",
+                "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+                "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Arne Blankerts",
+                    "email": "[email protected]",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Sebastian Heuer",
+                    "email": "[email protected]",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Library for handling version information and constraints",
+            "support": {
+                "issues": "https://github.com/phar-io/version/issues",
+                "source": "https://github.com/phar-io/version/tree/3.2.1"
+            },
+            "time": "2022-02-21T01:04:05+00:00"
+        },
+        {
+            "name": "php-parallel-lint/php-parallel-lint",
+            "version": "v1.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-parallel-lint/PHP-Parallel-Lint.git",
+                "reference": "6db563514f27e19595a19f45a4bf757b6401194e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/6db563514f27e19595a19f45a4bf757b6401194e",
+                "reference": "6db563514f27e19595a19f45a4bf757b6401194e",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "php": ">=5.3.0"
+            },
+            "replace": {
+                "grogy/php-parallel-lint": "*",
+                "jakub-onderka/php-parallel-lint": "*"
+            },
+            "require-dev": {
+                "nette/tester": "^1.3 || ^2.0",
+                "php-parallel-lint/php-console-highlighter": "0.* || ^1.0",
+                "squizlabs/php_codesniffer": "^3.6"
+            },
+            "suggest": {
+                "php-parallel-lint/php-console-highlighter": "Highlight syntax in code snippet"
+            },
+            "bin": [
+                "parallel-lint"
+            ],
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "./src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jakub Onderka",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "This tool checks the syntax of PHP files about 20x faster than serial check.",
+            "homepage": "https://github.com/php-parallel-lint/PHP-Parallel-Lint",
+            "keywords": [
+                "lint",
+                "static analysis"
+            ],
+            "support": {
+                "issues": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues",
+                "source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.4.0"
+            },
+            "time": "2024-03-27T12:14:49+00:00"
+        },
+        {
+            "name": "phpstan/phpdoc-parser",
+            "version": "1.28.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/phpdoc-parser.git",
+                "reference": "cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb",
+                "reference": "cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "doctrine/annotations": "^2.0",
+                "nikic/php-parser": "^4.15",
+                "php-parallel-lint/php-parallel-lint": "^1.2",
+                "phpstan/extension-installer": "^1.0",
+                "phpstan/phpstan": "^1.5",
+                "phpstan/phpstan-phpunit": "^1.1",
+                "phpstan/phpstan-strict-rules": "^1.0",
+                "phpunit/phpunit": "^9.5",
+                "symfony/process": "^5.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "PHPStan\\PhpDocParser\\": [
+                        "src/"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "PHPDoc parser with support for nullable, intersection and generic types",
+            "support": {
+                "issues": "https://github.com/phpstan/phpdoc-parser/issues",
+                "source": "https://github.com/phpstan/phpdoc-parser/tree/1.28.0"
+            },
+            "time": "2024-04-03T18:51:33+00:00"
+        },
+        {
+            "name": "phpunit/php-code-coverage",
+            "version": "10.1.14",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+                "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b",
+                "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-libxml": "*",
+                "ext-xmlwriter": "*",
+                "nikic/php-parser": "^4.18 || ^5.0",
+                "php": ">=8.1",
+                "phpunit/php-file-iterator": "^4.0",
+                "phpunit/php-text-template": "^3.0",
+                "sebastian/code-unit-reverse-lookup": "^3.0",
+                "sebastian/complexity": "^3.0",
+                "sebastian/environment": "^6.0",
+                "sebastian/lines-of-code": "^2.0",
+                "sebastian/version": "^4.0",
+                "theseer/tokenizer": "^1.2.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.1"
+            },
+            "suggest": {
+                "ext-pcov": "PHP extension that provides line coverage",
+                "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "10.1-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+            "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+            "keywords": [
+                "coverage",
+                "testing",
+                "xunit"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+                "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-12T15:33:41+00:00"
+        },
+        {
+            "name": "phpunit/php-file-iterator",
+            "version": "4.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+                "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c",
+                "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]",
+                    "role": "lead"
+                }
+            ],
+            "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+            "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+            "keywords": [
+                "filesystem",
+                "iterator"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+                "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy",
+                "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-08-31T06:24:48+00:00"
+        },
+        {
+            "name": "phpunit/php-invoker",
+            "version": "4.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-invoker.git",
+                "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
+                "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "ext-pcntl": "*",
+                "phpunit/phpunit": "^10.0"
+            },
+            "suggest": {
+                "ext-pcntl": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]",
+                    "role": "lead"
+                }
+            ],
+            "description": "Invoke callables with a timeout",
+            "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+            "keywords": [
+                "process"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+                "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T06:56:09+00:00"
+        },
+        {
+            "name": "phpunit/php-text-template",
+            "version": "3.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-text-template.git",
+                "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748",
+                "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]",
+                    "role": "lead"
+                }
+            ],
+            "description": "Simple template engine.",
+            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+            "keywords": [
+                "template"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+                "security": "https://github.com/sebastianbergmann/php-text-template/security/policy",
+                "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-08-31T14:07:24+00:00"
+        },
+        {
+            "name": "phpunit/php-timer",
+            "version": "6.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-timer.git",
+                "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d",
+                "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "6.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]",
+                    "role": "lead"
+                }
+            ],
+            "description": "Utility class for timing",
+            "homepage": "https://github.com/sebastianbergmann/php-timer/",
+            "keywords": [
+                "timer"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+                "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T06:57:52+00:00"
+        },
+        {
+            "name": "phpunit/phpunit",
+            "version": "10.5.20",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit.git",
+                "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/547d314dc24ec1e177720d45c6263fb226cc2ae3",
+                "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-json": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-xml": "*",
+                "ext-xmlwriter": "*",
+                "myclabs/deep-copy": "^1.10.1",
+                "phar-io/manifest": "^2.0.3",
+                "phar-io/version": "^3.0.2",
+                "php": ">=8.1",
+                "phpunit/php-code-coverage": "^10.1.5",
+                "phpunit/php-file-iterator": "^4.0",
+                "phpunit/php-invoker": "^4.0",
+                "phpunit/php-text-template": "^3.0",
+                "phpunit/php-timer": "^6.0",
+                "sebastian/cli-parser": "^2.0",
+                "sebastian/code-unit": "^2.0",
+                "sebastian/comparator": "^5.0",
+                "sebastian/diff": "^5.0",
+                "sebastian/environment": "^6.0",
+                "sebastian/exporter": "^5.1",
+                "sebastian/global-state": "^6.0.1",
+                "sebastian/object-enumerator": "^5.0",
+                "sebastian/recursion-context": "^5.0",
+                "sebastian/type": "^4.0",
+                "sebastian/version": "^4.0"
+            },
+            "suggest": {
+                "ext-soap": "To be able to generate mocks based on WSDL files"
+            },
+            "bin": [
+                "phpunit"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "10.5-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/Framework/Assert/Functions.php"
+                ],
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]",
+                    "role": "lead"
+                }
+            ],
+            "description": "The PHP Unit Testing framework.",
+            "homepage": "https://phpunit.de/",
+            "keywords": [
+                "phpunit",
+                "testing",
+                "xunit"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+                "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+                "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.20"
+            },
+            "funding": [
+                {
+                    "url": "https://phpunit.de/sponsors.html",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-04-24T06:32:35+00:00"
+        },
+        {
+            "name": "psr/cache",
+            "version": "3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/cache.git",
+                "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+                "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Cache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for caching libraries",
+            "keywords": [
+                "cache",
+                "psr",
+                "psr-6"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/cache/tree/3.0.0"
+            },
+            "time": "2021-02-03T23:26:27+00:00"
+        },
+        {
+            "name": "sebastian/cli-parser",
+            "version": "2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/cli-parser.git",
+                "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084",
+                "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library for parsing CLI options",
+            "homepage": "https://github.com/sebastianbergmann/cli-parser",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+                "security": "https://github.com/sebastianbergmann/cli-parser/security/policy",
+                "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-02T07:12:49+00:00"
+        },
+        {
+            "name": "sebastian/code-unit",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/code-unit.git",
+                "reference": "a81fee9eef0b7a76af11d121767abc44c104e503"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503",
+                "reference": "a81fee9eef0b7a76af11d121767abc44c104e503",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]",
+                    "role": "lead"
+                }
+            ],
+            "description": "Collection of value objects that represent the PHP code units",
+            "homepage": "https://github.com/sebastianbergmann/code-unit",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+                "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T06:58:43+00:00"
+        },
+        {
+            "name": "sebastian/code-unit-reverse-lookup",
+            "version": "3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+                "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
+                "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Looks up which function or method a line of code belongs to",
+            "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+                "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T06:59:15+00:00"
+        },
+        {
+            "name": "sebastian/comparator",
+            "version": "5.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/comparator.git",
+                "reference": "2db5010a484d53ebf536087a70b4a5423c102372"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372",
+                "reference": "2db5010a484d53ebf536087a70b4a5423c102372",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-mbstring": "*",
+                "php": ">=8.1",
+                "sebastian/diff": "^5.0",
+                "sebastian/exporter": "^5.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "5.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Jeff Welch",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Provides the functionality to compare PHP values for equality",
+            "homepage": "https://github.com/sebastianbergmann/comparator",
+            "keywords": [
+                "comparator",
+                "compare",
+                "equality"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/comparator/issues",
+                "security": "https://github.com/sebastianbergmann/comparator/security/policy",
+                "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-08-14T13:18:12+00:00"
+        },
+        {
+            "name": "sebastian/complexity",
+            "version": "3.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/complexity.git",
+                "reference": "68ff824baeae169ec9f2137158ee529584553799"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799",
+                "reference": "68ff824baeae169ec9f2137158ee529584553799",
+                "shasum": ""
+            },
+            "require": {
+                "nikic/php-parser": "^4.18 || ^5.0",
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.2-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library for calculating the complexity of PHP code units",
+            "homepage": "https://github.com/sebastianbergmann/complexity",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/complexity/issues",
+                "security": "https://github.com/sebastianbergmann/complexity/security/policy",
+                "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-12-21T08:37:17+00:00"
+        },
+        {
+            "name": "sebastian/diff",
+            "version": "5.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/diff.git",
+                "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e",
+                "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0",
+                "symfony/process": "^6.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "5.1-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Kore Nordmann",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Diff implementation",
+            "homepage": "https://github.com/sebastianbergmann/diff",
+            "keywords": [
+                "diff",
+                "udiff",
+                "unidiff",
+                "unified diff"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/diff/issues",
+                "security": "https://github.com/sebastianbergmann/diff/security/policy",
+                "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-02T07:15:17+00:00"
+        },
+        {
+            "name": "sebastian/environment",
+            "version": "6.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/environment.git",
+                "reference": "8074dbcd93529b357029f5cc5058fd3e43666984"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984",
+                "reference": "8074dbcd93529b357029f5cc5058fd3e43666984",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "suggest": {
+                "ext-posix": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "6.1-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Provides functionality to handle HHVM/PHP environments",
+            "homepage": "https://github.com/sebastianbergmann/environment",
+            "keywords": [
+                "Xdebug",
+                "environment",
+                "hhvm"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/environment/issues",
+                "security": "https://github.com/sebastianbergmann/environment/security/policy",
+                "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-23T08:47:14+00:00"
+        },
+        {
+            "name": "sebastian/exporter",
+            "version": "5.1.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/exporter.git",
+                "reference": "955288482d97c19a372d3f31006ab3f37da47adf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf",
+                "reference": "955288482d97c19a372d3f31006ab3f37da47adf",
+                "shasum": ""
+            },
+            "require": {
+                "ext-mbstring": "*",
+                "php": ">=8.1",
+                "sebastian/recursion-context": "^5.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "5.1-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Jeff Welch",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Provides the functionality to export PHP variables for visualization",
+            "homepage": "https://www.github.com/sebastianbergmann/exporter",
+            "keywords": [
+                "export",
+                "exporter"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/exporter/issues",
+                "security": "https://github.com/sebastianbergmann/exporter/security/policy",
+                "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-02T07:17:12+00:00"
+        },
+        {
+            "name": "sebastian/global-state",
+            "version": "6.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/global-state.git",
+                "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9",
+                "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "sebastian/object-reflector": "^3.0",
+                "sebastian/recursion-context": "^5.0"
+            },
+            "require-dev": {
+                "ext-dom": "*",
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "6.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Snapshotting of global state",
+            "homepage": "https://www.github.com/sebastianbergmann/global-state",
+            "keywords": [
+                "global state"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/global-state/issues",
+                "security": "https://github.com/sebastianbergmann/global-state/security/policy",
+                "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-02T07:19:19+00:00"
+        },
+        {
+            "name": "sebastian/lines-of-code",
+            "version": "2.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+                "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0",
+                "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0",
+                "shasum": ""
+            },
+            "require": {
+                "nikic/php-parser": "^4.18 || ^5.0",
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library for counting the lines of code in PHP source code",
+            "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+                "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
+                "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-12-21T08:38:20+00:00"
+        },
+        {
+            "name": "sebastian/object-enumerator",
+            "version": "5.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+                "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906",
+                "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "sebastian/object-reflector": "^3.0",
+                "sebastian/recursion-context": "^5.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "5.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+            "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+                "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T07:08:32+00:00"
+        },
+        {
+            "name": "sebastian/object-reflector",
+            "version": "3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/object-reflector.git",
+                "reference": "24ed13d98130f0e7122df55d06c5c4942a577957"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957",
+                "reference": "24ed13d98130f0e7122df55d06c5c4942a577957",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Allows reflection of object attributes, including inherited and non-public ones",
+            "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+                "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T07:06:18+00:00"
+        },
+        {
+            "name": "sebastian/recursion-context",
+            "version": "5.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/recursion-context.git",
+                "reference": "05909fb5bc7df4c52992396d0116aed689f93712"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712",
+                "reference": "05909fb5bc7df4c52992396d0116aed689f93712",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "5.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Jeff Welch",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Provides functionality to recursively process PHP variables",
+            "homepage": "https://github.com/sebastianbergmann/recursion-context",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+                "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T07:05:40+00:00"
+        },
+        {
+            "name": "sebastian/type",
+            "version": "4.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/type.git",
+                "reference": "462699a16464c3944eefc02ebdd77882bd3925bf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf",
+                "reference": "462699a16464c3944eefc02ebdd77882bd3925bf",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]",
+                    "role": "lead"
+                }
+            ],
+            "description": "Collection of value objects that represent the types of the PHP type system",
+            "homepage": "https://github.com/sebastianbergmann/type",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/type/issues",
+                "source": "https://github.com/sebastianbergmann/type/tree/4.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T07:10:45+00:00"
+        },
+        {
+            "name": "sebastian/version",
+            "version": "4.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/version.git",
+                "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17",
+                "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "[email protected]",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+            "homepage": "https://github.com/sebastianbergmann/version",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/version/issues",
+                "source": "https://github.com/sebastianbergmann/version/tree/4.0.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-07T11:34:05+00:00"
+        },
+        {
+            "name": "slevomat/coding-standard",
+            "version": "8.15.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/slevomat/coding-standard.git",
+                "reference": "7d1d957421618a3803b593ec31ace470177d7817"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/7d1d957421618a3803b593ec31ace470177d7817",
+                "reference": "7d1d957421618a3803b593ec31ace470177d7817",
+                "shasum": ""
+            },
+            "require": {
+                "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0",
+                "php": "^7.2 || ^8.0",
+                "phpstan/phpdoc-parser": "^1.23.1",
+                "squizlabs/php_codesniffer": "^3.9.0"
+            },
+            "require-dev": {
+                "phing/phing": "2.17.4",
+                "php-parallel-lint/php-parallel-lint": "1.3.2",
+                "phpstan/phpstan": "1.10.60",
+                "phpstan/phpstan-deprecation-rules": "1.1.4",
+                "phpstan/phpstan-phpunit": "1.3.16",
+                "phpstan/phpstan-strict-rules": "1.5.2",
+                "phpunit/phpunit": "8.5.21|9.6.8|10.5.11"
+            },
+            "type": "phpcodesniffer-standard",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "8.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "SlevomatCodingStandard\\": "SlevomatCodingStandard/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.",
+            "keywords": [
+                "dev",
+                "phpcs"
+            ],
+            "support": {
+                "issues": "https://github.com/slevomat/coding-standard/issues",
+                "source": "https://github.com/slevomat/coding-standard/tree/8.15.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/kukulich",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-03-09T15:20:58+00:00"
+        },
+        {
+            "name": "squizlabs/php_codesniffer",
+            "version": "3.9.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
+                "reference": "aac1f6f347a5c5ac6bc98ad395007df00990f480"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/aac1f6f347a5c5ac6bc98ad395007df00990f480",
+                "reference": "aac1f6f347a5c5ac6bc98ad395007df00990f480",
+                "shasum": ""
+            },
+            "require": {
+                "ext-simplexml": "*",
+                "ext-tokenizer": "*",
+                "ext-xmlwriter": "*",
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4"
+            },
+            "bin": [
+                "bin/phpcbf",
+                "bin/phpcs"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.x-dev"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Greg Sherwood",
+                    "role": "Former lead"
+                },
+                {
+                    "name": "Juliette Reinders Folmer",
+                    "role": "Current lead"
+                },
+                {
+                    "name": "Contributors",
+                    "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors"
+                }
+            ],
+            "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
+            "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer",
+            "keywords": [
+                "phpcs",
+                "standards",
+                "static analysis"
+            ],
+            "support": {
+                "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues",
+                "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy",
+                "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer",
+                "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/PHPCSStandards",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/jrfnl",
+                    "type": "github"
+                },
+                {
+                    "url": "https://opencollective.com/php_codesniffer",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2024-04-23T20:25:34+00:00"
+        },
+        {
+            "name": "symfony/cache",
+            "version": "v7.0.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/cache.git",
+                "reference": "2d0d3f92c74c445410d05374908b03e0a1131e2b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/cache/zipball/2d0d3f92c74c445410d05374908b03e0a1131e2b",
+                "reference": "2d0d3f92c74c445410d05374908b03e0a1131e2b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "psr/cache": "^2.0|^3.0",
+                "psr/log": "^1.1|^2|^3",
+                "symfony/cache-contracts": "^2.5|^3",
+                "symfony/service-contracts": "^2.5|^3",
+                "symfony/var-exporter": "^6.4|^7.0"
+            },
+            "conflict": {
+                "doctrine/dbal": "<3.6",
+                "symfony/dependency-injection": "<6.4",
+                "symfony/http-kernel": "<6.4",
+                "symfony/var-dumper": "<6.4"
+            },
+            "provide": {
+                "psr/cache-implementation": "2.0|3.0",
+                "psr/simple-cache-implementation": "1.0|2.0|3.0",
+                "symfony/cache-implementation": "1.1|2.0|3.0"
+            },
+            "require-dev": {
+                "cache/integration-tests": "dev-master",
+                "doctrine/dbal": "^3.6|^4",
+                "predis/predis": "^1.1|^2.0",
+                "psr/simple-cache": "^1.0|^2.0|^3.0",
+                "symfony/config": "^6.4|^7.0",
+                "symfony/dependency-injection": "^6.4|^7.0",
+                "symfony/filesystem": "^6.4|^7.0",
+                "symfony/http-kernel": "^6.4|^7.0",
+                "symfony/messenger": "^6.4|^7.0",
+                "symfony/var-dumper": "^6.4|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Cache\\": ""
+                },
+                "classmap": [
+                    "Traits/ValueWrapper.php"
+                ],
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides extended PSR-6, PSR-16 (and tags) implementations",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "caching",
+                "psr6"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/cache/tree/v7.0.6"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-03-27T19:55:25+00:00"
+        },
+        {
+            "name": "symfony/cache-contracts",
+            "version": "v3.4.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/cache-contracts.git",
+                "reference": "2c9db6509a1b21dad229606897639d3284f54b2a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/2c9db6509a1b21dad229606897639d3284f54b2a",
+                "reference": "2c9db6509a1b21dad229606897639d3284f54b2a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "psr/cache": "^3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.4-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Cache\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to caching",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/cache-contracts/tree/v3.4.2"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-01-23T14:51:35+00:00"
+        },
+        {
+            "name": "symfony/console",
+            "version": "v7.0.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/console.git",
+                "reference": "fde915cd8e7eb99b3d531d3d5c09531429c3f9e5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/console/zipball/fde915cd8e7eb99b3d531d3d5c09531429c3f9e5",
+                "reference": "fde915cd8e7eb99b3d531d3d5c09531429c3f9e5",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/service-contracts": "^2.5|^3",
+                "symfony/string": "^6.4|^7.0"
+            },
+            "conflict": {
+                "symfony/dependency-injection": "<6.4",
+                "symfony/dotenv": "<6.4",
+                "symfony/event-dispatcher": "<6.4",
+                "symfony/lock": "<6.4",
+                "symfony/process": "<6.4"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0|2.0|3.0"
+            },
+            "require-dev": {
+                "psr/log": "^1|^2|^3",
+                "symfony/config": "^6.4|^7.0",
+                "symfony/dependency-injection": "^6.4|^7.0",
+                "symfony/event-dispatcher": "^6.4|^7.0",
+                "symfony/http-foundation": "^6.4|^7.0",
+                "symfony/http-kernel": "^6.4|^7.0",
+                "symfony/lock": "^6.4|^7.0",
+                "symfony/messenger": "^6.4|^7.0",
+                "symfony/process": "^6.4|^7.0",
+                "symfony/stopwatch": "^6.4|^7.0",
+                "symfony/var-dumper": "^6.4|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Console\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Eases the creation of beautiful and testable command line interfaces",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "cli",
+                "command-line",
+                "console",
+                "terminal"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/console/tree/v7.0.6"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-04-01T11:04:53+00:00"
+        },
+        {
+            "name": "symfony/event-dispatcher",
+            "version": "v7.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/event-dispatcher.git",
+                "reference": "834c28d533dd0636f910909d01b9ff45cc094b5e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/834c28d533dd0636f910909d01b9ff45cc094b5e",
+                "reference": "834c28d533dd0636f910909d01b9ff45cc094b5e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "symfony/event-dispatcher-contracts": "^2.5|^3"
+            },
+            "conflict": {
+                "symfony/dependency-injection": "<6.4",
+                "symfony/service-contracts": "<2.5"
+            },
+            "provide": {
+                "psr/event-dispatcher-implementation": "1.0",
+                "symfony/event-dispatcher-implementation": "2.0|3.0"
+            },
+            "require-dev": {
+                "psr/log": "^1|^2|^3",
+                "symfony/config": "^6.4|^7.0",
+                "symfony/dependency-injection": "^6.4|^7.0",
+                "symfony/error-handler": "^6.4|^7.0",
+                "symfony/expression-language": "^6.4|^7.0",
+                "symfony/http-foundation": "^6.4|^7.0",
+                "symfony/service-contracts": "^2.5|^3",
+                "symfony/stopwatch": "^6.4|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\EventDispatcher\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.3"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-01-23T15:02:46+00:00"
+        },
+        {
+            "name": "symfony/event-dispatcher-contracts",
+            "version": "v3.4.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+                "reference": "4e64b49bf370ade88e567de29465762e316e4224"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/4e64b49bf370ade88e567de29465762e316e4224",
+                "reference": "4e64b49bf370ade88e567de29465762e316e4224",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "psr/event-dispatcher": "^1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.4-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\EventDispatcher\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to dispatching event",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.2"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-01-23T14:51:35+00:00"
+        },
+        {
+            "name": "symfony/filesystem",
+            "version": "v7.0.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/filesystem.git",
+                "reference": "408105dff4c104454100730bdfd1a9cdd993f04d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/408105dff4c104454100730bdfd1a9cdd993f04d",
+                "reference": "408105dff4c104454100730bdfd1a9cdd993f04d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-mbstring": "~1.8"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Filesystem\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides basic utilities for the filesystem",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/filesystem/tree/v7.0.6"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-03-21T19:37:36+00:00"
+        },
+        {
+            "name": "symfony/finder",
+            "version": "v7.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/finder.git",
+                "reference": "6e5688d69f7cfc4ed4a511e96007e06c2d34ce56"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/6e5688d69f7cfc4ed4a511e96007e06c2d34ce56",
+                "reference": "6e5688d69f7cfc4ed4a511e96007e06c2d34ce56",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2"
+            },
+            "require-dev": {
+                "symfony/filesystem": "^6.4|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Finder\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Finds files and directories via an intuitive fluent interface",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/finder/tree/v7.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-10-31T17:59:56+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php81",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php81.git",
+                "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d",
+                "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php81\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/process",
+            "version": "v7.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/process.git",
+                "reference": "0e7727191c3b71ebec6d529fa0e50a01ca5679e9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/process/zipball/0e7727191c3b71ebec6d529fa0e50a01ca5679e9",
+                "reference": "0e7727191c3b71ebec6d529fa0e50a01ca5679e9",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Process\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Executes commands in sub-processes",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/process/tree/v7.0.4"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-02-22T20:27:20+00:00"
+        },
+        {
+            "name": "symfony/stopwatch",
+            "version": "v7.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/stopwatch.git",
+                "reference": "983900d6fddf2b0cbaacacbbad07610854bd8112"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/stopwatch/zipball/983900d6fddf2b0cbaacacbbad07610854bd8112",
+                "reference": "983900d6fddf2b0cbaacacbbad07610854bd8112",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "symfony/service-contracts": "^2.5|^3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Stopwatch\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides a way to profile code",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/stopwatch/tree/v7.0.3"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-01-23T15:02:46+00:00"
+        },
+        {
+            "name": "symfony/string",
+            "version": "v7.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/string.git",
+                "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/string/zipball/f5832521b998b0bec40bee688ad5de98d4cf111b",
+                "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-intl-grapheme": "~1.0",
+                "symfony/polyfill-intl-normalizer": "~1.0",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "symfony/translation-contracts": "<2.5"
+            },
+            "require-dev": {
+                "symfony/error-handler": "^6.4|^7.0",
+                "symfony/http-client": "^6.4|^7.0",
+                "symfony/intl": "^6.4|^7.0",
+                "symfony/translation-contracts": "^2.5|^3.0",
+                "symfony/var-exporter": "^6.4|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/functions.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\String\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "grapheme",
+                "i18n",
+                "string",
+                "unicode",
+                "utf-8",
+                "utf8"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/string/tree/v7.0.4"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-02-01T13:17:36+00:00"
+        },
+        {
+            "name": "symfony/var-exporter",
+            "version": "v7.0.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-exporter.git",
+                "reference": "c74c568d2a15a1d407cf40d61ea82bc2d521e27b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-exporter/zipball/c74c568d2a15a1d407cf40d61ea82bc2d521e27b",
+                "reference": "c74c568d2a15a1d407cf40d61ea82bc2d521e27b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2"
+            },
+            "require-dev": {
+                "symfony/property-access": "^6.4|^7.0",
+                "symfony/serializer": "^6.4|^7.0",
+                "symfony/var-dumper": "^6.4|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\VarExporter\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "[email protected]"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Allows exporting any serializable PHP data structure to plain PHP code",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "clone",
+                "construct",
+                "export",
+                "hydrate",
+                "instantiate",
+                "lazy-loading",
+                "proxy",
+                "serialize"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/var-exporter/tree/v7.0.6"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-03-20T21:25:22+00:00"
+        },
+        {
+            "name": "theseer/tokenizer",
+            "version": "1.2.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/theseer/tokenizer.git",
+                "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+                "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-tokenizer": "*",
+                "ext-xmlwriter": "*",
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Arne Blankerts",
+                    "email": "[email protected]",
+                    "role": "Developer"
+                }
+            ],
+            "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+            "support": {
+                "issues": "https://github.com/theseer/tokenizer/issues",
+                "source": "https://github.com/theseer/tokenizer/tree/1.2.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/theseer",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-03T12:36:25+00:00"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": {
+        "alipaysdk/openapi": 20
+    },
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": "^8.2",
+        "ext-bcmath": "*",
+        "ext-curl": "*",
+        "ext-fileinfo": "*",
+        "ext-json": "*",
+        "ext-mbstring": "*",
+        "ext-mysqli": "*",
+        "ext-openssl": "*",
+        "ext-pdo": "*",
+        "ext-posix": "*",
+        "ext-redis": "*",
+        "ext-xml": "*",
+        "ext-yaml": "*",
+        "ext-zip": "*"
+    },
+    "platform-dev": [],
+    "plugin-api-version": "2.6.0"
+}

+ 148 - 0
config/.config.example.php

@@ -0,0 +1,148 @@
+<?php
+
+//基本设置---------------------------------------------------------------------------------------------------------------
+$_ENV['key'] = 'ChangeMe';     // Cookie加密密钥,请务必修改此key为随机字符串
+$_ENV['pwdMethod'] = 'bcrypt'; // 密码加密 可选 bcrypt, argon2i, argon2id
+$_ENV['salt'] = '';            // bcrypt/argon2i/argon2id 会忽略此项
+
+$_ENV['debug'] = false;                  // debug模式开关,生产环境请保持为false
+$_ENV['appName'] = 'SSPanel-UIM';         // 站点名称
+$_ENV['baseUrl'] = 'https://example.com'; // 站点地址,必须以https://开头,不要以/结尾
+
+// WebAPI
+$_ENV['webAPI'] = true;                // 是否开启WebAPI功能
+$_ENV['webAPIUrl'] = $_ENV['baseUrl']; // WebAPI地址,如需和站点地址相同,请不要修改
+$_ENV['muKey'] = 'ChangeMe';           // WebAPI密钥,用于节点服务端与面板通信,请务必修改此key为随机字符串
+$_ENV['checkNodeIp'] = true;           // 是否webapi验证节点ip
+
+//数据库设置--------------------------------------------------------------------------------------------------------------
+// db_host|db_socket 二选一,若设置 db_socket 则 db_host 会被忽略,不用请留空
+// db_host 例: localhost(可解析的主机名), 127.0.0.1(IP 地址)
+// db_socket 例:/var/run/mysqld/mysqld.sock(需使用绝对地址)
+$_ENV['db_host'] = '';
+$_ENV['db_socket'] = '';
+$_ENV['db_database'] = 'sspanel'; // 数据库名
+$_ENV['db_username'] = 'root';    // 数据库用户名
+$_ENV['db_password'] = 'sspanel'; // 用户密码
+$_ENV['db_port'] = '3306';        // 端口
+#读写分离相关配置
+$_ENV['enable_db_rw_split'] = false; // 是否开启读写分离
+$_ENV['read_db_hosts'] = [''];       // 从库地址,可配置多个
+$_ENV['write_db_host'] = '';         // 主库地址
+#高级
+$_ENV['db_charset'] = 'utf8mb4';
+$_ENV['db_collation'] = 'utf8mb4_unicode_ci';
+$_ENV['db_prefix'] = '';
+
+//Redis设置--------------------------------------------------------------------------------------------------------------
+$_ENV['redis_host'] = '127.0.0.1';    // Redis地址,使用unix domain socket时填写文件路径
+$_ENV['redis_port'] = 6379;           // Redis端口,使用unix domain socket时填写-1
+$_ENV['redis_connect_timeout'] = 2.0; // Redis连接超时时间,单位秒
+$_ENV['redis_read_timeout'] = 8.0;    // Redis读取超时时间,单位秒
+$_ENV['redis_username'] = '';         // Redis用户名,留空则不使用用户名连接
+$_ENV['redis_password'] = '';         // Redis密码,留空则无密码
+$_ENV['redis_ssl'] = false;           // 是否使用SSL连接Redis,如果使用了SSL,那么Redis端口应为Redis实例的TLS端口
+$_ENV['redis_ssl_context'] = [];      // 使用SSL时的上下文选项,参考 https://www.php.net/manual/zh/context.ssl.php
+
+//Rate Limit 设置--------------------------------------------------------------------------------------------------------
+$_ENV['enable_rate_limit'] = true;     // 是否开启请求限制
+$_ENV['rate_limit_sub_ip'] = 10;       // 每分钟每个IP的订阅链接请求限制
+$_ENV['rate_limit_sub'] = 10;          // 每分钟每个用户的订阅链接请求限制
+$_ENV['rate_limit_webapi_ip'] = 120;   // 每分钟每个IP的WebAPI请求限制
+$_ENV['rate_limit_webapi'] = 1200;     // 每分钟WebAPI全局请求限制
+$_ENV['rate_limit_user_api_ip'] = 60;  // 每分钟每个IP的用户API请求限制
+$_ENV['rate_limit_user_api'] = 60;     // 每分钟每个用户的API请求限制
+$_ENV['rate_limit_admin_api_ip'] = 60; // 每分钟每个管理员的API请求限制
+$_ENV['rate_limit_admin_api'] = 60;    // 每分钟每个管理员的API请求限制
+$_ENV['rate_limit_node_api_ip'] = 60;  // 每分钟每个IP的节点API请求限制
+$_ENV['rate_limit_node_api'] = 60;     // 每分钟每个节点的API请求限制
+
+//邮件设置----------------------------------------------------------------------------------------------------------------
+$_ENV['mail_filter'] = 0;        // 0: 关闭; 1: 白名单模式; 2; 黑名单模式;
+$_ENV['mail_filter_list'] = [];
+
+//已注册用户设置-----------------------------------------------------------------------------------------------------------
+//TODO: move these settings to DB
+#高级
+$_ENV['class_expire_reset_traffic'] = 0; // 等级到期时重置为的流量值,单位GB,小于0时不重置
+$_ENV['enable_kill'] = false;            // 是否允许用户注销账户
+$_ENV['enable_change_email'] = true;     // 是否允许用户更改賬戶郵箱
+
+#用户流量余量不足邮件提醒
+$_ENV['notify_limit_mode'] = false; // false为关闭,per为按照百分比提醒,mb为按照固定剩余流量提醒
+$_ENV['notify_limit_value'] = 500;  // 当上一项为per时,此处填写百分比;当上一项为mb时,此处填写流量
+
+//订阅设置----------------------------------------------------------------------------------------------------------------
+$_ENV['Subscribe'] = true;          // 本站是否提供订阅功能
+$_ENV['subUrl'] = $_ENV['baseUrl']; // 订阅地址,如需和站点名称相同,请不要修改
+$_ENV['sub_token_len'] = 16;        // 订阅token长度
+
+//审计自动封禁设置---------------------------------------------------------------------------------------------------------
+//TODO: move these settings to DB
+$_ENV['auto_detect_ban_allow_admin'] = true; // 管理员不受审计限制
+$_ENV['auto_detect_ban_allow_users'] = [];   // 审计封禁的例外用户 ID
+$_ENV['auto_detect_ban_number'] = 30;        // 每次执行封禁所需的触发次数
+$_ENV['auto_detect_ban_time'] = 60;          // 每次封禁的时长 (分钟)
+
+//节点检测---------------------------------------------------------------------------------------------------------------
+//TODO: move these settings to DB
+#GFW检测
+$_ENV['detect_gfw_port'] = 443;                                                    //所有节点服务器都打开的TCP端口
+$_ENV['detect_gfw_url'] = 'http://example.com:8080/v1/tcping?ip={ip}&port={port}'; //检测节点是否被gfw墙了的API的URL
+
+#离线检测
+$_ENV['enable_detect_offline'] = true;
+
+//高级设置---------------------------------------------------------------------------------------------------------------
+$_ENV['enable_login_bind_ip'] = true;     //是否将登陆线程和IP绑定
+$_ENV['enable_login_bind_device'] = true; //是否将登陆线程和设备绑定
+$_ENV['rememberMeDuration'] = 7;          //登录时记住账号时长天数
+$_ENV['timeZone'] = 'Asia/Taipei';        //需使用 PHP 兼容的时区格式
+$_ENV['theme'] = 'tabler';                //默认主题
+$_ENV['locale'] = 'zh-TW';                //默认语言
+$_ENV['jump_delay'] = 1200;               //跳转延时,单位ms
+$_ENV['keep_connect'] = false;            // 流量耗尽用户限速至 1Mbps
+
+//Generative AI---------------------------------------------------------------------------------------------------------
+//Large language model powered ticket reply and more
+//TODO: move these settings to DB
+$_ENV['llm_backend'] = 'openai'; // openai/google-ai/huggingface/cf-workers-ai/anthropic
+#OpenAI ChatGPT
+$_ENV['openai_api_key'] = '';
+$_ENV['openai_model'] = 'gpt-4-turbo-preview';
+#Google AI API
+$_ENV['google_ai_api_key'] = '';
+$_ENV['google_ai_model_id'] = 'gemini-1.5-pro-latest';
+#Vertex AI API
+$_ENV['vertex_ai_access_token'] = '';
+$_ENV['vertex_ai_location'] = 'us-central1';
+$_ENV['vertex_ai_model_id'] = 'gemini-1.0-pro';
+$_ENV['vertex_ai_project_id'] = '';
+#Hugging Face Inference API
+$_ENV['huggingface_api_key'] = '';
+$_ENV['huggingface_endpoint_url'] = '';
+#Cloudflare Workers AI
+$_ENV['cf_workers_ai_account_id'] = '';
+$_ENV['cf_workers_ai_api_token'] = '';
+$_ENV['cf_workers_ai_model_id'] = '@cf/meta/llama-2-7b-chat-int8';
+#Anthropic
+$_ENV['anthropic_api_key'] = '';
+$_ENV['anthropic_model_id'] = 'claude-3-opus-20240229';
+
+//Other-----------------------------------------------------------------------------------------------------------------
+// cdn.jsdelivr.net / fastly.jsdelivr.net / testingcf.jsdelivr.net
+$_ENV['jsdelivr_url'] = 'fastly.jsdelivr.net';
+// https://sentry.io for production debugging
+$_ENV['sentry_dsn'] = '';
+// Maxmind GeoIP2 database
+$_ENV['maxmind_license_key'] = '';
+$_ENV['geoip_locale'] = 'en';
+// ClientDownload 命令解决 API 访问频率高而被限制使用的 Github access token
+$_ENV['github_access_token'] = '';
+// use Cloudflare R2 for clients download
+$_ENV['enable_r2_client_download'] = false;
+$_ENV['r2_bucket_name'] = '';
+$_ENV['r2_account_id'] = '';
+$_ENV['r2_access_key_id'] = '';
+$_ENV['r2_access_key_secret'] = '';
+$_ENV['r2_client_download_timeout'] = 10;

+ 756 - 0
config/appprofile.example.php

@@ -0,0 +1,756 @@
+<?php
+
+declare(strict_types=1);
+
+$_ENV['V2RayJson_Config'] = [
+    'log' => [
+        'error' => [
+            'level' => 'error',
+            'type' => 'console',
+        ],
+        'access' => [
+            'type' => 'none',
+        ],
+    ],
+    'dns' => [
+        'nameServer' => [
+            [
+                'address' => '1.1.1.1',
+            ],
+            [
+                'address' => '1.0.0.1',
+            ],
+        ],
+    ],
+    'inbounds' => [
+        [
+            'protocol' => 'socks',
+            'settings' => [
+                'udpEnabled' => true,
+                'address' => '127.0.0.1',
+                'packetEncoding' => 'packet',
+            ],
+            'port' => 7892,
+            'listen' => '127.0.0.1',
+        ],
+        [
+            'protocol' => 'http',
+            'settings' => [],
+            'port' => 7893,
+            'listen' => '127.0.0.1',
+        ],
+    ],
+    'outbounds' => [],
+];
+
+$_ENV['SingBox_Config'] = [
+    'log' => [
+        'level' => 'error',
+    ],
+    'dns' => [
+        'servers' => [
+            [
+                'tag' => 'local',
+                'address' => 'local',
+            ],
+        ],
+        'rules' => [
+            [
+                'outbound' => 'any',
+                'server' => 'local',
+            ],
+        ],
+        'final' => 'local',
+        'strategy' => 'prefer_ipv6',
+    ],
+    'inbounds' => [
+        [
+            'type' => 'tun',
+            'inet4_address' => '172.19.0.1/30',
+            'auto_route' => true,
+            'strict_route' => true,
+            'endpoint_independent_nat' => true,
+            'udp_timeout' => 60,
+            'platform' => [
+                'http_proxy' => [
+                    'enabled' => true,
+                    'server' => '127.0.0.1',
+                    'server_port' => 7891,
+                ],
+            ],
+            'sniff' => true,
+        ],
+        [
+            'type' => 'mixed',
+            'listen' => '127.0.0.1',
+            'listen_port' => 7891,
+            'sniff' => true,
+            'domain_strategy' => 'prefer_ipv6',
+        ],
+    ],
+    'outbounds' => [
+        [
+            'type' => 'selector',
+            'tag' => 'default',
+            'outbounds' => [],
+        ],
+        [
+            'type' => 'direct',
+            'tag' => 'direct',
+        ],
+        [
+            'type' => 'block',
+            'tag' => 'block',
+        ],
+    ],
+    'route' => [
+        'rules' => [
+            [
+                'clash_mode' => 'Direct',
+                'outbound' => 'direct',
+            ],
+            [
+                'clash_mode' => 'Rule',
+                'outbound' => 'default',
+            ],
+            [
+                'clash_mode' => 'Global',
+                'outbound' => 'default',
+            ],
+            [
+                'protocol' => 'stun',
+                'outbound' => 'block',
+            ],
+            [
+                'ip_is_private' => true,
+                'outbound' => 'direct',
+            ],
+            [
+                'rule_set' => 'geoip-cn',
+                'outbound' => 'direct',
+            ],
+            [
+                'rule_set' => 'geosite-cn',
+                'outbound' => 'direct',
+            ],
+        ],
+        'rule_set' => [
+            [
+                'tag' => 'geoip-cn',
+                'type' => 'remote',
+                'format' => 'binary',
+                'url' => 'https://' . $_ENV['jsdelivr_url'] . '/gh/SagerNet/sing-geoip@rule-set/geoip-cn.srs',
+                'download_detour' => 'direct',
+            ],
+            [
+                'tag' => 'geosite-cn',
+                'type' => 'remote',
+                'format' => 'binary',
+                'url' => 'https://' . $_ENV['jsdelivr_url'] . '/gh/SagerNet/sing-geosite@rule-set/geosite-cn.srs',
+                'download_detour' => 'direct',
+            ],
+        ],
+        'auto_detect_interface' => true,
+    ],
+    'experimental' => [
+        'cache_file' => [
+            'enabled' => true,
+            'cache_id' => '',
+        ],
+        'clash_api' => [
+            'external_controller' => '127.0.0.1:9090',
+        ],
+    ],
+];
+
+$_ENV['Clash_Config'] = [
+    'port' => 7890,
+    'socks-port' => 7891,
+    'allow-lan' => false,
+    'mode' => 'Rule',
+    'ipv6' => true,
+    'log-level' => 'error',
+    'external-controller' => '0.0.0.0:9091',
+];
+
+// Clash group indexes to be inserted node names
+$_ENV['Clash_Group_Indexes'] = [0, 1, 2, 4, 6, 7, 8, 11];
+
+$_ENV['Clash_Group_Config'] = [
+    'proxy-groups' => [
+        [
+            'name' => '🔰 手动选择',
+            'type' => 'select',
+            // 插入节点名称
+            'proxies' => [
+                '♻️ 自动选择',
+                '🎯 Direct',
+            ],
+        ],
+        [
+            'name' => '♻️ 自动选择',
+            'type' => 'url-test',
+            'url' => 'http://cp.cloudflare.com/generate_204',
+            'interval' => 300,
+            // 插入节点名称
+            'proxies' => [
+            ],
+        ],
+        [
+            'name' => '🎥 Netflix',
+            'type' => 'select',
+            // 插入节点名称
+            'proxies' => [
+                '🔰 手动选择',
+                '♻️ 自动选择',
+                '🎯 Direct',
+            ],
+        ],
+        [
+            'name' => '⛔️ 广告拦截',
+            'type' => 'select',
+            'proxies' => [
+                '🛑 Block',
+                '🎯 Direct',
+                '🔰 手动选择',
+            ],
+        ],
+        [
+            'name' => '🌍 主流媒体',
+            'type' => 'select',
+            // 插入节点名称
+            'proxies' => [
+                '🔰 手动选择',
+                '♻️ 自动选择',
+                '🎯 Direct',
+            ],
+        ],
+        [
+            'name' => '🇨🇳 中国媒体',
+            'type' => 'select',
+            'proxies' => [
+                '🎯 Direct',
+                '🔰 手动选择',
+                '♻️ 自动选择',
+            ],
+        ],
+        [
+            'name' => 'Ⓜ️ Microsoft',
+            'type' => 'select',
+            // 插入节点名称
+            'proxies' => [
+                '🎯 Direct',
+                '🔰 手动选择',
+                '♻️ 自动选择',
+            ],
+        ],
+        [
+            'name' => '📲 Telegram',
+            'type' => 'select',
+            // 插入节点名称
+            'proxies' => [
+                '🔰 手动选择',
+                '♻️ 自动选择',
+                '🎯 Direct',
+            ],
+        ],
+        [
+            'name' => '🍎 Apple',
+            'type' => 'select',
+            // 插入节点名称
+            'proxies' => [
+                '🔰 手动选择',
+                '♻️ 自动选择',
+                '🎯 Direct',
+            ],
+        ],
+        [
+            'name' => '🎯 Direct',
+            'type' => 'select',
+            'proxies' => [
+                'DIRECT',
+            ],
+        ],
+        [
+            'name' => '🛑 Block',
+            'type' => 'select',
+            'proxies' => [
+                'REJECT',
+            ],
+        ],
+        [
+            'name' => '🐟 漏网之鱼',
+            'type' => 'select',
+            // 插入节点名称
+            'proxies' => [
+                '🔰 手动选择',
+                '♻️ 自动选择',
+                '🎯 Direct',
+            ],
+        ],
+    ],
+    'rules' => [
+        // 全球直连
+        'DOMAIN-KEYWORD,Thunder,🎯 Direct',
+        'DOMAIN-KEYWORD,XLLiveUD,🎯 Direct',
+        'DOMAIN-KEYWORD,aria2,🎯 Direct',
+        'DOMAIN-KEYWORD,miner,🎯 Direct',
+        'DOMAIN-KEYWORD,mining,🎯 Direct',
+        'DOMAIN-KEYWORD,monero,🎯 Direct',
+        'DOMAIN-KEYWORD,pool,🎯 Direct',
+        'DOMAIN-KEYWORD,xmr,🎯 Direct',
+        'DOMAIN-KEYWORD,xunlei,🎯 Direct',
+        'DOMAIN-KEYWORD,yunpan,🎯 Direct',
+        'DST-PORT,10300,🎯 Direct',
+        'DST-PORT,10343,🎯 Direct',
+        'DST-PORT,18080,🎯 Direct',
+        'DST-PORT,2222,🎯 Direct',
+        'DST-PORT,3333,🎯 Direct',
+        'DST-PORT,5555,🎯 Direct',
+        'DST-PORT,7777,🎯 Direct',
+        'DST-PORT,8333,🎯 Direct',
+        'DST-PORT,8888,🎯 Direct',
+        'DST-PORT,9000,🎯 Direct',
+        'DST-PORT,9999,🎯 Direct',
+        'GEOIP,cn,🎯 Direct',
+        'GEOIP,private,🎯 Direct,no-resolve',
+        'GEOSITE,cn,🎯 Direct',
+        'PROCESS-NAME,DownloadService,🎯 Direct',
+        'PROCESS-NAME,Folx,🎯 Direct',
+        'PROCESS-NAME,Motrix,🎯 Direct',
+        'PROCESS-NAME,NetTransport,🎯 Direct',
+        'PROCESS-NAME,Thunder,🎯 Direct',
+        'PROCESS-NAME,Transmission,🎯 Direct',
+        'PROCESS-NAME,WebTorrent Helper,🎯 Direct',
+        'PROCESS-NAME,WebTorrent,🎯 Direct',
+        'PROCESS-NAME,Weiyun,🎯 Direct',
+        'PROCESS-NAME,aria2c,🎯 Direct',
+        'PROCESS-NAME,fdm,🎯 Direct',
+        'PROCESS-NAME,qbittorrent,🎯 Direct',
+        'PROCESS-NAME,uTorrent,🎯 Direct',
+        // Microsoft
+        'GEOSITE,microsoft,Ⓜ️ Microsoft',
+        // Apple
+        'GEOSITE,apple,🍎 Apple',
+        // Telegram
+        'GEOIP,telegram,📲 Telegram',
+        'GEOSITE,telegram,📲 Telegram',
+        // Netflix
+        'GEOIP,netflix,🎥 Netflix',
+        'GEOSITE,netflix,🎥 Netflix',
+        // 国外媒体
+        'GEOSITE,category-media,🌍 主流媒体',
+        // 中国媒体
+        'GEOSITE,category-media-cn,🇨🇳 中国媒体',
+        // 广告拦截
+        'GEOIP,ad,⛔️ 广告拦截',
+        'GEOSITE,category-ads-all,⛔️ 广告拦截',
+        // :)
+        // https://github.com/hoshsadiq/adblock-nocoin-list
+        'DOMAIN-SUFFIX,1q2w3.fun,🛑 Block',
+        'DOMAIN-SUFFIX,abc.pema.cl,🛑 Block',
+        'DOMAIN-SUFFIX,acbp0020171456.page.tl,🛑 Block',
+        'DOMAIN-SUFFIX,ad-miner.com,🛑 Block',
+        'DOMAIN-SUFFIX,adminer.com,🛑 Block',
+        'DOMAIN-SUFFIX,aeros01.tk,🛑 Block',
+        'DOMAIN-SUFFIX,aeros02.tk,🛑 Block',
+        'DOMAIN-SUFFIX,aeros11.tk,🛑 Block',
+        'DOMAIN-SUFFIX,aeros12.tk,🛑 Block',
+        'DOMAIN-SUFFIX,afminer.com,🛑 Block',
+        'DOMAIN-SUFFIX,analytics.blue,🛑 Block',
+        'DOMAIN-SUFFIX,andlache.com,🛑 Block',
+        'DOMAIN-SUFFIX,anybest.pw,🛑 Block',
+        'DOMAIN-SUFFIX,api.browsermine.com,🛑 Block',
+        'DOMAIN-SUFFIX,api.inwemo.com,🛑 Block',
+        'DOMAIN-SUFFIX,api.miner.beeppool.org,🛑 Block',
+        'DOMAIN-SUFFIX,as.cfcdist.loan,🛑 Block',
+        'DOMAIN-SUFFIX,ashgrrwt.click,🛑 Block',
+        'DOMAIN-SUFFIX,authedmine.com,🛑 Block',
+        'DOMAIN-SUFFIX,authedmine.eu,🛑 Block',
+        'DOMAIN-SUFFIX,authedwebmine.cz,🛑 Block',
+        'DOMAIN-SUFFIX,autologica.ga,🛑 Block',
+        'DOMAIN-SUFFIX,axoncoho.tk,🛑 Block',
+        'DOMAIN-SUFFIX,bablace.com,🛑 Block',
+        'DOMAIN-SUFFIX,bafybeidravcab5p3acvthxtwosm4rfpl4yypwwm52s7sazgxaezfzn5xn4.ipfs.infura-ipfs.io,🛑 Block',
+        'DOMAIN-SUFFIX,baiduccdn1.com,🛑 Block',
+        'DOMAIN-SUFFIX,becanium.com,🛑 Block',
+        'DOMAIN-SUFFIX,berateveng.ru,🛑 Block',
+        'DOMAIN-SUFFIX,besocial.online,🛑 Block',
+        'DOMAIN-SUFFIX,bestcoinsignals.com,🛑 Block',
+        'DOMAIN-SUFFIX,besti.ga,🛑 Block',
+        'DOMAIN-SUFFIX,bestsrv.de,🛑 Block',
+        'DOMAIN-SUFFIX,bewaslac.com,🛑 Block',
+        'DOMAIN-SUFFIX,biberukalap.com,🛑 Block',
+        'DOMAIN-SUFFIX,binarybusiness.de,🛑 Block',
+        'DOMAIN-SUFFIX,bitcoin-cashcard.com,🛑 Block',
+        'DOMAIN-SUFFIX,bitcoin-cashcard.de,🛑 Block',
+        'DOMAIN-SUFFIX,bitcoin-cashcard.eu,🛑 Block',
+        'DOMAIN-SUFFIX,bitcoin-pay.eu,🛑 Block',
+        'DOMAIN-SUFFIX,bitcoin-pocket.de,🛑 Block',
+        'DOMAIN-SUFFIX,bitcoin-pocket.eu,🛑 Block',
+        'DOMAIN-SUFFIX,bmcm.ml,🛑 Block',
+        'DOMAIN-SUFFIX,bmcm.pw,🛑 Block',
+        'DOMAIN-SUFFIX,bmnr.pw,🛑 Block',
+        'DOMAIN-SUFFIX,bmst.pw,🛑 Block',
+        'DOMAIN-SUFFIX,brominer.com,🛑 Block',
+        'DOMAIN-SUFFIX,browsermine.com,🛑 Block',
+        'DOMAIN-SUFFIX,candid.zone,🛑 Block',
+        'DOMAIN-SUFFIX,cashbeet.com,🛑 Block',
+        'DOMAIN-SUFFIX,cdn.adless.io,🛑 Block',
+        'DOMAIN-SUFFIX,cdn.cloudcoins.co,🛑 Block',
+        'DOMAIN-SUFFIX,cdn.minescripts.info,🛑 Block',
+        'DOMAIN-SUFFIX,cdn1.pebx.pl,🛑 Block',
+        'DOMAIN-SUFFIX,cdnjs.cloudflane.com,🛑 Block',
+        'DOMAIN-SUFFIX,cfcdist.gdn,🛑 Block',
+        'DOMAIN-SUFFIX,clgserv.pro,🛑 Block',
+        'DOMAIN-SUFFIX,cloud-miner.de,🛑 Block',
+        'DOMAIN-SUFFIX,cloud-miner.eu,🛑 Block',
+        'DOMAIN-SUFFIX,cloudcdn.gdn,🛑 Block',
+        'DOMAIN-SUFFIX,cloudflane.com,🛑 Block',
+        'DOMAIN-SUFFIX,cnhv.co,🛑 Block',
+        'DOMAIN-SUFFIX,cnt.statistic.date,🛑 Block',
+        'DOMAIN-SUFFIX,coin-have.com,🛑 Block',
+        'DOMAIN-SUFFIX,coinblind.com,🛑 Block',
+        'DOMAIN-SUFFIX,coinerra.com,🛑 Block',
+        'DOMAIN-SUFFIX,coinhiveproxy.com,🛑 Block',
+        'DOMAIN-SUFFIX,coinimp.com,🛑 Block',
+        'DOMAIN-SUFFIX,coinimp.net,🛑 Block',
+        'DOMAIN-SUFFIX,coinminingonline.com,🛑 Block',
+        'DOMAIN-SUFFIX,coinnebula.com,🛑 Block',
+        'DOMAIN-SUFFIX,coinpirate.cf,🛑 Block',
+        'DOMAIN-SUFFIX,coinpot.co,🛑 Block',
+        'DOMAIN-SUFFIX,coinrail.io,🛑 Block',
+        'DOMAIN-SUFFIX,contribute.to-support.me,🛑 Block',
+        'DOMAIN-SUFFIX,cryptaloot.pro,🛑 Block',
+        'DOMAIN-SUFFIX,crypto-loot.com,🛑 Block',
+        'DOMAIN-SUFFIX,crypto-webminer.com,🛑 Block',
+        'DOMAIN-SUFFIX,crypto.csgocpu.com,🛑 Block',
+        'DOMAIN-SUFFIX,cryptoloot.pro,🛑 Block',
+        'DOMAIN-SUFFIX,d.cpufan.club,🛑 Block',
+        'DOMAIN-SUFFIX,dark-utilities.me,🛑 Block',
+        'DOMAIN-SUFFIX,dark-utilities.pw,🛑 Block',
+        'DOMAIN-SUFFIX,dark-utilities.xyz,🛑 Block',
+        'DOMAIN-SUFFIX,de-mi-nis-ner.info,🛑 Block',
+        'DOMAIN-SUFFIX,de-ner-mi-nis4.info,🛑 Block',
+        'DOMAIN-SUFFIX,de-nis-ner-mi-5.info,🛑 Block',
+        'DOMAIN-SUFFIX,depttake.ga,🛑 Block',
+        'DOMAIN-SUFFIX,dev.cryptobara.com,🛑 Block',
+        'DOMAIN-SUFFIX,digger.cryptobara.com,🛑 Block',
+        'DOMAIN-SUFFIX,dl.browsermine.com,🛑 Block',
+        'DOMAIN-SUFFIX,donttbeevils.de,🛑 Block',
+        'DOMAIN-SUFFIX,dronml.ml,🛑 Block',
+        'DOMAIN-SUFFIX,easyhash.de,🛑 Block',
+        'DOMAIN-SUFFIX,eth-pocket.com,🛑 Block',
+        'DOMAIN-SUFFIX,eth-pocket.de,🛑 Block',
+        'DOMAIN-SUFFIX,eth-pocket.eu,🛑 Block',
+        'DOMAIN-SUFFIX,ethereum-cashcard.com,🛑 Block',
+        'DOMAIN-SUFFIX,ethereum-cashcard.de,🛑 Block',
+        'DOMAIN-SUFFIX,ethereum-cashcard.eu,🛑 Block',
+        'DOMAIN-SUFFIX,ethereum-pocket.com,🛑 Block',
+        'DOMAIN-SUFFIX,ethereum-pocket.de,🛑 Block',
+        'DOMAIN-SUFFIX,ethereum-pocket.eu,🛑 Block',
+        'DOMAIN-SUFFIX,ethtrader.de,🛑 Block',
+        'DOMAIN-SUFFIX,eu.cfcdist.loan,🛑 Block',
+        'DOMAIN-SUFFIX,eucsoft.com,🛑 Block',
+        'DOMAIN-SUFFIX,evilsbedont.de,🛑 Block',
+        'DOMAIN-SUFFIX,exdynsrv.com,🛑 Block',
+        'DOMAIN-SUFFIX,f1tbit.com,🛑 Block',
+        'DOMAIN-SUFFIX,flare-analytics.com,🛑 Block',
+        'DOMAIN-SUFFIX,flighty.win,🛑 Block',
+        'DOMAIN-SUFFIX,flightzy.date,🛑 Block',
+        'DOMAIN-SUFFIX,flightzy.win,🛑 Block',
+        'DOMAIN-SUFFIX,formulawire.com,🛑 Block',
+        'DOMAIN-SUFFIX,freecontent.date,🛑 Block',
+        'DOMAIN-SUFFIX,freecontent.science,🛑 Block',
+        'DOMAIN-SUFFIX,freecontent.stream,🛑 Block',
+        'DOMAIN-SUFFIX,freecontent.win,🛑 Block',
+        'DOMAIN-SUFFIX,g1thub.com,🛑 Block',
+        'DOMAIN-SUFFIX,ganymed.beeppool.org,🛑 Block',
+        'DOMAIN-SUFFIX,gasolina.ml,🛑 Block',
+        'DOMAIN-SUFFIX,go.bestmobiworld.com,🛑 Block',
+        'DOMAIN-SUFFIX,go.fastspot.io,🛑 Block',
+        'DOMAIN-SUFFIX,go.megabanners.cf,🛑 Block',
+        'DOMAIN-SUFFIX,goldoffer.online,🛑 Block',
+        'DOMAIN-SUFFIX,gramombird.com,🛑 Block',
+        'DOMAIN-SUFFIX,gridiogrid.com,🛑 Block',
+        'DOMAIN-SUFFIX,gxbrowser.net,🛑 Block',
+        'DOMAIN-SUFFIX,hashing.win,🛑 Block',
+        'DOMAIN-SUFFIX,hemnes.win,🛑 Block',
+        'DOMAIN-SUFFIX,hhb123.tk,🛑 Block',
+        'DOMAIN-SUFFIX,hide.ovh,🛑 Block',
+        'DOMAIN-SUFFIX,hive.tubetitties.com,🛑 Block',
+        'DOMAIN-SUFFIX,hostcontent.live,🛑 Block',
+        'DOMAIN-SUFFIX,hostingcloud.racing,🛑 Block',
+        'DOMAIN-SUFFIX,hostingcloud.trade,🛑 Block',
+        'DOMAIN-SUFFIX,hostingcloud.win,🛑 Block',
+        'DOMAIN-SUFFIX,igrid.org,🛑 Block',
+        'DOMAIN-SUFFIX,ijfcm7bu6ocerxsfq56ka3dtdanunyp4ytwk745b54agtravj2wr2qqd.onion.pet,🛑 Block',
+        'DOMAIN-SUFFIX,ininmacerad.pro,🛑 Block',
+        'DOMAIN-SUFFIX,intelserviceupdate.com,🛑 Block',
+        'DOMAIN-SUFFIX,jqcdn01.herokuapp.com,🛑 Block',
+        'DOMAIN-SUFFIX,jqcdn03.herokuapp.com,🛑 Block',
+        'DOMAIN-SUFFIX,jqcdn2.herokuapp.com,🛑 Block',
+        'DOMAIN-SUFFIX,jquery-cdn.download,🛑 Block',
+        'DOMAIN-SUFFIX,jqwww.download,🛑 Block',
+        'DOMAIN-SUFFIX,js.nahnoji.cz,🛑 Block',
+        'DOMAIN-SUFFIX,jscdndel.com,🛑 Block',
+        'DOMAIN-SUFFIX,jscoinminer.com,🛑 Block',
+        'DOMAIN-SUFFIX,jshosting.party,🛑 Block',
+        'DOMAIN-SUFFIX,jshosting.win,🛑 Block',
+        'DOMAIN-SUFFIX,jurty.ml,🛑 Block',
+        'DOMAIN-SUFFIX,krb.devphp.org.ua,🛑 Block',
+        'DOMAIN-SUFFIX,laserveradedomaina.com,🛑 Block',
+        'DOMAIN-SUFFIX,ledhenone.com,🛑 Block',
+        'DOMAIN-SUFFIX,lightminer.co,🛑 Block',
+        'DOMAIN-SUFFIX,losital.ru,🛑 Block',
+        'DOMAIN-SUFFIX,machieved.com,🛑 Block',
+        'DOMAIN-SUFFIX,mail.ghmproperties.com,🛑 Block',
+        'DOMAIN-SUFFIX,mail.itseasy.com,🛑 Block',
+        'DOMAIN-SUFFIX,mail.shaferglazer.com,🛑 Block',
+        'DOMAIN-SUFFIX,mail.techniservinc.com,🛑 Block',
+        'DOMAIN-SUFFIX,mebablo.com,🛑 Block',
+        'DOMAIN-SUFFIX,mepirtedic.com,🛑 Block',
+        'DOMAIN-SUFFIX,mi-de-ner-nis3.info,🛑 Block',
+        'DOMAIN-SUFFIX,mine.blank.drawpad.org,🛑 Block',
+        'DOMAIN-SUFFIX,mine.nahnoji.cz,🛑 Block',
+        'DOMAIN-SUFFIX,mine.terorie.com,🛑 Block',
+        'DOMAIN-SUFFIX,mine.torrent.pw,🛑 Block',
+        'DOMAIN-SUFFIX,minemytraffic.com,🛑 Block',
+        'DOMAIN-SUFFIX,miner.beeppool.org,🛑 Block',
+        'DOMAIN-SUFFIX,miner.cryptobara.com,🛑 Block',
+        'DOMAIN-SUFFIX,miner.nablabee.com,🛑 Block',
+        'DOMAIN-SUFFIX,miner.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,minerad.com,🛑 Block',
+        'DOMAIN-SUFFIX,minero-proxy-01.now.sh,🛑 Block',
+        'DOMAIN-SUFFIX,minero-proxy-02.now.sh,🛑 Block',
+        'DOMAIN-SUFFIX,minero-proxy-03.now.sh,🛑 Block',
+        'DOMAIN-SUFFIX,minero.pw,🛑 Block',
+        'DOMAIN-SUFFIX,minescripts.info,🛑 Block',
+        'DOMAIN-SUFFIX,minexmr.stream,🛑 Block',
+        'DOMAIN-SUFFIX,minr.pw,🛑 Block',
+        'DOMAIN-SUFFIX,mm.zubovskaya-banya.ru,🛑 Block',
+        'DOMAIN-SUFFIX,mon-deu-1.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,mon-deu-2.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,mon-deu-3.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,mon-fra-1.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,mon-fra-2.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,mon-gbr-1.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,monero-miner.com,🛑 Block',
+        'DOMAIN-SUFFIX,monerominer.rocks,🛑 Block',
+        'DOMAIN-SUFFIX,money-maker-default.info,🛑 Block',
+        'DOMAIN-SUFFIX,mxcdn1.now.sh,🛑 Block',
+        'DOMAIN-SUFFIX,mxcdn2.now.sh,🛑 Block',
+        'DOMAIN-SUFFIX,my.domain,🛑 Block',
+        'DOMAIN-SUFFIX,nametraff.com,🛑 Block',
+        'DOMAIN-SUFFIX,nathetsof.com,🛑 Block',
+        'DOMAIN-SUFFIX,nch-software.info,🛑 Block',
+        'DOMAIN-SUFFIX,nerohut.com,🛑 Block',
+        'DOMAIN-SUFFIX,new.minr.pw,🛑 Block',
+        'DOMAIN-SUFFIX,nfwebminer.com,🛑 Block',
+        'DOMAIN-SUFFIX,niematego.tk,🛑 Block',
+        'DOMAIN-SUFFIX,nim.sh,🛑 Block',
+        'DOMAIN-SUFFIX,nimiq.icemining.ca,🛑 Block',
+        'DOMAIN-SUFFIX,nimiq.terorie.com,🛑 Block',
+        'DOMAIN-SUFFIX,nimiqpool.com,🛑 Block',
+        'DOMAIN-SUFFIX,nimwss-us-shark.lolopool.com,🛑 Block',
+        'DOMAIN-SUFFIX,ninaning.com,🛑 Block',
+        'DOMAIN-SUFFIX,nitrokod.com,🛑 Block',
+        'DOMAIN-SUFFIX,nmq.zxnexus.com,🛑 Block',
+        'DOMAIN-SUFFIX,node.nimiq.watch,🛑 Block',
+        'DOMAIN-SUFFIX,notmining.org,🛑 Block',
+        'DOMAIN-SUFFIX,npcdn1.now.sh,🛑 Block',
+        'DOMAIN-SUFFIX,nvidia-graphics.top,🛑 Block',
+        'DOMAIN-SUFFIX,nvidiacenter.com,🛑 Block',
+        'DOMAIN-SUFFIX,ocean2.authcaptcha.com,🛑 Block',
+        'DOMAIN-SUFFIX,offerreality.com,🛑 Block',
+        'DOMAIN-SUFFIX,ogrid.org,🛑 Block',
+        'DOMAIN-SUFFIX,okeyletsgo.ml,🛑 Block',
+        'DOMAIN-SUFFIX,p.estream.to,🛑 Block',
+        'DOMAIN-SUFFIX,panelsave.com,🛑 Block',
+        'DOMAIN-SUFFIX,panger-top.click,🛑 Block',
+        'DOMAIN-SUFFIX,papoto.com,🛑 Block',
+        'DOMAIN-SUFFIX,party-vqgdyvoycc.now.sh,🛑 Block',
+        'DOMAIN-SUFFIX,pearno.com,🛑 Block',
+        'DOMAIN-SUFFIX,pertholin.com,🛑 Block',
+        'DOMAIN-SUFFIX,play.estream.to,🛑 Block',
+        'DOMAIN-SUFFIX,play.estream.xyz,🛑 Block',
+        'DOMAIN-SUFFIX,play.gramombird.com,🛑 Block',
+        'DOMAIN-SUFFIX,play.istlandoll.com,🛑 Block',
+        'DOMAIN-SUFFIX,play.mine.gay-hotvideo.net,🛑 Block',
+        'DOMAIN-SUFFIX,play.nexioniect.com,🛑 Block',
+        'DOMAIN-SUFFIX,play.on.animeteatr.ru,🛑 Block',
+        'DOMAIN-SUFFIX,play.pampopholf.com,🛑 Block',
+        'DOMAIN-SUFFIX,play.play.estream.to,🛑 Block',
+        'DOMAIN-SUFFIX,play.play.estream.xyz,🛑 Block',
+        'DOMAIN-SUFFIX,play.tercabilis.info,🛑 Block',
+        'DOMAIN-SUFFIX,play.video2.stream.vidzi.tv,🛑 Block',
+        'DOMAIN-SUFFIX,play.vidzi.tv,🛑 Block',
+        'DOMAIN-SUFFIX,pool.hws.ru,🛑 Block',
+        'DOMAIN-SUFFIX,pr0gram.org,🛑 Block',
+        'DOMAIN-SUFFIX,premiumstats.xyz,🛑 Block',
+        'DOMAIN-SUFFIX,proofly.win,🛑 Block',
+        'DOMAIN-SUFFIX,proxy-can-1.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,proxy-deu-1.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,proxy-deu-2.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,proxy-fra-3.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,proxy-gbr-1.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,proxy-pol-1.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,proxy-pol-2.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,reauthenticator.com,🛑 Block',
+        'DOMAIN-SUFFIX,renhertfo.com,🛑 Block',
+        'DOMAIN-SUFFIX,roastedvolt.net,🛑 Block',
+        'DOMAIN-SUFFIX,rock.reauthenticator.com,🛑 Block',
+        'DOMAIN-SUFFIX,rock2.authcaptcha.com,🛑 Block',
+        'DOMAIN-SUFFIX,rocks.io,🛑 Block',
+        'DOMAIN-SUFFIX,s01.hostcontent.live,🛑 Block',
+        'DOMAIN-SUFFIX,s03.hostcontent.live,🛑 Block',
+        'DOMAIN-SUFFIX,s04.hostcontent.live,🛑 Block',
+        'DOMAIN-SUFFIX,s05.hostcontent.live,🛑 Block',
+        'DOMAIN-SUFFIX,s07.hostcontent.live,🛑 Block',
+        'DOMAIN-SUFFIX,s100.hostcontent.live,🛑 Block',
+        'DOMAIN-SUFFIX,s11.hostcontent.live,🛑 Block',
+        'DOMAIN-SUFFIX,s12.hostcontent.live,🛑 Block',
+        'DOMAIN-SUFFIX,s13.hostcontent.live,🛑 Block',
+        'DOMAIN-SUFFIX,s3.pampopholf.com,🛑 Block',
+        'DOMAIN-SUFFIX,sass2.authcaptcha.com,🛑 Block',
+        'DOMAIN-SUFFIX,scaleway.ovh,🛑 Block',
+        'DOMAIN-SUFFIX,sea2.authcaptcha.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-1.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-1.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-1.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-10.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-10.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-10.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-11.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-11.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-11.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-12.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-12.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-12.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-13.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-13.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-13.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-14.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-14.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-14.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-15.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-15.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-15.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-16.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-16.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-16.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-17.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-17.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-17.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-18.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-18.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-18.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-19.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-19.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-19.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-2.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-2.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-2.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-20.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-20.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-20.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-3.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-3.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-3.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-4.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-4.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-4.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-5.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-5.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-5.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-6.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-6.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-6.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-7.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-7.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-7.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-8.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-8.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-8.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-9.nimiq-network.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-9.nimiq.com,🛑 Block',
+        'DOMAIN-SUFFIX,seed-9.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-can-1.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-can-2.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-deu-1.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-deu-2.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-deu-3.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-deu-4.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-fra-1.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-fra-3.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-gbr-1.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-gbr-2.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-pol-1.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-pol-2.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-pol-3.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed-pol-4.inf.nimiq.network,🛑 Block',
+        'DOMAIN-SUFFIX,seed.nimiq.by,🛑 Block',
+        'DOMAIN-SUFFIX,seed.nimiq.jp,🛑 Block',
+        'DOMAIN-SUFFIX,seed.nimiqpool.com,🛑 Block',
+        'DOMAIN-SUFFIX,serie-vostfr.com,🛑 Block',
+        'DOMAIN-SUFFIX,serv1swork.com,🛑 Block',
+        'DOMAIN-SUFFIX,service4refresh.info,🛑 Block',
+        'DOMAIN-SUFFIX,silimbompom.com,🛑 Block',
+        'DOMAIN-SUFFIX,site.flashx.cc,🛑 Block',
+        'DOMAIN-SUFFIX,sparechange.io,🛑 Block',
+        'DOMAIN-SUFFIX,srcip.com,🛑 Block',
+        'DOMAIN-SUFFIX,srcips.com,🛑 Block',
+        'DOMAIN-SUFFIX,statdynamic.com,🛑 Block',
+        'DOMAIN-SUFFIX,static.sparechange.io,🛑 Block',
+        'DOMAIN-SUFFIX,staticsfs.host,🛑 Block',
+        'DOMAIN-SUFFIX,stone2.authcaptcha.com,🛑 Block',
+        'DOMAIN-SUFFIX,stonecalcom.com,🛑 Block',
+        'DOMAIN-SUFFIX,str1kee.com,🛑 Block',
+        'DOMAIN-SUFFIX,sunnimiq.cf,🛑 Block',
+        'DOMAIN-SUFFIX,sunnimiq5.cf,🛑 Block',
+        'DOMAIN-SUFFIX,sunnimiq6.cf,🛑 Block',
+        'DOMAIN-SUFFIX,swiftmining.win,🛑 Block',
+        'DOMAIN-SUFFIX,sxcdn02.now.sh,🛑 Block',
+        'DOMAIN-SUFFIX,sxcdn1.herokuapp.com,🛑 Block',
+        'DOMAIN-SUFFIX,sxcdn4.now.sh,🛑 Block',
+        'DOMAIN-SUFFIX,sxcdn5.herokuapp.com,🛑 Block',
+        'DOMAIN-SUFFIX,sxcdn6.now.sh,🛑 Block',
+        'DOMAIN-SUFFIX,test.minr.pw,🛑 Block',
+        'DOMAIN-SUFFIX,thewhizmarketing.com,🛑 Block',
+        'DOMAIN-SUFFIX,thewhizproducts.com,🛑 Block',
+        'DOMAIN-SUFFIX,thewise.com,🛑 Block',
+        'DOMAIN-SUFFIX,traffic.tc-clicks.com,🛑 Block',
+        'DOMAIN-SUFFIX,trustaproiam.de,🛑 Block',
+        'DOMAIN-SUFFIX,trusteverything.de,🛑 Block',
+        'DOMAIN-SUFFIX,tulip18.com,🛑 Block',
+        'DOMAIN-SUFFIX,uoldid.ru,🛑 Block',
+        'DOMAIN-SUFFIX,us.cfcdist.loan,🛑 Block',
+        'DOMAIN-SUFFIX,vceilinichego.ru,🛑 Block',
+        'DOMAIN-SUFFIX,verifier.live,🛑 Block',
+        'DOMAIN-SUFFIX,video.streaming.estream.to,🛑 Block',
+        'DOMAIN-SUFFIX,videoplayer2.xyz,🛑 Block',
+        'DOMAIN-SUFFIX,vkcdnservice.com,🛑 Block',
+        'DOMAIN-SUFFIX,vmi503011.contaboserver.net,🛑 Block',
+        'DOMAIN-SUFFIX,vuryua.ru,🛑 Block',
+        'DOMAIN-SUFFIX,webapi.salamantex.com,🛑 Block',
+        'DOMAIN-SUFFIX,webapi.staging.salamantex.com,🛑 Block',
+        'DOMAIN-SUFFIX,webassembly.stream,🛑 Block',
+        'DOMAIN-SUFFIX,webmine.cz,🛑 Block',
+        'DOMAIN-SUFFIX,webmine.pro,🛑 Block',
+        'DOMAIN-SUFFIX,webminepool.com,🛑 Block',
+        'DOMAIN-SUFFIX,webminerpool.com,🛑 Block',
+        'DOMAIN-SUFFIX,webmining.co,🛑 Block',
+        'DOMAIN-SUFFIX,webxmr.com,🛑 Block',
+        'DOMAIN-SUFFIX,wordc.ga,🛑 Block',
+        'DOMAIN-SUFFIX,wp-monero-miner.de,🛑 Block',
+        'DOMAIN-SUFFIX,wpcdn1.herokuapp.com,🛑 Block',
+        'DOMAIN-SUFFIX,wss.nablabee.com,🛑 Block',
+        'DOMAIN-SUFFIX,wss.rand.com.ru,🛑 Block',
+        'DOMAIN-SUFFIX,wtm.monitoringservice.co,🛑 Block',
+        'DOMAIN-SUFFIX,xmr.2miners.com,🛑 Block',
+        'DOMAIN-SUFFIX,xmr.cool,🛑 Block',
+        'DOMAIN-SUFFIX,zymerget.win,🛑 Block',
+        // 漏网之鱼
+        'MATCH,🐟 漏网之鱼',
+    ],
+];

+ 52 - 0
config/clients.json

@@ -0,0 +1,52 @@
+{
+    "clients":[
+        {
+            "name": "Clash Verge",
+            "tagMethod": "github_release",
+            "gitRepo": "clash-verge-rev/clash-verge-rev",
+            "savePath": "public/clients/",
+            "downloads": [
+                {
+                    "sourceName": "Clash.Verge_%tagName1%_x64-setup.exe",
+                    "saveName": "Clash.Verge.exe"
+                },
+                {
+                    "sourceName": "Clash.Verge_%tagName1%_aarch64.dmg",
+                    "saveName": "Clash.Verge_aarch64.dmg"
+                },
+                {
+                    "sourceName": "clash-verge_%tagName1%_amd64.AppImage.tar.gz",
+                    "saveName": "Clash.Verge.AppImage.tar.gz"
+                }
+            ]
+        },
+        {
+            "name": "Clash.Meta For Android",
+            "tagMethod": "github_release",
+            "gitRepo": "MetaCubeX/ClashMetaForAndroid",
+            "savePath": "public/clients/",
+            "downloads": [
+                {
+                    "sourceName": "cmfa-%tagName1%-meta-universal-release.apk ",
+                    "saveName": "CMFA.apk"
+                }
+            ]
+        },
+        {
+            "name": "sing-box",
+            "tagMethod": "github_release",
+            "gitRepo": "SagerNet/sing-box",
+            "savePath": "public/clients/",
+            "downloads": [
+                {
+                    "sourceName": "SFA-%tagName1%-universal.apk",
+                    "saveName": "SFA.apk"
+                },
+                {
+                    "sourceName": "SFM-%tagName1%-universal.zip",
+                    "saveName": "SFM.zip"
+                }
+            ]
+        }
+    ]
+}

+ 1541 - 0
config/settings.json

@@ -0,0 +1,1541 @@
+[
+    {
+        "item": "payment_gateway",
+        "value": "[]",
+        "class": "billing",
+        "is_public": 1,
+        "type": "array",
+        "default": "[]",
+        "mark": "支付网关"
+    },
+    {
+        "item": "f2f_pay_app_id",
+        "value": "",
+        "class": "billing",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "当面付AppID"
+    },
+    {
+        "item": "f2f_pay_pid",
+        "value": "",
+        "class": "billing",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "当面付PID"
+    },
+    {
+        "item": "f2f_pay_public_key",
+        "value": "",
+        "class": "billing",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "当面付公钥"
+    },
+    {
+        "item": "f2f_pay_private_key",
+        "value": "",
+        "class": "billing",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "当面付私钥"
+    },
+    {
+        "item": "f2f_pay_notify_url",
+        "value": "",
+        "class": "billing",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "当面付自定义回调地址"
+    },
+    {
+        "item": "stripe_api_key",
+        "value": "",
+        "class": "billing",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Stripe API Key"
+    },
+    {
+        "item": "stripe_endpoint_secret",
+        "value": "",
+        "class": "billing",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Stripe Endpoint Secret"
+    },
+    {
+        "item": "stripe_currency",
+        "value": "USD",
+        "class": "billing",
+        "is_public": 0,
+        "type": "string",
+        "default": "USD",
+        "mark": "Stripe Currency"
+    },
+    {
+        "item": "stripe_min_recharge",
+        "value": "10",
+        "class": "billing",
+        "is_public": 1,
+        "type": "int",
+        "default": "10",
+        "mark": "Stripe minimum recharge amount"
+    },
+    {
+        "item": "stripe_max_recharge",
+        "value": "1000",
+        "class": "billing",
+        "is_public": 1,
+        "type": "int",
+        "default": "1000",
+        "mark": "Stripe maximum recharge amount"
+    },
+    {
+        "item": "stripe_card",
+        "value": "0",
+        "class": "billing",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "Stripe Card Payment"
+    },
+    {
+        "item": "stripe_alipay",
+        "value": "0",
+        "class": "billing",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "Stripe Alipay Payment"
+    },
+    {
+        "item": "stripe_wechat",
+        "value": "0",
+        "class": "billing",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "Stripe WeChat Payment"
+    },
+    {
+        "item": "epay_url",
+        "value": "",
+        "class": "billing",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "易支付url"
+    },
+	{
+        "item": "epay_pid",
+        "value": "",
+        "class": "billing",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "易支付商户ID"
+    },
+	{
+        "item": "epay_key",
+        "value": "",
+        "class": "billing",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "易支付商户Key"
+    },
+    {
+        "item": "epay_sign_type",
+        "value": "sha256",
+        "class": "billing",
+        "is_public": 0,
+        "type": "string",
+        "default": "sha256",
+        "mark": "易支付签名方式"
+    },
+    {
+        "item": "epay_alipay",
+        "value": "1",
+        "class": "billing",
+        "is_public": 1,
+        "type": "bool",
+        "default": "1",
+        "mark": "启用支付宝"
+    },
+    {
+        "item": "epay_wechat",
+        "value": "0",
+        "class": "billing",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "启用微信支付"
+    },
+    {
+        "item": "epay_qq",
+        "value": "0",
+        "class": "billing",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "启用QQ钱包"
+    },
+    {
+        "item": "epay_usdt",
+        "value": "0",
+        "class": "billing",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "启用USDT"
+    },
+    {
+        "item": "paypal_mode",
+        "value": "live",
+        "class": "billing",
+        "is_public": 0,
+        "type": "string",
+        "default": "live",
+        "mark": "PayPal模式"
+    },
+    {
+        "item": "paypal_client_id",
+        "value": "",
+        "class": "billing",
+        "is_public": 1,
+        "type": "string",
+        "default": "",
+        "mark": "PayPal客戶ID"
+    },
+    {
+        "item": "paypal_client_secret",
+        "value": "",
+        "class": "billing",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "PayPal客戶密钥"
+    },
+    {
+        "item": "paypal_currency",
+        "value": "USD",
+        "class": "billing",
+        "is_public": 1,
+        "type": "string",
+        "default": "USD",
+        "mark": "PayPal货币"
+    },
+    {
+        "item": "paypal_locale",
+        "value": "en_US",
+        "class": "billing",
+        "is_public": 0,
+        "type": "string",
+        "default": "en_US",
+        "mark": "PayPal语言"
+    },
+    {
+        "item": "email_driver",
+        "value": "none",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "none",
+        "mark": "邮件服务提供商"
+    },
+    {
+        "item": "smtp_host",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "smtp发信主机"
+    },
+    {
+        "item": "smtp_username",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "smtp账户名称"
+    },
+    {
+        "item": "smtp_password",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "smtp账户密码"
+    },
+    {
+        "item": "smtp_port",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "smtp发信端口"
+    },
+    {
+        "item": "smtp_name",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "smtp发信名称"
+    },
+    {
+        "item": "smtp_sender",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "smtp发信地址"
+    },
+    {
+        "item": "smtp_ssl",
+        "value": "1",
+        "class": "email",
+        "is_public": 0,
+        "type": "bool",
+        "default": "1",
+        "mark": "是否使用 TLS\/SSL 发信"
+    },
+    {
+        "item": "smtp_bbc",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "发给用户的邮件密送给指定邮箱备份"
+    },
+    {
+        "item": "mailgun_key",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "mailgun密钥"
+    },
+    {
+        "item": "mailgun_domain",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "mailgun域名"
+    },
+    {
+        "item": "mailgun_sender",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "mailgun发件邮箱"
+    },
+    {
+        "item": "mailgun_sender_name",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "mailgun发信人名称"
+    },
+    {
+        "item": "sendgrid_key",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "sendgrid密钥"
+    },
+    {
+        "item": "sendgrid_sender",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "sendgrid发件邮箱"
+    },
+    {
+        "item": "sendgrid_name",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "sendgrid发件人名称"
+    },
+    {
+        "item": "postal_host",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Postal API地址"
+    },
+    {
+        "item": "postal_key",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Postal API密钥"
+    },
+    {
+        "item": "postal_sender",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Postal发件邮箱"
+    },
+    {
+        "item": "postal_name",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Postal发件人名称"
+    },
+    {
+        "item": "aws_ses_access_key_id",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "aws密钥id"
+    },
+    {
+        "item": "aws_ses_access_key_secret",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "aws密钥key"
+    },
+    {
+        "item": "aws_ses_region",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "aws区域"
+    },
+    {
+        "item": "aws_ses_sender",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "AWS SES Sender"
+    },
+    {
+        "item": "mailchimp_key",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Mailchimp Api Key"
+    },
+    {
+        "item": "mailchimp_from_email",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Mailchimp From Email"
+    },
+    {
+        "item": "mailchimp_from_name",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Mailchimp From Name"
+    },
+    {
+        "item": "alibabacloud_dm_access_key_id",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "AlibabaCloud DM Access Key ID"
+    },
+    {
+        "item": "alibabacloud_dm_access_key_secret",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "AlibabaCloud DM Access Key Secret"
+    },
+    {
+        "item": "alibabacloud_dm_endpoint",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "AlibabaCloud DM Endpoint"
+    },
+    {
+        "item": "alibabacloud_dm_account_name",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "AlibabaCloud DM Account Name"
+    },
+    {
+        "item": "alibabacloud_dm_from_alias",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "AlibabaCloud DM From Alias"
+    },
+    {
+        "item": "email_verify_code_ttl",
+        "value": "3600",
+        "class": "email",
+        "is_public": 0,
+        "type": "int",
+        "default": "3600",
+        "mark": "邮箱验证码有效期"
+    },
+    {
+        "item": "email_password_reset_ttl",
+        "value": "3600",
+        "class": "email",
+        "is_public": 0,
+        "type": "int",
+        "default": "3600",
+        "mark": "邮箱重设密码链接有效期"
+    },
+    {
+        "item": "email_request_ip_limit",
+        "value": "3",
+        "class": "email",
+        "is_public": 0,
+        "type": "int",
+        "default": "3",
+        "mark": "单个IP每小时可请求的发信次数"
+    },
+    {
+        "item": "email_request_address_limit",
+        "value": "3",
+        "class": "email",
+        "is_public": 0,
+        "type": "int",
+        "default": "3",
+        "mark": "单个邮箱地址每小时可请求的发信次数"
+    },
+    {
+        "item": "captcha_provider",
+        "value": "turnstile",
+        "class": "captcha",
+        "is_public": 1,
+        "type": "string",
+        "default": "turnstile",
+        "mark": "验证码提供商"
+    },
+    {
+        "item": "enable_reg_captcha",
+        "value": "0",
+        "class": "captcha",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "注册验证码"
+    },
+    {
+        "item": "enable_login_captcha",
+        "value": "0",
+        "class": "captcha",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "登录验证码"
+    },
+    {
+        "item": "enable_checkin_captcha",
+        "value": "0",
+        "class": "captcha",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "签到验证码"
+    },
+    {
+        "item": "enable_reset_password_captcha",
+        "value": "0",
+        "class": "captcha",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "重置密码验证码"
+    },
+    {
+        "item": "turnstile_sitekey",
+        "value": "",
+        "class": "captcha",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Turnstile网站密钥"
+    },
+    {
+        "item": "turnstile_secret",
+        "value": "",
+        "class": "captcha",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Turnstile密钥"
+    },
+    {
+        "item": "geetest_id",
+        "value": "",
+        "class": "captcha",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "极验id"
+    },
+    {
+        "item": "geetest_key",
+        "value": "",
+        "class": "captcha",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "极验密钥"
+    },
+    {
+        "item": "hcaptcha_sitekey",
+        "value": "",
+        "class": "captcha",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "hCaptcha Site Key"
+    },
+    {
+        "item": "hcaptcha_secret",
+        "value": "",
+        "class": "captcha",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "hCaptcha Secret"
+    },
+    {
+        "item": "enable_telegram",
+        "value": "0",
+        "class": "im",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "是否启用Telegram机器人"
+    },
+    {
+        "item": "telegram_token",
+        "value": "",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Telegram Bot Token"
+    },
+    {
+        "item": "telegram_chatid",
+        "value": "-1",
+        "class": "im",
+        "is_public": 0,
+        "type": "int",
+        "default": "-1",
+        "mark": "Telegram 群组会话 ID"
+    },
+    {
+        "item": "telegram_bot",
+        "value": "_bot",
+        "class": "im",
+        "is_public": 1,
+        "type": "string",
+        "default": "_bot",
+        "mark": "Telegram 机器人账号"
+    },
+    {
+        "item": "telegram_request_token",
+        "value": "",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Telegram Webhook 密钥"
+    },
+    {
+        "item": "telegram_add_node",
+        "value": "1",
+        "class": "im",
+        "is_public": 0,
+        "type": "bool",
+        "default": "1",
+        "mark": "是否启用Telegram机器人添加节点通知"
+    },
+    {
+        "item": "telegram_add_node_text",
+        "value": "%node_name% 已被添加",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "%node_name% 已被添加",
+        "mark": "Telegram机器人添加节点通知文本"
+    },
+    {
+        "item": "telegram_update_node",
+        "value": "1",
+        "class": "im",
+        "is_public": 0,
+        "type": "bool",
+        "default": "1",
+        "mark": "是否启用Telegram机器人修改节点通知"
+    },
+    {
+        "item": "telegram_update_node_text",
+        "value": "%node_name% 已被修改",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "%node_name% 已被修改",
+        "mark": "Telegram机器人修改节点通知文本"
+    },
+    {
+        "item": "telegram_delete_node",
+        "value": "1",
+        "class": "im",
+        "is_public": 0,
+        "type": "bool",
+        "default": "1",
+        "mark": "是否启用Telegram机器人删除节点通知"
+    },
+    {
+        "item": "telegram_delete_node_text",
+        "value": "%node_name% 被刪除了",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "%node_name% 被刪除了",
+        "mark": "Telegram机器人删除节点通知文本"
+    },
+    {
+        "item": "telegram_node_gfwed",
+        "value": "1",
+        "class": "im",
+        "is_public": 0,
+        "type": "bool",
+        "default": "1",
+        "mark": "是否启用Telegram机器人节点被墙通知"
+    },
+    {
+        "item": "telegram_node_gfwed_text",
+        "value": "喵喵喵~ %node_name% 节点被墙了喵~",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "喵喵喵~ %node_name% 节点被墙了喵~",
+        "mark": "Telegram机器人节点被墙通知"
+    },
+    {
+        "item": "telegram_node_ungfwed",
+        "value": "1",
+        "class": "im",
+        "is_public": 0,
+        "type": "bool",
+        "default": "1",
+        "mark": "是否启用Telegram机器人节点被墙恢复通知"
+    },
+    {
+        "item": "telegram_node_ungfwed_text",
+        "value": "喵喵喵~ 被墙的 %node_name% 节点恢复了喵~",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "喵喵喵~ 被墙的 %node_name% 节点恢复了喵~",
+        "mark": "Telegram机器人节点被墙恢复文本"
+    },
+    {
+        "item": "telegram_node_online",
+        "value": "1",
+        "class": "im",
+        "is_public": 0,
+        "type": "bool",
+        "default": "1",
+        "mark": "是否启用Telegram机器人节点恢复上线通知"
+    },
+    {
+        "item": "telegram_node_online_text",
+        "value": "%node_name% 被修好了",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "%node_name% 被修好了",
+        "mark": "Telegram机器人节点恢复上线通知文本"
+    },
+    {
+        "item": "telegram_node_offline",
+        "value": "1",
+        "class": "im",
+        "is_public": 0,
+        "type": "bool",
+        "default": "1",
+        "mark": "是否启用Telegram机器人节点离线通知"
+    },
+    {
+        "item": "telegram_node_offline_text",
+        "value": "%node_name% 出现了一些故障",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "%node_name% 出现了一些故障",
+        "mark": "Telegram机器人节点离线通知文本"
+    },
+    {
+        "item": "telegram_daily_job",
+        "value": "1",
+        "class": "im",
+        "is_public": 0,
+        "type": "bool",
+        "default": "1",
+        "mark": "是否启用Telegram机器人每日任务通知"
+    },
+    {
+        "item": "telegram_daily_job_text",
+        "value": "成功执行每日任务",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "成功执行每日任务",
+        "mark": "Telegram机器人每日任务通知文本"
+    },
+    {
+        "item": "telegram_diary",
+        "value": "1",
+        "class": "im",
+        "is_public": 0,
+        "type": "bool",
+        "default": "1",
+        "mark": "是否启用Telegram机器人系统运行状况通知"
+    },
+    {
+        "item": "telegram_diary_text",
+        "value": "今日签到人数:%getTodayCheckinUser% \n 今日使用总流量:%lastday_total%",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "今日签到人数:%getTodayCheckinUser% \n 今日使用总流量:%lastday_total%",
+        "mark": "Telegram机器人系统运行状况通知文本"
+    },
+    {
+        "item": "telegram_unbind_kick_member",
+        "value": "0",
+        "class": "im",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "解绑Telegram账户后自动踢出群组"
+    },
+    {
+        "item": "telegram_group_bound_user",
+        "value": "0",
+        "class": "im",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "是否仅允许已绑定Telegram账户的用户加入群组"
+    },
+    {
+        "item": "enable_welcome_message",
+        "value": "0",
+        "class": "im",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "Telegram 机器人发送欢迎消息"
+    },
+    {
+        "item": "telegram_group_quiet",
+        "value": "1",
+        "class": "im",
+        "is_public": 0,
+        "type": "bool",
+        "default": "1",
+        "mark": "Telegram 机器人在群组中不回应"
+    },
+    {
+        "item": "allow_to_join_new_groups",
+        "value": "0",
+        "class": "im",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "允许 Bot 加入下方配置之外的群组"
+    },
+    {
+        "item": "group_id_allowed_to_join",
+        "value": "[]",
+        "class": "im",
+        "is_public": 0,
+        "type": "array",
+        "default": "[]",
+        "mark": "允许加入的群组 ID"
+    },
+    {
+        "item": "help_any_command",
+        "value": "0",
+        "class": "im",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "允许任意未知的命令触发 /help 的回复"
+    },
+    {
+        "item": "user_not_bind_reply",
+        "value": "您未绑定本站账号,您可以进入网站的 **资料编辑**,在右下方绑定您的账号。",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "您未绑定本站账号,您可以进入网站的 **资料编辑**,在右下方绑定您的账号。",
+        "mark": "未绑定账户的回复"
+    },
+    {
+        "item": "discord_bot_token",
+        "value": "",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Discord Bot Token"
+    },
+    {
+        "item": "discord_client_id",
+        "value": "0",
+        "class": "im",
+        "is_public": 0,
+        "type": "int",
+        "default": "0",
+        "mark": "Discord Client ID"
+    },
+    {
+        "item": "discord_client_secret",
+        "value": "",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Discord Client Secret"
+    },
+    {
+        "item": "discord_guild_id",
+        "value": "0",
+        "class": "im",
+        "is_public": 0,
+        "type": "int",
+        "default": "0",
+        "mark": "Discord Guild ID"
+    },
+    {
+        "item": "slack_token",
+        "value": "",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Slack App Token"
+    },
+    {
+        "item": "slack_client_id",
+        "value": "",
+        "class": "im",
+        "is_public": 0,
+        "type": "",
+        "default": "string",
+        "mark": "Slack Client ID"
+    },
+    {
+        "item": "slack_client_secret",
+        "value": "",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Slack Client Secret"
+    },
+    {
+        "item": "slack_team_id",
+        "value": "",
+        "class": "im",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Slack Team ID"
+    },
+    {
+        "item": "crisp_id",
+        "value": "",
+        "class": "support",
+        "is_public": 1,
+        "type": "string",
+        "default": "",
+        "mark": "crisp_id"
+    },
+    {
+        "item": "livechat_license",
+        "value": "",
+        "class": "support",
+        "is_public": 1,
+        "type": "string",
+        "default": "",
+        "mark": "livechat_license"
+    },
+    {
+        "item": "live_chat",
+        "value": "none",
+        "class": "support",
+        "is_public": 1,
+        "type": "string",
+        "default": "none",
+        "mark": "客服系统开关"
+    },
+    {
+        "item": "enable_ticket",
+        "value": "1",
+        "class": "support",
+        "is_public": 1,
+        "type": "bool",
+        "default": "1",
+        "mark": "启用工单系统"
+    },
+    {
+        "item": "mail_ticket",
+        "value": "1",
+        "class": "support",
+        "is_public": 0,
+        "type": "bool",
+        "default": "1",
+        "mark": "启用工单邮件提醒"
+    },
+    {
+        "item": "ticket_limit",
+        "value": "3",
+        "class": "support",
+        "is_public": 0,
+        "type": "int",
+        "default": "3",
+        "mark": "用戶工单配額(每月)"
+    },
+    {
+        "item": "reg_mode",
+        "value": "open",
+        "class": "reg",
+        "is_public": 1,
+        "type": "string",
+        "default": "open",
+        "mark": "注册模式"
+    },
+    {
+        "item": "reg_email_verify",
+        "value": "0",
+        "class": "reg",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "邮箱验证"
+    },
+    {
+        "item": "random_group",
+        "value": "0",
+        "class": "reg",
+        "is_public": 0,
+        "type": "string",
+        "default": "0",
+        "mark": "注册时随机分配到的分组"
+    },
+    {
+        "item": "min_port",
+        "value": "10000",
+        "class": "reg",
+        "is_public": 1,
+        "type": "int",
+        "default": "10000",
+        "mark": "用户端口池最小值"
+    },
+    {
+        "item": "max_port",
+        "value": "65535",
+        "class": "reg",
+        "is_public": 1,
+        "type": "int",
+        "default": "65535",
+        "mark": "用户端口池最大值"
+    },
+    {
+        "item": "free_user_reset_day",
+        "value": "0",
+        "class": "reg",
+        "is_public": 0,
+        "type": "int",
+        "default": "0",
+        "mark": "免费用戶的流量重置日"
+    },
+    {
+        "item": "free_user_reset_bandwidth",
+        "value": "0",
+        "class": "reg",
+        "is_public": 0,
+        "type": "int",
+        "default": "0",
+        "mark": "需要重置的免费流量"
+    },
+    {
+        "item": "reg_traffic",
+        "value": "0",
+        "class": "reg",
+        "is_public": 0,
+        "type": "int",
+        "default": "0",
+        "mark": "注册流量(GB)"
+    },
+    {
+        "item": "reg_ip_limit",
+        "value": "0",
+        "class": "reg",
+        "is_public": 0,
+        "type": "int",
+        "default": "0",
+        "mark": "注册连接 IP 限制"
+    },
+    {
+        "item": "reg_speed_limit",
+        "value": "0",
+        "class": "reg",
+        "is_public": 0,
+        "type": "int",
+        "default": "0",
+        "mark": "注册速率限制"
+    },
+    {
+        "item": "reg_class",
+        "value": "0",
+        "class": "reg",
+        "is_public": 0,
+        "type": "int",
+        "default": "0",
+        "mark": "注册等级"
+    },
+    {
+        "item": "reg_class_time",
+        "value": "0",
+        "class": "reg",
+        "is_public": 0,
+        "type": "int",
+        "default": "0",
+        "mark": "注册等级过期时间(天)"
+    },
+    {
+        "item": "reg_method",
+        "value": "aes-128-gcm",
+        "class": "reg",
+        "is_public": 0,
+        "type": "string",
+        "default": "aes-128-gcm",
+        "mark": "默认加密"
+    },
+    {
+        "item": "reg_daily_report",
+        "value": "0",
+        "class": "reg",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "是否默认接收每日用量邮件推送"
+    },
+    {
+        "item": "invite_reg_money_reward",
+        "value": "0",
+        "class": "ref",
+        "is_public": 1,
+        "type": "int",
+        "default": "0",
+        "mark": "邀请注册余额奖励(元)"
+    },
+    {
+        "item": "invite_reg_traffic_reward",
+        "value": "0",
+        "class": "ref",
+        "is_public": 1,
+        "type": "int",
+        "default": "0",
+        "mark": "邀请注册流量奖励(GB)"
+    },
+    {
+        "item": "invite_mode",
+        "value": "reg_only",
+        "class": "ref",
+        "is_public": 0,
+        "type": "string",
+        "default": "reg_only",
+        "mark": "邀请模式"
+    },
+    {
+        "item": "invite_reward_mode",
+        "value": "reward_count",
+        "class": "ref",
+        "is_public": 0,
+        "type": "string",
+        "default": "reward_count",
+        "mark": "返利模式"
+    },
+    {
+        "item": "invite_reward_rate",
+        "value": "0.2",
+        "class": "ref",
+        "is_public": 1,
+        "type": "string",
+        "default": "0.2",
+        "mark": "返利比例"
+    },
+    {
+        "item": "invite_reward_count_limit",
+        "value": "1",
+        "class": "ref",
+        "is_public": 0,
+        "type": "string",
+        "default": "1",
+        "mark": "返利次数限制"
+    },
+    {
+        "item": "invite_reward_total_limit",
+        "value": "50",
+        "class": "ref",
+        "is_public": 0,
+        "type": "int",
+        "default": "50",
+        "mark": "返利金额限制"
+    },
+    {
+        "item": "display_detect_log",
+        "value": "1",
+        "class": "feature",
+        "is_public": 1,
+        "type": "bool",
+        "default": "1",
+        "mark": "显示用户审计记录"
+    },
+    {
+        "item": "display_docs",
+        "value": "1",
+        "class": "feature",
+        "is_public": 1,
+        "type": "bool",
+        "default": "1",
+        "mark": "显示文档"
+    },
+    {
+        "item": "display_docs_only_for_paid_user",
+        "value": "0",
+        "class": "feature",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "文档仅付费用户可见"
+    },
+    {
+        "item": "traffic_log",
+        "value": "0",
+        "class": "feature",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "启用每小时使用流量日志"
+    },
+    {
+        "item": "traffic_log_retention_days",
+        "value": "7",
+        "class": "feature",
+        "is_public": 0,
+        "type": "int",
+        "default": "7",
+        "mark": "流量日志保留天数"
+    },
+    {
+        "item": "subscribe_log",
+        "value": "0",
+        "class": "feature",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "启用订阅日志"
+    },
+    {
+        "item": "subscribe_log_retention_days",
+        "value": "7",
+        "class": "feature",
+        "is_public": 1,
+        "type": "int",
+        "default": "7",
+        "mark": "订阅日志保留天数"
+    },
+    {
+        "item": "notify_new_subscribe",
+        "value": "0",
+        "class": "feature",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "通知用户新IP订阅"
+    },
+    {
+        "item": "login_log",
+        "value": "1",
+        "class": "feature",
+        "is_public": 1,
+        "type": "bool",
+        "default": "1",
+        "mark": "启用登录日志"
+    },
+    {
+        "item": "notify_new_login",
+        "value": "0",
+        "class": "feature",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "通知用户新IP登录"
+    },
+    {
+        "item": "enable_checkin",
+        "value": "0",
+        "class": "feature",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "签到开关"
+    },
+    {
+        "item": "checkin_min",
+        "value": "1",
+        "class": "feature",
+        "is_public": 1,
+        "type": "int",
+        "default": "1",
+        "mark": "签到最少流量"
+    },
+    {
+        "item": "checkin_max",
+        "value": "50",
+        "class": "feature",
+        "is_public": 1,
+        "type": "int",
+        "default": "50",
+        "mark": "签到最多流量"
+    },
+    {
+        "item": "enable_forced_replacement",
+        "value": "1",
+        "class": "subscribe",
+        "is_public": 0,
+        "type": "bool",
+        "default": "1",
+        "mark": "用户修改账户登录密码时,是否强制更换订阅地址"
+    },
+    {
+        "item": "enable_ss_sub",
+        "value": "1",
+        "class": "subscribe",
+        "is_public": 1,
+        "type": "bool",
+        "default": "1",
+        "mark": "Shadowsocks 订阅开关"
+    },
+    {
+        "item": "enable_v2_sub",
+        "value": "1",
+        "class": "subscribe",
+        "is_public": 1,
+        "type": "bool",
+        "default": "1",
+        "mark": "V2Ray 订阅开关"
+    },
+    {
+        "item": "enable_trojan_sub",
+        "value": "1",
+        "class": "subscribe",
+        "is_public": 1,
+        "type": "bool",
+        "default": "1",
+        "mark": "Trojan 订阅开关"
+    },
+    {
+        "item": "enable_daily_finance_mail",
+        "value": "0",
+        "class": "cron",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "是否启用每日财务报告"
+    },
+    {
+        "item": "enable_weekly_finance_mail",
+        "value": "0",
+        "class": "cron",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "是否启用每周财务报告"
+    },
+    {
+        "item": "enable_monthly_finance_mail",
+        "value": "0",
+        "class": "cron",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "是否启用每月财务报告"
+    },
+    {
+        "item": "enable_detect_gfw",
+        "value": "0",
+        "class": "cron",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "是否启用节点被墙检测"
+    },
+    {
+        "item": "enable_detect_ban",
+        "value": "0",
+        "class": "cron",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "是否启用审计封禁"
+    },
+    {
+        "item": "enable_detect_inactive_user",
+        "value": "0",
+        "class": "cron",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "是否启用闲置用户检测"
+    },
+    {
+        "item": "detect_inactive_user_checkin_days",
+        "value": "90",
+        "class": "cron",
+        "is_public": 0,
+        "type": "int",
+        "default": "90",
+        "mark": "未签到时长(天)"
+    },
+    {
+        "item": "detect_inactive_user_login_days",
+        "value": "90",
+        "class": "cron",
+        "is_public": 0,
+        "type": "int",
+        "default": "90",
+        "mark": "未登录时长(天)"
+    },
+    {
+        "item": "detect_inactive_user_use_days",
+        "value": "90",
+        "class": "cron",
+        "is_public": 0,
+        "type": "int",
+        "default": "90",
+        "mark": "未使用时长(天)"
+    },
+    {
+        "item": "remove_inactive_user_link_and_invite",
+        "value": "0",
+        "class": "cron",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "Enable remove link and invite of inactive user"
+    },
+    {
+        "item": "daily_job_hour",
+        "value": "0",
+        "class": "cron",
+        "is_public": 0,
+        "type": "int",
+        "default": "0",
+        "mark": "每日任务执行时间(小时)"
+    },
+    {
+        "item": "daily_job_minute",
+        "value": "0",
+        "class": "cron",
+        "is_public": 0,
+        "type": "int",
+        "default": "0",
+        "mark": "每日任务执行时间(分钟)"
+    },
+    {
+        "item": "last_daily_job_time",
+        "value": "0",
+        "class": "cron",
+        "is_public": 0,
+        "type": "int",
+        "default": "0",
+        "mark": "上次执行每日任务的时间"
+    },
+    {
+        "item": "db_version",
+        "value": "2023020100",
+        "class": "db",
+        "is_public": 0,
+        "type": "int",
+        "default": "2023020100",
+        "mark": "当前数据库版本"
+    }
+]

+ 416 - 0
db/migrations/2023020100-init.php

@@ -0,0 +1,416 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec(
+            "CREATE TABLE `announcement` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '公告ID',
+                `date` datetime NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '公告日期',
+                `content` longtext NOT NULL DEFAULT '' COMMENT '公告内容',
+                PRIMARY KEY (`id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `config` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '配置ID',
+                `item` varchar(255) NOT NULL DEFAULT '' COMMENT '配置项',
+                `value` varchar(2048) NOT NULL DEFAULT '' COMMENT '配置值',
+                `class` varchar(16) NOT NULL DEFAULT '' COMMENT '配置类别',
+                `is_public` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否为公共参数',
+                `type` varchar(16) NOT NULL DEFAULT '' COMMENT '配置值类型',
+                `default` varchar(2048) NOT NULL DEFAULT '' COMMENT '默认值',
+                `mark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
+                PRIMARY KEY (`id`),
+                KEY `item` (`item`),
+                KEY `class` (`class`),
+                KEY `is_public` (`is_public`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `detect_ban_log` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '封禁记录ID',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `detect_number` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '本次违规次数',
+                `ban_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '封禁时长',
+                `start_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '封禁开始时间',
+                `end_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '封禁结束时间',
+                `all_detect_number` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '累计违规次数',
+                PRIMARY KEY (`id`),
+                KEY `user_id` (`user_id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `detect_list` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '审计规则ID',
+                `name` varchar(255) NOT NULL DEFAULT '' COMMENT '规则名称',
+                `text` varchar(255) NOT NULL DEFAULT '' COMMENT '规则介绍',
+                `regex` varchar(255) NOT NULL DEFAULT '' COMMENT '正则表达式',
+                `type` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '规则类型',
+                PRIMARY KEY (`id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `detect_log` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '审计记录ID',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `list_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '规则ID',
+                `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '触发时间',
+                `node_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '节点ID',
+                `status` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '状态',
+                PRIMARY KEY (`id`),
+                KEY `user_id` (`user_id`),
+                KEY `list_id` (`list_id`),
+                KEY `node_id` (`node_id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `docs` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '文档ID',
+                `date` datetime NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '文档日期',
+                `title` varchar(255) NOT NULL DEFAULT '' COMMENT '文档标题',
+                `content` longtext NOT NULL DEFAULT '' COMMENT '文档内容',
+                PRIMARY KEY (`id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `email_queue` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `to_email` varchar(255) NOT NULL DEFAULT '' COMMENT '收件人邮箱',
+                `subject` varchar(255) NOT NULL DEFAULT '' COMMENT '邮件主题',
+                `template` varchar(255) NOT NULL DEFAULT '' COMMENT '邮件模板',
+                `array` longtext NOT NULL DEFAULT '{}' COMMENT '模板参数' CHECK (json_valid(`array`)),
+                `time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '添加时间',
+                PRIMARY KEY (`id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `gift_card` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '礼品卡ID',
+                `card` text NOT NULL DEFAULT '' COMMENT '卡号',
+                `balance` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '余额',
+                `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                `status` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '使用状态',
+                `use_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '使用时间',
+                `use_user` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '使用用户',
+                PRIMARY KEY (`id`),
+                KEY `id` (`id`),
+                KEY `status` (`status`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+            
+            CREATE TABLE `hourly_usage` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `date` date NOT NULL DEFAULT 0 COMMENT '记录日期',
+                `usage` longtext NOT NULL DEFAULT '{}' COMMENT '流量用量' CHECK (json_valid(`usage`)),
+                PRIMARY KEY (`id`),
+                KEY `user_id` (`user_id`),
+                KEY `date` (`date`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `invoice` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '账单ID',
+                `type` varchar(255) NOT NULL DEFAULT 'product' COMMENT '类型',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '归属用户ID',
+                `order_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '订单ID',
+                `content` longtext NOT NULL DEFAULT '{}' COMMENT '账单内容' CHECK (json_valid(`content`)),
+                `price` double unsigned NOT NULL DEFAULT 0 COMMENT '账单金额',
+                `status` varchar(255) NOT NULL DEFAULT '' COMMENT '账单状态',
+                `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                `update_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '更新时间',
+                `pay_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '支付时间',
+                PRIMARY KEY (`id`),
+                KEY `id` (`id`),
+                KEY `type` (`type`),
+                KEY `user_id` (`user_id`),
+                KEY `order_id` (`order_id`),
+                KEY `status` (`status`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `link` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `token` varchar(255) NOT NULL DEFAULT '' COMMENT '订阅token',
+                `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                PRIMARY KEY (`id`),
+                UNIQUE KEY `token` (`token`),
+                UNIQUE KEY `userid` (`userid`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `login_ip` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `ip` varchar(255) NOT NULL DEFAULT '' COMMENT '登录IP',
+                `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '登录时间',
+                `type` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '登录类型',
+                PRIMARY KEY (`id`),
+                KEY `userid` (`userid`),
+                KEY `type` (`type`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `node` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '节点ID',
+                `name` varchar(255) NOT NULL DEFAULT '' COMMENT '节点名称',
+                `type` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '节点启用',
+                `server` varchar(255) NOT NULL DEFAULT '' COMMENT '节点地址',
+                `custom_config` longtext NOT NULL DEFAULT '{}' COMMENT '自定义配置' CHECK (json_valid(`custom_config`)),
+                `sort` tinyint(2) unsigned NOT NULL DEFAULT 14 COMMENT '节点类型',
+                `traffic_rate` double unsigned NOT NULL DEFAULT 1 COMMENT '流量倍率',
+                `is_dynamic_rate` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否启用动态流量倍率',
+                `dynamic_rate_type` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '动态流量倍率计算方式',
+                `dynamic_rate_config` longtext NOT NULL DEFAULT '{}' COMMENT '动态流量倍率配置' CHECK (json_valid(`custom_config`)),
+                `node_class` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT '节点等级',
+                `node_speedlimit` double unsigned NOT NULL DEFAULT 0 COMMENT '节点限速',
+                `node_bandwidth` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '节点流量',
+                `node_bandwidth_limit` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '节点流量限制',
+                `bandwidthlimit_resetday` tinyint(2) unsigned NOT NULL DEFAULT 0 COMMENT '流量重置日',
+                `node_heartbeat` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '节点心跳',
+                `online_user` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '节点在线用户',
+                `ipv4` inet4 NOT NULL DEFAULT '127.0.0.1' COMMENT 'IPv4地址',
+                `ipv6` inet6 NOT NULL DEFAULT '::1' COMMENT 'IPv6地址',
+                `node_group` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT '节点群组',
+                `online` tinyint(1) NOT NULL DEFAULT 1 COMMENT '在线状态',
+                `gfw_block` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否被GFW封锁',
+                `password` varchar(255) NOT NULL DEFAULT '' COMMENT '后端连接密码',
+                PRIMARY KEY (`id`),
+                UNIQUE KEY `password` (`password`),
+                KEY `type` (`type`),
+                KEY `sort` (`sort`),
+                KEY `is_dynamic_rate` (`is_dynamic_rate`),
+                KEY `node_class` (`node_class`),
+                KEY `bandwidthlimit_resetday` (`bandwidthlimit_resetday`),
+                KEY `node_group` (`node_group`),
+                KEY `online` (`online`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+            
+            CREATE TABLE `online_log` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID',
+                `ip` inet6 NOT NULL COMMENT 'IP地址',
+                `node_id` int(11) unsigned NOT NULL COMMENT '节点ID',
+                `first_time` int(11) unsigned NOT NULL COMMENT '首次在线时间',
+                `last_time` int(11) unsigned NOT NULL COMMENT '最后在线时间',
+                PRIMARY KEY (`id`),
+                UNIQUE KEY (`user_id`, `ip`),
+                KEY `node_id` (`node_id`),
+                KEY `last_time` (`last_time`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `order` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单ID',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '提交用户ID',
+                `product_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '商品ID',
+                `product_type` varchar(255) NOT NULL DEFAULT '' COMMENT '商品类型',
+                `product_name` varchar(255) NOT NULL DEFAULT '' COMMENT '商品名称',
+                `product_content` longtext NOT NULL DEFAULT '{}' COMMENT '商品内容' CHECK (json_valid(`product_content`)),
+                `coupon` varchar(255) NOT NULL DEFAULT '' COMMENT '订单优惠码',
+                `price` double unsigned NOT NULL DEFAULT 0 COMMENT '订单金额',
+                `status` varchar(255) NOT NULL DEFAULT '' COMMENT '订单状态',
+                `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                `update_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '更新时间',
+                PRIMARY KEY (`id`),
+                KEY `id` (`id`),
+                KEY `user_id` (`user_id`),
+                KEY `product_id` (`product_id`),
+                KEY `product_type` (`product_type`),
+                KEY `status` (`status`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `payback` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `total` decimal(12,2) unsigned NOT NULL DEFAULT 0 COMMENT '总金额',
+                `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `ref_by` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '推荐人ID',
+                `ref_get` decimal(12,2) unsigned NOT NULL DEFAULT 0 COMMENT '推荐人获得金额',
+                `invoice_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账单ID',
+                `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                PRIMARY KEY (`id`),
+                KEY `userid` (`userid`),
+                KEY `ref_by` (`ref_by`),
+                KEY `invoice_id` (`invoice_id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `paylist` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `total` decimal(12,2) NOT NULL DEFAULT 0 COMMENT '总金额',
+                `status` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '状态',
+                `invoice_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账单ID',
+                `tradeno` varchar(255) NOT NULL DEFAULT '' COMMENT '网关单号',
+                `gateway` varchar(255) NOT NULL DEFAULT '' COMMENT '支付网关',
+                `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                PRIMARY KEY (`id`),
+                UNIQUE KEY `tradeno` (`tradeno`),
+                KEY `userid` (`userid`),
+                KEY `status` (`status`),
+                KEY `invoice_id` (`invoice_id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `product` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品ID',
+                `type` varchar(255) NOT NULL DEFAULT 'tabp' COMMENT '类型',
+                `name` varchar(255) NOT NULL DEFAULT '' COMMENT '名称',
+                `price` double unsigned NOT NULL DEFAULT 0 COMMENT '售价',
+                `content` longtext NOT NULL DEFAULT '{}' COMMENT '内容' CHECK (json_valid(`content`)),
+                `limit` longtext NOT NULL DEFAULT '{}' COMMENT '购买限制' CHECK (json_valid(`limit`)),
+                `status` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '销售状态',
+                `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                `update_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '更新时间',
+                `sale_count` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '累计销量',
+                `stock` int(11) NOT NULL DEFAULT -1 COMMENT '库存',
+                PRIMARY KEY (`id`),
+                KEY `id` (`id`),
+                KEY `type` (`type`),
+                KEY `status` (`status`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+            
+            CREATE TABLE `syslog` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '触发用户',
+                `ip` varchar(255) NOT NULL DEFAULT '' COMMENT '触发IP',
+                `message` varchar(1024) NOT NULL DEFAULT '' COMMENT '日志内容',
+                `level` tinyint(3) unsigned NOT NULL DEFAULT 100 COMMENT '日志等级',
+                `context` longtext NOT NULL DEFAULT '{}' COMMENT '日志内容' CHECK (json_valid(`context`)),
+                `channel` varchar(255) NOT NULL DEFAULT '' COMMENT '日志类别',
+                `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '记录时间',
+                PRIMARY KEY (`id`),
+                KEY `user_id` (`user_id`),
+                KEY `ip` (`ip`),
+                KEY `message` (`message`),
+                KEY `level` (`level`),
+                KEY `channel` (`channel`),
+                KEY `datetime` (`datetime`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+            
+            CREATE TABLE `subscribe_log` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `type` varchar(255) NOT NULL DEFAULT '' COMMENT '获取的订阅类型',
+                `request_ip` varchar(255) NOT NULL DEFAULT '' COMMENT '请求IP',
+                `request_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '请求时间',
+                `request_user_agent` varchar(1024) NOT NULL DEFAULT '' COMMENT '请求UA',
+                PRIMARY KEY (`id`),
+                KEY `user_id` (`user_id`),
+                KEY `type` (`type`),
+                KEY `request_ip` (`request_ip`),
+                KEY `request_time` (`request_time`),
+                KEY `request_user_agent` (`request_user_agent`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `ticket` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '工单ID',
+                `title` varchar(255) NOT NULL DEFAULT '' COMMENT '工单标题',
+                `content` longtext NOT NULL DEFAULT '{}' COMMENT '工单内容' CHECK (json_valid(`content`)),
+                `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `status` varchar(255) NOT NULL DEFAULT '' COMMENT '工单状态',
+                `type` varchar(255) NOT NULL DEFAULT '' COMMENT '工单类型',
+                `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                PRIMARY KEY (`id`),
+                KEY `userid` (`userid`),
+                KEY `status` (`status`),
+                KEY `type` (`type`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `user` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',
+                `user_name` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名',
+                `email` varchar(255) NOT NULL COMMENT '用户Email',
+                `pass` varchar(255) NOT NULL COMMENT '登录密码',
+                `passwd` varchar(255) NOT NULL COMMENT '连接密码',
+                `uuid` uuid NOT NULL COMMENT 'UUID',
+                `u` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账户当前上传流量',
+                `d` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账户当前下载流量',
+                `transfer_today` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账户今日所用流量',
+                `transfer_total` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账户累计使用流量',
+                `transfer_enable` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账户当前可用流量',
+                `port` smallint(6) unsigned NOT NULL COMMENT '端口',
+                `last_detect_ban_time` datetime NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '最后一次被封禁的时间',
+                `all_detect_number` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '累计违规次数',
+                `last_use_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '最后使用时间',
+                `last_check_in_time` int(11) unsigned DEFAULT 0 COMMENT '最后签到时间',
+                `last_login_time` int(11) unsigned DEFAULT 0 COMMENT '最后登录时间',
+                `reg_date` datetime NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '注册时间',
+                `money` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '账户余额',
+                `ref_by` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '邀请人ID',
+                `method` varchar(255) NOT NULL DEFAULT 'aes-128-gcm' COMMENT '加密方式',
+                `reg_ip` varchar(255) NOT NULL DEFAULT '127.0.0.1' COMMENT '注册IP',
+                `node_speedlimit` double NOT NULL DEFAULT 0 COMMENT '用户限速',
+                `node_iplimit` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT '同时可连接IP数',
+                `is_admin` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否管理员',
+                `im_type` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT '联系方式类型',
+                `im_value` varchar(255) NOT NULL DEFAULT '' COMMENT '联系方式',
+                `contact_method` smallint(6) NOT NULL DEFAULT 1 COMMENT '偏好的联系方式',
+                `daily_mail_enable` tinyint(1) NOT NULL DEFAULT 0 COMMENT '每日报告开关',
+                `class` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT '等级',
+                `class_expire` datetime NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '等级过期时间',
+                `theme` varchar(255) NOT NULL DEFAULT 'tabler' COMMENT '网站主题',
+                `ga_token` varchar(255) NOT NULL DEFAULT '' COMMENT 'GA密钥',
+                `ga_enable` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'GA开关',
+                `remark` text NOT NULL DEFAULT '' COMMENT '备注',
+                `node_group` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT '节点分组',
+                `is_banned` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否封禁',
+                `banned_reason` varchar(255) NOT NULL DEFAULT '' COMMENT '封禁理由',
+                `is_shadow_banned` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否处于账户异常状态',
+                `expire_notified` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '过期提醒',
+                `traffic_notified` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '流量提醒',
+                `auto_reset_day` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT '自动重置流量日',
+                `auto_reset_bandwidth` decimal(12,2) unsigned NOT NULL DEFAULT 0 COMMENT '自动重置流量',
+                `api_token` varchar(255) NOT NULL DEFAULT '' COMMENT 'API 密钥',
+                `is_dark_mode` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否启用暗黑模式',
+                `is_inactive` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否处于闲置状态',
+                `locale` varchar(16) NOT NULL DEFAULT 'zh-TW' COMMENT '显示语言',
+                PRIMARY KEY (`id`),
+                UNIQUE KEY `email` (`email`),
+                UNIQUE KEY `passwd` (`passwd`),
+                UNIQUE KEY `uuid` (`uuid`),
+                UNIQUE KEY `ga_token` (`ga_token`),
+                UNIQUE KEY `api_token` (`api_token`),
+                KEY `is_admin` (`is_admin`),
+                KEY `is_banned` (`is_banned`),
+                KEY `is_shadow_banned` (`is_shadow_banned`),
+                KEY `is_inactive` (`is_inactive`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `user_coupon` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '优惠码ID',
+                `code` varchar(255) NOT NULL DEFAULT '' COMMENT '优惠码',
+                `content` longtext NOT NULL DEFAULT '{}' COMMENT '优惠码内容' CHECK (json_valid(`content`)),
+                `limit` longtext NOT NULL DEFAULT '{}' COMMENT '优惠码限制' CHECK (json_valid(`limit`)),
+                `use_count` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '累计使用次数',
+                `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                `expire_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '过期时间',
+                PRIMARY KEY (`id`),
+                KEY `id` (`id`),
+                UNIQUE KEY `code` (`code`),
+                KEY `expire_time` (`expire_time`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE `user_invite_code` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `code` varchar(255) NOT NULL DEFAULT '' COMMENT '邀请码',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                PRIMARY KEY (`id`),
+                UNIQUE KEY `code` (`code`),
+                UNIQUE KEY `user_id` (`user_id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+            
+            CREATE TABLE `user_money_log` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `before` decimal(10,2) NOT NULL DEFAULT 0 COMMENT '用户变动前账户余额',
+                `after` decimal(10,2) NOT NULL DEFAULT 0 COMMENT '用户变动后账户余额',
+                `amount` decimal(10,2) NOT NULL DEFAULT 0 COMMENT '变动总额',
+                `remark` text NOT NULL DEFAULT '' COMMENT '备注',
+                `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                PRIMARY KEY (`id`),
+                KEY `user_id` (`user_id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"
+        );
+
+        return 2023020100;
+    }
+
+    public function down(): int
+    {
+        echo 'No reverse operation for initial migration' . PHP_EOL . PHP_EOL;
+
+        return 2023020100;
+    }
+};

+ 32 - 0
db/migrations/2023021600-drop_user_token.php

@@ -0,0 +1,32 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec('DROP TABLE IF EXISTS `user_token`');
+
+        return 2023021600;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec(
+            'CREATE TABLE IF NOT EXISTS `user_token` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+                `token` varchar(255) DEFAULT NULL,
+                `user_id` bigint(20) unsigned DEFAULT NULL,
+                `create_time` bigint(20) unsigned DEFAULT NULL,
+                `expire_time` bigint(20) DEFAULT NULL,
+                PRIMARY KEY (`id`),
+                KEY `user_id` (`user_id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;'
+        );
+
+        return 2023020100;
+    }
+};

+ 22 - 0
db/migrations/2023030500-add_paylist_invoice_id.php

@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec('ALTER TABLE paylist ADD COLUMN IF NOT EXISTS `invoice_id` int(11) DEFAULT 0;');
+
+        return 2023030500;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec('ALTER TABLE paylist DROP COLUMN IF EXISTS `invoice_id`;');
+
+        return 2023021600;
+    }
+};

+ 32 - 0
db/migrations/2023031700-add_user_money_log.php

@@ -0,0 +1,32 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("CREATE TABLE IF NOT EXISTS `user_money_log` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `before` decimal(10,2) NOT NULL DEFAULT 0 COMMENT '用户变动前账户余额',
+                `after` decimal(10,2) NOT NULL DEFAULT 0 COMMENT '用户变动后账户余额',
+                `amount` decimal(10,2) NOT NULL DEFAULT 0 COMMENT '变动总额',
+                `remark` text NOT NULL DEFAULT '' COMMENT '备注',
+                `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                PRIMARY KEY (`id`),
+                KEY `user_id` (`user_id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;");
+
+        return 2023031700;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec('DROP TABLE IF EXISTS `user_money_log`;');
+
+        return 2023030500;
+    }
+};

+ 22 - 0
db/migrations/2023031701-add_paylist_gateway.php

@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("ALTER TABLE paylist ADD COLUMN IF NOT EXISTS `gateway` varchar(255) NOT NULL DEFAULT '';");
+
+        return 2023031701;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec('ALTER TABLE paylist DROP COLUMN IF EXISTS `gateway`;');
+
+        return 2023031700;
+    }
+};

+ 49 - 0
db/migrations/2023032600-online_log_per_user-ip.php

@@ -0,0 +1,49 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        $pdo = DB::getPdo();
+        $pdo->exec('
+            CREATE TABLE IF NOT EXISTS online_log (
+                id INT UNSIGNED NOT NULL AUTO_INCREMENT,
+                user_id INT UNSIGNED NOT NULL,
+                ip INET6 NOT NULL,
+                node_id INT UNSIGNED NOT NULL,
+                first_time INT UNSIGNED NOT NULL,
+                last_time INT UNSIGNED NOT NULL,
+                PRIMARY KEY (id),
+                UNIQUE KEY (user_id, ip),
+                KEY (last_time)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+        ');
+
+        $pdo->exec('DROP TABLE IF EXISTS alive_ip');
+
+        return 2023032600;
+    }
+
+    public function down(): int
+    {
+        $pdo = DB::getPdo();
+        $pdo->exec('
+            CREATE TABLE IF NOT EXISTS alive_ip (
+                id BIGINT(20) NOT NULL AUTO_INCREMENT,
+                nodeid INT(11) DEFAULT NULL,
+                userid INT(11) DEFAULT NULL,
+                ip VARCHAR(255) DEFAULT NULL,
+                datetime BIGINT(20) DEFAULT NULL,
+                PRIMARY KEY (id)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+        ');
+
+        $pdo->exec('DROP TABLE IF EXISTS online_log');
+
+        return 2023031701;
+    }
+};

+ 24 - 0
db/migrations/2023050800-add_user_transfer_today.php

@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec('ALTER TABLE user DROP COLUMN IF EXISTS `last_day_t`;');
+        DB::getPdo()->exec("ALTER TABLE user ADD COLUMN IF NOT EXISTS `transfer_today` bigint(20) unsigned DEFAULT 0 COMMENT '账户今日所用流量';");
+
+        return 2023050800;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec("ALTER TABLE user ADD COLUMN IF NOT EXISTS `last_day_t` bigint(20) DEFAULT 0 COMMENT '今天之前已使用的流量';");
+        DB::getPdo()->exec('ALTER TABLE user DROP COLUMN IF EXISTS `transfer_today`;');
+
+        return 2023032600;
+    }
+};

+ 22 - 0
db/migrations/2023053000-add_user_coupon_use_time.php

@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("ALTER TABLE user_coupon ADD COLUMN IF NOT EXISTS `use_count` int(11) NOT NULL DEFAULT 0 COMMENT '累计使用数';");
+
+        return 2023053000;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec('ALTER TABLE user_coupon DROP COLUMN IF EXISTS `use_count`;');
+
+        return 2023050800;
+    }
+};

+ 64 - 0
db/migrations/2023060300-add_user_locale_and_update_data_type.php

@@ -0,0 +1,64 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+        ALTER TABLE user ADD COLUMN IF NOT EXISTS `locale` varchar(16) NOT NULL DEFAULT 'zh-TW' COMMENT '显示语言';
+        ALTER TABLE user MODIFY COLUMN `user_name` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名';
+        ALTER TABLE user MODIFY COLUMN `email` varchar(255) NOT NULL COMMENT 'Email';
+        ALTER TABLE user MODIFY COLUMN `pass` varchar(255) NOT NULL COMMENT '登录密码';
+        ALTER TABLE user MODIFY COLUMN `passwd` varchar(255) NOT NULL COMMENT '节点密码';
+        ALTER TABLE user MODIFY COLUMN `u` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账户当前上传流量';
+        ALTER TABLE user MODIFY COLUMN `d` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账户当前下载流量';
+        ALTER TABLE user MODIFY COLUMN `transfer_today` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账户今日所用流量';
+        ALTER TABLE user MODIFY COLUMN `transfer_total` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账户累计使用流量';
+        ALTER TABLE user MODIFY COLUMN `transfer_enable` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账户当前可用流量';
+        ALTER TABLE user MODIFY COLUMN `last_detect_ban_time` datetime NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '最后一次被封禁的时间';
+        ALTER TABLE user MODIFY COLUMN `all_detect_number` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '累计违规次数';
+        ALTER TABLE user MODIFY COLUMN `last_check_in_time` int(11) unsigned DEFAULT 0 COMMENT '最后签到时间';
+        ALTER TABLE user MODIFY COLUMN `reg_date` datetime NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '注册时间';
+        ALTER TABLE user MODIFY COLUMN `money` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '账户余额';
+        ALTER TABLE user MODIFY COLUMN `ref_by` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '邀请人ID';
+        ALTER TABLE user MODIFY COLUMN `method` varchar(255) NOT NULL DEFAULT 'aes-128-gcm' COMMENT 'Shadowsocks加密方式';
+        ALTER TABLE user MODIFY COLUMN `reg_ip` varchar(255) NOT NULL DEFAULT '127.0.0.1' COMMENT '注册IP';
+        ALTER TABLE user MODIFY COLUMN `is_admin` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否管理员';
+        ALTER TABLE user MODIFY COLUMN `im_type` smallint(6) unsigned NOT NULL DEFAULT 1 COMMENT '联系方式类型';
+        UPDATE user SET im_value = '' WHERE im_value IS NULL;
+        ALTER TABLE user MODIFY COLUMN `im_value` varchar(255) NOT NULL DEFAULT '' COMMENT '联系方式';
+        ALTER TABLE user MODIFY COLUMN `class` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT '等级';
+        ALTER TABLE user MODIFY COLUMN `class_expire` datetime NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '等级过期时间';
+        ALTER TABLE user MODIFY COLUMN `theme` varchar(255) NOT NULL DEFAULT 'tabler' COMMENT '网站主题';
+        ALTER TABLE user MODIFY COLUMN `ga_token` varchar(255) NOT NULL DEFAULT '' COMMENT 'GA密钥';
+        ALTER TABLE user MODIFY COLUMN `ga_enable` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'GA开关';
+        ALTER TABLE user MODIFY COLUMN `remark` text NOT NULL DEFAULT '' COMMENT '备注';
+        ALTER TABLE user MODIFY COLUMN `node_group` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT '节点分组';
+        ALTER TABLE user MODIFY COLUMN `is_banned` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否封禁';
+        ALTER TABLE user MODIFY COLUMN `banned_reason` varchar(255) NOT NULL DEFAULT '' COMMENT '封禁理由';
+        ALTER TABLE user MODIFY COLUMN `expire_notified` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '过期提醒';
+        ALTER TABLE user MODIFY COLUMN `traffic_notified` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '流量提醒';
+        ALTER TABLE user MODIFY COLUMN `auto_reset_day` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT '自动重置流量日';
+        ALTER TABLE user MODIFY COLUMN `auto_reset_bandwidth` decimal(12,2) unsigned NOT NULL DEFAULT 0.00 COMMENT '自动重置流量';
+        ALTER TABLE user MODIFY COLUMN `is_dark_mode` tinyint(1) NOT NULL DEFAULT 0;
+        ALTER TABLE user DROP KEY IF EXISTS `user_name`;
+        ALTER TABLE user ADD UNIQUE KEY IF NOT EXISTS `api_token` (`api_token`);
+        ALTER TABLE user ADD KEY IF NOT EXISTS `is_admin` (`is_admin`);
+        ALTER TABLE user ADD KEY IF NOT EXISTS `is_banned` (`is_banned`);
+        ALTER TABLE user CHANGE COLUMN IF EXISTS `sendDailyMail` `daily_mail_enable` tinyint(1) NOT NULL DEFAULT 0 COMMENT '每日报告开关';
+        ");
+
+        return 2023060300;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec('ALTER TABLE user DROP COLUMN IF EXISTS `locale`;');
+
+        return 2023053000;
+    }
+};

+ 168 - 0
db/migrations/2023061800-update_new_shop_data_type.php

@@ -0,0 +1,168 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("SET FOREIGN_KEY_CHECKS = 0;
+        ALTER TABLE announcement MODIFY COLUMN `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '公告ID';
+        ALTER TABLE announcement MODIFY COLUMN `date` datetime NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '公告日期';
+        ALTER TABLE announcement MODIFY COLUMN `content` text NOT NULL DEFAULT '' COMMENT '公告内容';
+        ALTER TABLE config MODIFY COLUMN `value` varchar(2048) DEFAULT NULL COMMENT '值';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `detect_number` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '本次违规次数';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `ban_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '本次封禁时长';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `start_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '统计开始时间';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `end_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '统计结束时间';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `all_detect_number` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '累计违规次数';
+        ALTER TABLE detect_list MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '审计规则ID';
+        ALTER TABLE detect_list MODIFY COLUMN `name` varchar(255) NOT NULL DEFAULT '' COMMENT '规则名称';
+        ALTER TABLE detect_list MODIFY COLUMN `text` varchar(255) NOT NULL DEFAULT '' COMMENT '规则名称';
+        ALTER TABLE detect_list MODIFY COLUMN `regex` varchar(255) NOT NULL DEFAULT '' COMMENT '正则表达式';
+        ALTER TABLE detect_list MODIFY COLUMN `type` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '规则类型';
+        ALTER TABLE detect_log MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE detect_log MODIFY COLUMN `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE detect_log MODIFY COLUMN `list_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '规则ID';
+        ALTER TABLE detect_log MODIFY COLUMN `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '触发时间';
+        ALTER TABLE detect_log MODIFY COLUMN `node_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '节点ID';
+        ALTER TABLE detect_log MODIFY COLUMN `status` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '状态';
+        ALTER TABLE docs MODIFY COLUMN `date` datetime NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '文档日期';
+        ALTER TABLE docs MODIFY COLUMN `title` varchar(255) NOT NULL DEFAULT '' COMMENT '文档标题';
+        ALTER TABLE docs MODIFY COLUMN `content` longtext NOT NULL DEFAULT '' COMMENT '文档内容';
+        ALTER TABLE docs DROP COLUMN IF EXISTS `markdown`;
+        ALTER TABLE email_queue MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE email_queue MODIFY COLUMN `to_email` varchar(255) NOT NULL DEFAULT '' COMMENT '收件人邮箱';
+        ALTER TABLE email_queue MODIFY COLUMN `subject` varchar(255) NOT NULL DEFAULT '' COMMENT '邮件标题';
+        ALTER TABLE email_queue MODIFY COLUMN `template` varchar(255) NOT NULL DEFAULT '' COMMENT '邮件模板';
+        ALTER TABLE email_queue MODIFY COLUMN `array` longtext NOT NULL DEFAULT '{}' COMMENT '模板参数' CHECK (json_valid(`array`));
+        ALTER TABLE email_queue MODIFY COLUMN `time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '添加时间';
+        ALTER TABLE gift_card MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '礼品卡ID';
+        ALTER TABLE gift_card MODIFY COLUMN `card` text NOT NULL DEFAULT '' COMMENT '卡号';
+        ALTER TABLE gift_card MODIFY COLUMN `balance` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '余额';
+        ALTER TABLE gift_card MODIFY COLUMN `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE gift_card MODIFY COLUMN `status` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '使用状态';
+        ALTER TABLE gift_card MODIFY COLUMN `use_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '使用时间';
+        ALTER TABLE gift_card MODIFY COLUMN `use_user` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '使用用户';
+        ALTER TABLE invoice MODIFY COLUMN `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '账单ID';
+        ALTER TABLE invoice MODIFY COLUMN `user_id` bigint(20) unsigned DEFAULT 0 COMMENT '归属用户';
+        ALTER TABLE invoice MODIFY COLUMN `order_id` bigint(20) unsigned DEFAULT 0 COMMENT '订单ID';
+        ALTER TABLE invoice MODIFY COLUMN `content` longtext DEFAULT '{}' COMMENT '账单内容' CHECK (json_valid(`content`));
+        ALTER TABLE invoice MODIFY COLUMN `price` double unsigned DEFAULT 0 COMMENT '账单金额';
+        ALTER TABLE invoice MODIFY COLUMN `status` varchar(255) DEFAULT '' COMMENT '账单状态';
+        ALTER TABLE invoice MODIFY COLUMN `create_time` int(11) unsigned DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE invoice MODIFY COLUMN `update_time` int(11) unsigned DEFAULT 0 COMMENT '更新时间';
+        ALTER TABLE invoice MODIFY COLUMN `pay_time` int(11) unsigned DEFAULT 0 COMMENT '支付时间';
+        ALTER TABLE link MODIFY COLUMN `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE link MODIFY COLUMN `token` varchar(255) NOT NULL DEFAULT '' COMMENT '订阅token';
+        ALTER TABLE link MODIFY COLUMN `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE login_ip MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE login_ip MODIFY COLUMN `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE login_ip MODIFY COLUMN `ip` varchar(255) NOT NULL DEFAULT '' COMMENT '登录IP';
+        ALTER TABLE login_ip MODIFY COLUMN `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '登录时间';
+        ALTER TABLE login_ip MODIFY COLUMN `type` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '登录类型';
+        ALTER TABLE login_ip ADD KEY IF NOT EXISTS `type` (`type`);
+        ALTER TABLE node MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '节点ID';
+        ALTER TABLE node MODIFY COLUMN `name` varchar(255) NOT NULL DEFAULT '' COMMENT '节点名称';
+        ALTER TABLE node MODIFY COLUMN `type` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '节点显示';
+        ALTER TABLE node MODIFY COLUMN `server` varchar(255) NOT NULL DEFAULT '' COMMENT '节点地址';
+        ALTER TABLE node MODIFY COLUMN `custom_config` longtext NOT NULL DEFAULT '{}' COMMENT '自定义配置' CHECK (json_valid(`custom_config`));
+        ALTER TABLE node MODIFY COLUMN `sort` tinyint(2) unsigned NOT NULL DEFAULT 14 COMMENT '节点类型';
+        ALTER TABLE node MODIFY COLUMN `traffic_rate` float unsigned NOT NULL DEFAULT 1 COMMENT '流量倍率';
+        ALTER TABLE node MODIFY COLUMN `node_class` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT '节点等级';
+        ALTER TABLE node MODIFY COLUMN `node_speedlimit` double unsigned NOT NULL DEFAULT 0 COMMENT '节点限速';
+        ALTER TABLE node MODIFY COLUMN `node_bandwidth` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '节点流量';
+        ALTER TABLE node MODIFY COLUMN `node_bandwidth_limit` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '节点流量限制';
+        ALTER TABLE node MODIFY COLUMN `bandwidthlimit_resetday` tinyint(2) unsigned NOT NULL DEFAULT 0 COMMENT '流量重置日';
+        ALTER TABLE node MODIFY COLUMN `node_heartbeat` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '节点心跳';
+        ALTER TABLE node MODIFY COLUMN `online_user` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '节点在线用户';
+        ALTER TABLE node MODIFY COLUMN `node_group` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT '节点群组';
+        ALTER TABLE node MODIFY COLUMN `online` tinyint(1) NOT NULL DEFAULT 1 COMMENT '在线状态';
+        ALTER TABLE node MODIFY COLUMN `gfw_block` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否被GFW封锁';
+        ALTER TABLE node MODIFY COLUMN `password` varchar(255) NOT NULL DEFAULT '' COMMENT '后端连接密码';
+        ALTER TABLE node DROP COLUMN IF EXISTS `node_connector`;
+        ALTER TABLE node DROP COLUMN IF EXISTS `mu_only`;
+        ALTER TABLE node ADD KEY IF NOT EXISTS `type` (`type`);
+        ALTER TABLE node ADD KEY IF NOT EXISTS `sort` (`sort`);
+        ALTER TABLE node ADD KEY IF NOT EXISTS `node_class` (`node_class`);
+        ALTER TABLE node ADD KEY IF NOT EXISTS `node_group` (`node_group`);
+        ALTER TABLE node ADD KEY IF NOT EXISTS `online` (`online`);
+        ALTER TABLE online_log MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE online_log MODIFY COLUMN `user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID';
+        ALTER TABLE online_log MODIFY COLUMN `ip` inet6 NOT NULL COMMENT 'IP地址';
+        ALTER TABLE online_log MODIFY COLUMN `node_id` int(11) unsigned NOT NULL COMMENT '节点ID';
+        ALTER TABLE online_log MODIFY COLUMN `first_time` int(11) unsigned NOT NULL COMMENT '首次在线时间';
+        ALTER TABLE online_log MODIFY COLUMN `last_time` int(11) unsigned NOT NULL COMMENT '最后在线时间';
+        ALTER TABLE `order` MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单ID';
+        ALTER TABLE `order` MODIFY COLUMN `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '提交用户';
+        ALTER TABLE `order` MODIFY COLUMN `product_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '商品ID';
+        ALTER TABLE `order` MODIFY COLUMN `product_type` varchar(255) NOT NULL DEFAULT '' COMMENT '商品类型';
+        ALTER TABLE `order` MODIFY COLUMN `product_name` varchar(255) NOT NULL DEFAULT '' COMMENT '商品名称';
+        ALTER TABLE `order` MODIFY COLUMN `product_content` longtext NOT NULL DEFAULT '{}' COMMENT '商品内容' CHECK (json_valid(`product_content`));
+        ALTER TABLE `order` MODIFY COLUMN `coupon` varchar(255) NOT NULL DEFAULT '' COMMENT '订单优惠码';
+        ALTER TABLE `order` MODIFY COLUMN `price` double unsigned NOT NULL DEFAULT 0 COMMENT '订单金额';
+        ALTER TABLE `order` MODIFY COLUMN `status` varchar(255) NOT NULL DEFAULT '' COMMENT '订单状态';
+        ALTER TABLE `order` MODIFY COLUMN `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE `order` MODIFY COLUMN `update_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '更新时间';
+        ALTER TABLE payback MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE payback MODIFY COLUMN `total` decimal(12,2) unsigned NOT NULL DEFAULT 0 COMMENT '总金额';
+        ALTER TABLE payback MODIFY COLUMN `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE payback MODIFY COLUMN `ref_by` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '推荐人ID';
+        ALTER TABLE payback MODIFY COLUMN `ref_get` decimal(12,2) unsigned NOT NULL DEFAULT 0 COMMENT '推荐人获得金额';
+        ALTER TABLE payback MODIFY COLUMN `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE paylist MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE paylist MODIFY COLUMN `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE paylist MODIFY COLUMN `total` decimal(12,2) NOT NULL DEFAULT 0 COMMENT '总金额';
+        ALTER TABLE paylist MODIFY COLUMN `status` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '状态';
+        ALTER TABLE paylist MODIFY COLUMN `invoice_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账单ID';
+        ALTER TABLE paylist MODIFY COLUMN `tradeno` varchar(255) NOT NULL DEFAULT '' COMMENT '网关单号';
+        ALTER TABLE paylist MODIFY COLUMN `gateway` varchar(255) NOT NULL DEFAULT '' COMMENT '支付网关';
+        ALTER TABLE paylist MODIFY COLUMN `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE product MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品ID';
+        ALTER TABLE product MODIFY COLUMN `type` varchar(255) NOT NULL DEFAULT 'tabp' COMMENT '类型';
+        ALTER TABLE product MODIFY COLUMN `name` varchar(255) NOT NULL DEFAULT '' COMMENT '名称';
+        ALTER TABLE product MODIFY COLUMN `price` double unsigned NOT NULL DEFAULT 0 COMMENT '售价';
+        ALTER TABLE product MODIFY COLUMN `content` longtext NOT NULL DEFAULT '{}' COMMENT '内容' CHECK (json_valid(`content`));
+        ALTER TABLE product MODIFY COLUMN `limit` longtext NOT NULL DEFAULT '{}' COMMENT '购买限制' CHECK (json_valid(`limit`));
+        ALTER TABLE product MODIFY COLUMN `status` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '销售状态';
+        ALTER TABLE product MODIFY COLUMN `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE product MODIFY COLUMN `update_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '更新时间';
+        ALTER TABLE product MODIFY COLUMN `sale_count` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '累计销售数';
+        ALTER TABLE product MODIFY COLUMN `stock` int(11) NOT NULL DEFAULT -1 COMMENT '库存';
+        ALTER TABLE product ADD KEY IF NOT EXISTS `status` (`status`);
+        ALTER TABLE ticket MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '工单ID';
+        ALTER TABLE ticket MODIFY COLUMN `title` varchar(255) NOT NULL DEFAULT '' COMMENT '工单标题';
+        ALTER TABLE ticket MODIFY COLUMN `content` longtext NOT NULL DEFAULT '{}' COMMENT '工单内容' CHECK (json_valid(`content`));
+        ALTER TABLE ticket MODIFY COLUMN `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE ticket MODIFY COLUMN `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE ticket MODIFY COLUMN `status` varchar(255) NOT NULL DEFAULT '' COMMENT '工单状态';
+        ALTER TABLE ticket MODIFY COLUMN `type` varchar(255) NOT NULL DEFAULT '' COMMENT '工单类型';
+        ALTER TABLE ticket ADD KEY IF NOT EXISTS `userid` (`userid`);
+        ALTER TABLE ticket ADD KEY IF NOT EXISTS `status` (`status`);
+        ALTER TABLE user MODIFY COLUMN `class` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT '等级';
+        ALTER TABLE user DROP COLUMN IF EXISTS `node_connector`;
+        ALTER TABLE user_coupon MODIFY COLUMN `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '优惠码ID';
+        ALTER TABLE user_coupon MODIFY COLUMN `code` varchar(255) NOT NULL DEFAULT '' COMMENT '优惠码';
+        ALTER TABLE user_coupon MODIFY COLUMN `content` longtext NOT NULL DEFAULT '{}' COMMENT '优惠码内容' CHECK (json_valid(`content`));
+        ALTER TABLE user_coupon MODIFY COLUMN `limit` longtext NOT NULL DEFAULT '{}' COMMENT '优惠码限制' CHECK (json_valid(`limit`));
+        ALTER TABLE user_coupon MODIFY COLUMN `use_count` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '累计使用次数';
+        ALTER TABLE user_coupon MODIFY COLUMN `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE user_coupon MODIFY COLUMN `expire_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '过期时间';
+        ALTER TABLE user_invite_code MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE user_invite_code MODIFY COLUMN `code` varchar(255) NOT NULL DEFAULT '' COMMENT '邀请码';
+        ALTER TABLE user_invite_code MODIFY COLUMN `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE user_money_log MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        SET FOREIGN_KEY_CHECKS = 1;");
+
+        return 2023061800;
+    }
+
+    public function down(): int
+    {
+        return 2023061800;
+    }
+};

+ 34 - 0
db/migrations/2023063000-add_user_is_inactive.php

@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE user DROP COLUMN IF EXISTS `t`;
+            ALTER TABLE user ADD COLUMN IF NOT EXISTS `is_inactive` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否处于闲置状态';
+            ALTER TABLE user ADD COLUMN IF NOT EXISTS `last_use_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '最后使用时间';
+            ALTER TABLE user ADD COLUMN IF NOT EXISTS `last_login_time` int(11) unsigned DEFAULT 0 COMMENT '最后登录时间';
+            ALTER TABLE user ADD KEY IF NOT EXISTS `is_inactive` (`is_inactive`);
+        ");
+
+        return 2023063000;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE user ADD COLUMN IF NOT EXISTS `t` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '最后使用时间';
+            ALTER TABLE user DROP COLUMN IF EXISTS `is_inactive`;
+            ALTER TABLE user DROP COLUMN IF EXISTS `last_use_time`;
+            ALTER TABLE user DROP COLUMN IF EXISTS `last_login_time`;
+            ALTER TABLE user DROP KEY IF EXISTS `is_inactive`;
+        ");
+
+        return 2023061800;
+    }
+};

+ 55 - 0
db/migrations/2023071000-drop_temp_tables.php

@@ -0,0 +1,55 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec('
+            DROP TABLE IF EXISTS `email_verify`;
+            DROP TABLE IF EXISTS `user_password_reset`;
+            DROP TABLE IF EXISTS `telegram_session`;
+        ');
+
+        return 2023071000;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec(
+            "CREATE TABLE IF NOT EXISTS `email_verify` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `email` varchar(255) NOT NULL DEFAULT '' COMMENT '邮箱',
+                `ip` varchar(255) NOT NULL DEFAULT '' COMMENT 'IP',
+                `code` varchar(255) NOT NULL DEFAULT '' COMMENT '验证码',
+                `expire_in` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '过期时间',
+                PRIMARY KEY (`id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+            
+            CREATE TABLE IF NOT EXISTS `telegram_session` (
+                `id` bigint(20) NOT NULL AUTO_INCREMENT,
+                `user_id` bigint(20) DEFAULT NULL,
+                `type` int(11) DEFAULT NULL,
+                `session_content` varchar(255) DEFAULT NULL,
+                `datetime` bigint(20) DEFAULT NULL,
+                PRIMARY KEY (`id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+            CREATE TABLE IF NOT EXISTS `user_password_reset` (
+                `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `email` varchar(255) NOT NULL DEFAULT '' COMMENT '用户邮箱',
+                `token` varchar(255) NOT NULL DEFAULT '' COMMENT '重置密码的 token',
+                `init_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                `expire_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '过期时间',
+                PRIMARY KEY (`id`),
+                KEY `email` (`email`),
+                KEY `token` (`token`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"
+        );
+
+        return 2023063000;
+    }
+};

+ 32 - 0
db/migrations/2023071600-drop_stream_media.php

@@ -0,0 +1,32 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec('
+            DROP TABLE IF EXISTS `stream_media`;
+        ');
+
+        return 2023071600;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec(
+            "CREATE TABLE IF NOT EXISTS `stream_media` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `node_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '节点ID',
+                `result` text NOT NULL DEFAULT '' COMMENT '检测结果',
+                `created_at` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                PRIMARY KEY (`id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"
+        );
+
+        return 2023071000;
+    }
+};

+ 30 - 0
db/migrations/2023071700-add_user_is_shadow_banned.php

@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE user ADD COLUMN IF NOT EXISTS `is_shadow_banned` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否处于账户异常状态';
+            ALTER TABLE user MODIFY COLUMN `is_dark_mode` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否启用暗黑模式';
+            ALTER TABLE user MODIFY COLUMN `is_inactive` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否处于闲置状态';
+            ALTER TABLE user DROP COLUMN IF EXISTS `use_new_shop`;
+        ");
+
+        return 2023071700;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE user DROP COLUMN IF EXISTS `is_shadow_banned`;
+            ALTER TABLE user ADD COLUMN IF NOT EXISTS `use_new_shop` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '是否启用新商店',
+        ");
+
+        return 2023071600;
+    }
+};

+ 48 - 0
db/migrations/2023072000-add_sub_log.php

@@ -0,0 +1,48 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+            CREATE TABLE IF NOT EXISTS `subscribe_log` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `type` varchar(255) NOT NULL DEFAULT '' COMMENT '获取的订阅类型',
+                `request_ip` varchar(255) NOT NULL DEFAULT '' COMMENT '请求IP',
+                `request_user_agent` varchar(255) NOT NULL DEFAULT '' COMMENT '请求UA信息',
+                `request_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '请求时间',
+                PRIMARY KEY (`id`),
+                KEY `user_id` (`user_id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+            DROP TABLE IF EXISTS `user_subscribe_log`;
+        ");
+
+        return 2023072000;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec("
+            CREATE TABLE IF NOT EXISTS `user_subscribe_log` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `user_name` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `email` varchar(255) NOT NULL DEFAULT '' COMMENT '用户邮箱',
+                `subscribe_type` varchar(255) NOT NULL DEFAULT '' COMMENT '获取的订阅类型',
+                `request_ip` varchar(255) NOT NULL DEFAULT '' COMMENT '请求IP',
+                `request_time` timestamp NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '请求时间',
+                `request_user_agent` varchar(255) NOT NULL DEFAULT '' COMMENT '请求UA信息',
+                PRIMARY KEY (`id`),
+                KEY `user_id` (`user_id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+            DROP TABLE IF EXISTS `subscribe_log`;
+        ");
+
+        return 2023071700;
+    }
+};

+ 27 - 0
db/migrations/2023080900-update_user_im_type.php

@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE user MODIFY COLUMN `im_type` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT '联系方式类型';
+            UPDATE user SET `im_value` = '' WHERE `im_value` = '0';
+        ");
+
+        return 2023080900;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE user MODIFY COLUMN `im_type` smallint(6) unsigned NOT NULL DEFAULT 1 COMMENT '联系方式类型';
+        ");
+
+        return 2023072000;
+    }
+};

+ 26 - 0
db/migrations/2023081800-add_user_contact_method.php

@@ -0,0 +1,26 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE user ADD COLUMN IF NOT EXISTS `contact_method` smallint(6) NOT NULL DEFAULT 1 COMMENT '偏好的联系方式';
+        ");
+
+        return 2023081800;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec('
+            ALTER TABLE user DROP COLUMN IF EXISTS `contact_method`;
+        ');
+
+        return 2023080900;
+    }
+};

+ 26 - 0
db/migrations/2023082000-remove_user_expire_in.php

@@ -0,0 +1,26 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec('
+            ALTER TABLE user DROP COLUMN IF EXISTS `expire_in`;
+        ');
+
+        return 2023082000;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE user ADD COLUMN IF NOT EXISTS `expire_in` datetime NOT NULL DEFAULT '2199-01-01 00:00:00' COMMENT '账户过期时间';
+        ");
+
+        return 2023081800;
+    }
+};

+ 28 - 0
db/migrations/2023102200-add_node_dynamic_rate.php

@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE node ADD COLUMN IF NOT EXISTS `is_dynamic_rate` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否启用动态流量倍率';
+            ALTER TABLE node ADD COLUMN IF NOT EXISTS `dynamic_rate_config` longtext NOT NULL DEFAULT '{}' COMMENT '动态流量倍率配置' CHECK (json_valid(`custom_config`));
+        ");
+
+        return 2023102200;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec('
+            ALTER TABLE node DROP COLUMN IF EXISTS `is_dynamic_rate`;
+            ALTER TABLE node DROP COLUMN IF EXISTS `dynamic_rate_config`;
+        ');
+
+        return 2023082000;
+    }
+};

+ 28 - 0
db/migrations/2023111700-remove_node_info_status.php

@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec('
+            ALTER TABLE node DROP COLUMN IF EXISTS `info`;
+            ALTER TABLE node DROP COLUMN IF EXISTS `status`;
+        ');
+
+        return 2023111700;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE node ADD COLUMN IF NOT EXISTS `info` varchar(255) NOT NULL DEFAULT '' COMMENT '节点信息';
+            ALTER TABLE node ADD COLUMN IF NOT EXISTS `status` varchar(255) NOT NULL DEFAULT '' COMMENT '节点状态';
+        ");
+
+        return 2023102200;
+    }
+};

+ 28 - 0
db/migrations/2023111800-remove_user_invite_code_at.php

@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec('
+            ALTER TABLE user_invite_code DROP COLUMN IF EXISTS `created_at`;
+            ALTER TABLE user_invite_code DROP COLUMN IF EXISTS `updated_at`;
+        ');
+
+        return 2023111800;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE user_invite_code ADD COLUMN IF NOT EXISTS `created_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '创建时间';
+            ALTER TABLE user_invite_code ADD COLUMN IF NOT EXISTS `updated_at` timestamp NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '更新时间';
+        ");
+
+        return 2023111700;
+    }
+};

+ 28 - 0
db/migrations/2023111801-remove_detect_ban_log_user_info.php

@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec('
+            ALTER TABLE detect_ban_log DROP COLUMN IF EXISTS `user_name`;
+            ALTER TABLE detect_ban_log DROP COLUMN IF EXISTS `email`;
+        ');
+
+        return 2023111801;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE detect_ban_log ADD COLUMN IF NOT EXISTS `user_name` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名';
+            ALTER TABLE detect_ban_log ADD COLUMN IF NOT EXISTS `email` varchar(255) NOT NULL DEFAULT '' COMMENT '用户邮箱';
+        ");
+
+        return 2023111800;
+    }
+};

+ 26 - 0
db/migrations/2023120700-add_node_dynamic_rate.php

@@ -0,0 +1,26 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE node ADD COLUMN IF NOT EXISTS `dynamic_rate_type` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '动态流量倍率计算方式';
+        ");
+
+        return 2023120700;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec('
+            ALTER TABLE node DROP COLUMN IF EXISTS `dynamic_rate_type`;
+        ');
+
+        return 2023111801;
+    }
+};

+ 26 - 0
db/migrations/2024012000-add_payback_invoice_id.php

@@ -0,0 +1,26 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE payback ADD COLUMN IF NOT EXISTS `invoice_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账单ID';
+        ");
+
+        return 2024012000;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec('
+            ALTER TABLE payback DROP COLUMN IF EXISTS `invoice_id`;
+        ');
+
+        return 2023120700;
+    }
+};

+ 26 - 0
db/migrations/2024012300-remove_user_invite_num.php

@@ -0,0 +1,26 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec('
+            ALTER TABLE user DROP COLUMN IF EXISTS `invite_num`;
+        ');
+
+        return 2024012300;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE user ADD COLUMN IF NOT EXISTS `invite_num` int(11) NOT NULL DEFAULT 0 COMMENT '可用邀请次数';
+        ");
+
+        return 2024012000;
+    }
+};

+ 43 - 0
db/migrations/2024012700-add_hourly_usage.php

@@ -0,0 +1,43 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+            CREATE TABLE IF NOT EXISTS `hourly_usage` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `date` date NOT NULL DEFAULT 0 COMMENT '记录日期',
+                `usage` longtext NOT NULL DEFAULT '{}' COMMENT '流量用量' CHECK (json_valid(`usage`)),
+                PRIMARY KEY (`id`),
+                KEY `user_id` (`user_id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+            DROP TABLE IF EXISTS `user_hourly_usage`;
+        ");
+
+        return 2024012700;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec("
+            CREATE TABLE IF NOT EXISTS `user_hourly_usage` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `traffic` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '当前总流量',
+                `hourly_usage` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '过去一小时流量',
+                `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '记录时间',
+                PRIMARY KEY (`id`),
+                KEY `user_id` (`user_id`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+            DROP TABLE IF EXISTS `hourly_usage`;
+        ");
+
+        return 2024012300;
+    }
+};

+ 37 - 0
db/migrations/2024021900-add_missing_indexes.php

@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec('
+        ALTER TABLE config ADD KEY IF NOT EXISTS `item` (`item`);
+        ALTER TABLE config ADD KEY IF NOT EXISTS `class` (`class`);
+        ALTER TABLE config ADD KEY IF NOT EXISTS `is_public` (`is_public`);
+        ALTER TABLE hourly_usage ADD KEY IF NOT EXISTS `date` (`date`);
+        ALTER TABLE node ADD UNIQUE KEY IF NOT EXISTS `password` (`password`);
+        ALTER TABLE node ADD KEY IF NOT EXISTS `is_dynamic_rate` (`is_dynamic_rate`);
+        ALTER TABLE node ADD KEY IF NOT EXISTS `bandwidthlimit_resetday` (`bandwidthlimit_resetday`);
+        ALTER TABLE online_log ADD KEY IF NOT EXISTS `node_id` (`node_id`);
+        ALTER TABLE payback ADD KEY IF NOT EXISTS `userid` (`userid`);
+        ALTER TABLE payback ADD KEY IF NOT EXISTS `ref_by` (`ref_by`);
+        ALTER TABLE payback ADD KEY IF NOT EXISTS `invoice_id` (`invoice_id`);
+        ALTER TABLE paylist ADD UNIQUE KEY IF NOT EXISTS `tradeno` (`tradeno`);
+        ALTER TABLE paylist ADD KEY IF NOT EXISTS `status` (`status`);
+        ALTER TABLE paylist ADD KEY IF NOT EXISTS `invoice_id` (`invoice_id`);
+        ALTER TABLE subscribe_log ADD KEY IF NOT EXISTS `type` (`type`);
+        ALTER TABLE ticket ADD KEY IF NOT EXISTS `type` (`type`);
+        ALTER TABLE user ADD KEY IF NOT EXISTS `is_shadow_banned` (`is_shadow_banned`);');
+
+        return 2024021900;
+    }
+
+    public function down(): int
+    {
+        return 2024021900;
+    }
+};

+ 30 - 0
db/migrations/2024030300-update_node_ip.php

@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE node ADD COLUMN IF NOT EXISTS `ipv4` inet4 NOT NULL DEFAULT '127.0.0.1' COMMENT 'IPv4地址';
+            ALTER TABLE node ADD COLUMN IF NOT EXISTS `ipv6` inet6 NOT NULL DEFAULT '::1' COMMENT 'IPv6地址';
+            ALTER TABLE node DROP COLUMN IF EXISTS `node_ip`;
+        ");
+
+        return 2024030300;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE node ADD COLUMN IF NOT EXISTS `node_ip` varchar(255) NOT NULL DEFAULT '' COMMENT '节点IP';
+            ALTER TABLE node DROP COLUMN IF EXISTS `ipv4`;
+            ALTER TABLE node DROP COLUMN IF EXISTS `ipv6`;
+        ");
+
+        return 2024021900;
+    }
+};

+ 33 - 0
db/migrations/2024031000-remove_user_forbidden.php

@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE user DROP COLUMN IF EXISTS `forbidden_ip`;
+            ALTER TABLE user DROP COLUMN IF EXISTS `forbidden_port`;
+            ALTER TABLE user MODIFY COLUMN `api_token` varchar(255) NOT NULL DEFAULT '' COMMENT 'API Token';
+            ALTER TABLE user MODIFY COLUMN `uuid` uuid NOT NULL COMMENT 'UUID';
+            ALTER TABLE user ADD UNIQUE KEY IF NOT EXISTS `passwd` (`passwd`);
+        ");
+
+        return 2024031000;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE user ADD COLUMN IF NOT EXISTS `forbidden_ip` varchar(255) NOT NULL DEFAULT '' COMMENT '禁止访问IP';
+            ALTER TABLE user ADD COLUMN IF NOT EXISTS `forbidden_port` varchar(255) NOT NULL DEFAULT '' COMMENT '禁止访问端口';
+            ALTER TABLE user MODIFY COLUMN `api_token` char(36) NOT NULL DEFAULT '' COMMENT 'API 密钥';
+            ALTER TABLE user MODIFY COLUMN `uuid` char(36) NOT NULL COMMENT 'UUID';
+        ");
+
+        return 2024030300;
+    }
+};

+ 41 - 0
db/migrations/2024031700-update_data_type.php

@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE announcement MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '公告ID';
+            ALTER TABLE announcement MODIFY COLUMN `content` longtext NOT NULL DEFAULT '' COMMENT '公告内容';
+            ALTER TABLE config MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '配置ID';
+            ALTER TABLE config MODIFY COLUMN `item` varchar(255) NOT NULL DEFAULT '' COMMENT '配置项';
+            ALTER TABLE config MODIFY COLUMN `value` varchar(2048) NOT NULL DEFAULT '' COMMENT '配置值';
+            ALTER TABLE config MODIFY COLUMN `class` varchar(16) NOT NULL DEFAULT '' COMMENT '配置类别';
+            ALTER TABLE config MODIFY COLUMN `is_public` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否为公共参数';
+            ALTER TABLE config MODIFY COLUMN `type` varchar(16) NOT NULL DEFAULT '' COMMENT '配置值类型';
+            ALTER TABLE config MODIFY COLUMN `default` varchar(2048) NOT NULL DEFAULT '' COMMENT '默认值';
+            ALTER TABLE config MODIFY COLUMN `mark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注';
+            ALTER TABLE detect_ban_log MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '封禁记录ID';
+            ALTER TABLE invoice MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '账单ID';
+            ALTER TABLE link MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+            ALTER TABLE subscribe_log MODIFY COLUMN `request_user_agent` varchar(1024) NOT NULL DEFAULT '' COMMENT '请求UA';
+            ALTER TABLE subscribe_log ADD KEY IF NOT EXISTS `request_ip` (`request_ip`);
+            ALTER TABLE subscribe_log ADD KEY IF NOT EXISTS `request_time` (`request_time`);
+            ALTER TABLE subscribe_log ADD KEY IF NOT EXISTS `request_user_agent` (`request_user_agent`);
+            ALTER TABLE user_coupon MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '优惠码ID';
+            ALTER TABLE user_coupon DROP KEY IF EXISTS `code`;
+            ALTER TABLE user_coupon ADD UNIQUE KEY IF NOT EXISTS `code` (`code`);
+        ");
+
+        return 2024031700;
+    }
+
+    public function down(): int
+    {
+        return 2024031700;
+    }
+};

+ 38 - 0
db/migrations/2024040500-add_invoice_type.php

@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE invoice ADD COLUMN IF NOT EXISTS `type` varchar(255) NOT NULL DEFAULT 'product' COMMENT '类型';
+            ALTER TABLE invoice ADD KEY IF NOT EXISTS `type` (`type`);
+            ALTER TABLE invoice MODIFY COLUMN `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '归属用户ID';
+            ALTER TABLE invoice MODIFY COLUMN `order_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '订单ID';
+            ALTER TABLE invoice MODIFY COLUMN `content` longtext NOT NULL DEFAULT '{}' COMMENT '账单内容' CHECK (json_valid(`content`));
+            ALTER TABLE invoice MODIFY COLUMN `price` double unsigned NOT NULL DEFAULT 0 COMMENT '账单金额';
+            ALTER TABLE invoice MODIFY COLUMN `status` varchar(255) NOT NULL DEFAULT '' COMMENT '账单状态';
+            ALTER TABLE invoice MODIFY COLUMN `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+            ALTER TABLE invoice MODIFY COLUMN `update_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '更新时间';
+            ALTER TABLE invoice MODIFY COLUMN `pay_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '支付时间';
+            ALTER TABLE `order` ADD KEY IF NOT EXISTS `product_type` (`product_type`);
+            ALTER TABLE node MODIFY COLUMN `traffic_rate` double unsigned NOT NULL DEFAULT 1 COMMENT '流量倍率';
+        ");
+
+        return 2024040500;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec('
+            ALTER TABLE invoice DROP COLUMN IF EXISTS `type`;
+            ALTER TABLE invoice DROP KEY IF EXISTS `type`;
+        ');
+
+        return 2024031700;
+    }
+};

+ 42 - 0
db/migrations/2024041000-add_syslog.php

@@ -0,0 +1,42 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+            CREATE TABLE IF NOT EXISTS `syslog` (
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '触发用户',
+                `ip` varchar(255) NOT NULL DEFAULT '' COMMENT '触发IP',
+                `message` varchar(1024) NOT NULL DEFAULT '' COMMENT '日志内容',
+                `level` tinyint(3) unsigned NOT NULL DEFAULT 100 COMMENT '日志等级',
+                `context` longtext NOT NULL DEFAULT '{}' COMMENT '日志内容' CHECK (json_valid(`context`)),
+                `channel` varchar(255) NOT NULL DEFAULT '' COMMENT '日志类别',
+                `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '记录时间',
+                PRIMARY KEY (`id`),
+                KEY `user_id` (`user_id`),
+                KEY `ip` (`ip`),
+                KEY `message` (`message`),
+                KEY `level` (`level`),
+                KEY `channel` (`channel`),
+                KEY `datetime` (`datetime`)
+            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+        ");
+
+        return 2024041000;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec('
+            DROP TABLE IF EXISTS `syslog`;
+        ');
+
+        return 2024040500;
+    }
+};

+ 39 - 0
phpinsights.php

@@ -0,0 +1,39 @@
+<?php
+
+declare(strict_types=1);
+
+return [
+    'preset' => 'default',
+    'remove' => [
+        NunoMaduro\PhpInsights\Domain\Sniffs\ForbiddenSetterSniff::class,
+        NunoMaduro\PhpInsights\Domain\Insights\CyclomaticComplexityIsHigh::class,
+        NunoMaduro\PhpInsights\Domain\Insights\ForbiddenDefineFunctions::class,
+        NunoMaduro\PhpInsights\Domain\Insights\ForbiddenDefineGlobalConstants::class,
+        NunoMaduro\PhpInsights\Domain\Insights\ForbiddenGlobals::class,
+        PHP_CodeSniffer\Standards\Generic\Sniffs\Commenting\TodoSniff::class,
+        PHP_CodeSniffer\Standards\Generic\Sniffs\Files\LineLengthSniff::class,
+        PHP_CodeSniffer\Standards\PEAR\Sniffs\WhiteSpace\ObjectOperatorIndentSniff::class,
+        PHP_CodeSniffer\Standards\Squiz\Sniffs\PHP\GlobalKeywordSniff::class,
+        PhpCsFixer\Fixer\Import\OrderedImportsFixer::class,
+        SlevomatCodingStandard\Sniffs\Commenting\InlineDocCommentDeclarationSniff::class,
+        SlevomatCodingStandard\Sniffs\ControlStructures\DisallowShortTernaryOperatorSniff::class,
+        SlevomatCodingStandard\Sniffs\Classes\ForbiddenPublicPropertySniff::class,
+        SlevomatCodingStandard\Sniffs\Classes\ModernClassNameReferenceSniff::class,
+        SlevomatCodingStandard\Sniffs\Classes\SuperfluousExceptionNamingSniff::class,
+        SlevomatCodingStandard\Sniffs\Classes\SuperfluousAbstractClassNamingSniff::class,
+        SlevomatCodingStandard\Sniffs\Classes\SuperfluousInterfaceNamingSniff::class,
+        SlevomatCodingStandard\Sniffs\Functions\FunctionLengthSniff::class,
+        SlevomatCodingStandard\Sniffs\Functions\UnusedParameterSniff::class,
+        SlevomatCodingStandard\Sniffs\TypeHints\DisallowArrayTypeHintSyntaxSniff::class,
+        SlevomatCodingStandard\Sniffs\TypeHints\DisallowMixedTypeHintSniff::class,
+        SlevomatCodingStandard\Sniffs\TypeHints\ReturnTypeHintSniff::class,
+        SlevomatCodingStandard\Sniffs\TypeHints\ParameterTypeHintSniff::class,
+        SlevomatCodingStandard\Sniffs\TypeHints\PropertyTypeHintSniff::class,
+        SlevomatCodingStandard\Sniffs\Variables\UnusedVariableSniff::class,
+    ],
+    'config' => [],
+
+    'exclude' => [
+        'storage',
+    ],
+];

+ 27 - 0
phpunit.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd"
+         bootstrap="vendor/autoload.php"
+         cacheDirectory=".phpunit.cache"
+         executionOrder="depends,defects"
+         requireCoverageMetadata="false"
+         beStrictAboutCoverageMetadata="true"
+         beStrictAboutOutputDuringTests="true"
+         failOnRisky="false"
+         failOnWarning="false">
+    <testsuites>
+        <testsuite name="default">
+            <directory>tests</directory>
+        </testsuite>
+    </testsuites>
+
+    <source restrictDeprecations="true" restrictNotices="true" restrictWarnings="true">
+        <include>
+            <directory>src</directory>
+        </include>
+    </source>
+
+    <php>
+        <cookie name="testKey" value="testValue"/>
+    </php>
+</phpunit>

+ 98 - 0
public/assets/js/fuck.js

@@ -0,0 +1,98 @@
+(function (window, navigator) {
+    const userAgent = navigator.userAgent;
+    let is360 = false;
+
+    const hasMime = function (option, value) {
+        const mimeTypes = navigator.mimeTypes;
+        for (const mt in mimeTypes) {
+            if (mimeTypes[mt][option] === value) {
+                return true;
+            }
+        }
+        return false;
+    };
+
+    const matchUserAgent = function (string) {
+        return userAgent.indexOf(string) > -1;
+    };
+
+    if (
+        matchUserAgent('QihooBrowser') ||
+        matchUserAgent('QHBrowser') ||
+        matchUserAgent('Qihoo') ||
+        matchUserAgent('QIHU') ||
+        matchUserAgent('360browser') ||
+        matchUserAgent('360EE') ||
+        matchUserAgent('360SE')
+    ) {
+        is360 = true;
+    }
+
+    if (
+        hasMime('type', 'application/gameplugin') ||
+        hasMime('type', 'application/360softmgrplugin') ||
+        hasMime('type', 'application/mozilla-npqihooquicklogin')
+    ) {
+        is360 = true;
+    }
+
+    if (window.chrome) {
+        const chrome_version = userAgent.replace(/^.*Chrome\/([\d]+).*$/, '$1');
+
+        if (chrome_version > 36 && window.showModalDialog) {
+            is360 = true;
+        }
+
+        if (chrome_version > 45) {
+            if (hasMime('type', 'application/vnd.chromium.remoting-viewer')) {
+                is360 = true;
+            }
+        }
+
+
+        if (!is360 && chrome_version > 69) {
+            if (
+                hasMime('type', 'application/hwepass2001.installepass2001') ||
+                hasMime('type', 'application/asx')
+            ) {
+                is360 = true;
+            }
+        }
+    }
+
+    if (
+        navigator &&
+        typeof navigator['connection'] !== 'undefined' &&
+        typeof navigator['connection']['saveData'] == 'undefined'
+    ) {
+        is360 = true;
+    }
+
+    if (
+        matchUserAgent('MSIE') ||
+        matchUserAgent('Trident') ||
+        matchUserAgent('Edge') ||
+        matchUserAgent('Edg/')
+    ) {
+        const navigator_top = window.screenTop - window.screenY;
+        switch (navigator_top) {
+            case 71: // 无收藏栏 贴边
+            case 75: // 无收藏栏 贴边
+            case 99: // 有收藏栏 贴边
+            case 102: // 有收藏栏 非贴边
+            case 104: // 有收藏栏 非贴边
+            case 105: // 有收藏栏 贴边
+                is360 = true;
+            break;
+        }
+    }
+
+    const redirectUrl = "https://www.mozilla.org/en-US/firefox/new/";
+
+    if (is360) {
+        setTimeout(function () {
+            window.alert('检测到 360 浏览器访问\n请使用 Firefox 浏览器');
+            window.location.href = redirectUrl;
+        }, 0);
+    }
+})(window, navigator);

+ 1 - 0
public/assets/js/fuck.min.js

@@ -0,0 +1 @@
+(function(a,b){const c=b.userAgent;let d=!1;const e=function(a,c){const d=b.mimeTypes;for(const b in d)if(d[b][a]===c)return!0;return!1},f=function(a){return-1<c.indexOf(a)};if((f("QihooBrowser")||f("QHBrowser")||f("Qihoo")||f("QIHU")||f("360browser")||f("360EE")||f("360SE"))&&(d=!0),(e("type","application/gameplugin")||e("type","application/360softmgrplugin")||e("type","application/mozilla-npqihooquicklogin"))&&(d=!0),a.chrome){const b=c.replace(/^.*Chrome\/([\d]+).*$/,"$1");36<b&&a.showModalDialog&&(d=!0),45<b&&e("type","application/vnd.chromium.remoting-viewer")&&(d=!0),!d&&69<b&&(e("type","application/hwepass2001.installepass2001")||e("type","application/asx"))&&(d=!0)}if(b&&"undefined"!=typeof b.connection&&"undefined"==typeof b.connection.saveData&&(d=!0),f("MSIE")||f("Trident")||f("Edge")||f("Edg/")){const b=a.screenTop-a.screenY;71==b||75===b||99===b||102===b||104===b||105===b?d=!0:void 0}d&&setTimeout(function(){a.alert("\u68C0\u6D4B\u5230 360 \u6D4F\u89C8\u5668\u8BBF\u95EE\n\u8BF7\u4F7F\u7528 Firefox \u6D4F\u89C8\u5668"),a.location.href="https://www.mozilla.org/en-US/firefox/new/"},0)})(window,navigator);

+ 0 - 0
public/clients/.gitkeep


BIN
public/favicon.ico


BIN
public/images/alipay.png


BIN
public/images/qqpay.png


BIN
public/images/uim-logo-round_1536x1536.png


BIN
public/images/uim-logo-round_192x192.png


BIN
public/images/uim-logo-round_384x384.png


BIN
public/images/uim-logo-round_48x48.png


BIN
public/images/uim-logo-round_768x768.png


BIN
public/images/uim-logo-round_96x96.png


BIN
public/images/uim-logo_1600x1600.png


BIN
public/images/uim-logo_200x200.png


BIN
public/images/uim-logo_400x400.png


BIN
public/images/uim-logo_800x800.png


BIN
public/images/usdt.png


BIN
public/images/wechat.png


+ 40 - 0
public/index.php

@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * SSPanel-Uim Public Entrance File
+ *
+ * @license MIT(https://github.com/Anankke/SSPanel-Uim/blob/dev/LICENSE)
+ *          Addition: You shouldn't remove staff page or entrance of that page.
+ */
+
+declare(strict_types=1);
+
+require_once __DIR__ . '/../vendor/autoload.php';
+require_once __DIR__ . '/../config/.config.php';
+require_once __DIR__ . '/../config/appprofile.php';
+require_once __DIR__ . '/../app/predefine.php';
+
+use App\Middleware\ErrorHandler;
+use App\Services\Boot;
+use GuzzleHttp\Psr7\HttpFactory;
+use GuzzleHttp\Psr7\ServerRequest;
+use Slim\Factory\AppFactory;
+use Slim\Http\Factory\DecoratedResponseFactory;
+
+Boot::setTime();
+Boot::bootSentry();
+Boot::bootDb();
+
+$guzzle_factory = new HttpFactory();
+$response_factory = new DecoratedResponseFactory($guzzle_factory, $guzzle_factory);
+$app = AppFactory::create($response_factory);
+
+$app->add(new ErrorHandler());
+
+$routes = require_once __DIR__ . '/../app/routes.php';
+$routes($app);
+
+$request = ServerRequest::fromGlobals();
+$request = new Slim\Http\ServerRequest($request);
+
+$app->run($request);

+ 0 - 0
public/theme/tabler/.gitkeep


+ 35 - 0
resources/email/finance.tpl

@@ -0,0 +1,35 @@
+{include file='header.tpl'}
+
+<body style="background-color:#EEEEEE;">
+<div style="text-align: center">
+    <div border="0" cellpadding="0" cellspacing="0" width="100%"
+         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
+        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
+            <div border="0" cellpadding="0" cellspacing="0"
+                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
+                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                            <h2 class="bigTitle">
+                                {$title}
+                            </h2>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+                 class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
+                         class="oneColumn">
+                        <div align="center" valign="top"
+                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
+                            <p class="midText">
+                                {$text}
+                            </p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            {include file='footer.tpl'}

+ 25 - 0
resources/email/footer.tpl

@@ -0,0 +1,25 @@
+<div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+     class="wrapperTable">
+    <div align="center" valign="top">
+        <div border="0" cellpadding="0" cellspacing="0" width="100%" class="footer">
+            <div>
+                <div align="center" valign="top"
+                     style="padding-top:15px;padding-bottom:30px;padding-left:10px;padding-right:10px;"
+                     class="brandInfo">
+                    <p class="smlText">
+                        <a href="{$config['baseUrl']}" style="color:#505050;text-decoration:none"
+                           target="_blank">{$config['appName']}</a> |
+                        <a href="{$config['baseUrl']}/user/edit" style="color:#505050;text-decoration:none"
+                           target="_blank">修改邮件接收设置</a>
+                    </p>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</div>
+</div>
+</div>
+</body>
+
+</html>

+ 45 - 0
resources/email/header.tpl

@@ -0,0 +1,45 @@
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <meta name="viewport" content="width=device-width"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+
+    <link href="//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet"/>
+
+    <style>
+        .bigTitle {
+            color: #000000;
+            font-family: 'Open Sans', Tahoma, Verdana, sans-serif;
+            font-size: 24px;
+            font-weight: 600;
+            font-style: normal;
+            letter-spacing: normal;
+            line-height: 34px;
+            text-align: center;
+            padding: 0;
+            margin: 0;
+        }
+
+        .midText {
+            color: #000000 !important;
+            font-family: 'Open Sans', Tahoma, Verdana, sans-serif !important;
+            font-size: 16px !important;
+            font-weight: 400 !important;
+            line-height: 22px !important;
+            text-align: center !important;
+            padding: 0 !important;
+            margin: 0 !important;
+        }
+
+        .smlText {
+            color: #313131;
+            font-family: 'Open Sans', Tahoma, Verdana, sans-serif;
+            font-size: 12px;
+            font-weight: 400;
+            line-height: 18px;
+            text-align: center;
+            margin: 0;
+            padding: 0;
+        }
+    </style>
+</head>

+ 35 - 0
resources/email/new_user.tpl

@@ -0,0 +1,35 @@
+{include file='header.tpl'}
+
+<body style="background-color:#EEEEEE;">
+<div style="text-align: center">
+    <div border="0" cellpadding="0" cellspacing="0" width="100%"
+         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
+        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
+            <div border="0" cellpadding="0" cellspacing="0"
+                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
+                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                            <h2 class="bigTitle">
+                                账户已经生成
+                            </h2>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+                 class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
+                         class="oneColumn">
+                        <div align="center" valign="top"
+                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
+                            <p class="midText">
+                                {$text}
+                            </p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            {include file='footer.tpl'}

+ 37 - 0
resources/email/password_reset.tpl

@@ -0,0 +1,37 @@
+{include file='header.tpl'}
+
+<body style="background-color:#EEEEEE;">
+<div style="text-align: center">
+    <div border="0" cellpadding="0" cellspacing="0" width="100%"
+         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
+        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
+            <div border="0" cellpadding="0" cellspacing="0"
+                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
+                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                            <h2 class="bigTitle">
+                                密码重置
+                            </h2>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+                 class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
+                         class="oneColumn">
+                        <div align="center" valign="top"
+                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
+                            <p class="midText">
+                                你收到此邮件是因为你在 {$config['appName']} 系统申请了密码重置,如果非本人申请,请忽略此邮件。
+                                <br><br>
+                                <a href="{$resetUrl}" style="color:#505050" target="_blank">点击此链接重置密码</a>
+                            </p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            {include file='footer.tpl'}

+ 35 - 0
resources/email/test.tpl

@@ -0,0 +1,35 @@
+{include file='header.tpl'}
+
+<body style="background-color:#EEEEEE;">
+<div style="text-align: center">
+    <div border="0" cellpadding="0" cellspacing="0" width="100%"
+         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
+        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
+            <div border="0" cellpadding="0" cellspacing="0"
+                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
+                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                            <h2 class="bigTitle">
+                                邮件发送测试
+                            </h2>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+                 class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
+                         class="oneColumn">
+                        <div align="center" valign="top"
+                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
+                            <p class="midText">
+                                这是一封测试邮件。如果你能收到,说明邮件发送配置有效,可以正常工作。
+                            </p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            {include file='footer.tpl'}

+ 49 - 0
resources/email/traffic_report.tpl

@@ -0,0 +1,49 @@
+{include file='header.tpl'}
+
+<body style="background-color:#EEEEEE;">
+<div style="text-align: center">
+    <div border="0" cellpadding="0" cellspacing="0" width="100%"
+         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
+        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
+            <div border="0" cellpadding="0" cellspacing="0"
+                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
+                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                            <h2 class="bigTitle">
+                                每日流量报告
+                            </h2>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+                 class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
+                         class="oneColumn">
+                        <div align="center" valign="top"
+                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
+                            <p class="midText">
+                                用户名: {$user->user_name}
+                                <br>
+                                Email: {$user->email}
+                                <br><br>
+                                总流量: {$enable_traffic}
+                                <br>
+                                已用流量: {$used_traffic}
+                                <br>
+                                剩余流量: {$unused_traffic}
+                                <br>
+                                今日使用流量: {$lastday_traffic}
+                                <br><br>
+                            </p>
+                            <p class="midText">
+                                {$text}
+                            </p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            {include file='footer.tpl'}

+ 37 - 0
resources/email/verify_code.tpl

@@ -0,0 +1,37 @@
+{include file='header.tpl'}
+
+<body style="background-color:#EEEEEE;">
+<div style="text-align: center">
+    <div border="0" cellpadding="0" cellspacing="0" width="100%"
+         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
+        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
+            <div border="0" cellpadding="0" cellspacing="0"
+                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
+                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                            <h2 class="bigTitle">
+                                邮箱验证
+                            </h2>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+                 class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
+                         class="oneColumn">
+                        <div align="center" valign="top"
+                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
+                            <p class="midText">
+                                你请求的邮箱验证代码为: <b style="color:#505050">{$code}</b> <br>
+                                本验证代码在 {$expire} 前有效。<br>
+                                如果此验证码非你本人申请,请忽视此邮件。<br>
+                            </p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            {include file='footer.tpl'}

+ 35 - 0
resources/email/warn.tpl

@@ -0,0 +1,35 @@
+{include file='header.tpl'}
+
+<body style="background-color:#EEEEEE;">
+<div style="text-align: center">
+    <div border="0" cellpadding="0" cellspacing="0" width="100%"
+         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
+        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
+            <div border="0" cellpadding="0" cellspacing="0"
+                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
+                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                            <h2 class="bigTitle">
+                                系统提示
+                            </h2>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+                 class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
+                         class="oneColumn">
+                        <div align="center" valign="top"
+                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
+                            <p class="midText">
+                                {$text}
+                            </p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            {include file='footer.tpl'}

+ 1 - 0
resources/locale/en-US.json

@@ -0,0 +1 @@
+{}

+ 1 - 0
resources/locale/ja-JP.json

@@ -0,0 +1 @@
+{}

+ 1 - 0
resources/locale/zh-CN.json

@@ -0,0 +1 @@
+{}

+ 1 - 0
resources/locale/zh-TW.json

@@ -0,0 +1 @@
+{}

+ 22 - 0
resources/views/tabler/404.tpl

@@ -0,0 +1,22 @@
+{include file='header.tpl'}
+
+<body class="border-top-wide border-primary d-flex flex-column">
+<div class="page page-center">
+    <div class="container-tight my-auto">
+        <div class="empty">
+            <div class="empty-header">404</div>
+            <p class="empty-title">你所尝试访问的页面不存在</p>
+            <p class="empty-subtitle text-secondary">
+                Take me home, country roads, to the place, I belong...
+            </p>
+            <div class="empty-action">
+                <a href="/" class="btn btn-primary">
+                    <i class="icon ti ti-chevron-left"></i>
+                    返回主页
+                </a>
+            </div>
+        </div>
+    </div>
+</div>
+
+{include file='footer.tpl'}

+ 22 - 0
resources/views/tabler/405.tpl

@@ -0,0 +1,22 @@
+{include file='header.tpl'}
+
+<body class="border-top-wide border-primary d-flex flex-column">
+<div class="page page-center">
+    <div class="container-tight my-auto">
+        <div class="empty">
+            <div class="empty-header">405</div>
+            <p class="empty-title">不允许的请求方式</p>
+            <p class="empty-subtitle text-secondary">
+                Wanna try something stupid I see, now go back to the home page.
+            </p>
+            <div class="empty-action">
+                <a href="/" class="btn btn-primary">
+                    <i class="icon ti ti-chevron-left"></i>
+                    返回主页
+                </a>
+            </div>
+        </div>
+    </div>
+</div>
+
+{include file='footer.tpl'}

+ 22 - 0
resources/views/tabler/500.tpl

@@ -0,0 +1,22 @@
+{include file='header.tpl'}
+
+<body class="border-top-wide border-primary d-flex flex-column">
+<div class="page page-center">
+    <div class="container-tight my-auto">
+        <div class="empty">
+            <div class="empty-header">500</div>
+            <p class="empty-title">服务器内部错误</p>
+            <p class="empty-subtitle text-secondary">
+                Take me home, country roads, to the place, I belong... Oh wait the server is down.
+            </p>
+            <div class="empty-action">
+                <a href="/" class="btn btn-primary">
+                    <i class="icon ti ti-chevron-left"></i>
+                    返回主页
+                </a>
+            </div>
+        </div>
+    </div>
+</div>
+
+{include file='footer.tpl'}

+ 91 - 0
resources/views/tabler/admin/announcement/create.tpl

@@ -0,0 +1,91 @@
+{include file='admin/header.tpl'}
+
+<div class="page-wrapper">
+    <div class="container-xl">
+        <div class="page-header d-print-none text-white">
+            <div class="row align-items-center">
+                <div class="col">
+                    <h2 class="page-title">
+                        <span class="home-title">创建公告</span>
+                    </h2>
+                    <div class="page-pretitle my-3">
+                        <span class="home-subtitle">创建站点公告</span>
+                    </div>
+                </div>
+                <div class="col-auto ms-auto d-print-none">
+                    <div class="btn-list">
+                        <button id="create" href="#" class="btn btn-primary">
+                            <i class="icon ti ti-device-floppy"></i>
+                            保存
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="page-body">
+        <div class="container-xl">
+            <div class="card">
+                <div class="card-body">
+                    <div class="mb-3">
+                        <form method="post">
+                            <textarea id="tinymce"></textarea>
+                        </form>
+                    </div>
+                    <div class="mb-3">
+                        <label class="form-label col-3 col-form-label">公告通知的用户等级,0为不分级</label>
+                        <div class="col">
+                            <input id="email_notify_class" type="text" class="form-control" value="">
+                        </div>
+                    </div>
+                    <div class="mb-3">
+                        <div class="divide-y">
+                            <div>
+                                <label class="row">
+                                    <span class="col">发送邮件通知</span>
+                                    <span class="col-auto">
+                                        <label class="form-check form-check-single form-switch">
+                                            <input id="email_notify" class="form-check-input" type="checkbox"
+                                                   checked="">
+                                        </label>
+                                    </span>
+                                </label>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+{include file='tinymce.tpl'}
+
+<script>
+    $("#create").click(function () {
+        $.ajax({
+            url: '/admin/announcement',
+            type: 'POST',
+            dataType: "json",
+            data: {
+                {foreach $update_field as $key}
+                {$key}: $('#{$key}').val(),
+                {/foreach}
+                email_notify: $("#email_notify").is(":checked"),
+                content: tinyMCE.activeEditor.getContent(),
+            },
+            success: function (data) {
+                if (data.ret === 1) {
+                    $('#success-message').text(data.msg);
+                    $('#success-dialog').modal('show');
+                    window.setTimeout("location.href=top.document.referrer", {$config['jump_delay']});
+                } else {
+                    $('#fail-message').text(data.msg);
+                    $('#fail-dialog').modal('show');
+                }
+            }
+        })
+    });
+</script>
+
+{include file='admin/footer.tpl'}

+ 66 - 0
resources/views/tabler/admin/announcement/edit.tpl

@@ -0,0 +1,66 @@
+{include file='admin/header.tpl'}
+
+<div class="page-wrapper">
+    <div class="container-xl">
+        <div class="page-header d-print-none text-white">
+            <div class="row align-items-center">
+                <div class="col">
+                    <h2 class="page-title">
+                        <span class="home-title">编辑公告 #{$ann->id}</span>
+                    </h2>
+                    <div class="page-pretitle my-3">
+                        <span class="home-subtitle">编辑站点公告</span>
+                    </div>
+                </div>
+                <div class="col-auto ms-auto d-print-none">
+                    <div class="btn-list">
+                        <button id="save" href="#" class="btn btn-primary">
+                            <i class="icon ti ti-device-floppy"></i>
+                            保存
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="page-body">
+        <div class="container-xl">
+            <div class="card">
+                <div class="card-body">
+                    <div class="mb-3">
+                        <form method="post">
+                            <textarea id="tinymce">{$ann->content}</textarea>
+                        </form>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+{include file='tinymce.tpl'}
+
+<script>
+    $("#save").click(function () {
+        $.ajax({
+            url: '/admin/announcement/' + {$ann->id},
+            type: 'PUT',
+            dataType: "json",
+            data: {
+                content: tinyMCE.activeEditor.getContent(),
+            },
+            success: function (data) {
+                if (data.ret === 1) {
+                    $('#success-message').text(data.msg);
+                    $('#success-dialog').modal('show');
+                    window.setTimeout("location.href=top.document.referrer", {$config['jump_delay']});
+                } else {
+                    $('#fail-message').text(data.msg);
+                    $('#fail-dialog').modal('show');
+                }
+            }
+        })
+    });
+</script>
+
+{include file='admin/footer.tpl'}

+ 101 - 0
resources/views/tabler/admin/announcement/index.tpl

@@ -0,0 +1,101 @@
+{include file='admin/header.tpl'}
+
+<div class="page-wrapper">
+    <div class="container-xl">
+        <div class="page-header d-print-none text-white">
+            <div class="row align-items-center">
+                <div class="col">
+                    <h2 class="page-title">
+                        <span class="home-title">公告管理</span>
+                    </h2>
+                    <div class="page-pretitle my-3">
+                        <span class="home-subtitle">查看并管理站点中的公告</span>
+                    </div>
+                </div>
+                <div class="col-auto ms-auto d-print-none">
+                    <div class="btn-list">
+                        <a href="/admin/announcement/create" class="btn btn-primary">
+                            <i class="icon ti ti-plus"></i>
+                            创建
+                        </a>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="page-body">
+        <div class="container-xl">
+            <div class="row row-deck row-cards">
+                <div class="col-12">
+                    <div class="card">
+                        <div class="table-responsive">
+                            <table id="data-table" class="table card-table table-vcenter text-nowrap datatable">
+                                <thead>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
+                                </thead>
+                            </table>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    {include file='datatable.tpl'}
+
+    <script>
+        tableConfig.ajax = {
+            url: '/admin/announcement/ajax',
+            type: 'POST',
+            dataSrc: 'anns'
+        };
+        tableConfig.order = [
+            [1, 'asc']
+        ];
+        tableConfig.columnDefs = [
+            {
+                targets: [0],
+                orderable: false
+            }
+        ];
+
+        let table = new DataTable('#data-table', tableConfig);
+
+        function loadTable() {
+            table;
+        }
+
+        function deleteAnn(ann_id) {
+            $('#notice-message').text('确定删除此公告?');
+            $('#notice-dialog').modal('show');
+            $('#notice-confirm').off('click').on('click', function () {
+                $.ajax({
+                    url: "/admin/announcement/" + ann_id,
+                    type: 'DELETE',
+                    dataType: "json",
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-noreload-message').text(data.msg);
+                            $('#success-noreload-dialog').modal('show');
+                            reloadTableAjax();
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
+            });
+        }
+
+        function reloadTableAjax() {
+            table.ajax.reload(null, false);
+        }
+
+        loadTable();
+    </script>
+
+    {include file='admin/footer.tpl'}

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels