├── .editorconfig
├── .github
├── actions
│ └── setup-python
│ │ └── action.yml
└── workflows
│ ├── publish.yml
│ └── ruff.yml
├── .gitignore
├── .pre-commit-config.yaml
├── LICENSE
├── README.md
├── docs
├── NoneBotPlugin.svg
└── rendering.png
├── nonebot_plugin_lxns_maimai
├── __init__.py
├── apis
│ ├── __init__.py
│ └── request.py
├── config.py
├── exception.py
├── filters.py
├── migrations
│ └── ce7ee9d4e359_first_revision.py
├── model.py
├── render.py
├── resources
│ ├── fonts
│ │ ├── SourceHanSans-Bold.otf
│ │ ├── SourceHanSans-Heavy.otf
│ │ ├── SourceHanSans-Medium.otf
│ │ ├── SourceHanSans-Normal.otf
│ │ └── SourceHanSans-Regular.otf
│ ├── images
│ │ ├── canvas.png
│ │ ├── default_icon.png
│ │ └── default_nameplate.png
│ └── templates
│ │ ├── best50.html.jinja2
│ │ ├── icons.macros.html.jinja2
│ │ ├── index.css
│ │ └── macros.html.jinja2
├── schema
│ ├── __init__.py
│ ├── alias.py
│ ├── collection.py
│ ├── enum
│ │ ├── __init__.py
│ │ ├── fctype.py
│ │ ├── fstype.py
│ │ ├── levelindex.py
│ │ ├── ratetype.py
│ │ └── songtype.py
│ ├── genre.py
│ ├── notes.py
│ ├── player.py
│ ├── score.py
│ ├── song.py
│ ├── trend.py
│ └── version.py
└── utils.py
├── pdm.lock
└── pyproject.toml
/.editorconfig:
--------------------------------------------------------------------------------
1 | # http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = true
11 |
12 | # The JSON files contain newlines inconsistently
13 | [*.json]
14 | insert_final_newline = ignore
15 |
16 | [*.md]
17 | trim_trailing_whitespace = false
18 |
19 | [{*.py,*.pyi}]
20 | indent_size = 4
--------------------------------------------------------------------------------
/.github/actions/setup-python/action.yml:
--------------------------------------------------------------------------------
1 | name: Setup Python
2 | description: Setup Python
3 |
4 | inputs:
5 | python-version:
6 | description: Python version
7 | required: false
8 | default: "3.10"
9 |
10 | runs:
11 | using: "composite"
12 | steps:
13 | - name: Install PDM
14 | run: pipx install pdm
15 | shell: bash
16 |
17 | - name: Setup PDM
18 | uses: pdm-project/setup-pdm@v3
19 | with:
20 | python-version: ${{ inputs.python-version }}
21 | architecture: "x64"
22 | cache: true
23 |
24 | - name: Install dependencies
25 | run: pdm install
26 | shell: bash
27 |
--------------------------------------------------------------------------------
/.github/workflows/publish.yml:
--------------------------------------------------------------------------------
1 | name: Publish
2 |
3 | on:
4 | push:
5 | tags:
6 | - '*'
7 | workflow_dispatch:
8 |
9 | jobs:
10 | pypi-publish:
11 | name: Upload release to PyPI
12 | runs-on: ubuntu-latest
13 | environment:
14 | name: release
15 | url: https://pypi.org/p/nonebot-plugin-lxns-maimai
16 | permissions:
17 | id-token: write
18 | steps:
19 | - uses: actions/checkout@master
20 |
21 | - name: Setup Python environment
22 | uses: ./.github/actions/setup-python
23 |
24 | - name: Install pypa/build
25 | run: >-
26 | python -m
27 | pip install
28 | build
29 | --user
30 | - name: Build a binary wheel and a source tarball
31 | run: >-
32 | python -m
33 | build
34 | --sdist
35 | --wheel
36 | --outdir dist/
37 | .
38 | - name: Publish distribution to PyPI
39 | uses: pypa/gh-action-pypi-publish@release/v1
40 |
--------------------------------------------------------------------------------
/.github/workflows/ruff.yml:
--------------------------------------------------------------------------------
1 | name: Ruff Lint
2 |
3 | on:
4 | push:
5 | branches:
6 | - master
7 | pull_request:
8 |
9 | jobs:
10 | ruff:
11 | name: Ruff Lint
12 | runs-on: ubuntu-latest
13 | steps:
14 | - uses: actions/checkout@v4
15 |
16 | - name: Run Ruff Lint
17 | uses: chartboost/ruff-action@v1
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | share/python-wheels/
24 | *.egg-info/
25 | .installed.cfg
26 | *.egg
27 | MANIFEST
28 |
29 | # PyInstaller
30 | # Usually these files are written by a python script from a template
31 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
32 | *.manifest
33 | *.spec
34 |
35 | # Installer logs
36 | pip-log.txt
37 | pip-delete-this-directory.txt
38 |
39 | # Unit test / coverage reports
40 | htmlcov/
41 | .tox/
42 | .nox/
43 | .coverage
44 | .coverage.*
45 | .cache
46 | nosetests.xml
47 | coverage.xml
48 | *.cover
49 | *.py,cover
50 | .hypothesis/
51 | .pytest_cache/
52 | cover/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | .pybuilder/
76 | target/
77 |
78 | # Jupyter Notebook
79 | .ipynb_checkpoints
80 |
81 | # IPython
82 | profile_default/
83 | ipython_config.py
84 |
85 | # pyenv
86 | # For a library or package, you might want to ignore these files since the code is
87 | # intended to run in multiple environments; otherwise, check them in:
88 | # .python-version
89 |
90 | # pipenv
91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
94 | # install all needed dependencies.
95 | #Pipfile.lock
96 |
97 | # poetry
98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99 | # This is especially recommended for binary packages to ensure reproducibility, and is more
100 | # commonly ignored for libraries.
101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102 | #poetry.lock
103 |
104 | # pdm
105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106 | #pdm.lock
107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108 | # in version control.
109 | # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
110 | .pdm.toml
111 | .pdm-python
112 | .pdm-build/
113 |
114 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
115 | __pypackages__/
116 |
117 | # Celery stuff
118 | celerybeat-schedule
119 | celerybeat.pid
120 |
121 | # SageMath parsed files
122 | *.sage.py
123 |
124 | # Environments
125 | .env
126 | .venv
127 | env/
128 | venv/
129 | ENV/
130 | env.bak/
131 | venv.bak/
132 |
133 | # Spyder project settings
134 | .spyderproject
135 | .spyproject
136 |
137 | # Rope project settings
138 | .ropeproject
139 |
140 | # mkdocs documentation
141 | /site
142 |
143 | # mypy
144 | .mypy_cache/
145 | .dmypy.json
146 | dmypy.json
147 |
148 | # Pyre type checker
149 | .pyre/
150 |
151 | # pytype static type analyzer
152 | .pytype/
153 |
154 | # Cython debug symbols
155 | cython_debug/
156 |
157 | # PyCharm
158 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
159 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
160 | # and can be added to the global gitignore or merged into this file. For a more nuclear
161 | # option (not recommended) you can uncomment the following to ignore the entire idea folder.
162 | .idea/
163 |
164 | data
165 | /bot.py
166 | /maimai.db
167 |
--------------------------------------------------------------------------------
/.pre-commit-config.yaml:
--------------------------------------------------------------------------------
1 | default_install_hook_types: [pre-commit, prepare-commit-msg]
2 | ci:
3 | autofix_commit_msg: ":rotating_light: auto fix by pre-commit hooks"
4 | autofix_prs: true
5 | autoupdate_branch: master
6 | autoupdate_schedule: monthly
7 | autoupdate_commit_msg: ":arrow_up: auto update by pre-commit hooks"
8 | repos:
9 | - repo: https://github.com/astral-sh/ruff-pre-commit
10 | rev: v0.11.4
11 | hooks:
12 | - id: ruff
13 | args: [--fix, --exit-non-zero-on-fix]
14 | stages: [pre-commit]
15 |
16 | - repo: https://github.com/pycqa/isort
17 | rev: 6.0.1
18 | hooks:
19 | - id: isort
20 | stages: [pre-commit]
21 |
22 | - repo: https://github.com/psf/black
23 | rev: 25.1.0
24 | hooks:
25 | - id: black
26 | stages: [pre-commit]
27 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Komorebi
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
49 |
50 | ## 📖 介绍
51 |
52 | NoneBot maimai DX 查询插件。
53 |
54 | ## 🎉 配置 & 使用
55 |
56 | 详见 Wiki:[📖 这里](https://github.com/KomoriDev/nonebot-plugin-lxns-maimai/wiki)
57 |
58 | ## 📸 效果图
59 |
60 |
61 |
62 | ## 💖 鸣谢
63 |
64 | - [@Lxns-Network](https://github.com/Lxns-Network):提供了超棒的 maimai DX 查分器
65 | - [@星鹿ELEC](https://space.bilibili.com/628990513):绘制了好康的 Best 50 查分图
66 |
67 | ## 📄 许可证
68 |
69 | 本项目使用 [MIT](./LICENSE) 许可证开源
70 |
71 | ```text
72 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
73 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
74 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
75 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
76 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
77 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
78 | SOFTWARE.
79 | ```
80 |
--------------------------------------------------------------------------------
/docs/rendering.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/docs/rendering.png
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/__init__.py:
--------------------------------------------------------------------------------
1 | import httpx
2 | from nonebot import require
3 | from nonebot.rule import Rule
4 | from nonebot.log import logger
5 | from nonebot.plugin import PluginMetadata, inherit_supported_adapters
6 |
7 | require("nonebot_plugin_orm")
8 | require("nonebot_plugin_user")
9 | require("nonebot_plugin_waiter")
10 | require("nonebot_plugin_alconna")
11 | require("nonebot_plugin_htmlrender")
12 | from nonebot_plugin_waiter import prompt
13 | from nonebot_plugin_user import UserSession
14 | from nonebot_plugin_orm import async_scoped_session
15 | from nonebot_plugin_alconna.uniseg import Button, UniMessage, FallbackStrategy
16 | from nonebot_plugin_alconna import Args, Match, Option, Alconna, CommandMeta, on_alconna
17 |
18 | from .apis import API
19 | from . import migrations
20 | from .render import render_b50
21 | from .schema import RenderProps
22 | from .config import Config, config
23 | from .model import User, bind_user
24 | from .exception import FetchUserException
25 |
26 | __plugin_meta__ = PluginMetadata(
27 | name="maimai DX 查分",
28 | description="maimai DX 查分插件",
29 | usage="/m b50",
30 | type="application",
31 | homepage="https://github.com/KomoriDev/nonebot-plugin-lxns-maimai",
32 | config=Config,
33 | supported_adapters=inherit_supported_adapters(
34 | "nonebot_plugin_alconna", "nonebot_plugin_user"
35 | ),
36 | extra={
37 | "unique_name": "maimai dx",
38 | "orm_version_location": migrations,
39 | "author": "Komorebi ",
40 | "version": "0.1.2",
41 | },
42 | )
43 |
44 |
45 | if not config.api_token:
46 | logger.warning("缺失必要配置项,已禁用该插件")
47 |
48 |
49 | def is_enable() -> Rule:
50 |
51 | def _rule() -> bool:
52 | return bool(config.api_token)
53 |
54 | return Rule(_rule)
55 |
56 |
57 | mai = on_alconna(
58 | Alconna(
59 | "mai",
60 | Option("bind", Args["friend_code?#好友码", int], help_text="绑定好友码"),
61 | Option("best50", alias={"b50"}, help_text="查询 Best50"),
62 | meta=CommandMeta(
63 | description="maimai DX 查分",
64 | usage=__plugin_meta__.usage,
65 | example="/mai bind 123456; /mai b50",
66 | compact=True,
67 | ),
68 | ),
69 | rule=is_enable(),
70 | aliases={"m", "maimai"},
71 | use_cmd_start=True,
72 | )
73 |
74 |
75 | @mai.assign("bind")
76 | async def _(friend_code: Match[int], user_session: UserSession):
77 | if friend_code.available:
78 | result = friend_code.result
79 | else:
80 | result = await prompt("请输入好友码", timeout=30)
81 | if result is None:
82 | await (
83 | UniMessage.text("等待超时")
84 | .keyboard(Button("input", label="重试", text="/mai bind"))
85 | .finish(at_sender=True, fallback=FallbackStrategy.ignore)
86 | )
87 | result = result.extract_plain_text()
88 | try:
89 | player = await API.get_player_info(int(result))
90 | await bind_user(user_session.user_id, player.friend_code)
91 | await (
92 | UniMessage.text(f"绑定成功!欢迎 {player.name}")
93 | .keyboard(Button("input", label="查询 Best50", text="/mai b50"))
94 | .finish(at_sender=True, fallback=FallbackStrategy.ignore)
95 | )
96 | except FetchUserException as e:
97 | await (
98 | UniMessage.text(f"绑定失败: {str(e)}")
99 | .keyboard(Button("input", label="重试", text="/mai bind"))
100 | .finish(at_sender=True, fallback=FallbackStrategy.ignore)
101 | )
102 |
103 |
104 | @mai.assign("best50")
105 | async def _(db_session: async_scoped_session, user_session: UserSession):
106 | user = await db_session.get(User, user_session.user_id)
107 | if user is None:
108 | await (
109 | UniMessage.text("暂未绑定 maimai DX 查分器账号。")
110 | .text("使用 /mai bind 命令进行绑定")
111 | .keyboard(Button("input", label="Bind", text="/mai bind"))
112 | .finish(at_sender=True, fallback=FallbackStrategy.ignore)
113 | )
114 | try:
115 | standard_total, dx_total, standard, dx = await API.get_bests(user.friend_code)
116 | player = await API.get_player_info(user.friend_code)
117 | props = RenderProps(
118 | player=player,
119 | standard_total=standard_total,
120 | dx_total=dx_total,
121 | standard=standard,
122 | dx=dx,
123 | )
124 | await UniMessage.image(raw=await render_b50(props)).finish(at_sender=True)
125 | except FetchUserException as e:
126 | await (
127 | UniMessage.text(f"Best 50 查询失败: {str(e)}")
128 | .keyboard(Button("input", label="重试", text="/mai b50"))
129 | .finish(at_sender=True, fallback=FallbackStrategy.ignore)
130 | )
131 | except httpx.ConnectError:
132 | await (
133 | UniMessage.text("Best 50 查询失败: 网络超时,请稍后再试")
134 | .keyboard(Button("input", label="重试", text="/mai b50"))
135 | .finish(at_sender=True, fallback=FallbackStrategy.ignore)
136 | )
137 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/apis/__init__.py:
--------------------------------------------------------------------------------
1 | from .request import API as API
2 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/apis/request.py:
--------------------------------------------------------------------------------
1 | from io import BytesIO
2 |
3 | import httpx
4 |
5 | from ..config import config
6 | from ..exception import FetchUserException
7 | from ..schema import Song, Score, Trend, Player
8 |
9 | url = config.api_url
10 | token = config.api_token
11 |
12 |
13 | class API:
14 | headers = {"Authorization": token}
15 |
16 | @classmethod
17 | async def get_player_info(cls, friend_code: int) -> Player:
18 | """
19 | 通过好友码获取玩家信息。
20 | 当好友码被绑定时,需要查分器用户开启 `allow_third_party_fetch_player` 权限。
21 | """
22 | async with httpx.AsyncClient() as client:
23 | response = await client.get(
24 | url=f"{url}/player/{friend_code}", headers=cls.headers
25 | )
26 | if response.status_code != 200:
27 | raise FetchUserException(response.json()["message"])
28 | return Player(**response.json()["data"])
29 |
30 | @classmethod
31 | async def get_rating_trend(cls, friend_code: int) -> Trend:
32 | """
33 | DX Rating 趋势
34 | 当好友码被绑定时,需要查分器用户开启 `allow_third_party_fetch_history` 权限。
35 | """
36 | async with httpx.AsyncClient() as client:
37 | response = await client.get(
38 | url=f"{url}/player/{friend_code}/trend", headers=cls.headers
39 | )
40 | if response.status_code != 200:
41 | raise FetchUserException(response.json()["message"])
42 | return Trend(**response.json()["data"])
43 |
44 | @classmethod
45 | async def get_bests(
46 | cls, friend_code: int
47 | ) -> tuple[int, int, list[Score], list[Score]]:
48 | """
49 | 获取玩家缓存的 Best50
50 | Args:
51 | friend_code: 好友码
52 |
53 | Returns:
54 | standard_total: 旧版本谱面 Best 35 总分
55 | dx_total: 现版本谱面 Best 15 总分
56 | standard: 旧版本谱面 Best 35 列表
57 | dx: 现版本谱面 Best 15 列表
58 | """
59 | async with httpx.AsyncClient() as client:
60 | response = await client.get(
61 | url=f"{url}/player/{friend_code}/bests", headers=cls.headers
62 | )
63 | if response.status_code != 200:
64 | raise FetchUserException(response.json()["message"])
65 | data = response.json()["data"]
66 | standard_scores = [Score(**score) for score in data["standard"]]
67 | dx_scores = [Score(**score) for score in data["dx"]]
68 | return data["standard_total"], data["dx_total"], standard_scores, dx_scores
69 |
70 | @classmethod
71 | async def get_song_info(cls, song_id: int) -> Song:
72 | async with httpx.AsyncClient() as client:
73 | response = await client.get(f"{url}/song/{song_id}")
74 | return Song(**response.json())
75 |
76 | @classmethod
77 | async def download_player_icon(cls, player: Player) -> BytesIO | bytes:
78 | if not player.icon:
79 | return BytesIO()
80 | async with httpx.AsyncClient() as client:
81 | response = await client.get(
82 | f"https://assets.lxns.net/maimai/icon/{player.icon.id}.png!webp"
83 | )
84 | return BytesIO(response.content)
85 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/config.py:
--------------------------------------------------------------------------------
1 | from pathlib import Path
2 |
3 | from pydantic import Field, BaseModel
4 | from nonebot.plugin import get_plugin_config
5 |
6 | RESOURCES_DIR: Path = Path(__file__).parent / "resources"
7 | IMAGES_DIR: Path = RESOURCES_DIR / "images"
8 | TEMPLATES_DIR: Path = RESOURCES_DIR / "templates"
9 |
10 | COURSE_RANK = [
11 | "初学者",
12 | "初段",
13 | "二段",
14 | "三段",
15 | "四段",
16 | "五段",
17 | "六段",
18 | "七段",
19 | "八段",
20 | "九段",
21 | "十段",
22 | "真传",
23 | "真初段",
24 | "真二段",
25 | "真三段",
26 | "真四段",
27 | "真五段",
28 | "真六段",
29 | "真七段",
30 | "真八段",
31 | "真九段",
32 | "真十段",
33 | "真皆传",
34 | "里皆传",
35 | ]
36 |
37 |
38 | class ScopedConfig(BaseModel):
39 | api_url: str = "https://maimai.lxns.net/api/v0/maimai"
40 | api_token: str = ""
41 |
42 |
43 | class Config(BaseModel):
44 | maimai: ScopedConfig = Field(default_factory=ScopedConfig)
45 | """MaiMai Config"""
46 |
47 |
48 | config = get_plugin_config(Config).maimai
49 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/exception.py:
--------------------------------------------------------------------------------
1 | class FetchUserException(Exception):
2 | """Fetch User Info Field"""
3 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/filters.py:
--------------------------------------------------------------------------------
1 | from .config import COURSE_RANK
2 | from .schema.enum import LevelIndex
3 |
4 |
5 | def level_index_to_color(level_index: LevelIndex) -> tuple[str, str]:
6 | match level_index:
7 | case LevelIndex.BASIC:
8 | return "#E1FFE9", "#00FF4430"
9 | case LevelIndex.ADVANCED:
10 | return "#FFF7E1", "#FBFF0030"
11 | case LevelIndex.EXPERT:
12 | return "#FFE1E1", "#FF000030"
13 | case LevelIndex.MASTER:
14 | return "#E7E1FF", "#A100FF30"
15 | case LevelIndex.RE_MASTER:
16 | return "#F0F0F0", "#80808030"
17 | case _:
18 | return "#E1FFE9", "#00FF4430"
19 |
20 |
21 | def star_count_to_color(count: int):
22 | if count == 1 or count == 2:
23 | return "#25FF00", "#0DFF00"
24 | elif count == 3 or count == 4:
25 | return "#FF5100", "#FF0000"
26 | else:
27 | return "#FFCF00", "#FFFB00"
28 |
29 |
30 | def course_rank_id_to_text(course_rank: int) -> str:
31 | return COURSE_RANK[course_rank]
32 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/migrations/ce7ee9d4e359_first_revision.py:
--------------------------------------------------------------------------------
1 | """first revision
2 |
3 | 迁移 ID: ce7ee9d4e359
4 | 父迁移:
5 | 创建时间: 2024-08-21 13:01:53.113592
6 |
7 | """
8 |
9 | from __future__ import annotations
10 |
11 | from collections.abc import Sequence
12 |
13 | import sqlalchemy as sa
14 | from alembic import op
15 |
16 | revision: str = "ce7ee9d4e359"
17 | down_revision: str | Sequence[str] | None = None
18 | branch_labels: str | Sequence[str] | None = ("nonebot_plugin_lxns_maimai",)
19 | depends_on: str | Sequence[str] | None = None
20 |
21 |
22 | def upgrade(name: str = "") -> None:
23 | if name:
24 | return
25 | # ### commands auto generated by Alembic - please adjust! ###
26 | op.create_table(
27 | "nonebot_plugin_lxns_maimai_user",
28 | sa.Column("id", sa.Integer(), nullable=False),
29 | sa.Column("friend_code", sa.Integer(), nullable=False),
30 | sa.PrimaryKeyConstraint("id", name=op.f("pk_nonebot_plugin_lxns_maimai_user")),
31 | info={"bind_key": "nonebot_plugin_lxns_maimai"},
32 | )
33 | # ### end Alembic commands ###
34 |
35 |
36 | def downgrade(name: str = "") -> None:
37 | if name:
38 | return
39 | # ### commands auto generated by Alembic - please adjust! ###
40 | op.drop_table("nonebot_plugin_lxns_maimai_user")
41 | # ### end Alembic commands ###
42 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/model.py:
--------------------------------------------------------------------------------
1 | from sqlalchemy.orm import Mapped, mapped_column
2 | from nonebot_plugin_orm import Model, get_session
3 |
4 |
5 | class User(Model):
6 |
7 | id: Mapped[int] = mapped_column(primary_key=True)
8 | """用户 ID"""
9 | friend_code: Mapped[int]
10 | """好友码"""
11 |
12 |
13 | async def bind_user(id: int, friend_code: int) -> User:
14 | session = get_session()
15 | async with session.begin():
16 | user = await session.get(User, id)
17 |
18 | if not user:
19 | user = User(friend_code=friend_code)
20 | session.add(user)
21 |
22 | return user
23 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/render.py:
--------------------------------------------------------------------------------
1 | import asyncio
2 |
3 | from nonebot_plugin_htmlrender import template_to_pic
4 |
5 | from .schema import RenderProps
6 | from .config import TEMPLATES_DIR
7 | from .utils import calc_star_count
8 | from .filters import star_count_to_color, level_index_to_color, course_rank_id_to_text
9 |
10 |
11 | async def render_b50(props: RenderProps) -> bytes:
12 | tasks = [calc_star_count(score) for score in props.standard + props.dx]
13 | star_counts = await asyncio.gather(*tasks)
14 |
15 | for score, star_count in zip(props.standard + props.dx, star_counts):
16 | score.star_count = star_count # type: ignore
17 |
18 | return await template_to_pic(
19 | template_path=str(TEMPLATES_DIR),
20 | template_name="best50.html.jinja2",
21 | templates={
22 | "player": props.player,
23 | "standard_total": props.standard_total,
24 | "dx_total": props.dx_total,
25 | "standard": props.standard,
26 | "dx": props.dx,
27 | },
28 | filters={
29 | "level_index_to_color": level_index_to_color,
30 | "star_count_to_color": star_count_to_color,
31 | "course_rank_id_to_text": course_rank_id_to_text,
32 | },
33 | pages={
34 | "viewport": {"width": 1080, "height": 1512},
35 | "base_url": f"file://{TEMPLATES_DIR}",
36 | },
37 | )
38 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Bold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Bold.otf
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Heavy.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Heavy.otf
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Medium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Medium.otf
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Normal.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Normal.otf
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Regular.otf
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/resources/images/canvas.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/images/canvas.png
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/resources/images/default_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/images/default_icon.png
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/resources/images/default_nameplate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/images/default_nameplate.png
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/resources/templates/best50.html.jinja2:
--------------------------------------------------------------------------------
1 | {% from 'macros.html.jinja2' import header, song_card %}
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | Best 50
11 |
14 |
15 |
16 |
17 |
18 |
19 | {{ header(player, standard_total, dx_total) }}
20 |
21 |
22 |
23 | {% for score in standard %}
24 | {{ song_card(score, loop.index) }}
25 | {% endfor %}
26 |
27 |
28 |
29 | {% for score in dx %}
30 | {{ song_card(score, loop.index) }}
31 | {% endfor %}
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/resources/templates/icons.macros.html.jinja2:
--------------------------------------------------------------------------------
1 | {% macro app() %}
2 |
3 |
29 |
AP+
30 |
31 | {% endmacro %}
32 |
33 | {% macro ap() %}
34 |
35 |
53 | AP
54 |
55 | {% endmacro %}
56 |
57 | {% macro fcp() %}
58 |
59 |
86 |
FC+
87 |
88 | {% endmacro %}
89 |
90 | {% macro fc() %}
91 |
92 |
110 | FC
111 |
112 | {% endmacro %}
113 |
114 | {% macro fsdp() %}
115 |
116 |
142 |
FDX+
143 |
144 | {% endmacro %}
145 |
146 | {% macro fsd() %}
147 |
148 |
164 | FDX
165 |
166 | {% endmacro %}
167 |
168 | {% macro fsp() %}
169 |
170 |
199 |
FS+
200 |
201 | {% endmacro %}
202 |
203 | {% macro fs() %}
204 |
205 |
221 | FS
222 |
223 | {% endmacro %}
224 |
225 | {% macro sync() %}
226 |
227 |
243 | SP
244 |
245 | {% endmacro %}
246 |
247 | {% macro null() %}
248 |
251 | {% endmacro %}
252 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/resources/templates/index.css:
--------------------------------------------------------------------------------
1 | /*
2 | ! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com
3 | */
4 |
5 | /*
6 | 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
7 | 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
8 | */
9 |
10 | *,
11 | ::before,
12 | ::after {
13 | box-sizing: border-box;
14 | /* 1 */
15 | border-width: 0;
16 | /* 2 */
17 | border-style: solid;
18 | /* 2 */
19 | border-color: #e5e7eb;
20 | /* 2 */
21 | }
22 |
23 | ::before,
24 | ::after {
25 | --tw-content: '';
26 | }
27 |
28 | /*
29 | 1. Use a consistent sensible line-height in all browsers.
30 | 2. Prevent adjustments of font size after orientation changes in iOS.
31 | 3. Use a more readable tab size.
32 | 4. Use the user's configured `sans` font-family by default.
33 | 5. Use the user's configured `sans` font-feature-settings by default.
34 | 6. Use the user's configured `sans` font-variation-settings by default.
35 | 7. Disable tap highlights on iOS
36 | */
37 |
38 | html,
39 | :host {
40 | line-height: 1.5;
41 | /* 1 */
42 | -webkit-text-size-adjust: 100%;
43 | /* 2 */
44 | -moz-tab-size: 4;
45 | /* 3 */
46 | -o-tab-size: 4;
47 | tab-size: 4;
48 | /* 3 */
49 | font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
50 | /* 4 */
51 | font-feature-settings: normal;
52 | /* 5 */
53 | font-variation-settings: normal;
54 | /* 6 */
55 | -webkit-tap-highlight-color: transparent;
56 | /* 7 */
57 | }
58 |
59 | /*
60 | 1. Remove the margin in all browsers.
61 | 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
62 | */
63 |
64 | body {
65 | margin: 0;
66 | /* 1 */
67 | line-height: inherit;
68 | /* 2 */
69 | }
70 |
71 | /*
72 | 1. Add the correct height in Firefox.
73 | 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
74 | 3. Ensure horizontal rules are visible by default.
75 | */
76 |
77 | hr {
78 | height: 0;
79 | /* 1 */
80 | color: inherit;
81 | /* 2 */
82 | border-top-width: 1px;
83 | /* 3 */
84 | }
85 |
86 | /*
87 | Add the correct text decoration in Chrome, Edge, and Safari.
88 | */
89 |
90 | abbr:where([title]) {
91 | -webkit-text-decoration: underline dotted;
92 | text-decoration: underline dotted;
93 | }
94 |
95 | /*
96 | Remove the default font size and weight for headings.
97 | */
98 |
99 | h1,
100 | h2,
101 | h3,
102 | h4,
103 | h5,
104 | h6 {
105 | font-size: inherit;
106 | font-weight: inherit;
107 | }
108 |
109 | /*
110 | Reset links to optimize for opt-in styling instead of opt-out.
111 | */
112 |
113 | a {
114 | color: inherit;
115 | text-decoration: inherit;
116 | }
117 |
118 | /*
119 | Add the correct font weight in Edge and Safari.
120 | */
121 |
122 | b,
123 | strong {
124 | font-weight: bolder;
125 | }
126 |
127 | /*
128 | 1. Use the user's configured `mono` font-family by default.
129 | 2. Use the user's configured `mono` font-feature-settings by default.
130 | 3. Use the user's configured `mono` font-variation-settings by default.
131 | 4. Correct the odd `em` font sizing in all browsers.
132 | */
133 |
134 | code,
135 | kbd,
136 | samp,
137 | pre {
138 | font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
139 | /* 1 */
140 | font-feature-settings: normal;
141 | /* 2 */
142 | font-variation-settings: normal;
143 | /* 3 */
144 | font-size: 1em;
145 | /* 4 */
146 | }
147 |
148 | /*
149 | Add the correct font size in all browsers.
150 | */
151 |
152 | small {
153 | font-size: 80%;
154 | }
155 |
156 | /*
157 | Prevent `sub` and `sup` elements from affecting the line height in all browsers.
158 | */
159 |
160 | sub,
161 | sup {
162 | font-size: 75%;
163 | line-height: 0;
164 | position: relative;
165 | vertical-align: baseline;
166 | }
167 |
168 | sub {
169 | bottom: -0.25em;
170 | }
171 |
172 | sup {
173 | top: -0.5em;
174 | }
175 |
176 | /*
177 | 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
178 | 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
179 | 3. Remove gaps between table borders by default.
180 | */
181 |
182 | table {
183 | text-indent: 0;
184 | /* 1 */
185 | border-color: inherit;
186 | /* 2 */
187 | border-collapse: collapse;
188 | /* 3 */
189 | }
190 |
191 | /*
192 | 1. Change the font styles in all browsers.
193 | 2. Remove the margin in Firefox and Safari.
194 | 3. Remove default padding in all browsers.
195 | */
196 |
197 | button,
198 | input,
199 | optgroup,
200 | select,
201 | textarea {
202 | font-family: inherit;
203 | /* 1 */
204 | font-feature-settings: inherit;
205 | /* 1 */
206 | font-variation-settings: inherit;
207 | /* 1 */
208 | font-size: 100%;
209 | /* 1 */
210 | font-weight: inherit;
211 | /* 1 */
212 | line-height: inherit;
213 | /* 1 */
214 | letter-spacing: inherit;
215 | /* 1 */
216 | color: inherit;
217 | /* 1 */
218 | margin: 0;
219 | /* 2 */
220 | padding: 0;
221 | /* 3 */
222 | }
223 |
224 | /*
225 | Remove the inheritance of text transform in Edge and Firefox.
226 | */
227 |
228 | button,
229 | select {
230 | text-transform: none;
231 | }
232 |
233 | /*
234 | 1. Correct the inability to style clickable types in iOS and Safari.
235 | 2. Remove default button styles.
236 | */
237 |
238 | button,
239 | input:where([type='button']),
240 | input:where([type='reset']),
241 | input:where([type='submit']) {
242 | -webkit-appearance: button;
243 | /* 1 */
244 | background-color: transparent;
245 | /* 2 */
246 | background-image: none;
247 | /* 2 */
248 | }
249 |
250 | /*
251 | Use the modern Firefox focus style for all focusable elements.
252 | */
253 |
254 | :-moz-focusring {
255 | outline: auto;
256 | }
257 |
258 | /*
259 | Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
260 | */
261 |
262 | :-moz-ui-invalid {
263 | box-shadow: none;
264 | }
265 |
266 | /*
267 | Add the correct vertical alignment in Chrome and Firefox.
268 | */
269 |
270 | progress {
271 | vertical-align: baseline;
272 | }
273 |
274 | /*
275 | Correct the cursor style of increment and decrement buttons in Safari.
276 | */
277 |
278 | ::-webkit-inner-spin-button,
279 | ::-webkit-outer-spin-button {
280 | height: auto;
281 | }
282 |
283 | /*
284 | 1. Correct the odd appearance in Chrome and Safari.
285 | 2. Correct the outline style in Safari.
286 | */
287 |
288 | [type='search'] {
289 | -webkit-appearance: textfield;
290 | /* 1 */
291 | outline-offset: -2px;
292 | /* 2 */
293 | }
294 |
295 | /*
296 | Remove the inner padding in Chrome and Safari on macOS.
297 | */
298 |
299 | ::-webkit-search-decoration {
300 | -webkit-appearance: none;
301 | }
302 |
303 | /*
304 | 1. Correct the inability to style clickable types in iOS and Safari.
305 | 2. Change font properties to `inherit` in Safari.
306 | */
307 |
308 | ::-webkit-file-upload-button {
309 | -webkit-appearance: button;
310 | /* 1 */
311 | font: inherit;
312 | /* 2 */
313 | }
314 |
315 | /*
316 | Add the correct display in Chrome and Safari.
317 | */
318 |
319 | summary {
320 | display: list-item;
321 | }
322 |
323 | /*
324 | Removes the default spacing and border for appropriate elements.
325 | */
326 |
327 | blockquote,
328 | dl,
329 | dd,
330 | h1,
331 | h2,
332 | h3,
333 | h4,
334 | h5,
335 | h6,
336 | hr,
337 | figure,
338 | p,
339 | pre {
340 | margin: 0;
341 | }
342 |
343 | fieldset {
344 | margin: 0;
345 | padding: 0;
346 | }
347 |
348 | legend {
349 | padding: 0;
350 | }
351 |
352 | ol,
353 | ul,
354 | menu {
355 | list-style: none;
356 | margin: 0;
357 | padding: 0;
358 | }
359 |
360 | /*
361 | Reset default styling for dialogs.
362 | */
363 |
364 | dialog {
365 | padding: 0;
366 | }
367 |
368 | /*
369 | Prevent resizing textareas horizontally by default.
370 | */
371 |
372 | textarea {
373 | resize: vertical;
374 | }
375 |
376 | /*
377 | 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
378 | 2. Set the default placeholder color to the user's configured gray 400 color.
379 | */
380 |
381 | input::-moz-placeholder, textarea::-moz-placeholder {
382 | opacity: 1;
383 | /* 1 */
384 | color: #9ca3af;
385 | /* 2 */
386 | }
387 |
388 | input::placeholder,
389 | textarea::placeholder {
390 | opacity: 1;
391 | /* 1 */
392 | color: #9ca3af;
393 | /* 2 */
394 | }
395 |
396 | /*
397 | Set the default cursor for buttons.
398 | */
399 |
400 | button,
401 | [role="button"] {
402 | cursor: pointer;
403 | }
404 |
405 | /*
406 | Make sure disabled buttons don't get the pointer cursor.
407 | */
408 |
409 | :disabled {
410 | cursor: default;
411 | }
412 |
413 | /*
414 | 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
415 | 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
416 | This can trigger a poorly considered lint error in some tools but is included by design.
417 | */
418 |
419 | img,
420 | svg,
421 | video,
422 | canvas,
423 | audio,
424 | iframe,
425 | embed,
426 | object {
427 | display: block;
428 | /* 1 */
429 | vertical-align: middle;
430 | /* 2 */
431 | }
432 |
433 | /*
434 | Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
435 | */
436 |
437 | img,
438 | video {
439 | max-width: 100%;
440 | height: auto;
441 | }
442 |
443 | /* Make elements with the HTML hidden attribute stay hidden by default */
444 |
445 | [hidden] {
446 | display: none;
447 | }
448 |
449 | @font-face {
450 | font-family: 'sourcehan';
451 |
452 | src: url('../fonts/SourceHanSans-Regular.otf');
453 | }
454 |
455 | @font-face {
456 | font-family: 'sourcehan';
457 |
458 | src: url('../fonts/SourceHanSans-Normal.otf');
459 |
460 | font-weight: 350
461 | }
462 |
463 | @font-face {
464 | font-family: 'sourcehan';
465 |
466 | src: url('../fonts/SourceHanSans-Medium.otf');
467 |
468 | font-weight: 500
469 | }
470 |
471 | @font-face {
472 | font-family: 'sourcehan';
473 |
474 | src: url('../fonts/SourceHanSans-Bold.otf');
475 |
476 | font-weight: 700
477 | }
478 |
479 | @font-face {
480 | font-family: 'sourcehan';
481 |
482 | src: url('../fonts/SourceHanSans-Heavy.otf');
483 |
484 | font-weight: 900
485 | }
486 |
487 | *, ::before, ::after {
488 | --tw-border-spacing-x: 0;
489 | --tw-border-spacing-y: 0;
490 | --tw-translate-x: 0;
491 | --tw-translate-y: 0;
492 | --tw-rotate: 0;
493 | --tw-skew-x: 0;
494 | --tw-skew-y: 0;
495 | --tw-scale-x: 1;
496 | --tw-scale-y: 1;
497 | --tw-pan-x: ;
498 | --tw-pan-y: ;
499 | --tw-pinch-zoom: ;
500 | --tw-scroll-snap-strictness: proximity;
501 | --tw-gradient-from-position: ;
502 | --tw-gradient-via-position: ;
503 | --tw-gradient-to-position: ;
504 | --tw-ordinal: ;
505 | --tw-slashed-zero: ;
506 | --tw-numeric-figure: ;
507 | --tw-numeric-spacing: ;
508 | --tw-numeric-fraction: ;
509 | --tw-ring-inset: ;
510 | --tw-ring-offset-width: 0px;
511 | --tw-ring-offset-color: #fff;
512 | --tw-ring-color: rgb(59 130 246 / 0.5);
513 | --tw-ring-offset-shadow: 0 0 #0000;
514 | --tw-ring-shadow: 0 0 #0000;
515 | --tw-shadow: 0 0 #0000;
516 | --tw-shadow-colored: 0 0 #0000;
517 | --tw-blur: ;
518 | --tw-brightness: ;
519 | --tw-contrast: ;
520 | --tw-grayscale: ;
521 | --tw-hue-rotate: ;
522 | --tw-invert: ;
523 | --tw-saturate: ;
524 | --tw-sepia: ;
525 | --tw-drop-shadow: ;
526 | --tw-backdrop-blur: ;
527 | --tw-backdrop-brightness: ;
528 | --tw-backdrop-contrast: ;
529 | --tw-backdrop-grayscale: ;
530 | --tw-backdrop-hue-rotate: ;
531 | --tw-backdrop-invert: ;
532 | --tw-backdrop-opacity: ;
533 | --tw-backdrop-saturate: ;
534 | --tw-backdrop-sepia: ;
535 | --tw-contain-size: ;
536 | --tw-contain-layout: ;
537 | --tw-contain-paint: ;
538 | --tw-contain-style: ;
539 | }
540 |
541 | ::backdrop {
542 | --tw-border-spacing-x: 0;
543 | --tw-border-spacing-y: 0;
544 | --tw-translate-x: 0;
545 | --tw-translate-y: 0;
546 | --tw-rotate: 0;
547 | --tw-skew-x: 0;
548 | --tw-skew-y: 0;
549 | --tw-scale-x: 1;
550 | --tw-scale-y: 1;
551 | --tw-pan-x: ;
552 | --tw-pan-y: ;
553 | --tw-pinch-zoom: ;
554 | --tw-scroll-snap-strictness: proximity;
555 | --tw-gradient-from-position: ;
556 | --tw-gradient-via-position: ;
557 | --tw-gradient-to-position: ;
558 | --tw-ordinal: ;
559 | --tw-slashed-zero: ;
560 | --tw-numeric-figure: ;
561 | --tw-numeric-spacing: ;
562 | --tw-numeric-fraction: ;
563 | --tw-ring-inset: ;
564 | --tw-ring-offset-width: 0px;
565 | --tw-ring-offset-color: #fff;
566 | --tw-ring-color: rgb(59 130 246 / 0.5);
567 | --tw-ring-offset-shadow: 0 0 #0000;
568 | --tw-ring-shadow: 0 0 #0000;
569 | --tw-shadow: 0 0 #0000;
570 | --tw-shadow-colored: 0 0 #0000;
571 | --tw-blur: ;
572 | --tw-brightness: ;
573 | --tw-contrast: ;
574 | --tw-grayscale: ;
575 | --tw-hue-rotate: ;
576 | --tw-invert: ;
577 | --tw-saturate: ;
578 | --tw-sepia: ;
579 | --tw-drop-shadow: ;
580 | --tw-backdrop-blur: ;
581 | --tw-backdrop-brightness: ;
582 | --tw-backdrop-contrast: ;
583 | --tw-backdrop-grayscale: ;
584 | --tw-backdrop-hue-rotate: ;
585 | --tw-backdrop-invert: ;
586 | --tw-backdrop-opacity: ;
587 | --tw-backdrop-saturate: ;
588 | --tw-backdrop-sepia: ;
589 | --tw-contain-size: ;
590 | --tw-contain-layout: ;
591 | --tw-contain-paint: ;
592 | --tw-contain-style: ;
593 | }
594 |
595 | .absolute {
596 | position: absolute;
597 | }
598 |
599 | .relative {
600 | position: relative;
601 | }
602 |
603 | .inset-0 {
604 | inset: 0px;
605 | }
606 |
607 | .inset-4 {
608 | inset: 1rem;
609 | }
610 |
611 | .bottom-8 {
612 | bottom: 2rem;
613 | }
614 |
615 | .bottom-\[2px\] {
616 | bottom: 2px;
617 | }
618 |
619 | .bottom-\[35px\] {
620 | bottom: 35px;
621 | }
622 |
623 | .left-\[50px\] {
624 | left: 50px;
625 | }
626 |
627 | .left-\[128px\] {
628 | left: 128px;
629 | }
630 |
631 | .left-\[355px\] {
632 | left: 355px;
633 | }
634 |
635 |
636 | .left-\[-10px\] {
637 | left: -10px;
638 | }
639 |
640 | .left-\[-14px\] {
641 | left: -14px;
642 | }
643 |
644 | .left-\[-6px\] {
645 | left: -6px;
646 | }
647 |
648 | .left-\[-7px\] {
649 | left: -7px;
650 | }
651 |
652 | .left-\[-8px\] {
653 | left: -8px;
654 | }
655 |
656 | .left-\[-9px\] {
657 | left: -9px;
658 | }
659 |
660 | .left-\[15px\] {
661 | left: 15px;
662 | }
663 |
664 | .left-1\/2 {
665 | left: 50%;
666 | }
667 |
668 | .right-2 {
669 | right: 0.5rem;
670 | }
671 |
672 | .top-1 {
673 | top: 0.25rem;
674 | }
675 |
676 | .top-\[3px\] {
677 | top: 3px;
678 | }
679 |
680 | .top-\[4px\] {
681 | top: 4px;
682 | }
683 |
684 | .top-\[5px\] {
685 | top: 5px;
686 | }
687 |
688 | .top-\[6px\] {
689 | top: 6px;
690 | }
691 |
692 | .top-\[11px\] {
693 | top: 11px;
694 | }
695 |
696 | .top-\[30px\] {
697 | top: 30px;
698 | }
699 |
700 | .top-\[50px\] {
701 | top: 50px;
702 | }
703 |
704 | .top-\[262px\] {
705 | top: 262px;
706 | }
707 |
708 | .top-\[1132px\] {
709 | top: 1132px;
710 | }
711 |
712 | .m-2 {
713 | margin: 0.5rem;
714 | }
715 |
716 | .m-5 {
717 | margin: 1.25rem;
718 | }
719 |
720 | .mx-\[5px\] {
721 | margin-left: 5px;
722 | margin-right: 5px;
723 | }
724 |
725 | .mx-\[50px\] {
726 | margin-left: 50px;
727 | margin-right: 50px;
728 | }
729 |
730 | .mr-2 {
731 | margin-right: 0.5rem;
732 | }
733 |
734 | .-mr-1 {
735 | margin-right: -0.25rem;
736 | }
737 |
738 | .mb-10 {
739 | margin-bottom: 2.5rem;
740 | }
741 |
742 | .mb-2 {
743 | margin-bottom: 0.5rem;
744 | }
745 |
746 | .mb-\[2px\] {
747 | margin-bottom: 2px;
748 | }
749 |
750 | .mb-\[5px\] {
751 | margin-bottom: 5px;
752 | }
753 |
754 | .ml-1 {
755 | margin-left: 0.25rem;
756 | }
757 |
758 | .ml-2 {
759 | margin-left: 0.5rem;
760 | }
761 |
762 | .ml-4 {
763 | margin-left: 1rem;
764 | }
765 |
766 | .ml-\[16px\] {
767 | margin-left: 16px;
768 | }
769 |
770 | .ml-\[20px\] {
771 | margin-left: 20px;
772 | }
773 |
774 | .ml-\[7px\] {
775 | margin-left: 7px;
776 | }
777 |
778 | .mr-10 {
779 | margin-right: 2.5rem;
780 | }
781 |
782 | .mr-5 {
783 | margin-right: 1.25rem;
784 | }
785 |
786 | .mt-1 {
787 | margin-top: 0.25rem;
788 | }
789 |
790 | .mt-10 {
791 | margin-top: 2.5rem;
792 | }
793 |
794 | .mt-2 {
795 | margin-top: 0.5rem;
796 | }
797 |
798 | .mt-5 {
799 | margin-top: 1.25rem;
800 | }
801 |
802 | .mt-\[7px\] {
803 | margin-top: 7px;
804 | }
805 |
806 | .inline-block {
807 | display: inline-block;
808 | }
809 |
810 | .flex {
811 | display: flex;
812 | }
813 |
814 | .grid {
815 | display: grid;
816 | }
817 |
818 | .size-6 {
819 | width: 1.5rem;
820 | height: 1.5rem;
821 | }
822 |
823 | .h-14 {
824 | height: 3.5rem;
825 | }
826 |
827 | .h-2 {
828 | height: 0.5rem;
829 | }
830 |
831 | .h-4 {
832 | height: 1rem;
833 | }
834 |
835 | .h-8 {
836 | height: 2rem;
837 | }
838 |
839 | .h-2\.5 {
840 | height: 0.625rem;
841 | }
842 |
843 | .h-\[100px\] {
844 | height: 100px;
845 | }
846 |
847 | .h-\[132px\] {
848 | height: 132px;
849 | }
850 |
851 | .h-\[50px\] {
852 | height: 50px;
853 | }
854 |
855 | .h-\[75px\] {
856 | height: 75px;
857 | }
858 |
859 | .h-\[1567px\] {
860 | height: 1567px;
861 | }
862 |
863 | .w-0\.5 {
864 | width: 0.125rem;
865 | }
866 |
867 | .w-4 {
868 | width: 1rem;
869 | }
870 |
871 | .w-10 {
872 | width: 2.5rem;
873 | }
874 |
875 | .w-14 {
876 | width: 3.5rem;
877 | }
878 |
879 | .w-40 {
880 | width: 10rem;
881 | }
882 |
883 | .w-\[100px\] {
884 | width: 100px;
885 | }
886 |
887 | .w-\[180px\] {
888 | width: 180px;
889 | }
890 |
891 | .w-\[50px\] {
892 | width: 50px;
893 | }
894 |
895 | .w-\[580px\] {
896 | width: 580px;
897 | }
898 |
899 | .w-\[1080px\] {
900 | width: 1080px;
901 | }
902 |
903 | .w-full {
904 | width: 100%;
905 | }
906 |
907 | .min-w-48 {
908 | min-width: 48px;
909 | }
910 |
911 | .min-w-\[100px\] {
912 | min-width: 100px;
913 | }
914 |
915 | .max-w-48 {
916 | max-width: 12rem;
917 | }
918 |
919 | .max-w-\[100px\] {
920 | max-width: 100px;
921 | }
922 |
923 | .translate-x-1\/2 {
924 | --tw-translate-x: 50%;
925 | transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
926 | }
927 |
928 | .translate-y-1\/2 {
929 | --tw-translate-y: 50%;
930 | transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
931 | }
932 |
933 | .rotate-\[-30deg\] {
934 | --tw-rotate: -30deg;
935 | transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
936 | }
937 |
938 | .transform {
939 | transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
940 | }
941 |
942 | .grid-cols-2 {
943 | grid-template-columns: repeat(2, minmax(0, 1fr));
944 | }
945 |
946 | .grid-cols-5 {
947 | grid-template-columns: repeat(5, minmax(0, 1fr));
948 | }
949 |
950 | .flex-col {
951 | flex-direction: column;
952 | }
953 |
954 | .flex-wrap {
955 | flex-wrap: wrap;
956 | }
957 |
958 | .items-start {
959 | align-items: flex-start;
960 | }
961 |
962 | .items-end {
963 | align-items: flex-end;
964 | }
965 |
966 | .items-center {
967 | align-items: center;
968 | }
969 |
970 | .justify-center {
971 | justify-content: center;
972 | }
973 |
974 | .justify-between {
975 | justify-content: space-between;
976 | }
977 |
978 | .justify-around {
979 | justify-content: space-around;
980 | }
981 |
982 | .justify-evenly {
983 | justify-content: space-evenly;
984 | }
985 |
986 | .gap-3 {
987 | gap: 0.75rem;
988 | }
989 |
990 | .gap-5 {
991 | gap: 1.25rem;
992 | }
993 |
994 | .gap-6 {
995 | gap: 1.5rem;
996 | }
997 |
998 | .gap-x-5 {
999 | column-gap: 1.25rem;
1000 | }
1001 |
1002 | .gap-y-\[15px\] {
1003 | row-gap: 15px;
1004 | }
1005 |
1006 | .space-x-0 > :not([hidden]) ~ :not([hidden]) {
1007 | --tw-space-x-reverse: 0;
1008 | margin-right: calc(0px * var(--tw-space-x-reverse));
1009 | margin-left: calc(0px * calc(1 - var(--tw-space-x-reverse)));
1010 | }
1011 |
1012 | .space-x-0\.5 > :not([hidden]) ~ :not([hidden]) {
1013 | --tw-space-x-reverse: 0;
1014 | margin-right: calc(0.125rem * var(--tw-space-x-reverse));
1015 | margin-left: calc(0.125rem * calc(1 - var(--tw-space-x-reverse)));
1016 | }
1017 |
1018 | .space-y-5 > :not([hidden]) ~ :not([hidden]) {
1019 | --tw-space-y-reverse: 0;
1020 | margin-top: calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));
1021 | margin-bottom: calc(1.25rem * var(--tw-space-y-reverse));
1022 | }
1023 |
1024 | .overflow-hidden {
1025 | overflow: hidden;
1026 | }
1027 |
1028 | .overflow-visible {
1029 | overflow: visible;
1030 | }
1031 |
1032 | .truncate {
1033 | overflow: hidden;
1034 | text-overflow: ellipsis;
1035 | white-space: nowrap;
1036 | }
1037 |
1038 | .whitespace-nowrap {
1039 | white-space: nowrap;
1040 | }
1041 |
1042 | .rounded-full {
1043 | border-radius: 9999px;
1044 | }
1045 |
1046 | .rounded-xl {
1047 | border-radius: 0.75rem;
1048 | }
1049 |
1050 | .rounded-t-xl {
1051 | border-top-left-radius: 0.75rem;
1052 | border-top-right-radius: 0.75rem;
1053 | }
1054 |
1055 | .rounded-bl-\[15px\] {
1056 | border-bottom-left-radius: 15px;
1057 | }
1058 |
1059 | .rounded-br-\[15px\] {
1060 | border-bottom-right-radius: 15px;
1061 | }
1062 |
1063 | .rounded-tl-\[32px\] {
1064 | border-top-left-radius: 32px;
1065 | }
1066 |
1067 | .rounded-tr-\[15px\] {
1068 | border-top-right-radius: 15px;
1069 | }
1070 |
1071 | .border-8 {
1072 | border-width: 8px;
1073 | }
1074 |
1075 | .border-white {
1076 | --tw-border-opacity: 1;
1077 | border-color: rgb(255 255 255 / var(--tw-border-opacity));
1078 | }
1079 |
1080 | .bg-\[\#9E9E9E\] {
1081 | --tw-bg-opacity: 1;
1082 | background-color: rgb(158 158 158 / var(--tw-bg-opacity));
1083 | }
1084 |
1085 | .bg-\[\#C28B78\] {
1086 | --tw-bg-opacity: 1;
1087 | background-color: rgb(194 139 120 / var(--tw-bg-opacity));
1088 | }
1089 |
1090 | .bg-\[\#E1FFE9\] {
1091 | --tw-bg-opacity: 1;
1092 | background-color: rgb(225 255 233 / var(--tw-bg-opacity));
1093 | }
1094 |
1095 | .bg-\[\#E7E1FF\] {
1096 | --tw-bg-opacity: 1;
1097 | background-color: rgb(231 225 255 / var(--tw-bg-opacity));
1098 | }
1099 |
1100 | .bg-\[\#F0F0F0\] {
1101 | --tw-bg-opacity: 1;
1102 | background-color: rgb(240 240 240 / var(--tw-bg-opacity));
1103 | }
1104 |
1105 | .bg-\[\#FFE1E1\] {
1106 | --tw-bg-opacity: 1;
1107 | background-color: rgb(255 225 225 / var(--tw-bg-opacity));
1108 | }
1109 |
1110 | .bg-\[\#FFF7E1\] {
1111 | --tw-bg-opacity: 1;
1112 | background-color: rgb(255 247 225 / var(--tw-bg-opacity));
1113 | }
1114 |
1115 | .bg-\[\#FFFFFF\] {
1116 | --tw-bg-opacity: 1;
1117 | background-color: rgb(255 255 255 / var(--tw-bg-opacity));
1118 | }
1119 |
1120 | .bg-gray-200 {
1121 | --tw-bg-opacity: 1;
1122 | background-color: rgb(229 231 235 / var(--tw-bg-opacity));
1123 | }
1124 |
1125 | .bg-gray-500 {
1126 | --tw-bg-opacity: 1;
1127 | background-color: rgb(107 114 128 / var(--tw-bg-opacity));
1128 | }
1129 |
1130 | .bg-green-400 {
1131 | --tw-bg-opacity: 1;
1132 | background-color: rgb(74 222 128 / var(--tw-bg-opacity));
1133 | }
1134 |
1135 | .bg-indigo-300 {
1136 | --tw-bg-opacity: 1;
1137 | background-color: rgb(165 180 252 / var(--tw-bg-opacity));
1138 | }
1139 |
1140 | .bg-purple-400 {
1141 | --tw-bg-opacity: 1;
1142 | background-color: rgb(192 132 252 / var(--tw-bg-opacity));
1143 | }
1144 |
1145 | .bg-purple-500 {
1146 | --tw-bg-opacity: 1;
1147 | background-color: rgb(168 85 247 / var(--tw-bg-opacity));
1148 | }
1149 |
1150 | .bg-rose-400 {
1151 | --tw-bg-opacity: 1;
1152 | background-color: rgb(251 113 133 / var(--tw-bg-opacity));
1153 | }
1154 |
1155 | .bg-white {
1156 | --tw-bg-opacity: 1;
1157 | background-color: rgb(255 255 255 / var(--tw-bg-opacity));
1158 | }
1159 |
1160 | .bg-zinc-700 {
1161 | --tw-bg-opacity: 1;
1162 | background-color: rgb(63 63 70 / var(--tw-bg-opacity));
1163 | }
1164 |
1165 | .bg-cover {
1166 | background-size: cover;
1167 | }
1168 |
1169 | .bg-center {
1170 | background-position: center;
1171 | }
1172 |
1173 | .p-10 {
1174 | padding: 2.5rem;
1175 | }
1176 |
1177 | .p-2 {
1178 | padding: 0.5rem;
1179 | }
1180 |
1181 | .p-5 {
1182 | padding: 1.25rem;
1183 | }
1184 |
1185 | .px-2 {
1186 | padding-left: 0.5rem;
1187 | padding-right: 0.5rem;
1188 | }
1189 |
1190 | .px-4 {
1191 | padding-left: 1rem;
1192 | padding-right: 1rem;
1193 | }
1194 |
1195 | .px-10 {
1196 | padding-left: 2.5rem;
1197 | padding-right: 2.5rem;
1198 | }
1199 |
1200 | .py-0\.5 {
1201 | padding-top: 0.125rem;
1202 | padding-bottom: 0.125rem;
1203 | }
1204 |
1205 | .py-2 {
1206 | padding-top: 0.5rem;
1207 | padding-bottom: 0.5rem;
1208 | }
1209 |
1210 | .pb-10 {
1211 | padding-bottom: 2.5rem;
1212 | }
1213 |
1214 | .pt-20 {
1215 | padding-top: 5rem;
1216 | }
1217 |
1218 | .text-center {
1219 | text-align: center;
1220 | }
1221 |
1222 | .font-adlam {
1223 | font-family: adlam, sans-serif;
1224 | }
1225 |
1226 | .font-carter {
1227 | font-family: carter, sans-serif;
1228 | }
1229 |
1230 | .font-cherry {
1231 | font-family: cherry, sans-serif;
1232 | }
1233 |
1234 | .font-sourcehan {
1235 | font-family: sourcehan, sans-serif;
1236 | }
1237 |
1238 | .text-2xl {
1239 | font-size: 1.5rem;
1240 | line-height: 2rem;
1241 | }
1242 |
1243 | .text-3xl {
1244 | font-size: 1.875rem;
1245 | line-height: 2.25rem;
1246 | }
1247 |
1248 | .text-4xl {
1249 | font-size: 2.25rem;
1250 | line-height: 2.5rem;
1251 | }
1252 |
1253 | .text-8xl {
1254 | font-size: 6rem;
1255 | line-height: 1;
1256 | }
1257 |
1258 | .text-lg {
1259 | font-size: 1.125rem;
1260 | line-height: 1.75rem;
1261 | }
1262 |
1263 | .text-sm {
1264 | font-size: 0.875rem;
1265 | line-height: 1.25rem;
1266 | }
1267 |
1268 | .text-xl {
1269 | font-size: 1.25rem;
1270 | line-height: 1.75rem;
1271 | }
1272 |
1273 | .text-7xl {
1274 | font-size: 4.5rem;
1275 | line-height: 1;
1276 | }
1277 |
1278 | .text-xs {
1279 | font-size: 0.75rem;
1280 | line-height: 1rem;
1281 | }
1282 |
1283 | .text-\[10px\] {
1284 | font-size: 10px;
1285 | }
1286 |
1287 | .font-\[350\] {
1288 | font-weight: 350;
1289 | }
1290 |
1291 | .font-black {
1292 | font-weight: 900;
1293 | }
1294 |
1295 | .font-bold {
1296 | font-weight: 700;
1297 | }
1298 |
1299 | .font-medium {
1300 | font-weight: 500;
1301 | }
1302 |
1303 | .font-normal {
1304 | font-weight: 400;
1305 | }
1306 |
1307 | .font-semibold {
1308 | font-weight: 600;
1309 | }
1310 |
1311 | .uppercase {
1312 | text-transform: uppercase;
1313 | }
1314 |
1315 | .text-\[\#C28B78\] {
1316 | --tw-text-opacity: 1;
1317 | color: rgb(194 139 120 / var(--tw-text-opacity));
1318 | }
1319 |
1320 | .text-\[\#D1C3BF\] {
1321 | --tw-text-opacity: 1;
1322 | color: rgb(209 195 191 / var(--tw-text-opacity));
1323 | }
1324 |
1325 | .text-amber-400 {
1326 | --tw-text-opacity: 1;
1327 | color: rgb(251 191 36 / var(--tw-text-opacity));
1328 | }
1329 |
1330 | .text-gray-600 {
1331 | --tw-text-opacity: 1;
1332 | color: rgb(75 85 99 / var(--tw-text-opacity));
1333 | }
1334 |
1335 | .text-indigo-300 {
1336 | --tw-text-opacity: 1;
1337 | color: rgb(165 180 252 / var(--tw-text-opacity));
1338 | }
1339 |
1340 | .text-white {
1341 | --tw-text-opacity: 1;
1342 | color: rgb(255 255 255 / var(--tw-text-opacity));
1343 | }
1344 |
1345 | .text-\[\#9DD9ED\] {
1346 | --tw-text-opacity: 1;
1347 | color: rgb(157 217 237 / var(--tw-text-opacity));
1348 | }
1349 |
1350 | .text-\[\#ED9DB9\] {
1351 | --tw-text-opacity: 1;
1352 | color: rgb(237 157 185 / var(--tw-text-opacity));
1353 | }
1354 |
1355 | .text-\[\#EDD79D\] {
1356 | --tw-text-opacity: 1;
1357 | color: rgb(237 215 157 / var(--tw-text-opacity));
1358 | }
1359 |
1360 | .text-\[\#A9C9C6\] {
1361 | --tw-text-opacity: 1;
1362 | color: rgb(169 201 198 / var(--tw-text-opacity));
1363 | }
1364 |
1365 | .text-\[\#966D56\] {
1366 | --tw-text-opacity: 1;
1367 | color: rgb(150 109 86 / var(--tw-text-opacity));
1368 | }
1369 |
1370 | .underline {
1371 | text-decoration-line: underline;
1372 | }
1373 |
1374 | .decoration-indigo-400 {
1375 | text-decoration-color: #818cf8;
1376 | }
1377 |
1378 | .decoration-dotted {
1379 | text-decoration-style: dotted;
1380 | }
1381 |
1382 | .underline-offset-8 {
1383 | text-underline-offset: 8px;
1384 | }
1385 |
1386 | .opacity-50 {
1387 | opacity: 0.5;
1388 | }
1389 |
1390 | .opacity-100 {
1391 | opacity: 1;
1392 | }
1393 |
1394 | .shadow-\[0_0_10px_rgba\(0\2c 0\2c 0\2c 0\.3\)\] {
1395 | --tw-shadow: 0 0 10px rgba(0,0,0,0.3);
1396 | --tw-shadow-colored: 0 0 10px var(--tw-shadow-color);
1397 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1398 | }
1399 |
1400 | .shadow-\[0_0_10px_rgba\(13\2c 255\2c 0\2c 1\)\] {
1401 | --tw-shadow: 0 0 10px rgba(13,255,0,1);
1402 | --tw-shadow-colored: 0 0 10px var(--tw-shadow-color);
1403 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1404 | }
1405 |
1406 | .shadow-\[0_0_15px_rgba\(0\2c 0\2c 0\2c 0\.4\)\] {
1407 | --tw-shadow: 0 0 15px rgba(0,0,0,0.4);
1408 | --tw-shadow-colored: 0 0 15px var(--tw-shadow-color);
1409 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1410 | }
1411 |
1412 | .shadow-\[inset_0_0_20px_\#00FF4430\] {
1413 | --tw-shadow: inset 0 0 20px #00FF4430;
1414 | --tw-shadow-colored: inset 0 0 20px var(--tw-shadow-color);
1415 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1416 | }
1417 |
1418 | .shadow-\[inset_0_0_20px_\#80808030\] {
1419 | --tw-shadow: inset 0 0 20px #80808030;
1420 | --tw-shadow-colored: inset 0 0 20px var(--tw-shadow-color);
1421 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1422 | }
1423 |
1424 | .shadow-\[inset_0_0_20px_\#A100FF30\] {
1425 | --tw-shadow: inset 0 0 20px #A100FF30;
1426 | --tw-shadow-colored: inset 0 0 20px var(--tw-shadow-color);
1427 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1428 | }
1429 |
1430 | .shadow-\[inset_0_0_20px_\#FBFF0030\] {
1431 | --tw-shadow: inset 0 0 20px #FBFF0030;
1432 | --tw-shadow-colored: inset 0 0 20px var(--tw-shadow-color);
1433 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1434 | }
1435 |
1436 | .shadow-\[inset_0_0_20px_\#FF000030\] {
1437 | --tw-shadow: inset 0 0 20px #FF000030;
1438 | --tw-shadow-colored: inset 0 0 20px var(--tw-shadow-color);
1439 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1440 | }
1441 |
1442 | .blur-\[0\.5px\] {
1443 | --tw-blur: blur(0.5px);
1444 | filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
1445 | }
1446 |
1447 | .drop-shadow-\[0_0_2px_rgba\(0\2c 0\2c 0\2c 0\.3\)\] {
1448 | --tw-drop-shadow: drop-shadow(0 0 2px rgba(0,0,0,0.3));
1449 | filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
1450 | }
1451 |
1452 | .filter {
1453 | filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
1454 | }
1455 |
1456 | .transition {
1457 | transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;
1458 | transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
1459 | transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;
1460 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1461 | transition-duration: 150ms;
1462 | }
1463 |
1464 | .duration-500 {
1465 | transition-duration: 500ms;
1466 | }
1467 |
1468 | @media (min-width: 640px) {
1469 | .sm\:grid-cols-3 {
1470 | grid-template-columns: repeat(3, minmax(0, 1fr));
1471 | }
1472 | }
1473 |
1474 | @media (min-width: 768px) {
1475 | .md\:grid-cols-4 {
1476 | grid-template-columns: repeat(4, minmax(0, 1fr));
1477 | }
1478 | }
1479 |
1480 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/resources/templates/macros.html.jinja2:
--------------------------------------------------------------------------------
1 | {% from 'icons.macros.html.jinja2' import app, ap, fcp, fc, fsdp, fsd, fsp, fs, sync, null %}
2 | {% set icon_map = {
3 | 'app': app,
4 | 'ap': ap,
5 | 'fcp': fcp,
6 | 'fc': fc,
7 | 'fsdp': fsdp,
8 | 'fsd': fsd,
9 | 'fsp': fsp,
10 | 'fs': fs,
11 | 'sync': sync
12 | } %}
13 |
14 | {% macro stars(count) %}
15 | {% set background_color, shadow_color = count | star_count_to_color %}
16 |
17 | {% for i in range(5) %}
18 | {% if count == 0 %}
19 |
20 | {% elif count <= 4 %}
21 |
27 | {% else %}
28 |
29 | {% endif %}
30 | {% endfor %}
31 |
32 | {% endmacro %}
33 |
34 | {% macro header(player, standard_total, dx_total) %}
35 |
74 | {% endmacro %}
75 |
76 | {% macro song_card(score, index) %}
77 | {% set background_color, shadow_color = score.level_index | level_index_to_color %}
78 |
79 |
80 |
81 |

82 |
83 |
84 | {{ score.level_index.name }}
85 |
86 |
87 |
88 |
#{{ "%02d" | format(index) }}
89 | {{ stars(score.star_count) }}
90 |
91 |
{{ score.song_name }}
92 |
93 | {% set integer_part, decimal_part = "{:.4f}".format(score.achievements).split('.') %}
94 | {% if score.rate in ['sssp', 'sss'] %}
95 |
{{ integer_part[-3] }}
96 |
{{ integer_part[-2] }}
97 |
{{ integer_part[-1] }}
98 | {% elif score.rate in ['ssp', 'ss', 'sp', 's'] %}
99 |
{{ integer_part }}
100 | {% elif score.rate in ['aaa', 'aa', 'a'] %}
101 |
{{ integer_part }}
102 | {% elif score.rate in ['bbb', 'bb', 'b'] %}
103 |
{{ integer_part }}
104 | {% elif score.rate in ['c', 'd'] %}
105 |
{{ integer_part }}
106 | {% else %}
107 |
{{ integer_part }}
108 | {% endif %}
109 |
.
110 |
{{ decimal_part }}%
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
{{ score.level }}
119 |
120 |
{{ score.dx_rating | int }}
121 |
122 |
123 |
124 | {# FC Type #}
125 | {% if not score.fc %}
126 | {{ null() }}
127 | {% else %}
128 | {{ icon_map[score.fc.value]() }}
129 | {% endif %}
130 |
131 | {# FS Type #}
132 | {% if not score.fs %}
133 | {{ null() }}
134 | {% else %}
135 | {{ icon_map[score.fs.value]() }}
136 | {% endif %}
137 |
138 |
139 |
140 |
141 | {% endmacro %}
142 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/__init__.py:
--------------------------------------------------------------------------------
1 | from pydantic import BaseModel
2 |
3 | from .song import Song as Song
4 | from .alias import Alias as Alias
5 | from .genre import Genre as Genre
6 | from .notes import Notes as Notes
7 | from .score import Score as Score
8 | from .trend import Trend as Trend
9 | from .player import Player as Player
10 | from .version import Version as Version
11 | from .collection import Collection as Collection
12 | from .song import SongDifficulty as SongDifficulty
13 | from .song import SongDifficulties as SongDifficulties
14 | from .song import SongDifficultyUtage as SongDifficultyUtage
15 | from .collection import CollectionRequired as CollectionRequired
16 | from .collection import CollectionRequiredSong as CollectionRequiredSong
17 |
18 |
19 | class RenderProps(BaseModel):
20 | player: Player
21 | standard_total: int
22 | dx_total: int
23 | standard: list[Score]
24 | dx: list[Score]
25 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/alias.py:
--------------------------------------------------------------------------------
1 | from pydantic import BaseModel
2 |
3 |
4 | class Alias(BaseModel):
5 | """曲目别名"""
6 |
7 | song_id: int
8 | """曲目 ID"""
9 | aliases: list[int]
10 | """曲目所有别名"""
11 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/collection.py:
--------------------------------------------------------------------------------
1 | from pydantic import BaseModel
2 |
3 | from .enum import FCType, FSType, RateType, SongType
4 |
5 |
6 | class CollectionGenre(BaseModel):
7 | """收藏品分类"""
8 |
9 | id: int
10 | """收藏品分类 ID"""
11 | title: str
12 | """分类标题"""
13 | genre: str
14 | """分类标题(日文)"""
15 |
16 |
17 | class CollectionRequiredSong(BaseModel):
18 | """收藏品要求曲目"""
19 |
20 | id: int
21 | """曲目 ID"""
22 | title: str
23 | """曲名"""
24 | type: SongType
25 | """谱面类型"""
26 | completed: bool | None = None
27 | """值可空,要求的曲目是否完成"""
28 | completed_difficulties: list[int] | None = None
29 | """值可空,已完成的难度"""
30 |
31 |
32 | class CollectionRequired(BaseModel):
33 | """收藏品要求"""
34 |
35 | difficulties: list[int] | None = None
36 | """ 值可空,要求的谱面难度"""
37 | rate: RateType | None = None
38 | """ 值可空,要求的评级类型"""
39 | fc: FCType | None = None
40 | """ 值可空,要求的 FULL COMBO 类型"""
41 | fs: FSType | None = None
42 | """ 值可空,要求的 FULL SYNC 类型"""
43 | songs: list[CollectionRequiredSong] | None = None
44 | """ 值可空,要求的曲目"""
45 | completed: bool | None = None
46 | """值可空,要求是否全部完成"""
47 |
48 |
49 | class Collection(BaseModel):
50 | """收藏品"""
51 |
52 | id: int
53 | """收藏品 ID"""
54 | name: str
55 | """收藏品名称"""
56 | color: str | None = None
57 | """值可空,仅玩家称号,称号颜色"""
58 | description: str | None = None
59 | """收藏品说明"""
60 | genre: str | None = None
61 | """值可空,除玩家称号,收藏品分类(日文)"""
62 | required: list[CollectionRequired] | None = None
63 | """值可空,收藏品要求"""
64 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/enum/__init__.py:
--------------------------------------------------------------------------------
1 | from .fctype import FCType as FCType
2 | from .fstype import FSType as FSType
3 | from .ratetype import RateType as RateType
4 | from .songtype import SongType as SongType
5 | from .levelindex import LevelIndex as LevelIndex
6 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/enum/fctype.py:
--------------------------------------------------------------------------------
1 | from enum import Enum
2 |
3 |
4 | class FCType(str, Enum):
5 | """FULL COMBO 类型"""
6 |
7 | app = "app"
8 | """AP+"""
9 | ap = "ap"
10 | """AP"""
11 | fcp = "fcp"
12 | """FC+"""
13 | fc = "fc"
14 | """FC"""
15 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/enum/fstype.py:
--------------------------------------------------------------------------------
1 | from enum import Enum
2 |
3 |
4 | class FSType(str, Enum):
5 | """FULL SYNC 类型"""
6 |
7 | fsdp = "fsdp"
8 | """FSD+"""
9 | fsd = "fsd"
10 | """FSD"""
11 | fsp = "fsp"
12 | """FS+"""
13 | fs = "fs"
14 | """FS"""
15 | sync = "sync"
16 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/enum/levelindex.py:
--------------------------------------------------------------------------------
1 | from enum import Enum
2 |
3 |
4 | class LevelIndex(Enum):
5 | """难度"""
6 |
7 | BASIC = 0
8 | ADVANCED = 1
9 | EXPERT = 2
10 | MASTER = 3
11 | RE_MASTER = 4
12 |
13 | @classmethod
14 | def get_level(cls, index: int):
15 | for level in LevelIndex:
16 | if level.value == index:
17 | return level.name
18 | raise ValueError("Invalid value")
19 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/enum/ratetype.py:
--------------------------------------------------------------------------------
1 | from enum import Enum
2 |
3 |
4 | class RateType(str, Enum):
5 | """评级等级"""
6 |
7 | sssp = "sssp"
8 | """SSS+"""
9 | sss = "sss"
10 | """SSS"""
11 | ssp = "ssp"
12 | """SS+"""
13 | ss = "ss"
14 | """SS"""
15 | sp = "sp"
16 | """S+"""
17 | s = "s"
18 | """S"""
19 | aaa = "aaa"
20 | """AAA"""
21 | aa = "aa"
22 | """AA"""
23 | a = "a"
24 | """A"""
25 | bbb = "bbb"
26 | """BBB"""
27 | bb = "bb"
28 | """BB"""
29 | b = "b"
30 | """B"""
31 | c = "c"
32 | """C"""
33 | d = "d"
34 | """D"""
35 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/enum/songtype.py:
--------------------------------------------------------------------------------
1 | from enum import Enum
2 |
3 |
4 | class SongType(str, Enum):
5 | """谱面类型"""
6 |
7 | standard = "standard"
8 | """标准谱面"""
9 | dx = "dx"
10 | """DX 谱面"""
11 | utage = "utage"
12 | """宴会场谱面"""
13 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/genre.py:
--------------------------------------------------------------------------------
1 | from pydantic import BaseModel
2 |
3 |
4 | class Genre(BaseModel):
5 | """乐曲分类"""
6 |
7 | id: int
8 | """内部 ID"""
9 | title: str
10 | """分类标题"""
11 | genre: str
12 | """分类标题(日文)"""
13 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/notes.py:
--------------------------------------------------------------------------------
1 | from pydantic import Field, BaseModel
2 |
3 |
4 | class Notes(BaseModel):
5 | """谱面数量"""
6 |
7 | total: int
8 | """总物量"""
9 | tap: int
10 | """TAP 物量"""
11 | hold: int
12 | """HOLD 物量"""
13 | slide: int
14 | """SLIDE 物量"""
15 | touch: int
16 | """TOUCH 物量"""
17 | break_: int = Field(alias="break")
18 | """BREAK 物量"""
19 |
20 |
21 | class BuddyNotes(BaseModel):
22 | """仅宴会场曲目,BUDDY 谱面物量"""
23 |
24 | left: Notes
25 | """1P 谱面物量"""
26 | right: Notes
27 | """2P 谱面物量"""
28 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/player.py:
--------------------------------------------------------------------------------
1 | from pydantic import BaseModel
2 |
3 | from .collection import Collection
4 |
5 |
6 | class Player(BaseModel):
7 | """玩家"""
8 |
9 | name: str
10 | """游戏内名称"""
11 | rating: int
12 | """玩家 DX Rating"""
13 | friend_code: int
14 | """好友码"""
15 | trophy: Collection
16 | """仅[获取玩家信息](https://maimai.lxns.net/docs/api/maimai#get-apiv0maimaiplayerfriend_code)返回,称号"""
17 | trophy_name: str | None = None
18 | """仅[创建玩家信息](https://maimai.lxns.net/docs/api/maimai#post-apiv0maimaiplayer)必选,称号"""
19 | course_rank: int
20 | """段位 ID"""
21 | class_rank: int
22 | """阶级 ID"""
23 | star: int
24 | """搭档觉醒数"""
25 | icon: Collection | None = None
26 | """值可空,头像"""
27 | name_plate: Collection | None = None
28 | """值可空,姓名框"""
29 | frame: Collection | None = None
30 | """值可空,背景"""
31 | upload_time: str
32 | """
33 | 仅[获取玩家信息](https://maimai.lxns.net/docs/api/maimai#get-apiv0maimaiplayerfriend_code)返回,
34 | 玩家被同步时的 UTC 时间
35 | """
36 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/score.py:
--------------------------------------------------------------------------------
1 | from nonebot.compat import PYDANTIC_V2
2 | from pydantic import BaseModel, ConfigDict
3 |
4 | from .enum import FCType, FSType, RateType, SongType, LevelIndex
5 |
6 |
7 | class Score(BaseModel):
8 | """游玩成绩"""
9 |
10 | id: int
11 | """曲目 ID"""
12 | song_name: str
13 | """仅获取 `Score` 时返回,曲名"""
14 | level: str
15 | """仅获取 `Score` 时返回,难度标级,如 `14+`"""
16 | level_index: LevelIndex
17 | """难度"""
18 | achievements: float
19 | """达成率"""
20 | fc: FCType | None = None
21 | """值可空,FULL COMBO 类型"""
22 | fs: FSType | None = None
23 | """值可空,FULL SYNC 类型"""
24 | dx_score: int
25 | """DX 分数"""
26 | dx_rating: float
27 | """仅获取 `Score` 时返回,DX Rating,计算时需要向下取整"""
28 | rate: RateType
29 | """仅获取 `Score` 时返回,评级类型"""
30 | type: SongType
31 | """谱面类型"""
32 | play_time: str | None = None
33 | """游玩的 UTC 时间,精确到分钟"""
34 | upload_time: str
35 | """仅获取 `Score` 时返回,成绩被同步时的 UTC 时间"""
36 |
37 | if PYDANTIC_V2:
38 | model_config = ConfigDict(extra="allow") # type: ignore
39 | else:
40 |
41 | class Config:
42 | extra = "allow"
43 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/song.py:
--------------------------------------------------------------------------------
1 | from pydantic import BaseModel
2 |
3 | from .notes import Notes, BuddyNotes
4 | from .enum import SongType, LevelIndex
5 |
6 |
7 | class SongDifficulty(BaseModel):
8 | """谱面难度"""
9 |
10 | type: SongType
11 | """谱面类型"""
12 | difficulty: LevelIndex
13 | """难度"""
14 | level: str
15 | """难度等级"""
16 | level_value: float
17 | """谱面定数"""
18 | note_designer: str
19 | """谱师"""
20 | version: int
21 | """谱面首次出现版本"""
22 | notes: Notes | None = None
23 | """谱面物量"""
24 |
25 |
26 | class SongDifficultyUtage(SongDifficulty):
27 | """宴会场曲目谱面难度"""
28 |
29 | kanji: str
30 | """谱面属性"""
31 | description: str
32 | """谱面描述"""
33 | is_buddy: bool
34 | """是否为 BUDDY 谱面"""
35 | notes: Notes | BuddyNotes | None = None
36 | """ 值可空,谱面物量。is_buddy 为 true 时,notes 为 BuddyNotes。"""
37 |
38 |
39 | class SongDifficulties(BaseModel):
40 | """谱面难度"""
41 |
42 | standard: list[SongDifficulty]
43 | """曲目标准谱面难度列表"""
44 | dx: list[SongDifficulty]
45 | """曲目 DX 谱面难度列表"""
46 | utage: list[SongDifficultyUtage] | None = None
47 | """可选,宴会场曲目谱面难度列表"""
48 |
49 |
50 | class Song(BaseModel):
51 | """曲目"""
52 |
53 | id: int
54 | """曲目 ID"""
55 | title: str
56 | """曲名"""
57 | artist: str
58 | """艺术家"""
59 | genre: str
60 | """曲目分类"""
61 | bpm: int
62 | """曲目 BPM"""
63 | version: int
64 | """曲目首次出现版本"""
65 | rights: str | None = None
66 | """曲目版权信息"""
67 | disabled: bool | None = False
68 | """值可空,是否被禁用,默认值为 false"""
69 | difficulties: SongDifficulties
70 | """谱面难度"""
71 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/trend.py:
--------------------------------------------------------------------------------
1 | from pydantic import BaseModel
2 |
3 |
4 | class Trend(BaseModel):
5 | """DX Rating 趋势"""
6 |
7 | total: int
8 | """总 DX Rating"""
9 | standard: int
10 | """旧版本谱面总 DX Rating"""
11 | dx: int
12 | """现版本谱面总 DX Rating"""
13 | date: str
14 | """日期"""
15 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/schema/version.py:
--------------------------------------------------------------------------------
1 | from pydantic import BaseModel
2 |
3 |
4 | class Version(BaseModel):
5 | """曲目版本"""
6 |
7 | id: int
8 | """内部 ID"""
9 | title: str
10 | """版本标题"""
11 | version: int
12 | """主要版本 ID"""
13 |
--------------------------------------------------------------------------------
/nonebot_plugin_lxns_maimai/utils.py:
--------------------------------------------------------------------------------
1 | from .apis import API
2 | from .schema.enum import SongType, LevelIndex
3 | from .schema import Song, Score, SongDifficulty, SongDifficultyUtage
4 |
5 |
6 | def get_difficulty(
7 | song: Song, type: SongType, level_index: LevelIndex
8 | ) -> SongDifficulty | SongDifficultyUtage | None:
9 | if type == SongType.utage and song.difficulties.utage:
10 | return song.difficulties.utage[level_index.value]
11 | elif type == SongType.standard:
12 | return song.difficulties.standard[level_index.value]
13 | elif type == SongType.dx:
14 | return song.difficulties.dx[level_index.value]
15 | else:
16 | return None
17 |
18 |
19 | async def calc_star_count(score: Score) -> int | None:
20 | """计算 DX 分数星星数量"""
21 |
22 | song = await API.get_song_info(score.id)
23 | difficulty = get_difficulty(song, score.type, score.level_index)
24 |
25 | if not difficulty or not difficulty.notes:
26 | return None
27 |
28 | if isinstance(difficulty, SongDifficultyUtage):
29 | percentage = (
30 | score.dx_score / (difficulty.notes.left + difficulty.notes.right) * 3 # type: ignore
31 | ) * 100
32 | else:
33 | percentage = score.dx_score / (difficulty.notes.total * 3) * 100 # type: ignore
34 |
35 | if percentage >= 97:
36 | return 5
37 | elif percentage >= 95:
38 | return 4
39 | elif percentage >= 93:
40 | return 3
41 | elif percentage >= 90:
42 | return 2
43 | elif percentage >= 85:
44 | return 1
45 | else:
46 | return 0
47 |
--------------------------------------------------------------------------------
/pdm.lock:
--------------------------------------------------------------------------------
1 | # This file is @generated by PDM.
2 | # It is not intended for manual editing.
3 |
4 | [metadata]
5 | groups = ["default", "adapters", "dev"]
6 | strategy = ["inherit_metadata"]
7 | lock_version = "4.5.0"
8 | content_hash = "sha256:6a5e9c1ce8440773677939933d4ecbf40b7fb4dda3236aa92fbcb1c30cf135f9"
9 |
10 | [[metadata.targets]]
11 | requires_python = ">=3.10"
12 |
13 | [[package]]
14 | name = "aiofiles"
15 | version = "24.1.0"
16 | requires_python = ">=3.8"
17 | summary = "File support for asyncio."
18 | groups = ["default"]
19 | files = [
20 | {file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"},
21 | {file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"},
22 | ]
23 |
24 | [[package]]
25 | name = "alembic"
26 | version = "1.13.2"
27 | requires_python = ">=3.8"
28 | summary = "A database migration tool for SQLAlchemy."
29 | groups = ["default"]
30 | dependencies = [
31 | "Mako",
32 | "SQLAlchemy>=1.3.0",
33 | "importlib-metadata; python_version < \"3.9\"",
34 | "importlib-resources; python_version < \"3.9\"",
35 | "typing-extensions>=4",
36 | ]
37 | files = [
38 | {file = "alembic-1.13.2-py3-none-any.whl", hash = "sha256:6b8733129a6224a9a711e17c99b08462dbf7cc9670ba8f2e2ae9af860ceb1953"},
39 | {file = "alembic-1.13.2.tar.gz", hash = "sha256:1ff0ae32975f4fd96028c39ed9bb3c867fe3af956bd7bb37343b54c9fe7445ef"},
40 | ]
41 |
42 | [[package]]
43 | name = "annotated-types"
44 | version = "0.7.0"
45 | requires_python = ">=3.8"
46 | summary = "Reusable constraint types to use with typing.Annotated"
47 | groups = ["default", "adapters"]
48 | dependencies = [
49 | "typing-extensions>=4.0.0; python_version < \"3.9\"",
50 | ]
51 | files = [
52 | {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
53 | {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
54 | ]
55 |
56 | [[package]]
57 | name = "anyio"
58 | version = "4.4.0"
59 | requires_python = ">=3.8"
60 | summary = "High level compatibility layer for multiple asynchronous event loop implementations"
61 | groups = ["default"]
62 | dependencies = [
63 | "exceptiongroup>=1.0.2; python_version < \"3.11\"",
64 | "idna>=2.8",
65 | "sniffio>=1.1",
66 | "typing-extensions>=4.1; python_version < \"3.11\"",
67 | ]
68 | files = [
69 | {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"},
70 | {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"},
71 | ]
72 |
73 | [[package]]
74 | name = "arclet-alconna"
75 | version = "1.8.26"
76 | requires_python = ">=3.8"
77 | summary = "A High-performance, Generality, Humane Command Line Arguments Parser Library."
78 | groups = ["default"]
79 | dependencies = [
80 | "nepattern<1.0.0,>=0.7.6",
81 | "tarina>=0.5.5",
82 | "typing-extensions>=4.5.0",
83 | ]
84 | files = [
85 | {file = "arclet_alconna-1.8.26-py3-none-any.whl", hash = "sha256:9726c31947efb2cf6786c4a7962f6824e3b2831bb5c45991f2660adfe3958818"},
86 | {file = "arclet_alconna-1.8.26.tar.gz", hash = "sha256:8acbfc5892aea25772105581cc5e69e765ff4947ac53014ec7feeb5991e0a4e1"},
87 | ]
88 |
89 | [[package]]
90 | name = "arclet-alconna-tools"
91 | version = "0.7.9"
92 | requires_python = ">=3.8"
93 | summary = "Builtin Tools for Alconna"
94 | groups = ["default"]
95 | dependencies = [
96 | "arclet-alconna>=1.8.21",
97 | "nepattern<1.0.0,>=0.7.3",
98 | ]
99 | files = [
100 | {file = "arclet_alconna_tools-0.7.9-py3-none-any.whl", hash = "sha256:01a3462bb9f8dbe55010b394f7a0ac11e331799d463e326738870dce191aa608"},
101 | {file = "arclet_alconna_tools-0.7.9.tar.gz", hash = "sha256:bded24c4157e13e2d803fe7b77ee246fda456206451337015513f150d1e4449c"},
102 | ]
103 |
104 | [[package]]
105 | name = "black"
106 | version = "24.4.2"
107 | requires_python = ">=3.8"
108 | summary = "The uncompromising code formatter."
109 | groups = ["dev"]
110 | dependencies = [
111 | "click>=8.0.0",
112 | "mypy-extensions>=0.4.3",
113 | "packaging>=22.0",
114 | "pathspec>=0.9.0",
115 | "platformdirs>=2",
116 | "tomli>=1.1.0; python_version < \"3.11\"",
117 | "typing-extensions>=4.0.1; python_version < \"3.11\"",
118 | ]
119 | files = [
120 | {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"},
121 | {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"},
122 | {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"},
123 | {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"},
124 | {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"},
125 | {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"},
126 | {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"},
127 | {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"},
128 | {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"},
129 | {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"},
130 | {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"},
131 | {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"},
132 | {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"},
133 | {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"},
134 | ]
135 |
136 | [[package]]
137 | name = "certifi"
138 | version = "2024.7.4"
139 | requires_python = ">=3.6"
140 | summary = "Python package for providing Mozilla's CA Bundle."
141 | groups = ["default"]
142 | files = [
143 | {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"},
144 | {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"},
145 | ]
146 |
147 | [[package]]
148 | name = "cfgv"
149 | version = "3.4.0"
150 | requires_python = ">=3.8"
151 | summary = "Validate configuration and produce human readable error messages."
152 | groups = ["dev"]
153 | files = [
154 | {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"},
155 | {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"},
156 | ]
157 |
158 | [[package]]
159 | name = "click"
160 | version = "8.1.7"
161 | requires_python = ">=3.7"
162 | summary = "Composable command line interface toolkit"
163 | groups = ["default", "dev"]
164 | dependencies = [
165 | "colorama; platform_system == \"Windows\"",
166 | "importlib-metadata; python_version < \"3.8\"",
167 | ]
168 | files = [
169 | {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
170 | {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
171 | ]
172 |
173 | [[package]]
174 | name = "colorama"
175 | version = "0.4.6"
176 | requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
177 | summary = "Cross-platform colored terminal text."
178 | groups = ["default", "adapters", "dev"]
179 | marker = "platform_system == \"Windows\" or sys_platform == \"win32\""
180 | files = [
181 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
182 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
183 | ]
184 |
185 | [[package]]
186 | name = "distlib"
187 | version = "0.3.8"
188 | summary = "Distribution utilities"
189 | groups = ["dev"]
190 | files = [
191 | {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"},
192 | {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"},
193 | ]
194 |
195 | [[package]]
196 | name = "exceptiongroup"
197 | version = "1.2.2"
198 | requires_python = ">=3.7"
199 | summary = "Backport of PEP 654 (exception groups)"
200 | groups = ["default"]
201 | marker = "python_version < \"3.11\""
202 | files = [
203 | {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"},
204 | {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"},
205 | ]
206 |
207 | [[package]]
208 | name = "expiringdictx"
209 | version = "1.1.0"
210 | requires_python = "<4,>=3.9"
211 | summary = "提供一个带有过期时间的字典数据结构,适用于缓存和临时存储。"
212 | groups = ["default"]
213 | dependencies = [
214 | "lru-dict<2.0.0,>=1.3.0",
215 | ]
216 | files = [
217 | {file = "expiringdictx-1.1.0-py3-none-any.whl", hash = "sha256:f5d38ae23b46a8f97da27ce0dd74e669430d43b2efe98232a4a81f10b43cde25"},
218 | {file = "expiringdictx-1.1.0.tar.gz", hash = "sha256:f590a4bd656a5317c51e696c2f48fee97e1d3feb6de87e00cebeaad9035824fa"},
219 | ]
220 |
221 | [[package]]
222 | name = "filelock"
223 | version = "3.15.4"
224 | requires_python = ">=3.8"
225 | summary = "A platform independent file lock."
226 | groups = ["dev"]
227 | files = [
228 | {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"},
229 | {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"},
230 | ]
231 |
232 | [[package]]
233 | name = "greenlet"
234 | version = "3.0.3"
235 | requires_python = ">=3.7"
236 | summary = "Lightweight in-process concurrent programming"
237 | groups = ["default"]
238 | files = [
239 | {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"},
240 | {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"},
241 | {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"},
242 | {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"},
243 | {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"},
244 | {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"},
245 | {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"},
246 | {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"},
247 | {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"},
248 | {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"},
249 | {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"},
250 | {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"},
251 | {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"},
252 | {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"},
253 | {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"},
254 | {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"},
255 | {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"},
256 | {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"},
257 | {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"},
258 | {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"},
259 | {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"},
260 | {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"},
261 | {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"},
262 | {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"},
263 | {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"},
264 | {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"},
265 | {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"},
266 | {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"},
267 | ]
268 |
269 | [[package]]
270 | name = "h11"
271 | version = "0.14.0"
272 | requires_python = ">=3.7"
273 | summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
274 | groups = ["default"]
275 | dependencies = [
276 | "typing-extensions; python_version < \"3.8\"",
277 | ]
278 | files = [
279 | {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
280 | {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
281 | ]
282 |
283 | [[package]]
284 | name = "httpcore"
285 | version = "1.0.5"
286 | requires_python = ">=3.8"
287 | summary = "A minimal low-level HTTP client."
288 | groups = ["default"]
289 | dependencies = [
290 | "certifi",
291 | "h11<0.15,>=0.13",
292 | ]
293 | files = [
294 | {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"},
295 | {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"},
296 | ]
297 |
298 | [[package]]
299 | name = "httpx"
300 | version = "0.27.0"
301 | requires_python = ">=3.8"
302 | summary = "The next generation HTTP client."
303 | groups = ["default"]
304 | dependencies = [
305 | "anyio",
306 | "certifi",
307 | "httpcore==1.*",
308 | "idna",
309 | "sniffio",
310 | ]
311 | files = [
312 | {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"},
313 | {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"},
314 | ]
315 |
316 | [[package]]
317 | name = "identify"
318 | version = "2.6.0"
319 | requires_python = ">=3.8"
320 | summary = "File identification library for Python"
321 | groups = ["dev"]
322 | files = [
323 | {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"},
324 | {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"},
325 | ]
326 |
327 | [[package]]
328 | name = "idna"
329 | version = "3.7"
330 | requires_python = ">=3.5"
331 | summary = "Internationalized Domain Names in Applications (IDNA)"
332 | groups = ["default", "adapters"]
333 | files = [
334 | {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"},
335 | {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"},
336 | ]
337 |
338 | [[package]]
339 | name = "importlib-metadata"
340 | version = "8.2.0"
341 | requires_python = ">=3.8"
342 | summary = "Read metadata from Python packages"
343 | groups = ["default"]
344 | dependencies = [
345 | "typing-extensions>=3.6.4; python_version < \"3.8\"",
346 | "zipp>=0.5",
347 | ]
348 | files = [
349 | {file = "importlib_metadata-8.2.0-py3-none-any.whl", hash = "sha256:11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369"},
350 | {file = "importlib_metadata-8.2.0.tar.gz", hash = "sha256:72e8d4399996132204f9a16dcc751af254a48f8d1b20b9ff0f98d4a8f901e73d"},
351 | ]
352 |
353 | [[package]]
354 | name = "importlib-resources"
355 | version = "6.4.2"
356 | requires_python = ">=3.8"
357 | summary = "Read resources from Python packages"
358 | groups = ["default"]
359 | marker = "python_version < \"3.12\""
360 | dependencies = [
361 | "zipp>=3.1.0; python_version < \"3.10\"",
362 | ]
363 | files = [
364 | {file = "importlib_resources-6.4.2-py3-none-any.whl", hash = "sha256:8bba8c54a8a3afaa1419910845fa26ebd706dc716dd208d9b158b4b6966f5c5c"},
365 | {file = "importlib_resources-6.4.2.tar.gz", hash = "sha256:6cbfbefc449cc6e2095dd184691b7a12a04f40bc75dd4c55d31c34f174cdf57a"},
366 | ]
367 |
368 | [[package]]
369 | name = "isort"
370 | version = "5.13.2"
371 | requires_python = ">=3.8.0"
372 | summary = "A Python utility / library to sort Python imports."
373 | groups = ["dev"]
374 | files = [
375 | {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"},
376 | {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"},
377 | ]
378 |
379 | [[package]]
380 | name = "jinja2"
381 | version = "3.1.4"
382 | requires_python = ">=3.7"
383 | summary = "A very fast and expressive template engine."
384 | groups = ["default"]
385 | dependencies = [
386 | "MarkupSafe>=2.0",
387 | ]
388 | files = [
389 | {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"},
390 | {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"},
391 | ]
392 |
393 | [[package]]
394 | name = "loguru"
395 | version = "0.7.2"
396 | requires_python = ">=3.5"
397 | summary = "Python logging made (stupidly) simple"
398 | groups = ["default", "adapters"]
399 | dependencies = [
400 | "aiocontextvars>=0.2.0; python_version < \"3.7\"",
401 | "colorama>=0.3.4; sys_platform == \"win32\"",
402 | "win32-setctime>=1.0.0; sys_platform == \"win32\"",
403 | ]
404 | files = [
405 | {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"},
406 | {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"},
407 | ]
408 |
409 | [[package]]
410 | name = "lru-dict"
411 | version = "1.3.0"
412 | requires_python = ">=3.8"
413 | summary = "An Dict like LRU container."
414 | groups = ["default"]
415 | files = [
416 | {file = "lru-dict-1.3.0.tar.gz", hash = "sha256:54fd1966d6bd1fcde781596cb86068214edeebff1db13a2cea11079e3fd07b6b"},
417 | {file = "lru_dict-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4073333894db9840f066226d50e6f914a2240711c87d60885d8c940b69a6673f"},
418 | {file = "lru_dict-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0ad6361e4dd63b47b2fc8eab344198f37387e1da3dcfacfee19bafac3ec9f1eb"},
419 | {file = "lru_dict-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c637ab54b8cd9802fe19b260261e38820d748adf7606e34045d3c799b6dde813"},
420 | {file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fce5f95489ca1fc158cc9fe0f4866db9cec82c2be0470926a9080570392beaf"},
421 | {file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2bf2e24cf5f19c3ff69bf639306e83dced273e6fa775b04e190d7f5cd16f794"},
422 | {file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e90059f7701bef3c4da073d6e0434a9c7dc551d5adce30e6b99ef86b186f4b4a"},
423 | {file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ecb7ae557239c64077e9b26a142eb88e63cddb104111a5122de7bebbbd00098"},
424 | {file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6af36166d22dba851e06a13e35bbf33845d3dd88872e6aebbc8e3e7db70f4682"},
425 | {file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ee38d420c77eed548df47b7d74b5169a98e71c9e975596e31ab808e76d11f09"},
426 | {file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0e1845024c31e6ff246c9eb5e6f6f1a8bb564c06f8a7d6d031220044c081090b"},
427 | {file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3ca5474b1649555d014be1104e5558a92497509021a5ba5ea6e9b492303eb66b"},
428 | {file = "lru_dict-1.3.0-cp310-cp310-win32.whl", hash = "sha256:ebb03a9bd50c2ed86d4f72a54e0aae156d35a14075485b2127c4b01a3f4a63fa"},
429 | {file = "lru_dict-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:04cda617f4e4c27009005d0a8185ef02829b14b776d2791f5c994cc9d668bc24"},
430 | {file = "lru_dict-1.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:20c595764695d20bdc3ab9b582e0cc99814da183544afb83783a36d6741a0dac"},
431 | {file = "lru_dict-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d9b30a8f50c3fa72a494eca6be5810a1b5c89e4f0fda89374f0d1c5ad8d37d51"},
432 | {file = "lru_dict-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9710737584650a4251b9a566cbb1a86f83437adb209c9ba43a4e756d12faf0d7"},
433 | {file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b84c321ae34f2f40aae80e18b6fa08b31c90095792ab64bb99d2e385143effaa"},
434 | {file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eed24272b4121b7c22f234daed99899817d81d671b3ed030c876ac88bc9dc890"},
435 | {file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd13af06dab7c6ee92284fd02ed9a5613a07d5c1b41948dc8886e7207f86dfd"},
436 | {file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1efc59bfba6aac33684d87b9e02813b0e2445b2f1c444dae2a0b396ad0ed60c"},
437 | {file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfaf75ac574447afcf8ad998789071af11d2bcf6f947643231f692948839bd98"},
438 | {file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c95f8751e2abd6f778da0399c8e0239321d560dbc58cb063827123137d213242"},
439 | {file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:abd0c284b26b5c4ee806ca4f33ab5e16b4bf4d5ec9e093e75a6f6287acdde78e"},
440 | {file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a47740652b25900ac5ce52667b2eade28d8b5fdca0ccd3323459df710e8210a"},
441 | {file = "lru_dict-1.3.0-cp311-cp311-win32.whl", hash = "sha256:a690c23fc353681ed8042d9fe8f48f0fb79a57b9a45daea2f0be1eef8a1a4aa4"},
442 | {file = "lru_dict-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:efd3f4e0385d18f20f7ea6b08af2574c1bfaa5cb590102ef1bee781bdfba84bc"},
443 | {file = "lru_dict-1.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c279068f68af3b46a5d649855e1fb87f5705fe1f744a529d82b2885c0e1fc69d"},
444 | {file = "lru_dict-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:350e2233cfee9f326a0d7a08e309372d87186565e43a691b120006285a0ac549"},
445 | {file = "lru_dict-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4eafb188a84483b3231259bf19030859f070321b00326dcb8e8c6cbf7db4b12f"},
446 | {file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73593791047e36b37fdc0b67b76aeed439fcea80959c7d46201240f9ec3b2563"},
447 | {file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1958cb70b9542773d6241974646e5410e41ef32e5c9e437d44040d59bd80daf2"},
448 | {file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc1cd3ed2cee78a47f11f3b70be053903bda197a873fd146e25c60c8e5a32cd6"},
449 | {file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82eb230d48eaebd6977a92ddaa6d788f14cf4f4bcf5bbffa4ddfd60d051aa9d4"},
450 | {file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5ad659cbc349d0c9ba8e536b5f40f96a70c360f43323c29f4257f340d891531c"},
451 | {file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ba490b8972531d153ac0d4e421f60d793d71a2f4adbe2f7740b3c55dce0a12f1"},
452 | {file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:c0131351b8a7226c69f1eba5814cbc9d1d8daaf0fdec1ae3f30508e3de5262d4"},
453 | {file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0e88dba16695f17f41701269fa046197a3fd7b34a8dba744c8749303ddaa18df"},
454 | {file = "lru_dict-1.3.0-cp312-cp312-win32.whl", hash = "sha256:6ffaf595e625b388babc8e7d79b40f26c7485f61f16efe76764e32dce9ea17fc"},
455 | {file = "lru_dict-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf9da32ef2582434842ab6ba6e67290debfae72771255a8e8ab16f3e006de0aa"},
456 | {file = "lru_dict-1.3.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f8f7824db5a64581180ab9d09842e6dd9fcdc46aac9cb592a0807cd37ea55680"},
457 | {file = "lru_dict-1.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acd04b7e7b0c0c192d738df9c317093335e7282c64c9d1bb6b7ebb54674b4e24"},
458 | {file = "lru_dict-1.3.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5c20f236f27551e3f0adbf1a987673fb1e9c38d6d284502cd38f5a3845ef681"},
459 | {file = "lru_dict-1.3.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca3703ff03b03a1848c563bc2663d0ad813c1cd42c4d9cf75b623716d4415d9a"},
460 | {file = "lru_dict-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a9fb71ba262c6058a0017ce83d343370d0a0dbe2ae62c2eef38241ec13219330"},
461 | ]
462 |
463 | [[package]]
464 | name = "mako"
465 | version = "1.3.5"
466 | requires_python = ">=3.8"
467 | summary = "A super-fast templating language that borrows the best ideas from the existing templating languages."
468 | groups = ["default"]
469 | dependencies = [
470 | "MarkupSafe>=0.9.2",
471 | ]
472 | files = [
473 | {file = "Mako-1.3.5-py3-none-any.whl", hash = "sha256:260f1dbc3a519453a9c856dedfe4beb4e50bd5a26d96386cb6c80856556bb91a"},
474 | {file = "Mako-1.3.5.tar.gz", hash = "sha256:48dbc20568c1d276a2698b36d968fa76161bf127194907ea6fc594fa81f943bc"},
475 | ]
476 |
477 | [[package]]
478 | name = "markdown"
479 | version = "3.7"
480 | requires_python = ">=3.8"
481 | summary = "Python implementation of John Gruber's Markdown."
482 | groups = ["default"]
483 | dependencies = [
484 | "importlib-metadata>=4.4; python_version < \"3.10\"",
485 | ]
486 | files = [
487 | {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"},
488 | {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"},
489 | ]
490 |
491 | [[package]]
492 | name = "markupsafe"
493 | version = "2.1.5"
494 | requires_python = ">=3.7"
495 | summary = "Safely add untrusted strings to HTML/XML markup."
496 | groups = ["default"]
497 | files = [
498 | {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"},
499 | {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"},
500 | {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"},
501 | {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"},
502 | {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"},
503 | {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"},
504 | {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"},
505 | {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"},
506 | {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"},
507 | {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"},
508 | {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"},
509 | {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"},
510 | {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"},
511 | {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"},
512 | {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"},
513 | {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"},
514 | {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"},
515 | {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"},
516 | {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"},
517 | {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"},
518 | {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"},
519 | {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"},
520 | {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"},
521 | {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"},
522 | {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"},
523 | {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"},
524 | {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"},
525 | {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"},
526 | {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"},
527 | {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"},
528 | {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"},
529 | ]
530 |
531 | [[package]]
532 | name = "msgpack"
533 | version = "1.0.8"
534 | requires_python = ">=3.8"
535 | summary = "MessagePack serializer"
536 | groups = ["adapters"]
537 | files = [
538 | {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868"},
539 | {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c"},
540 | {file = "msgpack-1.0.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659"},
541 | {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2"},
542 | {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982"},
543 | {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa"},
544 | {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128"},
545 | {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d"},
546 | {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653"},
547 | {file = "msgpack-1.0.8-cp310-cp310-win32.whl", hash = "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693"},
548 | {file = "msgpack-1.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a"},
549 | {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836"},
550 | {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad"},
551 | {file = "msgpack-1.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b"},
552 | {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba"},
553 | {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85"},
554 | {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950"},
555 | {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a"},
556 | {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b"},
557 | {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce"},
558 | {file = "msgpack-1.0.8-cp311-cp311-win32.whl", hash = "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305"},
559 | {file = "msgpack-1.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e"},
560 | {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"},
561 | {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"},
562 | {file = "msgpack-1.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8"},
563 | {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3"},
564 | {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc"},
565 | {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58"},
566 | {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f"},
567 | {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04"},
568 | {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543"},
569 | {file = "msgpack-1.0.8-cp312-cp312-win32.whl", hash = "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c"},
570 | {file = "msgpack-1.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd"},
571 | {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"},
572 | ]
573 |
574 | [[package]]
575 | name = "multidict"
576 | version = "6.0.5"
577 | requires_python = ">=3.7"
578 | summary = "multidict implementation"
579 | groups = ["default", "adapters"]
580 | files = [
581 | {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"},
582 | {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"},
583 | {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"},
584 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"},
585 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"},
586 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"},
587 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"},
588 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"},
589 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"},
590 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"},
591 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"},
592 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"},
593 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"},
594 | {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"},
595 | {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"},
596 | {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"},
597 | {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"},
598 | {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"},
599 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"},
600 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"},
601 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"},
602 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"},
603 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"},
604 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"},
605 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"},
606 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"},
607 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"},
608 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"},
609 | {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"},
610 | {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"},
611 | {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"},
612 | {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"},
613 | {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"},
614 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"},
615 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"},
616 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"},
617 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"},
618 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"},
619 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"},
620 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"},
621 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"},
622 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"},
623 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"},
624 | {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"},
625 | {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"},
626 | {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"},
627 | {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"},
628 | ]
629 |
630 | [[package]]
631 | name = "mypy-extensions"
632 | version = "1.0.0"
633 | requires_python = ">=3.5"
634 | summary = "Type system extensions for programs checked with the mypy type checker."
635 | groups = ["dev"]
636 | files = [
637 | {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
638 | {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
639 | ]
640 |
641 | [[package]]
642 | name = "nepattern"
643 | version = "0.7.6"
644 | requires_python = ">=3.8"
645 | summary = "a complex pattern, support typing"
646 | groups = ["default"]
647 | dependencies = [
648 | "tarina>=0.5.1",
649 | "typing-extensions>=4.5.0",
650 | ]
651 | files = [
652 | {file = "nepattern-0.7.6-py3-none-any.whl", hash = "sha256:233d0befecc190f228ded3651a85faaf53f1308bba40ab8ddec379d0d3c88051"},
653 | {file = "nepattern-0.7.6.tar.gz", hash = "sha256:07bd5b2f3b9b9739b703bf723ffd642ca93738a32df7b699d57d6f338d46bad0"},
654 | ]
655 |
656 | [[package]]
657 | name = "nodeenv"
658 | version = "1.9.1"
659 | requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
660 | summary = "Node.js virtual environment builder"
661 | groups = ["dev"]
662 | files = [
663 | {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"},
664 | {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"},
665 | ]
666 |
667 | [[package]]
668 | name = "nonebot-adapter-onebot"
669 | version = "2.4.4"
670 | requires_python = "<4.0,>=3.9"
671 | summary = "OneBot(CQHTTP) adapter for nonebot2"
672 | groups = ["adapters"]
673 | dependencies = [
674 | "msgpack<2.0.0,>=1.0.3",
675 | "nonebot2<3.0.0,>=2.2.0",
676 | "pydantic!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0",
677 | "typing-extensions<5.0.0,>=4.0.0",
678 | ]
679 | files = [
680 | {file = "nonebot_adapter_onebot-2.4.4-py3-none-any.whl", hash = "sha256:4dceeec7332bb560652c764405e9dd350268303f69b7c0e92b7cfebe876e8d39"},
681 | {file = "nonebot_adapter_onebot-2.4.4.tar.gz", hash = "sha256:c8a3645f74a3e43c85f092fb670508c662c36831f019a15e4d74eaac686089f0"},
682 | ]
683 |
684 | [[package]]
685 | name = "nonebot-plugin-alconna"
686 | version = "0.52.0"
687 | requires_python = ">=3.9"
688 | summary = "Alconna Adapter for Nonebot"
689 | groups = ["default"]
690 | dependencies = [
691 | "arclet-alconna-tools>=0.7.9",
692 | "arclet-alconna>=1.8.25",
693 | "importlib-metadata>=4.13.0",
694 | "nepattern>=0.7.4",
695 | "nonebot-plugin-waiter>=0.6.0",
696 | "nonebot2>=2.3.0",
697 | "tarina>=0.5.5",
698 | ]
699 | files = [
700 | {file = "nonebot_plugin_alconna-0.52.0-py3-none-any.whl", hash = "sha256:e187a355be39c0fbaeecea358d60b591d0bc2b06849a10387f370a695f880aa7"},
701 | {file = "nonebot_plugin_alconna-0.52.0.tar.gz", hash = "sha256:f6146163fd2d69cee32cfbbb740ff32a0eaba118b306a212421410661c638ecc"},
702 | ]
703 |
704 | [[package]]
705 | name = "nonebot-plugin-htmlrender"
706 | version = "0.3.5"
707 | requires_python = "<4.0,>=3.9"
708 | summary = "通过浏览器渲染图片"
709 | groups = ["default"]
710 | dependencies = [
711 | "Pygments>=2.10.0",
712 | "aiofiles>=0.8.0",
713 | "jinja2>=3.0.3",
714 | "markdown>=3.3.6",
715 | "nonebot2>=2.2.0",
716 | "playwright>=1.17.2",
717 | "pymdown-extensions>=9.1",
718 | "python-markdown-math>=0.8",
719 | ]
720 | files = [
721 | {file = "nonebot_plugin_htmlrender-0.3.5-py3-none-any.whl", hash = "sha256:a46c6a1b57ae79e26ed996ca1eca2c729f8f4a53aed993b7664f956d7eeca29e"},
722 | {file = "nonebot_plugin_htmlrender-0.3.5.tar.gz", hash = "sha256:22b3e801bde06e66528582aa085317b27c42e82e8d7e72aa04218635e03c1303"},
723 | ]
724 |
725 | [[package]]
726 | name = "nonebot-plugin-localstore"
727 | version = "0.7.1"
728 | requires_python = "<4.0,>=3.9"
729 | summary = "Local Storage Support for NoneBot2"
730 | groups = ["default"]
731 | dependencies = [
732 | "nonebot2<3.0.0,>=2.2.0",
733 | "pydantic!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0",
734 | "typing-extensions<5.0.0,>=4.0.0",
735 | ]
736 | files = [
737 | {file = "nonebot_plugin_localstore-0.7.1-py3-none-any.whl", hash = "sha256:7908af162d1d0e8c736ae8863723325d057289f6b080ae44ff9ff39294f9ed16"},
738 | {file = "nonebot_plugin_localstore-0.7.1.tar.gz", hash = "sha256:9c2a7b39b50240896d9306adb79d8047308d0e77b88e3272b19be4908bdaabc9"},
739 | ]
740 |
741 | [[package]]
742 | name = "nonebot-plugin-orm"
743 | version = "0.7.6"
744 | requires_python = "<4.0,>=3.8"
745 | summary = "SQLAlchemy ORM support for nonebot"
746 | groups = ["default"]
747 | dependencies = [
748 | "alembic~=1.13",
749 | "click~=8.1",
750 | "importlib-metadata~=7.0; python_version < \"3.10\"",
751 | "importlib-resources~=6.1; python_version < \"3.12\"",
752 | "nonebot-plugin-localstore~=0.6",
753 | "nonebot2~=2.2",
754 | "sqlalchemy~=2.0",
755 | "typing-extensions~=4.9; python_version < \"3.11\"",
756 | ]
757 | files = [
758 | {file = "nonebot_plugin_orm-0.7.6-py3-none-any.whl", hash = "sha256:6ce808d7e847eb7c1a738609b0e94bb612488650c5150ae1b2d67463034bb255"},
759 | {file = "nonebot_plugin_orm-0.7.6.tar.gz", hash = "sha256:3ae4ac362a8ea6e6467666f654287855a30447f8fa457af88f1760f155c5d68c"},
760 | ]
761 |
762 | [[package]]
763 | name = "nonebot-plugin-session"
764 | version = "0.3.2"
765 | requires_python = "<4.0,>=3.9"
766 | summary = "Nonebot2 会话信息提取与会话id定义"
767 | groups = ["default"]
768 | dependencies = [
769 | "nonebot2<3.0.0,>=2.3.0",
770 | "strenum<0.5.0,>=0.4.15",
771 | ]
772 | files = [
773 | {file = "nonebot_plugin_session-0.3.2-py3-none-any.whl", hash = "sha256:785e74ff656e46d84c4dbbac125f9a9adebcc4b9ff7db700527e6e47d47aabd6"},
774 | {file = "nonebot_plugin_session-0.3.2.tar.gz", hash = "sha256:da0dabe9108151052a6e83d9923068d2ec43a93810ad37b264ed65aee2c69f93"},
775 | ]
776 |
777 | [[package]]
778 | name = "nonebot-plugin-user"
779 | version = "0.4.2"
780 | requires_python = ">=3.9"
781 | summary = "适用于 Nonebot2 的用户插件"
782 | groups = ["default"]
783 | dependencies = [
784 | "expiringdictx>=1.1.0",
785 | "nonebot-plugin-alconna>=0.37.1",
786 | "nonebot-plugin-orm>=0.7.0",
787 | "nonebot-plugin-session>=0.3.0",
788 | "nonebot2>=2.2.0",
789 | ]
790 | files = [
791 | {file = "nonebot_plugin_user-0.4.2-py3-none-any.whl", hash = "sha256:c7312109614cb40e1887e534deb1e81dd213b2304dd34cba738b35580971cc9f"},
792 | {file = "nonebot_plugin_user-0.4.2.tar.gz", hash = "sha256:422062dfa97d8fbd8dbd11ab46b240e86d90fcca3d991886596c3332e4211694"},
793 | ]
794 |
795 | [[package]]
796 | name = "nonebot-plugin-waiter"
797 | version = "0.7.1"
798 | requires_python = ">=3.9"
799 | summary = "An alternative for got-and-reject in Nonebot"
800 | groups = ["default"]
801 | dependencies = [
802 | "nonebot2>=2.3.0",
803 | ]
804 | files = [
805 | {file = "nonebot_plugin_waiter-0.7.1-py3-none-any.whl", hash = "sha256:b9967cc7aeea0db86053ada20929841830aea60bb8c7da26d0483eefda75635c"},
806 | {file = "nonebot_plugin_waiter-0.7.1.tar.gz", hash = "sha256:8be2adc175e45ca794881e3df449302b8e6e045cd9bae97a809907f4200b4110"},
807 | ]
808 |
809 | [[package]]
810 | name = "nonebot2"
811 | version = "2.3.3"
812 | requires_python = "<4.0,>=3.9"
813 | summary = "An asynchronous python bot framework."
814 | groups = ["default", "adapters"]
815 | dependencies = [
816 | "loguru<1.0.0,>=0.6.0",
817 | "pydantic!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0",
818 | "pygtrie<3.0.0,>=2.4.1",
819 | "python-dotenv<2.0.0,>=0.21.0",
820 | "tomli<3.0.0,>=2.0.1; python_version < \"3.11\"",
821 | "typing-extensions<5.0.0,>=4.4.0",
822 | "yarl<2.0.0,>=1.7.2",
823 | ]
824 | files = [
825 | {file = "nonebot2-2.3.3-py3-none-any.whl", hash = "sha256:5bc8d073091347f29c4a1a2f927c24a8941e5d286c77139376259318b9bbfc68"},
826 | {file = "nonebot2-2.3.3.tar.gz", hash = "sha256:4fa7707de5d708c27cc49493bc78a07fee2ba01f5516835a2ea5fbebb49b9dfa"},
827 | ]
828 |
829 | [[package]]
830 | name = "packaging"
831 | version = "24.1"
832 | requires_python = ">=3.8"
833 | summary = "Core utilities for Python packages"
834 | groups = ["dev"]
835 | files = [
836 | {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"},
837 | {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"},
838 | ]
839 |
840 | [[package]]
841 | name = "pathspec"
842 | version = "0.12.1"
843 | requires_python = ">=3.8"
844 | summary = "Utility library for gitignore style pattern matching of file paths."
845 | groups = ["dev"]
846 | files = [
847 | {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
848 | {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
849 | ]
850 |
851 | [[package]]
852 | name = "platformdirs"
853 | version = "4.2.2"
854 | requires_python = ">=3.8"
855 | summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
856 | groups = ["dev"]
857 | files = [
858 | {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"},
859 | {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"},
860 | ]
861 |
862 | [[package]]
863 | name = "playwright"
864 | version = "1.46.0"
865 | requires_python = ">=3.8"
866 | summary = "A high-level API to automate web browsers"
867 | groups = ["default"]
868 | dependencies = [
869 | "greenlet==3.0.3",
870 | "pyee==11.1.0",
871 | ]
872 | files = [
873 | {file = "playwright-1.46.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:fa60b95c16f6ce954636229a6c9dd885485326bca52d5ba20d02c0bc731a2bbb"},
874 | {file = "playwright-1.46.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:73dcfc24834f4d004bc862ed0d74b4c1406793a8164734238ad035356fddc8ac"},
875 | {file = "playwright-1.46.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:f5acfec1dbdc84d02dc696a17a344227e66c91413eab2036428dab405f195b82"},
876 | {file = "playwright-1.46.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:3b418509f45879f1403d070858657a39bd0b333b23d92c37355682b671726df9"},
877 | {file = "playwright-1.46.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23580f6a3f99757bb9779d29be37144cb9328cd9bafa178e6db5b3ab4b7faf4c"},
878 | {file = "playwright-1.46.0-py3-none-win32.whl", hash = "sha256:85f44dd32a23d02850f0ff4dafe51580e5199531fff5121a62489d9838707782"},
879 | {file = "playwright-1.46.0-py3-none-win_amd64.whl", hash = "sha256:f14a7fd7e24e954eec6ce61d787d499e41937ade811a0818e9a088aabe28ebb6"},
880 | ]
881 |
882 | [[package]]
883 | name = "pre-commit"
884 | version = "3.7.1"
885 | requires_python = ">=3.9"
886 | summary = "A framework for managing and maintaining multi-language pre-commit hooks."
887 | groups = ["dev"]
888 | dependencies = [
889 | "cfgv>=2.0.0",
890 | "identify>=1.0.0",
891 | "nodeenv>=0.11.1",
892 | "pyyaml>=5.1",
893 | "virtualenv>=20.10.0",
894 | ]
895 | files = [
896 | {file = "pre_commit-3.7.1-py2.py3-none-any.whl", hash = "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5"},
897 | {file = "pre_commit-3.7.1.tar.gz", hash = "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a"},
898 | ]
899 |
900 | [[package]]
901 | name = "pydantic"
902 | version = "2.8.2"
903 | requires_python = ">=3.8"
904 | summary = "Data validation using Python type hints"
905 | groups = ["default", "adapters"]
906 | dependencies = [
907 | "annotated-types>=0.4.0",
908 | "pydantic-core==2.20.1",
909 | "typing-extensions>=4.12.2; python_version >= \"3.13\"",
910 | "typing-extensions>=4.6.1; python_version < \"3.13\"",
911 | ]
912 | files = [
913 | {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"},
914 | {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"},
915 | ]
916 |
917 | [[package]]
918 | name = "pydantic-core"
919 | version = "2.20.1"
920 | requires_python = ">=3.8"
921 | summary = "Core functionality for Pydantic validation and serialization"
922 | groups = ["default", "adapters"]
923 | dependencies = [
924 | "typing-extensions!=4.7.0,>=4.6.0",
925 | ]
926 | files = [
927 | {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"},
928 | {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"},
929 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"},
930 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"},
931 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"},
932 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"},
933 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"},
934 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"},
935 | {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"},
936 | {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"},
937 | {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"},
938 | {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"},
939 | {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"},
940 | {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"},
941 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"},
942 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"},
943 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"},
944 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"},
945 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"},
946 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"},
947 | {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"},
948 | {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"},
949 | {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"},
950 | {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"},
951 | {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"},
952 | {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"},
953 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"},
954 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"},
955 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"},
956 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"},
957 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"},
958 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"},
959 | {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"},
960 | {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"},
961 | {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"},
962 | {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"},
963 | {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"},
964 | {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"},
965 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"},
966 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"},
967 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"},
968 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"},
969 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"},
970 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"},
971 | {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"},
972 | {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"},
973 | {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"},
974 | {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"},
975 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"},
976 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"},
977 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"},
978 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"},
979 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"},
980 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"},
981 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"},
982 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"},
983 | {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"},
984 | ]
985 |
986 | [[package]]
987 | name = "pyee"
988 | version = "11.1.0"
989 | requires_python = ">=3.8"
990 | summary = "A rough port of Node.js's EventEmitter to Python with a few tricks of its own"
991 | groups = ["default"]
992 | dependencies = [
993 | "typing-extensions",
994 | ]
995 | files = [
996 | {file = "pyee-11.1.0-py3-none-any.whl", hash = "sha256:5d346a7d0f861a4b2e6c47960295bd895f816725b27d656181947346be98d7c1"},
997 | {file = "pyee-11.1.0.tar.gz", hash = "sha256:b53af98f6990c810edd9b56b87791021a8f54fd13db4edd1142438d44ba2263f"},
998 | ]
999 |
1000 | [[package]]
1001 | name = "pygments"
1002 | version = "2.18.0"
1003 | requires_python = ">=3.8"
1004 | summary = "Pygments is a syntax highlighting package written in Python."
1005 | groups = ["default"]
1006 | files = [
1007 | {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"},
1008 | {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"},
1009 | ]
1010 |
1011 | [[package]]
1012 | name = "pygtrie"
1013 | version = "2.5.0"
1014 | summary = "A pure Python trie data structure implementation."
1015 | groups = ["default", "adapters"]
1016 | files = [
1017 | {file = "pygtrie-2.5.0-py3-none-any.whl", hash = "sha256:8795cda8105493d5ae159a5bef313ff13156c5d4d72feddefacaad59f8c8ce16"},
1018 | {file = "pygtrie-2.5.0.tar.gz", hash = "sha256:203514ad826eb403dab1d2e2ddd034e0d1534bbe4dbe0213bb0593f66beba4e2"},
1019 | ]
1020 |
1021 | [[package]]
1022 | name = "pymdown-extensions"
1023 | version = "10.9"
1024 | requires_python = ">=3.8"
1025 | summary = "Extension pack for Python Markdown."
1026 | groups = ["default"]
1027 | dependencies = [
1028 | "markdown>=3.6",
1029 | "pyyaml",
1030 | ]
1031 | files = [
1032 | {file = "pymdown_extensions-10.9-py3-none-any.whl", hash = "sha256:d323f7e90d83c86113ee78f3fe62fc9dee5f56b54d912660703ea1816fed5626"},
1033 | {file = "pymdown_extensions-10.9.tar.gz", hash = "sha256:6ff740bcd99ec4172a938970d42b96128bdc9d4b9bcad72494f29921dc69b753"},
1034 | ]
1035 |
1036 | [[package]]
1037 | name = "python-dotenv"
1038 | version = "1.0.1"
1039 | requires_python = ">=3.8"
1040 | summary = "Read key-value pairs from a .env file and set them as environment variables"
1041 | groups = ["default", "adapters"]
1042 | files = [
1043 | {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
1044 | {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
1045 | ]
1046 |
1047 | [[package]]
1048 | name = "python-markdown-math"
1049 | version = "0.8"
1050 | requires_python = ">=3.6"
1051 | summary = "Math extension for Python-Markdown"
1052 | groups = ["default"]
1053 | dependencies = [
1054 | "Markdown>=3.0",
1055 | ]
1056 | files = [
1057 | {file = "python-markdown-math-0.8.tar.gz", hash = "sha256:8564212af679fc18d53f38681f16080fcd3d186073f23825c7ce86fadd3e3635"},
1058 | {file = "python_markdown_math-0.8-py3-none-any.whl", hash = "sha256:c685249d84b5b697e9114d7beb352bd8ca2e07fd268fd4057ffca888c14641e5"},
1059 | ]
1060 |
1061 | [[package]]
1062 | name = "pyyaml"
1063 | version = "6.0.1"
1064 | requires_python = ">=3.6"
1065 | summary = "YAML parser and emitter for Python"
1066 | groups = ["default", "dev"]
1067 | files = [
1068 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"},
1069 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"},
1070 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"},
1071 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"},
1072 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"},
1073 | {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"},
1074 | {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"},
1075 | {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"},
1076 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"},
1077 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"},
1078 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"},
1079 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"},
1080 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"},
1081 | {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"},
1082 | {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"},
1083 | {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
1084 | {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
1085 | {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
1086 | {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"},
1087 | {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
1088 | {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
1089 | {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
1090 | {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"},
1091 | {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
1092 | ]
1093 |
1094 | [[package]]
1095 | name = "ruff"
1096 | version = "0.6.1"
1097 | requires_python = ">=3.7"
1098 | summary = "An extremely fast Python linter and code formatter, written in Rust."
1099 | groups = ["dev"]
1100 | files = [
1101 | {file = "ruff-0.6.1-py3-none-linux_armv6l.whl", hash = "sha256:b4bb7de6a24169dc023f992718a9417380301b0c2da0fe85919f47264fb8add9"},
1102 | {file = "ruff-0.6.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:45efaae53b360c81043e311cdec8a7696420b3d3e8935202c2846e7a97d4edae"},
1103 | {file = "ruff-0.6.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:bc60c7d71b732c8fa73cf995efc0c836a2fd8b9810e115be8babb24ae87e0850"},
1104 | {file = "ruff-0.6.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c7477c3b9da822e2db0b4e0b59e61b8a23e87886e727b327e7dcaf06213c5cf"},
1105 | {file = "ruff-0.6.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a0af7ab3f86e3dc9f157a928e08e26c4b40707d0612b01cd577cc84b8905cc9"},
1106 | {file = "ruff-0.6.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:392688dbb50fecf1bf7126731c90c11a9df1c3a4cdc3f481b53e851da5634fa5"},
1107 | {file = "ruff-0.6.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5278d3e095ccc8c30430bcc9bc550f778790acc211865520f3041910a28d0024"},
1108 | {file = "ruff-0.6.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe6d5f65d6f276ee7a0fc50a0cecaccb362d30ef98a110f99cac1c7872df2f18"},
1109 | {file = "ruff-0.6.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2e0dd11e2ae553ee5c92a81731d88a9883af8db7408db47fc81887c1f8b672e"},
1110 | {file = "ruff-0.6.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d812615525a34ecfc07fd93f906ef5b93656be01dfae9a819e31caa6cfe758a1"},
1111 | {file = "ruff-0.6.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:faaa4060f4064c3b7aaaa27328080c932fa142786f8142aff095b42b6a2eb631"},
1112 | {file = "ruff-0.6.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:99d7ae0df47c62729d58765c593ea54c2546d5de213f2af2a19442d50a10cec9"},
1113 | {file = "ruff-0.6.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9eb18dfd7b613eec000e3738b3f0e4398bf0153cb80bfa3e351b3c1c2f6d7b15"},
1114 | {file = "ruff-0.6.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:c62bc04c6723a81e25e71715aa59489f15034d69bf641df88cb38bdc32fd1dbb"},
1115 | {file = "ruff-0.6.1-py3-none-win32.whl", hash = "sha256:9fb4c4e8b83f19c9477a8745e56d2eeef07a7ff50b68a6998f7d9e2e3887bdc4"},
1116 | {file = "ruff-0.6.1-py3-none-win_amd64.whl", hash = "sha256:c2ebfc8f51ef4aca05dad4552bbcf6fe8d1f75b2f6af546cc47cc1c1ca916b5b"},
1117 | {file = "ruff-0.6.1-py3-none-win_arm64.whl", hash = "sha256:3bc81074971b0ffad1bd0c52284b22411f02a11a012082a76ac6da153536e014"},
1118 | {file = "ruff-0.6.1.tar.gz", hash = "sha256:af3ffd8c6563acb8848d33cd19a69b9bfe943667f0419ca083f8ebe4224a3436"},
1119 | ]
1120 |
1121 | [[package]]
1122 | name = "sniffio"
1123 | version = "1.3.1"
1124 | requires_python = ">=3.7"
1125 | summary = "Sniff out which async library your code is running under"
1126 | groups = ["default"]
1127 | files = [
1128 | {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
1129 | {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
1130 | ]
1131 |
1132 | [[package]]
1133 | name = "sqlalchemy"
1134 | version = "2.0.32"
1135 | requires_python = ">=3.7"
1136 | summary = "Database Abstraction Library"
1137 | groups = ["default"]
1138 | dependencies = [
1139 | "greenlet!=0.4.17; (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\") and python_version < \"3.13\"",
1140 | "importlib-metadata; python_version < \"3.8\"",
1141 | "typing-extensions>=4.6.0",
1142 | ]
1143 | files = [
1144 | {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0c9045ecc2e4db59bfc97b20516dfdf8e41d910ac6fb667ebd3a79ea54084619"},
1145 | {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1467940318e4a860afd546ef61fefb98a14d935cd6817ed07a228c7f7c62f389"},
1146 | {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5954463675cb15db8d4b521f3566a017c8789222b8316b1e6934c811018ee08b"},
1147 | {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167e7497035c303ae50651b351c28dc22a40bb98fbdb8468cdc971821b1ae533"},
1148 | {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b27dfb676ac02529fb6e343b3a482303f16e6bc3a4d868b73935b8792edb52d0"},
1149 | {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bf2360a5e0f7bd75fa80431bf8ebcfb920c9f885e7956c7efde89031695cafb8"},
1150 | {file = "SQLAlchemy-2.0.32-cp310-cp310-win32.whl", hash = "sha256:306fe44e754a91cd9d600a6b070c1f2fadbb4a1a257b8781ccf33c7067fd3e4d"},
1151 | {file = "SQLAlchemy-2.0.32-cp310-cp310-win_amd64.whl", hash = "sha256:99db65e6f3ab42e06c318f15c98f59a436f1c78179e6a6f40f529c8cc7100b22"},
1152 | {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21b053be28a8a414f2ddd401f1be8361e41032d2ef5884b2f31d31cb723e559f"},
1153 | {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b178e875a7a25b5938b53b006598ee7645172fccafe1c291a706e93f48499ff5"},
1154 | {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723a40ee2cc7ea653645bd4cf024326dea2076673fc9d3d33f20f6c81db83e1d"},
1155 | {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:295ff8689544f7ee7e819529633d058bd458c1fd7f7e3eebd0f9268ebc56c2a0"},
1156 | {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49496b68cd190a147118af585173ee624114dfb2e0297558c460ad7495f9dfe2"},
1157 | {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:acd9b73c5c15f0ec5ce18128b1fe9157ddd0044abc373e6ecd5ba376a7e5d961"},
1158 | {file = "SQLAlchemy-2.0.32-cp311-cp311-win32.whl", hash = "sha256:9365a3da32dabd3e69e06b972b1ffb0c89668994c7e8e75ce21d3e5e69ddef28"},
1159 | {file = "SQLAlchemy-2.0.32-cp311-cp311-win_amd64.whl", hash = "sha256:8bd63d051f4f313b102a2af1cbc8b80f061bf78f3d5bd0843ff70b5859e27924"},
1160 | {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bab3db192a0c35e3c9d1560eb8332463e29e5507dbd822e29a0a3c48c0a8d92"},
1161 | {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:19d98f4f58b13900d8dec4ed09dd09ef292208ee44cc9c2fe01c1f0a2fe440e9"},
1162 | {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd33c61513cb1b7371fd40cf221256456d26a56284e7d19d1f0b9f1eb7dd7e8"},
1163 | {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6ba0497c1d066dd004e0f02a92426ca2df20fac08728d03f67f6960271feec"},
1164 | {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2b6be53e4fde0065524f1a0a7929b10e9280987b320716c1509478b712a7688c"},
1165 | {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:916a798f62f410c0b80b63683c8061f5ebe237b0f4ad778739304253353bc1cb"},
1166 | {file = "SQLAlchemy-2.0.32-cp312-cp312-win32.whl", hash = "sha256:31983018b74908ebc6c996a16ad3690301a23befb643093fcfe85efd292e384d"},
1167 | {file = "SQLAlchemy-2.0.32-cp312-cp312-win_amd64.whl", hash = "sha256:4363ed245a6231f2e2957cccdda3c776265a75851f4753c60f3004b90e69bfeb"},
1168 | {file = "SQLAlchemy-2.0.32-py3-none-any.whl", hash = "sha256:e567a8793a692451f706b363ccf3c45e056b67d90ead58c3bc9471af5d212202"},
1169 | {file = "SQLAlchemy-2.0.32.tar.gz", hash = "sha256:c1b88cc8b02b6a5f0efb0345a03672d4c897dc7d92585176f88c67346f565ea8"},
1170 | ]
1171 |
1172 | [[package]]
1173 | name = "strenum"
1174 | version = "0.4.15"
1175 | summary = "An Enum that inherits from str."
1176 | groups = ["default"]
1177 | files = [
1178 | {file = "StrEnum-0.4.15-py3-none-any.whl", hash = "sha256:a30cda4af7cc6b5bf52c8055bc4bf4b2b6b14a93b574626da33df53cf7740659"},
1179 | {file = "StrEnum-0.4.15.tar.gz", hash = "sha256:878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff"},
1180 | ]
1181 |
1182 | [[package]]
1183 | name = "tarina"
1184 | version = "0.5.5"
1185 | requires_python = ">=3.8"
1186 | summary = "A collection of common utils for Arclet"
1187 | groups = ["default"]
1188 | dependencies = [
1189 | "typing-extensions>=4.4.0",
1190 | ]
1191 | files = [
1192 | {file = "tarina-0.5.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fda200701a81ed48e4303ccff10b5d680a7ad3d1772a6830f32995fe04459d6e"},
1193 | {file = "tarina-0.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:30ffe373da5f9e35179b96e233731e8a7bb83fe6bf8866753f468db53b3ed22e"},
1194 | {file = "tarina-0.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb7474ba9f9d55dc29df9d317c12fdc870ba10582b0c5ce36550e237881c9ea6"},
1195 | {file = "tarina-0.5.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a392ac4d4b94a9a51b7540d8194605be621a129147dc874933a524911a09c94e"},
1196 | {file = "tarina-0.5.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cc131ecab68d7ec31a12dfb8f0ab0638729a9b866043a79b66dcf7022000652"},
1197 | {file = "tarina-0.5.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:724a3d33ed7c48f68af7fc583aa21abff2cd1b60d0c51d3ba043683d715717f8"},
1198 | {file = "tarina-0.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b04897665d96ebd55461c0876407c3e569008ba8efee4d4342bad47c32b64b0f"},
1199 | {file = "tarina-0.5.5-cp310-cp310-win32.whl", hash = "sha256:f58c9eaa087af597cfd7e2885073c9dc93a3f93ba3f6957d55a9dacbcc1270ee"},
1200 | {file = "tarina-0.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:b7dc4a5e0779fd4ee023abf445c2f801069a5861133c3ad04a5e055d5d5071fb"},
1201 | {file = "tarina-0.5.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5ffb4ed6bd241809fd76b82bc7df857413cbc4a73a2ac8397374b79cb6e85e9b"},
1202 | {file = "tarina-0.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f5551815a970cd22d6d609a8769eac3e8b499e54ac5283e01169727f9ce0edd0"},
1203 | {file = "tarina-0.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4e2c18bcb1a3c59e45dc0fe39880b41d7e4fb5d742ef98a88fb4621aea9da02f"},
1204 | {file = "tarina-0.5.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2db5c4bc285d73bec00b159dde6ec41b74d14371eb6da29d8b14a382e370567e"},
1205 | {file = "tarina-0.5.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d74923bc3d6884639e102a6a35bffda9578d934a23c4eb3f2d835e718ac75cee"},
1206 | {file = "tarina-0.5.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e55686cff98c91ed4982226163ac5daeaf85510b4acab0c3d75331e255fbdce0"},
1207 | {file = "tarina-0.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:50572901cd69983cfdc9d5a5823d17c49755f9e071eb287e091df014beaf6e73"},
1208 | {file = "tarina-0.5.5-cp311-cp311-win32.whl", hash = "sha256:9d0a20f8b084af361fab7b070917edad611ede38014bab2cfc4024599586ade0"},
1209 | {file = "tarina-0.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:8e740532d5a9346079c55613adfb77895f596a9c57e46c06d7d6c03640bd4f38"},
1210 | {file = "tarina-0.5.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1bab4762a24d9fcd8eacae4376c8fa2d4a96e1a3c5aadbeaad9e113cd679ee7d"},
1211 | {file = "tarina-0.5.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:05149d5aef6947fcf11a5b6cbbab788202077a734b7a2d184a574283de311725"},
1212 | {file = "tarina-0.5.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b4ae866721d7b906fb327f847d9f8522f46bbea3b0df61b74d6bcc22dad1a33c"},
1213 | {file = "tarina-0.5.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c687aa0cfef24b1df2c8f044a72d8993d68b4e13ea8967b79105be7a2e4097dd"},
1214 | {file = "tarina-0.5.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e609199df957cd35cee6a942028f4caded21f1db8ac4c300c1dba94d61f0080"},
1215 | {file = "tarina-0.5.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d57033ce9fa1c6c0a3a4851503c7320e7f7eba5dfc77e4e2f98932f1b329ba85"},
1216 | {file = "tarina-0.5.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:986c5c59e30041e2a223c04b429777d3848c40e70b449f395b4b40290b6ff1ef"},
1217 | {file = "tarina-0.5.5-cp312-cp312-win32.whl", hash = "sha256:256cf6a4f6a395b90aa4c1305f69a36c5fa6155124b30157a4c7e7af7c6be9ca"},
1218 | {file = "tarina-0.5.5-cp312-cp312-win_amd64.whl", hash = "sha256:ada4a85937cb7f0c5968ffc1b4914779d35525bff14e451113da94028d6a7a23"},
1219 | {file = "tarina-0.5.5-py3-none-any.whl", hash = "sha256:4828ace26e49037b2dab624e62ca13a473909b2f535f1b4fd5169dd01e16f6c5"},
1220 | {file = "tarina-0.5.5.tar.gz", hash = "sha256:762a3871906e3dd79fc82d13ff99f14f1af977c4b8e2ce860209b8fa97a8b321"},
1221 | ]
1222 |
1223 | [[package]]
1224 | name = "tomli"
1225 | version = "2.0.1"
1226 | requires_python = ">=3.7"
1227 | summary = "A lil' TOML parser"
1228 | groups = ["default", "adapters", "dev"]
1229 | marker = "python_version < \"3.11\""
1230 | files = [
1231 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
1232 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
1233 | ]
1234 |
1235 | [[package]]
1236 | name = "typing-extensions"
1237 | version = "4.12.2"
1238 | requires_python = ">=3.8"
1239 | summary = "Backported and Experimental Type Hints for Python 3.8+"
1240 | groups = ["default", "adapters", "dev"]
1241 | files = [
1242 | {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
1243 | {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
1244 | ]
1245 |
1246 | [[package]]
1247 | name = "virtualenv"
1248 | version = "20.26.3"
1249 | requires_python = ">=3.7"
1250 | summary = "Virtual Python Environment builder"
1251 | groups = ["dev"]
1252 | dependencies = [
1253 | "distlib<1,>=0.3.7",
1254 | "filelock<4,>=3.12.2",
1255 | "importlib-metadata>=6.6; python_version < \"3.8\"",
1256 | "platformdirs<5,>=3.9.1",
1257 | ]
1258 | files = [
1259 | {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"},
1260 | {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"},
1261 | ]
1262 |
1263 | [[package]]
1264 | name = "win32-setctime"
1265 | version = "1.1.0"
1266 | requires_python = ">=3.5"
1267 | summary = "A small Python utility to set file creation time on Windows"
1268 | groups = ["default", "adapters"]
1269 | marker = "sys_platform == \"win32\""
1270 | files = [
1271 | {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"},
1272 | {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"},
1273 | ]
1274 |
1275 | [[package]]
1276 | name = "yarl"
1277 | version = "1.9.4"
1278 | requires_python = ">=3.7"
1279 | summary = "Yet another URL library"
1280 | groups = ["default", "adapters"]
1281 | dependencies = [
1282 | "idna>=2.0",
1283 | "multidict>=4.0",
1284 | "typing-extensions>=3.7.4; python_version < \"3.8\"",
1285 | ]
1286 | files = [
1287 | {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"},
1288 | {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"},
1289 | {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"},
1290 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"},
1291 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"},
1292 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"},
1293 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"},
1294 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"},
1295 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"},
1296 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"},
1297 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"},
1298 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"},
1299 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"},
1300 | {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"},
1301 | {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"},
1302 | {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"},
1303 | {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"},
1304 | {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"},
1305 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"},
1306 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"},
1307 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"},
1308 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"},
1309 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"},
1310 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"},
1311 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"},
1312 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"},
1313 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"},
1314 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"},
1315 | {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"},
1316 | {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"},
1317 | {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"},
1318 | {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"},
1319 | {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"},
1320 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"},
1321 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"},
1322 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"},
1323 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"},
1324 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"},
1325 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"},
1326 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"},
1327 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"},
1328 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"},
1329 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"},
1330 | {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"},
1331 | {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"},
1332 | {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"},
1333 | {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"},
1334 | ]
1335 |
1336 | [[package]]
1337 | name = "zipp"
1338 | version = "3.20.0"
1339 | requires_python = ">=3.8"
1340 | summary = "Backport of pathlib-compatible object wrapper for zip files"
1341 | groups = ["default"]
1342 | files = [
1343 | {file = "zipp-3.20.0-py3-none-any.whl", hash = "sha256:58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d"},
1344 | {file = "zipp-3.20.0.tar.gz", hash = "sha256:0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31"},
1345 | ]
1346 |
--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------
1 | [project]
2 | name = "nonebot-plugin-lxns-maimai"
3 | version = "0.1.2"
4 | description = "maimai DX 查分"
5 | authors = [
6 | {name = "KomoriDev", email = "mute231010@gmail.com"},
7 | ]
8 | dependencies = [
9 | "nonebot2>=2.3.3",
10 | "httpx>=0.27.0",
11 | "nonebot-plugin-alconna>=0.52.0",
12 | "nonebot-plugin-orm>=0.7.6",
13 | "nonebot-plugin-user>=0.4.2",
14 | "nonebot-plugin-htmlrender>=0.3.5",
15 | ]
16 | requires-python = ">=3.10"
17 | readme = "README.md"
18 | license = {text = "MIT"}
19 |
20 | [project.optional-dependencies]
21 | adapters = [
22 | "nonebot-adapter-onebot>=2.4.4",
23 | ]
24 | [build-system]
25 | requires = ["pdm-backend"]
26 | build-backend = "pdm.backend"
27 |
28 | [tool.nonebot]
29 | plugins = ["nonebot_plugin_lxns_maimai"]
30 |
31 | [tool.pdm]
32 | distribution = true
33 |
34 | [tool.pdm.dev-dependencies]
35 | dev = [
36 | "ruff>=0.6.1",
37 | "black>=24.4.2",
38 | "isort>=5.13.2",
39 | "pre-commit>=3.7.1",
40 | ]
41 |
42 | [tool.black]
43 | line-length = 90
44 | target-version = ["py310", "py311", "py312"]
45 | include = '\.pyi?$'
46 | extend-exclude = '''
47 | '''
48 |
49 | [tool.isort]
50 | profile = "black"
51 | line_length = 90
52 | length_sort = true
53 | skip_gitignore = true
54 | force_sort_within_sections = true
55 | extra_standard_library = ["typing_extensions"]
56 |
57 | [tool.ruff]
58 | line-length = 90
59 | target-version = "py310"
60 |
61 | [tool.ruff.lint]
62 | select = ["E", "W", "F", "UP", "C", "T", "PYI", "PT", "Q"]
63 | ignore = ["E402", "C901"]
64 |
65 | [tool.pyright]
66 | pythonVersion = "3.10"
67 | pythonPlatform = "All"
68 | typeCheckingMode = "basic"
69 |
70 |
--------------------------------------------------------------------------------