├── .gitattributes ├── tests ├── path │ ├── acid.svg.gz │ ├── acid.svg │ └── test_path.py ├── font │ ├── font_dir │ │ └── Kokoro-Regular.ttf │ └── ink.svg ├── version │ └── test_version.py └── shape │ └── test_normal_shape.py ├── docs ├── resvg.md ├── installation.md ├── index.rst ├── Makefile ├── make.bat ├── contributing.md ├── debugging.md ├── conf.py └── usage.md ├── Cargo.toml ├── pyproject.toml ├── .readthedocs.yml ├── .gitignore ├── LICENSE ├── .github ├── dependabot.yml └── workflows │ └── CI.yaml ├── README.md ├── resvg_py.pyi ├── src └── rust │ └── lib.rs ├── Cargo.lock └── uv.lock /.gitattributes: -------------------------------------------------------------------------------- 1 | tests/**/* linguist-vendored 2 | docs/**/* linguist-documentation -------------------------------------------------------------------------------- /tests/path/acid.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baseplate-admin/resvg-py/HEAD/tests/path/acid.svg.gz -------------------------------------------------------------------------------- /tests/font/font_dir/Kokoro-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baseplate-admin/resvg-py/HEAD/tests/font/font_dir/Kokoro-Regular.ttf -------------------------------------------------------------------------------- /tests/version/test_version.py: -------------------------------------------------------------------------------- 1 | import resvg_py 2 | 3 | 4 | def test_version_is_string(): 5 | assert isinstance(resvg_py.__version__,str) -------------------------------------------------------------------------------- /docs/resvg.md: -------------------------------------------------------------------------------- 1 | # Resvg Module 2 | 3 | ```{eval-rst} 4 | 5 | .. currentmodule:: resvg_py 6 | 7 | .. autofunction:: svg_to_bytes 8 | 9 | .. autoclass:: __version__ 10 | 11 | 12 | .. autoclass:: __author__ 13 | 14 | ``` 15 | -------------------------------------------------------------------------------- /docs/installation.md: -------------------------------------------------------------------------------- 1 | # Installation 2 | 3 | ## Requirements 4 | 5 | Python 3.8 to 3.12 supported. 6 | 7 | Currently it builds the non-EOL python versions with `maturin`\_ github-actions. 8 | 9 | ## Installation 10 | 11 | 1. Install with **pip**: 12 | 13 | ```python 14 | python -m pip install resvg_py 15 | ``` 16 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. resvg_py documentation master file, created by 2 | sphinx-quickstart on Sat Feb 24 21:13:02 2024. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to resvg_py's documentation! 7 | ======================================== 8 | 9 | Safe bindings for `resvg`_ 10 | 11 | .. toctree:: 12 | :maxdepth: 2 13 | :caption: Contents: 14 | 15 | installation 16 | usage 17 | resvg 18 | debugging 19 | contributing 20 | 21 | Indices and tables 22 | ================== 23 | 24 | * :ref:`genindex` 25 | * :ref:`search` 26 | 27 | 28 | .. _resvg: https://docs.rs/resvg/latest/resvg/ -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "resvg_py" 3 | version = "0.2.4" 4 | edition = "2021" 5 | authors = ['baseplate-admin'] 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | [lib] 8 | name = "resvg_py" 9 | path = "src/rust/lib.rs" 10 | crate-type = ["cdylib"] 11 | 12 | [dependencies] 13 | log = "0.4.28" 14 | pyo3 = "0.27.2" 15 | resvg = { version = "0.45.1", features = ["raster-images", "text"] } 16 | svgtypes = "0.16.0" 17 | 18 | 19 | [profile.release.package."*"] 20 | codegen-units = 1 21 | opt-level = 'z' 22 | strip = true 23 | 24 | [profile.release] 25 | panic = "abort" 26 | codegen-units = 1 27 | lto = "fat" 28 | opt-level = 'z' 29 | strip = true 30 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | %SPHINXBUILD% >NUL 2>NUL 14 | if errorlevel 9009 ( 15 | echo. 16 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 17 | echo.installed, then set the SPHINXBUILD environment variable to point 18 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 19 | echo.may add the Sphinx directory to PATH. 20 | echo. 21 | echo.If you don't have Sphinx installed, grab it from 22 | echo.https://www.sphinx-doc.org/ 23 | exit /b 1 24 | ) 25 | 26 | if "%1" == "" goto help 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | requires-python = ">=3.9" 3 | readme = "README.md" 4 | name = "resvg_py" 5 | dynamic = ["version"] 6 | authors = [ 7 | { name = "baseplate-admin", email = "61817579+baseplate-admin@users.noreply.github.com" }, 8 | ] 9 | classifiers = [ 10 | "Programming Language :: Rust", 11 | "Programming Language :: Python :: Implementation :: CPython", 12 | "Programming Language :: Python :: Implementation :: PyPy", 13 | ] 14 | 15 | 16 | [dependency-groups] 17 | dev = ["pytest>=8.1.1"] 18 | docs = [ 19 | "sphinx>=7.2.6", 20 | "furo>=2024.1.29", 21 | "sphinx-reload>=0.2.0", 22 | "myst-parser>=3.0.1", 23 | ] 24 | 25 | [project.urls] 26 | "Source Code" = "https://github.com/baseplate-admin/resvg-py" 27 | Issues = "https://github.com/baseplate-admin/resvg-py/issues" 28 | Documentation = "https://resvg-py.readthedocs.io/" 29 | 30 | [build-system] 31 | requires = ["maturin>=1.4,<2.0"] 32 | build-backend = "maturin" 33 | 34 | [tool.maturin] 35 | features = ["pyo3/extension-module"] 36 | -------------------------------------------------------------------------------- /.readthedocs.yml: -------------------------------------------------------------------------------- 1 | # .readthedocs.yaml 2 | # Read the Docs configuration file 3 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details 4 | # See https://github.com/astral-sh/uv/issues/10074 5 | 6 | 7 | # Required 8 | version: 2 9 | 10 | # Set the OS, Python version and other tools you might need 11 | build: 12 | os: ubuntu-lts-latest 13 | tools: 14 | python: 'latest' 15 | rust: 'latest' 16 | # You can also specify other tool versions: 17 | jobs: 18 | post_install: 19 | # Install with docs extras 20 | - python -m pip install uv 21 | - UV_PROJECT_ENVIRONMENT=$READTHEDOCS_VIRTUALENV_PATH uv sync --group docs 22 | 23 | 24 | python: 25 | install: 26 | - method: pip 27 | path: . 28 | 29 | # Build documentation in the "docs/" directory with Sphinx 30 | sphinx: 31 | configuration: docs/conf.py 32 | # Optionally build your docs in additional formats such as PDF and ePub 33 | # formats: 34 | # - pdf 35 | # - epub 36 | 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | 3 | # Byte-compiled / optimized / DLL files 4 | __pycache__/ 5 | .pytest_cache/ 6 | *.py[cod] 7 | 8 | # C extensions 9 | *.so 10 | 11 | # Distribution / packaging 12 | .Python 13 | .venv/ 14 | env/ 15 | bin/ 16 | build/ 17 | develop-eggs/ 18 | dist/ 19 | eggs/ 20 | lib/ 21 | lib64/ 22 | parts/ 23 | sdist/ 24 | var/ 25 | include/ 26 | man/ 27 | venv/ 28 | *.egg-info/ 29 | .installed.cfg 30 | *.egg 31 | 32 | # Installer logs 33 | pip-log.txt 34 | pip-delete-this-directory.txt 35 | pip-selfcheck.json 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .cache 42 | nosetests.xml 43 | coverage.xml 44 | 45 | # Translations 46 | *.mo 47 | 48 | # Mr Developer 49 | .mr.developer.cfg 50 | .project 51 | .pydevproject 52 | 53 | # Rope 54 | .ropeproject 55 | 56 | # Django stuff: 57 | *.log 58 | *.pot 59 | 60 | .DS_Store 61 | 62 | # Sphinx documentation 63 | docs/_build/ 64 | 65 | # PyCharm 66 | .idea/ 67 | 68 | # VSCode 69 | .vscode/ 70 | 71 | # Pyenv 72 | .python-version 73 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (C) 2024, baseplate-admin 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a 4 | copy of this software and associated documentation files (the "Software"), 5 | to deal in the Software without restriction, including without limitation 6 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 7 | and/or sell copies of the Software, and to permit persons to whom the 8 | Software is furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 16 | THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 19 | DEALINGS IN THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: 'cargo' # See documentation for possible values 9 | directory: '/' # Location of package manifests 10 | schedule: 11 | interval: 'monthly' 12 | day: 'friday' 13 | open-pull-requests-limit: 100 14 | - package-ecosystem: 'uv' # See documentation for possible values 15 | directory: '/' # Location of package manifests 16 | schedule: 17 | interval: 'weekly' 18 | day: 'friday' 19 | open-pull-requests-limit: 100 20 | 21 | # - package-ecosystem: "github-actions" # See documentation for possible values 22 | # directory: "/" # Location of package manifests 23 | # schedule: 24 | # interval: "daily" 25 | # open-pull-requests-limit: 100 26 | -------------------------------------------------------------------------------- /docs/contributing.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Thank you taking interest in this project. 4 | 5 | ## Goals 6 | 7 | My goal for this project is: 8 | 9 | - To enable all the features available in [resvg](https://github.com/razrfalcon/resvg) but don't write to the disk, everything must be done in memory. 10 | - Use the bare minimum amount of packages, in both python side and rust side 11 | - Make the package as user friendly as possible 12 | 13 | ## Getting Started 14 | 15 | Pre-requisite packages: 16 | 17 | - Install [poetry](https://python-poetry.org/) 18 | - Install [pipx](https://pipx.pypa.io/stable/installation/) 19 | - Install [maturin](https://www.maturin.rs/tutorial) 20 | 21 | Then do the modifications to the [lib.rs]{.title-ref} file and add test 22 | in tests directory. 23 | 24 | 1. Install **poetry** dependencies: 25 | 26 | ```sh 27 | poetry install 28 | ``` 29 | 30 | 2. Activate **poetry** shell: 31 | 32 | ```sh 33 | poetry shell 34 | ``` 35 | 36 | 3. Build with **maturin**: 37 | 38 | ```sh 39 | maturin develop 40 | ``` 41 | 42 | 4. Run tests: 43 | 44 | ```sh 45 | pytest . 46 | ``` 47 | 48 | If all tests pass, please send a Pull Request to the main repository. 49 | -------------------------------------------------------------------------------- /docs/debugging.md: -------------------------------------------------------------------------------- 1 | # Debugging 2 | 3 | While [resvg-py](https://github.com/baseplate-admin/resvg-py) is a very 4 | thin wrapper around the [resvg](https://docs.rs/resvg/latest/resvg/) 5 | project there might be bugs in _resvg-py_ (or _resvg_). 6 | 7 | In order to debug the issue you have to enable logging in 8 | [resvg-py](https://github.com/baseplate-admin/resvg-py) 9 | 10 | How to log in [resvg-py](https://github.com/baseplate-admin/resvg-py)? 11 | 12 | When you call [resvg-py](https://github.com/baseplate-admin/resvg-py)\'s 13 | function in your code you can pass [log_information=True]{.title-ref} to 14 | print debug information to the stdout 15 | 16 | For example: 17 | 18 | ```python 19 | import resvg_py 20 | import base64 21 | 22 | svg_string = """ 23 | 24 |   25 | 26 | """ 27 | 28 | # a large list of bytes 29 | png_bytes: list[bytes] = resvg_py.svg_to_bytes( 30 | svg_string=svg_string, 31 | log_information = True ## <----------- CHECK THIS LINE 32 | ) 33 | base64_utf8_str = base64.b64encode(bytes(png_bytes)).decode("utf-8") 34 | print(f"data:image/png;base64,{base64_utf8_str}") 35 | ``` 36 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # resvg_py 2 | 3 | [![Downloads](https://static.pepy.tech/badge/resvg_py)](https://pepy.tech/project/resvg_py) [![CI](https://github.com/baseplate-admin/resvg-py/actions/workflows/CI.yaml/badge.svg?branch=master)](https://github.com/baseplate-admin/resvg-py/actions/workflows/CI.yaml) [![Documentation Status](https://readthedocs.org/projects/resvg-py/badge/?version=latest)](https://resvg-py.readthedocs.io/en/latest/?badge=latest) [![Pypi Badge](https://img.shields.io/pypi/v/resvg-py.svg)](https://pypi.org/project/resvg-py/) 4 | 5 | A safe and high level binding for the [resvg](https://github.com/RazrFalcon/resvg) project 6 | 7 | ## Install 8 | 9 | ```py 10 | pip install resvg_py 11 | ``` 12 | 13 | Then use it like this: 14 | 15 | ```python 16 | 17 | import resvg_py 18 | 19 | svg_string = """ 20 | 21 |   22 | 23 | """ 24 | 25 | print(resvg_py.svg_to_bytes(svg_string=svg_string)) 26 | 27 | ``` 28 | 29 | (if you have a complex use case, please check the [api](https://resvg-py.readthedocs.io/en/latest/resvg.html) or [usage](https://resvg-py.readthedocs.io/en/latest/usage.html). It mostly re-exposes everything of resvg) 30 | 31 | ## Requires 32 | 33 | - Python 3.8 or higher 34 | 35 | --- 36 | 37 | This library is feature complete in my opinion. 38 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. 2 | # 3 | # For the full list of built-in configuration values, see the documentation: 4 | # https://www.sphinx-doc.org/en/master/usage/configuration.html 5 | 6 | # -- Project information ----------------------------------------------------- 7 | # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information 8 | import datetime 9 | import resvg_py 10 | 11 | project = "resvg_py" 12 | author = resvg_py.__author__ 13 | copyright = f"2024-{datetime.date.today().year}, {author}" 14 | release = resvg_py.__version__ 15 | 16 | # -- General configuration --------------------------------------------------- 17 | # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration 18 | 19 | extensions = [ 20 | "myst_parser", 21 | "sphinx.ext.autodoc", 22 | "sphinx.ext.intersphinx", 23 | "sphinx.ext.viewcode", 24 | ] 25 | 26 | templates_path = ["_templates"] 27 | exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] 28 | 29 | # List of patterns, relative to source directory, that match files and 30 | # directories to ignore when looking for source files. 31 | 32 | 33 | autodoc_typehints = "description" 34 | 35 | # -- Options for HTML output ------------------------------------------------- 36 | # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output 37 | 38 | html_theme = "furo" 39 | html_static_path = ["_static"] 40 | -------------------------------------------------------------------------------- /tests/path/acid.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/shape/test_normal_shape.py: -------------------------------------------------------------------------------- 1 | import resvg_py 2 | import base64 3 | 4 | svg_string = """ 5 | 6 |   7 | 8 | """ 9 | 10 | 11 | def test_rectangle(): 12 | _base64 = base64.b64encode( 13 | bytes(resvg_py.svg_to_bytes(svg_string=svg_string)) 14 | ).decode("utf-8") 15 | assert ( 16 | _base64 17 | == "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" 18 | ) 19 | -------------------------------------------------------------------------------- /resvg_py.pyi: -------------------------------------------------------------------------------- 1 | from typing import Literal 2 | 3 | __version__: str 4 | __author__: str 5 | 6 | def svg_to_bytes( 7 | svg_string: str | None = None, 8 | svg_path: str | None = None, 9 | background: str | None = None, 10 | skip_system_fonts: bool | None = False, 11 | log_information: bool | None = False, 12 | width: int | None = None, 13 | height: int | None = None, 14 | zoom: int | None = None, 15 | dpi: int | None = 0, 16 | resources_dir: str | None = None, 17 | languages: list[str] | None = [], 18 | font_size: int | None = 16, 19 | font_family: str | None = "Times New Roman", 20 | serif_family: str | None = "Times New Roman", 21 | sans_serif_family: str | None = "Arial", 22 | cursive_family: str | None = "Comic Sans MS", 23 | fantasy_family: str | None = "Impact", 24 | monospace_family: str | None = "Courier New", 25 | font_files: list[str] | None = None, 26 | font_dirs: list[str] | None = None, 27 | shape_rendering: Literal[ 28 | "optimize_speed", "crisp_edges", "geometric_precision" 29 | ] = "geometric_precision", 30 | text_rendering: Literal[ 31 | "optimize_speed", "optimize_legibility", "optimize_legibility" 32 | ] = "optimize_legibility", 33 | image_rendering: Literal["optimize_quality", "optimize_speed"] = "optimize_quality" 34 | ) -> bytes: 35 | """ 36 | :param svg_str: A string containing valid svg. 37 | :param svg_path: A path to a valid svg. 38 | :param width: An Integer containing the pixels size for width. 39 | :param height: An Integer containing the pixels size for height. 40 | :param zoom: An Integer containing the zoom percentage. 41 | :param dpi: An Integer containing DPI size for the svg rendering. 42 | :param resources_dir: A directory that contains resources for svg rendering. Such as `foreign objects `_. 43 | :param languages: A list of string containing the languages used for `svg` rendering 44 | :param font_size: An integer describing the font_size. 45 | :param font_family: A string that describes the font family used in SVG. 46 | :param serif_family: A string that describes the serif font family used in SVG. 47 | :param sans_serif_family: A string that describes the sans serif font family used in SVG. 48 | :param cursive_family: A string that describes the cursive font family used in SVG. 49 | :param fantasy_family: A string that describes the fantasy font family used in SVG. 50 | :param monospace_family: A string that describes the monospace font family used in SVG. 51 | :param font_files: A list of paths that contain the font file. 52 | :param font_dirs: A list of directories that contain the font file. This parameter will add all the present files in the directory. 53 | :param shape_rendering: The `shape rendering method `_ used in resvg. **Defaults to "geometric_precision"**. 54 | :param text_rendering: The `text rendering method `_ used in resvg. **Defaults to "optimize_legibility"**. 55 | :param image_rendering: The `image rendering method `_ used in resvg. **Defaults to "optimize_quality"**. 56 | :param background: A `CSS color `_ value that describes the canvas size. 57 | """ 58 | 59 | ... 60 | -------------------------------------------------------------------------------- /docs/usage.md: -------------------------------------------------------------------------------- 1 | # Usage 2 | 3 | The module takes in **utf-8** encoded `svg_string` and returns `base64` encoded **PNG** string. 4 | 5 | Lets say our svg looks like this : 6 | 7 |
8 | 9 | 10 | 11 |
12 | 13 | We can convert it to `PNG` by: 14 | 15 | ```python 16 | import resvg_py 17 | 18 | svg_string = """ 19 | 20 |   21 | 22 | """ 23 | 24 | png_bytes: list[bytes] = resvg_py.svg_to_bytes(svg_string=svg_string) # a large list of bytes 25 | 26 | ``` 27 | 28 | In order to convert image to base64: 29 | 30 | ```python 31 | 32 | import resvg_py 33 | import base64 34 | 35 | svg_string = """ 36 | 37 |   38 | 39 | """ 40 | 41 | # a large list of bytes 42 | png_bytes: list[bytes] = resvg_py.svg_to_bytes(svg_string=svg_string) 43 | base64_utf8_str = base64.b64encode(bytes(png_bytes)).decode("utf-8") 44 | print(f"data:image/png;base64,{base64_utf8_str}") 45 | ``` 46 | 47 | This should return the following **PNG** image (check using inspect element): 48 | 49 |
50 | 51 |
52 | 53 | We can also do something like this : 54 | 55 | ```python 56 | 57 | import resvg_py 58 | 59 | svg = ... # path to svg file 60 | 61 | print(resvg_py.svg_to_bytes(svg_path=svg)) 62 | ``` 63 | 64 | But please do note that `resvg` first looks for _svg_string_ and if that is empty then it looks for _svg_path_ 65 | 66 | ```{eval-rst} 67 | For extra parameters refer to :doc:`resvg <../resvg>` 68 | ``` 69 | -------------------------------------------------------------------------------- /.github/workflows/CI.yaml: -------------------------------------------------------------------------------- 1 | # This file is autogenerated by maturin v1.8.3 2 | # To update, run 3 | # 4 | # maturin generate-ci github 5 | # 6 | name: CI 7 | 8 | on: 9 | push: 10 | branches: 11 | - main 12 | - master 13 | tags: 14 | - '*' 15 | pull_request: 16 | workflow_dispatch: 17 | 18 | permissions: 19 | contents: read 20 | 21 | jobs: 22 | linux: 23 | runs-on: ${{ matrix.platform.runner }} 24 | strategy: 25 | matrix: 26 | platform: 27 | - runner: ubuntu-22.04 28 | target: x86_64 29 | - runner: ubuntu-22.04 30 | target: x86 31 | - runner: ubuntu-22.04 32 | target: aarch64 33 | - runner: ubuntu-22.04 34 | target: armv7 35 | - runner: ubuntu-22.04 36 | target: s390x 37 | - runner: ubuntu-22.04 38 | target: ppc64le 39 | steps: 40 | - uses: actions/checkout@v4 41 | - uses: actions/setup-python@v5 42 | with: 43 | python-version: 3.x 44 | - name: Build wheels 45 | uses: PyO3/maturin-action@v1 46 | with: 47 | target: ${{ matrix.platform.target }} 48 | args: --release --out dist --find-interpreter 49 | sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} 50 | manylinux: auto 51 | - name: Upload wheels 52 | uses: actions/upload-artifact@v4 53 | with: 54 | name: wheels-linux-${{ matrix.platform.target }} 55 | path: dist 56 | 57 | musllinux: 58 | runs-on: ${{ matrix.platform.runner }} 59 | strategy: 60 | matrix: 61 | platform: 62 | - runner: ubuntu-22.04 63 | target: x86_64 64 | - runner: ubuntu-22.04 65 | target: x86 66 | - runner: ubuntu-22.04 67 | target: aarch64 68 | - runner: ubuntu-22.04 69 | target: armv7 70 | steps: 71 | - uses: actions/checkout@v4 72 | - uses: actions/setup-python@v5 73 | with: 74 | python-version: 3.x 75 | - name: Build wheels 76 | uses: PyO3/maturin-action@v1 77 | with: 78 | target: ${{ matrix.platform.target }} 79 | args: --release --out dist --find-interpreter 80 | sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} 81 | manylinux: musllinux_1_2 82 | - name: Upload wheels 83 | uses: actions/upload-artifact@v4 84 | with: 85 | name: wheels-musllinux-${{ matrix.platform.target }} 86 | path: dist 87 | 88 | windows: 89 | runs-on: ${{ matrix.platform.runner }} 90 | strategy: 91 | matrix: 92 | platform: 93 | - runner: windows-latest 94 | target: x64 95 | - runner: windows-latest 96 | target: x86 97 | steps: 98 | - uses: actions/checkout@v4 99 | - uses: actions/setup-python@v5 100 | with: 101 | python-version: 3.x 102 | architecture: ${{ matrix.platform.target }} 103 | - name: Build wheels 104 | uses: PyO3/maturin-action@v1 105 | with: 106 | target: ${{ matrix.platform.target }} 107 | args: --release --out dist --find-interpreter 108 | sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} 109 | - name: Upload wheels 110 | uses: actions/upload-artifact@v4 111 | with: 112 | name: wheels-windows-${{ matrix.platform.target }} 113 | path: dist 114 | 115 | macos: 116 | runs-on: ${{ matrix.platform.runner }} 117 | strategy: 118 | matrix: 119 | platform: 120 | - runner: macos-15 121 | target: x86_64 122 | - runner: macos-15 123 | target: aarch64 124 | steps: 125 | - uses: actions/checkout@v4 126 | - uses: actions/setup-python@v5 127 | with: 128 | python-version: 3.x 129 | - name: Build wheels 130 | uses: PyO3/maturin-action@v1 131 | with: 132 | target: ${{ matrix.platform.target }} 133 | args: --release --out dist --find-interpreter 134 | sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} 135 | - name: Upload wheels 136 | uses: actions/upload-artifact@v4 137 | with: 138 | name: wheels-macos-${{ matrix.platform.target }} 139 | path: dist 140 | 141 | sdist: 142 | runs-on: ubuntu-latest 143 | steps: 144 | - uses: actions/checkout@v4 145 | - name: Build sdist 146 | uses: PyO3/maturin-action@v1 147 | with: 148 | command: sdist 149 | args: --out dist 150 | - name: Upload sdist 151 | uses: actions/upload-artifact@v4 152 | with: 153 | name: wheels-sdist 154 | path: dist 155 | 156 | release: 157 | name: Release 158 | runs-on: ubuntu-latest 159 | if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }} 160 | needs: [linux, musllinux, windows, macos, sdist, test] 161 | permissions: 162 | # Use to sign the release artifacts 163 | id-token: write 164 | # Used to upload release artifacts 165 | contents: write 166 | # Used to generate artifact attestation 167 | attestations: write 168 | steps: 169 | - uses: actions/download-artifact@v4 170 | - name: Generate artifact attestation 171 | uses: actions/attest-build-provenance@v2 172 | with: 173 | subject-path: 'wheels-*/*' 174 | - name: Publish to PyPI 175 | if: ${{ startsWith(github.ref, 'refs/tags/') }} 176 | uses: PyO3/maturin-action@v1 177 | env: 178 | MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }} 179 | with: 180 | command: upload 181 | args: --non-interactive --skip-existing wheels-*/* 182 | 183 | test: 184 | name: Run Tests 185 | runs-on: windows-latest 186 | strategy: 187 | matrix: 188 | python-version: ["3.10", "3.11", "3.12","3.13", "3.14"] 189 | steps: 190 | 191 | - uses: actions/checkout@v4 192 | 193 | - name: Set up Python (uv) 194 | uses: astral-sh/setup-uv@v6 195 | with: 196 | enable-cache: true 197 | python-version: ${{ matrix.python-version }} 198 | cache-dependency-glob: "uv.lock" 199 | 200 | - name: Create virtual environment and install dependencies 201 | run: | 202 | uv sync --group dev 203 | 204 | - name: Run backend tests 205 | run: | 206 | uv run pytest -v -x -rs 207 | 208 | 209 | 210 | -------------------------------------------------------------------------------- /tests/path/test_path.py: -------------------------------------------------------------------------------- 1 | import resvg_py 2 | from pathlib import Path 3 | import os 4 | import base64 5 | 6 | BASE_DIR = Path(__file__).resolve().parent 7 | 8 | svg_output = "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" 9 | 10 | 11 | def test_path(): 12 | path = os.path.join(BASE_DIR, "acid.svg") 13 | base = base64.b64encode(bytes(resvg_py.svg_to_bytes(svg_path=path))).decode("utf-8") 14 | assert base == svg_output 15 | 16 | 17 | def test_gzip_path(): 18 | path = os.path.join(BASE_DIR, "acid.svg.gz") 19 | base = base64.b64encode(bytes(resvg_py.svg_to_bytes(svg_path=path))).decode("utf-8") 20 | assert base == svg_output 21 | -------------------------------------------------------------------------------- /tests/font/ink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | coreproject.moe 14 | 15 | 16 | /anime/163078 17 | 18 | 19 | 20 | 21 | Yoru no Kurage wa Oyogenai 22 | 23 | 24 | Yoru no Kurage wa Oyogenai 25 | 26 | 27 | 28 | Jellyfish Can’t Swim in the Night • YoruKura 29 | 30 | 31 | 32 | eps • Series 33 | 34 | 35 | 2/12 36 | 37 | 38 | 39 | 24 mins/ep • Doga Kobo Studio 40 | 41 | 42 | 43 | 44 | 45 | 46 | mean score 47 | 48 | highest rated 2024 49 | 50 | 51 | 79% 52 | #15 53 | 54 | 55 | 56 | 57 | Apr 7, 2024 58 | Jun 23, 2024 59 | 60 | 61 | Airing from 62 | to 63 | 64 | 65 | 66 | 67 | 68 | "I want to find what I enjoy." 69 | 70 | Shibuya is a city full of identity. It is here on Shibuya’s late night 71 | streets that illustrator Mahiru Kozuki, former idol Kano Yamanouchi, 72 | Vtuber Kiui Watase and composer Mei Kim Anouk Takanashi — four 73 | young women who are slightly outside the world — join together and 74 | form an anonymous artist group called JELEE. “I” also want to shi 75 | 76 | 77 | 78 | 79 | 80 | 84 | 85 | 86 | project 87 | 88 | 89 | o 90 | 91 | 92 | c 93 | re 94 | 95 | 96 | 97 | 98 | c 99 | re 100 | 101 | 102 | o 103 | 104 | 105 | anime 106 | 107 | 108 | 109 | 110 | 111 | 112 | Drama 113 | 114 | 115 | 116 | 117 | available to watch in 118 | 119 | 120 | 121 | 122 | SUB 123 | 124 | 125 | 126 | 127 | 128 | 1080p 129 | 130 | 131 | 132 | 133 | 134 | DUB 135 | 136 | 137 | 138 | 139 | 140 | 720p 141 | 142 | 143 | 144 | 145 | 146 | 480p 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | -------------------------------------------------------------------------------- /src/rust/lib.rs: -------------------------------------------------------------------------------- 1 | /* 2 | Based on 3 | * https://github.com/RazrFalcon/resvg/blob/master/crates/resvg/src/main.rs 4 | * https://github.com/mrdotb/resvg_nif/blob/master/native/resvg/src/lib.rs 5 | */ 6 | 7 | use pyo3::prelude::*; 8 | use resvg::{self, usvg::{FontResolver}}; 9 | use core::panic; 10 | use std::sync::Arc; 11 | 12 | #[derive(Clone, Copy, PartialEq, Debug)] 13 | enum FitTo { 14 | /// Keep original size. 15 | Original, 16 | /// Scale to width. 17 | Width(u32), 18 | /// Scale to height. 19 | Height(u32), 20 | /// Scale to size. 21 | Size(u32, u32), 22 | /// Zoom by factor. 23 | Zoom(f32), 24 | } 25 | 26 | /// A simple stderr logger. 27 | static LOGGER: SimpleLogger = SimpleLogger; 28 | struct SimpleLogger; 29 | impl log::Log for SimpleLogger { 30 | fn enabled(&self, metadata: &log::Metadata) -> bool { 31 | metadata.level() <= log::LevelFilter::Warn 32 | } 33 | 34 | fn log(&self, record: &log::Record) { 35 | if self.enabled(record.metadata()) { 36 | let target = if !record.target().is_empty() { 37 | record.target() 38 | } else { 39 | record.module_path().unwrap_or_default() 40 | }; 41 | 42 | let line = record.line().unwrap_or(0); 43 | let args = record.args(); 44 | 45 | match record.level() { 46 | log::Level::Error => println!("Error (in {}:{}): {}", target, line, args), 47 | log::Level::Warn => println!("Warning (in {}:{}): {}", target, line, args), 48 | log::Level::Info => println!("Info (in {}:{}): {}", target, line, args), 49 | log::Level::Debug => println!("Debug (in {}:{}): {}", target, line, args), 50 | log::Level::Trace => println!("Trace (in {}:{}): {}", target, line, args), 51 | } 52 | } 53 | } 54 | 55 | fn flush(&self) {} 56 | } 57 | 58 | impl FitTo { 59 | fn fit_to_size(&self, size: resvg::tiny_skia::IntSize) -> Option { 60 | match *self { 61 | FitTo::Original => Some(size), 62 | FitTo::Width(w) => size.scale_to_width(w), 63 | FitTo::Height(h) => size.scale_to_height(h), 64 | FitTo::Size(w, h) => resvg::tiny_skia::IntSize::from_wh(w, h).map(|s| size.scale_to(s)), 65 | FitTo::Zoom(z) => size.scale_by(z), 66 | } 67 | } 68 | 69 | fn fit_to_transform(&self, size: resvg::tiny_skia::IntSize) -> resvg::tiny_skia::Transform { 70 | let size1 = size.to_size(); 71 | let size2 = match self.fit_to_size(size) { 72 | Some(v) => v.to_size(), 73 | None => return resvg::tiny_skia::Transform::default(), 74 | }; 75 | resvg::tiny_skia::Transform::from_scale( 76 | size2.width() / size1.width(), 77 | size2.height() / size1.height(), 78 | ) 79 | } 80 | } 81 | struct Opts<'a> { 82 | // font_size: u32, 83 | serif_family: Option, 84 | sans_serif_family: Option, 85 | cursive_family: Option, 86 | fantasy_family: Option, 87 | monospace_family: Option, 88 | background: Option, 89 | font_files: Option>, 90 | font_dirs: Option>, 91 | // Abstract Classes 92 | fit_to: FitTo, 93 | usvg_opt: resvg::usvg::Options<'a>, 94 | // Renderers 95 | skip_system_fonts: bool, 96 | } 97 | 98 | fn load_fonts( 99 | fontdb: &mut resvg::usvg::fontdb::Database, 100 | font_files: &Option>, 101 | font_dirs: &Option>, 102 | serif_family: String, 103 | sans_serif_family: String, 104 | cursive_family: String, 105 | fantasy_family: String, 106 | monospace_family: String, 107 | ) { 108 | if let Some(font_files) = font_files { 109 | for path in font_files { 110 | if let Err(e) = fontdb.load_font_file(path) { 111 | log::warn!("Failed to load '{}' cause {}.", path.to_string(), e); 112 | } 113 | } 114 | } 115 | 116 | if let Some(font_dirs) = font_dirs { 117 | for path in font_dirs { 118 | fontdb.load_fonts_dir(path); 119 | } 120 | } 121 | 122 | 123 | fontdb.set_serif_family(serif_family); 124 | fontdb.set_sans_serif_family(sans_serif_family); 125 | fontdb.set_cursive_family(cursive_family); 126 | fontdb.set_fantasy_family(fantasy_family); 127 | fontdb.set_monospace_family(monospace_family); 128 | 129 | } 130 | 131 | fn svg_to_skia_color(color: svgtypes::Color) -> resvg::tiny_skia::Color { 132 | resvg::tiny_skia::Color::from_rgba8(color.red, color.green, color.blue, color.alpha) 133 | } 134 | 135 | fn render_svg( 136 | background: Option, 137 | fit_to: FitTo, 138 | tree: &resvg::usvg::Tree 139 | ) -> Result { 140 | let original_size = tree.size().to_int_size(); 141 | 142 | let final_size = fit_to.fit_to_size(original_size) 143 | .ok_or("Failed to calculate scaled size")?; 144 | 145 | let mut pixmap = resvg::tiny_skia::Pixmap::new( 146 | final_size.width(), 147 | final_size.height(), 148 | ).ok_or("Failed to create pixmap")?; 149 | 150 | if let Some(background) = background { 151 | pixmap.fill(svg_to_skia_color(background)); 152 | } 153 | 154 | let ts = fit_to.fit_to_transform(original_size); 155 | resvg::render(tree, ts, &mut pixmap.as_mut()); 156 | 157 | Ok(pixmap) 158 | } 159 | 160 | 161 | fn resvg_magic(mut options: Opts, svg_string: String) -> Result, String> { 162 | let xml_tree = { 163 | let xml_opt = resvg::usvg::roxmltree::ParsingOptions { 164 | allow_dtd: true, 165 | ..Default::default() 166 | }; 167 | resvg::usvg::roxmltree::Document::parse_with_options(&svg_string, xml_opt) 168 | .map_err(|e| e.to_string()) 169 | }?; 170 | let has_text_nodes = xml_tree 171 | .descendants() 172 | .any(|n| n.has_tag_name(("http://www.w3.org/2000/svg", "text"))); 173 | 174 | // Create mutable reference to font database 175 | if let Some(fontdb) = Arc::get_mut(&mut options.usvg_opt.fontdb) { 176 | if !options.skip_system_fonts { 177 | fontdb.load_system_fonts(); 178 | } 179 | 180 | if has_text_nodes { 181 | // Extract font options before passing to load_fonts 182 | load_fonts( 183 | fontdb, 184 | &options.font_files, 185 | &options.font_dirs, 186 | options.serif_family.unwrap(), 187 | options.sans_serif_family.unwrap(), 188 | options.cursive_family.unwrap(), 189 | options.fantasy_family.unwrap(), 190 | options.monospace_family.unwrap(), 191 | ); 192 | } 193 | } 194 | 195 | let tree = { 196 | resvg::usvg::Tree::from_xmltree(&xml_tree, &options.usvg_opt) 197 | .map_err(|e| e.to_string()) 198 | }?; 199 | Ok(render_svg(options.background, options.fit_to, &tree)?.encode_png().unwrap()) 200 | } 201 | 202 | #[pyfunction] 203 | #[pyo3(signature = ( 204 | svg_string= None, 205 | svg_path = None, 206 | background = None, 207 | skip_system_fonts= false, 208 | log_information = false, 209 | width = None, 210 | height= None, 211 | zoom = None, 212 | dpi = 0, 213 | style_sheet = None, 214 | resources_dir = None, 215 | languages = vec![], 216 | font_size = 16, 217 | font_family = None, 218 | serif_family = None, 219 | sans_serif_family = None, 220 | cursive_family = None, 221 | fantasy_family = None, 222 | monospace_family = None, 223 | font_files = None, 224 | font_dirs = None, 225 | shape_rendering = "geometric_precision".to_owned(), 226 | text_rendering = "optimize_legibility".to_owned(), 227 | image_rendering = "optimize_quality".to_owned(), 228 | ))] 229 | fn svg_to_bytes( 230 | svg_string: Option, 231 | svg_path: Option, 232 | // Background 233 | background: Option, 234 | // Skip System Fonts 235 | skip_system_fonts: Option, 236 | // Log informations 237 | log_information: Option, 238 | // Control width, height, zoom, dpi 239 | width: Option, 240 | height: Option, 241 | zoom: Option, 242 | dpi: Option, 243 | // Style Sheet 244 | style_sheet: Option, 245 | // Resource Directory 246 | resources_dir: Option, 247 | // Fonts 248 | languages: Option>, 249 | font_size: Option, 250 | mut font_family: Option, 251 | mut serif_family: Option, 252 | mut sans_serif_family:Option, 253 | mut cursive_family: Option, 254 | mut fantasy_family: Option, 255 | mut monospace_family:Option, 256 | // Font files and directories 257 | font_files: Option>, 258 | font_dirs: Option>, 259 | // Effects based 260 | shape_rendering:Option, 261 | text_rendering: Option, 262 | image_rendering: Option, 263 | 264 | ) -> PyResult> { 265 | 266 | if log_information.unwrap_or(false) { 267 | if let Ok(()) = log::set_logger(&LOGGER) { 268 | log::set_max_level(log::LevelFilter::Warn); 269 | } 270 | } 271 | 272 | let none_or_take = |item:Option,otherwise:&str|{ 273 | if item.is_none(){ 274 | Some(otherwise.to_owned()) 275 | }else{ 276 | item 277 | } 278 | }; 279 | 280 | #[cfg(any(target_os = "windows", target_os = "macos"))] 281 | { 282 | font_family = none_or_take(font_family, "Times New Roman"); 283 | serif_family = none_or_take(serif_family, "Times New Roman"); 284 | sans_serif_family = none_or_take(sans_serif_family, "Arial"); 285 | cursive_family = none_or_take(cursive_family, "Comic Sans MS"); 286 | fantasy_family = none_or_take(fantasy_family, "Impact"); 287 | monospace_family = none_or_take(monospace_family, "Courier New"); 288 | } 289 | 290 | #[cfg(target_os="linux")] 291 | { 292 | font_family = none_or_take(font_family, "Liberation Serif"); 293 | serif_family = none_or_take(serif_family, "Liberation Serif"); 294 | sans_serif_family = none_or_take(sans_serif_family, "Liberation Sans"); 295 | cursive_family = none_or_take(cursive_family, "Comic Neue"); 296 | fantasy_family = none_or_take(fantasy_family, "Anton"); 297 | monospace_family = none_or_take(monospace_family, "Liberation Mono"); 298 | } 299 | 300 | let mut _svg_string = String::new(); 301 | if let Some(svg_string) = svg_string { 302 | _svg_string = svg_string; 303 | } 304 | 305 | // Only check for path if provided string is empty 306 | if _svg_string.is_empty() { 307 | if let Some(svg_path) = svg_path { 308 | if std::path::Path::new(&svg_path).exists() { 309 | let mut svg_data = 310 | std::fs::read(&svg_path).expect("failed to open the provided file"); 311 | if svg_data.starts_with(&[0x1f, 0x8b]) { 312 | svg_data = resvg::usvg::decompress_svgz(&svg_data) 313 | .expect("can't decompress the svg file"); 314 | }; 315 | _svg_string = std::str::from_utf8(&svg_data) 316 | .expect("can't convert bytes to utf-8") 317 | .to_owned(); 318 | } 319 | } 320 | } 321 | 322 | if _svg_string.is_empty() { 323 | panic!("`svg_string` is empty or `svg_path` contains empty invalid svg"); 324 | } 325 | 326 | let mut fit_to = FitTo::Original; 327 | let mut default_size = resvg::usvg::Size::from_wh(100.0, 100.0).unwrap(); 328 | 329 | if let (Some(w), Some(h)) = (width, height) { 330 | default_size = resvg::usvg::Size::from_wh(w as f32, h as f32).unwrap(); 331 | fit_to = FitTo::Size(w, h); 332 | } else if let Some(w) = width { 333 | default_size = resvg::usvg::Size::from_wh(w as f32, 100.0).unwrap(); 334 | fit_to = FitTo::Width(w); 335 | } else if let Some(h) = height { 336 | default_size = resvg::usvg::Size::from_wh(100.0, h as f32).unwrap(); 337 | fit_to = FitTo::Height(h); 338 | } else if let Some(z) = zoom { 339 | fit_to = FitTo::Zoom(z as f32); 340 | } 341 | 342 | let _shape_rendering = match shape_rendering 343 | .unwrap_or("geometric_precision".to_string()) 344 | .as_ref() 345 | { 346 | "optimize_speed" => resvg::usvg::ShapeRendering::OptimizeSpeed, 347 | "crisp_edges" => resvg::usvg::ShapeRendering::CrispEdges, 348 | "geometric_precision" => resvg::usvg::ShapeRendering::GeometricPrecision, 349 | _ => panic!("Unexpected invalid token for shape rendering"), 350 | }; 351 | 352 | let _text_rendering = match text_rendering 353 | .unwrap_or("optimize_legibility".to_string()) 354 | .as_ref() 355 | { 356 | "optimize_speed" => resvg::usvg::TextRendering::OptimizeSpeed, 357 | "optimize_legibility" => resvg::usvg::TextRendering::OptimizeLegibility, 358 | "geometric_precision" => resvg::usvg::TextRendering::GeometricPrecision, 359 | _ => panic!("Unexpected invalid token for text rendering"), 360 | }; 361 | 362 | let _image_rendering = match image_rendering 363 | .unwrap_or("optimize_quality".to_string()) 364 | .as_ref() 365 | { 366 | "optimize_quality" => resvg::usvg::ImageRendering::OptimizeQuality, 367 | "optimize_speed" => resvg::usvg::ImageRendering::OptimizeSpeed, 368 | _ => panic!("Unexpected invalid token for image rendering",), 369 | }; 370 | 371 | let _resources_dir = match resources_dir { 372 | Some(value) => Some(std::fs::canonicalize(value)?), 373 | None => None, 374 | }; 375 | 376 | let _background = match background { 377 | Some(color_str) => match color_str.parse::() { 378 | Ok(color) => Some(color), 379 | Err(error) => panic!("Error background: {}", error), 380 | }, 381 | None => None, 382 | }; 383 | 384 | let fontdb = resvg::usvg::fontdb::Database::new(); 385 | 386 | let usvg_options = resvg::usvg::Options { 387 | resources_dir: _resources_dir, 388 | dpi: dpi.unwrap_or(0) as f32, 389 | font_family: font_family.unwrap(), 390 | font_size: font_size.unwrap_or(16) as f32, 391 | languages: languages.unwrap_or(vec![]), 392 | shape_rendering: _shape_rendering, 393 | text_rendering: _text_rendering, 394 | image_rendering: _image_rendering, 395 | style_sheet: Some(style_sheet.unwrap_or_default()), 396 | default_size, 397 | image_href_resolver: resvg::usvg::ImageHrefResolver::default(), 398 | fontdb: Arc::new(fontdb), 399 | font_resolver: FontResolver::default(), 400 | }; 401 | 402 | 403 | 404 | let options = Opts { 405 | usvg_opt: usvg_options, 406 | background: _background, 407 | skip_system_fonts: skip_system_fonts.unwrap_or(false), 408 | fit_to, 409 | serif_family, 410 | sans_serif_family, 411 | cursive_family, 412 | fantasy_family, 413 | monospace_family, 414 | font_files, 415 | font_dirs, 416 | }; 417 | let pixmap = resvg_magic(options, _svg_string.trim().to_owned()).unwrap(); 418 | Ok(pixmap) 419 | } 420 | 421 | fn get_version() -> &'static str { 422 | static VERSION : std::sync::OnceLock = std::sync::OnceLock::new(); 423 | 424 | VERSION.get_or_init(||{ 425 | env!("CARGO_PKG_VERSION").to_owned() 426 | }) 427 | } 428 | 429 | fn get_author() -> &'static str { 430 | static AUTHOR : std::sync::OnceLock = std::sync::OnceLock::new(); 431 | 432 | AUTHOR.get_or_init(||{ 433 | env!("CARGO_PKG_AUTHORS").to_owned() 434 | }) 435 | } 436 | 437 | /// A Python module implemented in Rust. 438 | #[pymodule] 439 | fn resvg_py(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> { 440 | m.add("__version__", get_version())?; 441 | m.add("__author__", get_author())?; 442 | m.add_function(wrap_pyfunction!(svg_to_bytes, m)?)?; 443 | Ok(()) 444 | } -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "adler" 7 | version = "1.0.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 10 | 11 | [[package]] 12 | name = "arrayref" 13 | version = "0.3.7" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" 16 | 17 | [[package]] 18 | name = "arrayvec" 19 | version = "0.7.6" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 22 | 23 | [[package]] 24 | name = "autocfg" 25 | version = "1.2.0" 26 | source = "registry+https://github.com/rust-lang/crates.io-index" 27 | checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" 28 | 29 | [[package]] 30 | name = "base64" 31 | version = "0.22.1" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 34 | 35 | [[package]] 36 | name = "bitflags" 37 | version = "1.3.2" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 40 | 41 | [[package]] 42 | name = "bitflags" 43 | version = "2.5.0" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" 46 | 47 | [[package]] 48 | name = "bytemuck" 49 | version = "1.15.0" 50 | source = "registry+https://github.com/rust-lang/crates.io-index" 51 | checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" 52 | 53 | [[package]] 54 | name = "byteorder-lite" 55 | version = "0.1.0" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" 58 | 59 | [[package]] 60 | name = "cfg-if" 61 | version = "1.0.0" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 64 | 65 | [[package]] 66 | name = "color_quant" 67 | version = "1.1.0" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 70 | 71 | [[package]] 72 | name = "core_maths" 73 | version = "0.1.1" 74 | source = "registry+https://github.com/rust-lang/crates.io-index" 75 | checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" 76 | dependencies = [ 77 | "libm", 78 | ] 79 | 80 | [[package]] 81 | name = "crc32fast" 82 | version = "1.4.0" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" 85 | dependencies = [ 86 | "cfg-if", 87 | ] 88 | 89 | [[package]] 90 | name = "data-url" 91 | version = "0.3.1" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" 94 | 95 | [[package]] 96 | name = "euclid" 97 | version = "0.22.11" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" 100 | dependencies = [ 101 | "num-traits", 102 | ] 103 | 104 | [[package]] 105 | name = "fdeflate" 106 | version = "0.3.4" 107 | source = "registry+https://github.com/rust-lang/crates.io-index" 108 | checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" 109 | dependencies = [ 110 | "simd-adler32", 111 | ] 112 | 113 | [[package]] 114 | name = "flate2" 115 | version = "1.0.28" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" 118 | dependencies = [ 119 | "crc32fast", 120 | "miniz_oxide", 121 | ] 122 | 123 | [[package]] 124 | name = "float-cmp" 125 | version = "0.9.0" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" 128 | 129 | [[package]] 130 | name = "fontconfig-parser" 131 | version = "0.5.6" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "6a595cb550439a117696039dfc69830492058211b771a2a165379f2a1a53d84d" 134 | dependencies = [ 135 | "roxmltree 0.19.0", 136 | ] 137 | 138 | [[package]] 139 | name = "fontdb" 140 | version = "0.23.0" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" 143 | dependencies = [ 144 | "fontconfig-parser", 145 | "log", 146 | "memmap2", 147 | "slotmap", 148 | "tinyvec", 149 | "ttf-parser", 150 | ] 151 | 152 | [[package]] 153 | name = "gif" 154 | version = "0.13.1" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" 157 | dependencies = [ 158 | "color_quant", 159 | "weezl", 160 | ] 161 | 162 | [[package]] 163 | name = "heck" 164 | version = "0.5.0" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 167 | 168 | [[package]] 169 | name = "image-webp" 170 | version = "0.2.3" 171 | source = "registry+https://github.com/rust-lang/crates.io-index" 172 | checksum = "f6970fe7a5300b4b42e62c52efa0187540a5bef546c60edaf554ef595d2e6f0b" 173 | dependencies = [ 174 | "byteorder-lite", 175 | "quick-error", 176 | ] 177 | 178 | [[package]] 179 | name = "imagesize" 180 | version = "0.13.0" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" 183 | 184 | [[package]] 185 | name = "indoc" 186 | version = "2.0.5" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" 189 | 190 | [[package]] 191 | name = "kurbo" 192 | version = "0.11.0" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "6e5aa9f0f96a938266bdb12928a67169e8d22c6a786fda8ed984b85e6ba93c3c" 195 | dependencies = [ 196 | "arrayvec", 197 | "smallvec", 198 | ] 199 | 200 | [[package]] 201 | name = "kurbo" 202 | version = "0.12.0" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "ce9729cc38c18d86123ab736fd2e7151763ba226ac2490ec092d1dd148825e32" 205 | dependencies = [ 206 | "arrayvec", 207 | "euclid", 208 | "smallvec", 209 | ] 210 | 211 | [[package]] 212 | name = "libc" 213 | version = "0.2.153" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" 216 | 217 | [[package]] 218 | name = "libm" 219 | version = "0.2.15" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" 222 | 223 | [[package]] 224 | name = "log" 225 | version = "0.4.28" 226 | source = "registry+https://github.com/rust-lang/crates.io-index" 227 | checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 228 | 229 | [[package]] 230 | name = "memmap2" 231 | version = "0.9.4" 232 | source = "registry+https://github.com/rust-lang/crates.io-index" 233 | checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" 234 | dependencies = [ 235 | "libc", 236 | ] 237 | 238 | [[package]] 239 | name = "memoffset" 240 | version = "0.9.1" 241 | source = "registry+https://github.com/rust-lang/crates.io-index" 242 | checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" 243 | dependencies = [ 244 | "autocfg", 245 | ] 246 | 247 | [[package]] 248 | name = "miniz_oxide" 249 | version = "0.7.2" 250 | source = "registry+https://github.com/rust-lang/crates.io-index" 251 | checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" 252 | dependencies = [ 253 | "adler", 254 | "simd-adler32", 255 | ] 256 | 257 | [[package]] 258 | name = "num-traits" 259 | version = "0.2.19" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 262 | dependencies = [ 263 | "autocfg", 264 | ] 265 | 266 | [[package]] 267 | name = "once_cell" 268 | version = "1.21.3" 269 | source = "registry+https://github.com/rust-lang/crates.io-index" 270 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 271 | 272 | [[package]] 273 | name = "pico-args" 274 | version = "0.5.0" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" 277 | 278 | [[package]] 279 | name = "png" 280 | version = "0.17.13" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" 283 | dependencies = [ 284 | "bitflags 1.3.2", 285 | "crc32fast", 286 | "fdeflate", 287 | "flate2", 288 | "miniz_oxide", 289 | ] 290 | 291 | [[package]] 292 | name = "portable-atomic" 293 | version = "1.6.0" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" 296 | 297 | [[package]] 298 | name = "proc-macro2" 299 | version = "1.0.92" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" 302 | dependencies = [ 303 | "unicode-ident", 304 | ] 305 | 306 | [[package]] 307 | name = "pyo3" 308 | version = "0.27.2" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | checksum = "ab53c047fcd1a1d2a8820fe84f05d6be69e9526be40cb03b73f86b6b03e6d87d" 311 | dependencies = [ 312 | "indoc", 313 | "libc", 314 | "memoffset", 315 | "once_cell", 316 | "portable-atomic", 317 | "pyo3-build-config", 318 | "pyo3-ffi", 319 | "pyo3-macros", 320 | "unindent", 321 | ] 322 | 323 | [[package]] 324 | name = "pyo3-build-config" 325 | version = "0.27.2" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "b455933107de8642b4487ed26d912c2d899dec6114884214a0b3bb3be9261ea6" 328 | dependencies = [ 329 | "target-lexicon", 330 | ] 331 | 332 | [[package]] 333 | name = "pyo3-ffi" 334 | version = "0.27.2" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "1c85c9cbfaddf651b1221594209aed57e9e5cff63c4d11d1feead529b872a089" 337 | dependencies = [ 338 | "libc", 339 | "pyo3-build-config", 340 | ] 341 | 342 | [[package]] 343 | name = "pyo3-macros" 344 | version = "0.27.2" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "0a5b10c9bf9888125d917fb4d2ca2d25c8df94c7ab5a52e13313a07e050a3b02" 347 | dependencies = [ 348 | "proc-macro2", 349 | "pyo3-macros-backend", 350 | "quote", 351 | "syn", 352 | ] 353 | 354 | [[package]] 355 | name = "pyo3-macros-backend" 356 | version = "0.27.2" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "03b51720d314836e53327f5871d4c0cfb4fb37cc2c4a11cc71907a86342c40f9" 359 | dependencies = [ 360 | "heck", 361 | "proc-macro2", 362 | "pyo3-build-config", 363 | "quote", 364 | "syn", 365 | ] 366 | 367 | [[package]] 368 | name = "quick-error" 369 | version = "2.0.1" 370 | source = "registry+https://github.com/rust-lang/crates.io-index" 371 | checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" 372 | 373 | [[package]] 374 | name = "quote" 375 | version = "1.0.36" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 378 | dependencies = [ 379 | "proc-macro2", 380 | ] 381 | 382 | [[package]] 383 | name = "resvg" 384 | version = "0.45.1" 385 | source = "registry+https://github.com/rust-lang/crates.io-index" 386 | checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" 387 | dependencies = [ 388 | "gif", 389 | "image-webp", 390 | "log", 391 | "pico-args", 392 | "rgb", 393 | "svgtypes 0.15.3", 394 | "tiny-skia", 395 | "usvg", 396 | "zune-jpeg", 397 | ] 398 | 399 | [[package]] 400 | name = "resvg_py" 401 | version = "0.2.3" 402 | dependencies = [ 403 | "log", 404 | "pyo3", 405 | "resvg", 406 | "svgtypes 0.16.0", 407 | ] 408 | 409 | [[package]] 410 | name = "rgb" 411 | version = "0.8.37" 412 | source = "registry+https://github.com/rust-lang/crates.io-index" 413 | checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" 414 | dependencies = [ 415 | "bytemuck", 416 | ] 417 | 418 | [[package]] 419 | name = "roxmltree" 420 | version = "0.19.0" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "3cd14fd5e3b777a7422cca79358c57a8f6e3a703d9ac187448d0daf220c2407f" 423 | 424 | [[package]] 425 | name = "roxmltree" 426 | version = "0.20.0" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" 429 | 430 | [[package]] 431 | name = "rustybuzz" 432 | version = "0.20.1" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" 435 | dependencies = [ 436 | "bitflags 2.5.0", 437 | "bytemuck", 438 | "core_maths", 439 | "log", 440 | "smallvec", 441 | "ttf-parser", 442 | "unicode-bidi-mirroring", 443 | "unicode-ccc", 444 | "unicode-properties", 445 | "unicode-script", 446 | ] 447 | 448 | [[package]] 449 | name = "simd-adler32" 450 | version = "0.3.7" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 453 | 454 | [[package]] 455 | name = "simplecss" 456 | version = "0.2.1" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "a11be7c62927d9427e9f40f3444d5499d868648e2edbc4e2116de69e7ec0e89d" 459 | dependencies = [ 460 | "log", 461 | ] 462 | 463 | [[package]] 464 | name = "siphasher" 465 | version = "1.0.1" 466 | source = "registry+https://github.com/rust-lang/crates.io-index" 467 | checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" 468 | 469 | [[package]] 470 | name = "slotmap" 471 | version = "1.0.7" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" 474 | dependencies = [ 475 | "version_check", 476 | ] 477 | 478 | [[package]] 479 | name = "smallvec" 480 | version = "1.15.1" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 483 | 484 | [[package]] 485 | name = "strict-num" 486 | version = "0.1.1" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" 489 | dependencies = [ 490 | "float-cmp", 491 | ] 492 | 493 | [[package]] 494 | name = "svgtypes" 495 | version = "0.15.3" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" 498 | dependencies = [ 499 | "kurbo 0.11.0", 500 | "siphasher", 501 | ] 502 | 503 | [[package]] 504 | name = "svgtypes" 505 | version = "0.16.0" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "c9165405c8cf6bdc11d4417ef1c8c90521ebbadffe7da5c67bb5c1b90a14aeb1" 508 | dependencies = [ 509 | "kurbo 0.12.0", 510 | "siphasher", 511 | ] 512 | 513 | [[package]] 514 | name = "syn" 515 | version = "2.0.90" 516 | source = "registry+https://github.com/rust-lang/crates.io-index" 517 | checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" 518 | dependencies = [ 519 | "proc-macro2", 520 | "quote", 521 | "unicode-ident", 522 | ] 523 | 524 | [[package]] 525 | name = "target-lexicon" 526 | version = "0.13.2" 527 | source = "registry+https://github.com/rust-lang/crates.io-index" 528 | checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" 529 | 530 | [[package]] 531 | name = "tiny-skia" 532 | version = "0.11.4" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" 535 | dependencies = [ 536 | "arrayref", 537 | "arrayvec", 538 | "bytemuck", 539 | "cfg-if", 540 | "log", 541 | "png", 542 | "tiny-skia-path", 543 | ] 544 | 545 | [[package]] 546 | name = "tiny-skia-path" 547 | version = "0.11.4" 548 | source = "registry+https://github.com/rust-lang/crates.io-index" 549 | checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" 550 | dependencies = [ 551 | "arrayref", 552 | "bytemuck", 553 | "strict-num", 554 | ] 555 | 556 | [[package]] 557 | name = "tinyvec" 558 | version = "1.6.0" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 561 | dependencies = [ 562 | "tinyvec_macros", 563 | ] 564 | 565 | [[package]] 566 | name = "tinyvec_macros" 567 | version = "0.1.1" 568 | source = "registry+https://github.com/rust-lang/crates.io-index" 569 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 570 | 571 | [[package]] 572 | name = "ttf-parser" 573 | version = "0.25.1" 574 | source = "registry+https://github.com/rust-lang/crates.io-index" 575 | checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" 576 | dependencies = [ 577 | "core_maths", 578 | ] 579 | 580 | [[package]] 581 | name = "unicode-bidi" 582 | version = "0.3.15" 583 | source = "registry+https://github.com/rust-lang/crates.io-index" 584 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 585 | 586 | [[package]] 587 | name = "unicode-bidi-mirroring" 588 | version = "0.4.0" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" 591 | 592 | [[package]] 593 | name = "unicode-ccc" 594 | version = "0.4.0" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" 597 | 598 | [[package]] 599 | name = "unicode-ident" 600 | version = "1.0.12" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 603 | 604 | [[package]] 605 | name = "unicode-properties" 606 | version = "0.1.3" 607 | source = "registry+https://github.com/rust-lang/crates.io-index" 608 | checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 609 | 610 | [[package]] 611 | name = "unicode-script" 612 | version = "0.5.6" 613 | source = "registry+https://github.com/rust-lang/crates.io-index" 614 | checksum = "ad8d71f5726e5f285a935e9fe8edfd53f0491eb6e9a5774097fdabee7cd8c9cd" 615 | 616 | [[package]] 617 | name = "unicode-vo" 618 | version = "0.1.0" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" 621 | 622 | [[package]] 623 | name = "unindent" 624 | version = "0.2.3" 625 | source = "registry+https://github.com/rust-lang/crates.io-index" 626 | checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce" 627 | 628 | [[package]] 629 | name = "usvg" 630 | version = "0.45.1" 631 | source = "registry+https://github.com/rust-lang/crates.io-index" 632 | checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" 633 | dependencies = [ 634 | "base64", 635 | "data-url", 636 | "flate2", 637 | "fontdb", 638 | "imagesize", 639 | "kurbo 0.11.0", 640 | "log", 641 | "pico-args", 642 | "roxmltree 0.20.0", 643 | "rustybuzz", 644 | "simplecss", 645 | "siphasher", 646 | "strict-num", 647 | "svgtypes 0.15.3", 648 | "tiny-skia-path", 649 | "unicode-bidi", 650 | "unicode-script", 651 | "unicode-vo", 652 | "xmlwriter", 653 | ] 654 | 655 | [[package]] 656 | name = "version_check" 657 | version = "0.9.4" 658 | source = "registry+https://github.com/rust-lang/crates.io-index" 659 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 660 | 661 | [[package]] 662 | name = "weezl" 663 | version = "0.1.8" 664 | source = "registry+https://github.com/rust-lang/crates.io-index" 665 | checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" 666 | 667 | [[package]] 668 | name = "xmlwriter" 669 | version = "0.1.0" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" 672 | 673 | [[package]] 674 | name = "zune-core" 675 | version = "0.4.12" 676 | source = "registry+https://github.com/rust-lang/crates.io-index" 677 | checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" 678 | 679 | [[package]] 680 | name = "zune-jpeg" 681 | version = "0.4.19" 682 | source = "registry+https://github.com/rust-lang/crates.io-index" 683 | checksum = "2c9e525af0a6a658e031e95f14b7f889976b74a11ba0eca5a5fc9ac8a1c43a6a" 684 | dependencies = [ 685 | "zune-core", 686 | ] 687 | -------------------------------------------------------------------------------- /uv.lock: -------------------------------------------------------------------------------- 1 | version = 1 2 | revision = 2 3 | requires-python = ">=3.9" 4 | resolution-markers = [ 5 | "python_full_version >= '3.11'", 6 | "python_full_version == '3.10.*'", 7 | "python_full_version < '3.10'", 8 | ] 9 | 10 | [[package]] 11 | name = "alabaster" 12 | version = "0.7.16" 13 | source = { registry = "https://pypi.org/simple" } 14 | resolution-markers = [ 15 | "python_full_version < '3.10'", 16 | ] 17 | sdist = { url = "https://files.pythonhosted.org/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776, upload_time = "2024-01-10T00:56:10.189Z" } 18 | wheels = [ 19 | { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511, upload_time = "2024-01-10T00:56:08.388Z" }, 20 | ] 21 | 22 | [[package]] 23 | name = "alabaster" 24 | version = "1.0.0" 25 | source = { registry = "https://pypi.org/simple" } 26 | resolution-markers = [ 27 | "python_full_version >= '3.11'", 28 | "python_full_version == '3.10.*'", 29 | ] 30 | sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload_time = "2024-07-26T18:15:03.762Z" } 31 | wheels = [ 32 | { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload_time = "2024-07-26T18:15:02.05Z" }, 33 | ] 34 | 35 | [[package]] 36 | name = "babel" 37 | version = "2.17.0" 38 | source = { registry = "https://pypi.org/simple" } 39 | sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload_time = "2025-02-01T15:17:41.026Z" } 40 | wheels = [ 41 | { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload_time = "2025-02-01T15:17:37.39Z" }, 42 | ] 43 | 44 | [[package]] 45 | name = "beautifulsoup4" 46 | version = "4.13.4" 47 | source = { registry = "https://pypi.org/simple" } 48 | dependencies = [ 49 | { name = "soupsieve" }, 50 | { name = "typing-extensions" }, 51 | ] 52 | sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload_time = "2025-04-15T17:05:13.836Z" } 53 | wheels = [ 54 | { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload_time = "2025-04-15T17:05:12.221Z" }, 55 | ] 56 | 57 | [[package]] 58 | name = "certifi" 59 | version = "2025.6.15" 60 | source = { registry = "https://pypi.org/simple" } 61 | sdist = { url = "https://files.pythonhosted.org/packages/73/f7/f14b46d4bcd21092d7d3ccef689615220d8a08fb25e564b65d20738e672e/certifi-2025.6.15.tar.gz", hash = "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b", size = 158753, upload_time = "2025-06-15T02:45:51.329Z" } 62 | wheels = [ 63 | { url = "https://files.pythonhosted.org/packages/84/ae/320161bd181fc06471eed047ecce67b693fd7515b16d495d8932db763426/certifi-2025.6.15-py3-none-any.whl", hash = "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057", size = 157650, upload_time = "2025-06-15T02:45:49.977Z" }, 64 | ] 65 | 66 | [[package]] 67 | name = "charset-normalizer" 68 | version = "3.4.2" 69 | source = { registry = "https://pypi.org/simple" } 70 | sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload_time = "2025-05-02T08:34:42.01Z" } 71 | wheels = [ 72 | { url = "https://files.pythonhosted.org/packages/95/28/9901804da60055b406e1a1c5ba7aac1276fb77f1dde635aabfc7fd84b8ab/charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", size = 201818, upload_time = "2025-05-02T08:31:46.725Z" }, 73 | { url = "https://files.pythonhosted.org/packages/d9/9b/892a8c8af9110935e5adcbb06d9c6fe741b6bb02608c6513983048ba1a18/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", size = 144649, upload_time = "2025-05-02T08:31:48.889Z" }, 74 | { url = "https://files.pythonhosted.org/packages/7b/a5/4179abd063ff6414223575e008593861d62abfc22455b5d1a44995b7c101/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", size = 155045, upload_time = "2025-05-02T08:31:50.757Z" }, 75 | { url = "https://files.pythonhosted.org/packages/3b/95/bc08c7dfeddd26b4be8c8287b9bb055716f31077c8b0ea1cd09553794665/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", size = 147356, upload_time = "2025-05-02T08:31:52.634Z" }, 76 | { url = "https://files.pythonhosted.org/packages/a8/2d/7a5b635aa65284bf3eab7653e8b4151ab420ecbae918d3e359d1947b4d61/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", size = 149471, upload_time = "2025-05-02T08:31:56.207Z" }, 77 | { url = "https://files.pythonhosted.org/packages/ae/38/51fc6ac74251fd331a8cfdb7ec57beba8c23fd5493f1050f71c87ef77ed0/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", size = 151317, upload_time = "2025-05-02T08:31:57.613Z" }, 78 | { url = "https://files.pythonhosted.org/packages/b7/17/edee1e32215ee6e9e46c3e482645b46575a44a2d72c7dfd49e49f60ce6bf/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", size = 146368, upload_time = "2025-05-02T08:31:59.468Z" }, 79 | { url = "https://files.pythonhosted.org/packages/26/2c/ea3e66f2b5f21fd00b2825c94cafb8c326ea6240cd80a91eb09e4a285830/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", size = 154491, upload_time = "2025-05-02T08:32:01.219Z" }, 80 | { url = "https://files.pythonhosted.org/packages/52/47/7be7fa972422ad062e909fd62460d45c3ef4c141805b7078dbab15904ff7/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", size = 157695, upload_time = "2025-05-02T08:32:03.045Z" }, 81 | { url = "https://files.pythonhosted.org/packages/2f/42/9f02c194da282b2b340f28e5fb60762de1151387a36842a92b533685c61e/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", size = 154849, upload_time = "2025-05-02T08:32:04.651Z" }, 82 | { url = "https://files.pythonhosted.org/packages/67/44/89cacd6628f31fb0b63201a618049be4be2a7435a31b55b5eb1c3674547a/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", size = 150091, upload_time = "2025-05-02T08:32:06.719Z" }, 83 | { url = "https://files.pythonhosted.org/packages/1f/79/4b8da9f712bc079c0f16b6d67b099b0b8d808c2292c937f267d816ec5ecc/charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", size = 98445, upload_time = "2025-05-02T08:32:08.66Z" }, 84 | { url = "https://files.pythonhosted.org/packages/7d/d7/96970afb4fb66497a40761cdf7bd4f6fca0fc7bafde3a84f836c1f57a926/charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", size = 105782, upload_time = "2025-05-02T08:32:10.46Z" }, 85 | { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload_time = "2025-05-02T08:32:11.945Z" }, 86 | { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload_time = "2025-05-02T08:32:13.946Z" }, 87 | { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload_time = "2025-05-02T08:32:15.873Z" }, 88 | { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload_time = "2025-05-02T08:32:17.283Z" }, 89 | { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload_time = "2025-05-02T08:32:18.807Z" }, 90 | { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload_time = "2025-05-02T08:32:20.333Z" }, 91 | { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload_time = "2025-05-02T08:32:21.86Z" }, 92 | { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload_time = "2025-05-02T08:32:23.434Z" }, 93 | { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload_time = "2025-05-02T08:32:24.993Z" }, 94 | { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload_time = "2025-05-02T08:32:26.435Z" }, 95 | { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload_time = "2025-05-02T08:32:28.376Z" }, 96 | { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload_time = "2025-05-02T08:32:30.281Z" }, 97 | { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload_time = "2025-05-02T08:32:32.191Z" }, 98 | { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload_time = "2025-05-02T08:32:33.712Z" }, 99 | { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload_time = "2025-05-02T08:32:35.768Z" }, 100 | { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload_time = "2025-05-02T08:32:37.284Z" }, 101 | { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload_time = "2025-05-02T08:32:38.803Z" }, 102 | { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload_time = "2025-05-02T08:32:40.251Z" }, 103 | { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload_time = "2025-05-02T08:32:41.705Z" }, 104 | { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload_time = "2025-05-02T08:32:43.709Z" }, 105 | { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload_time = "2025-05-02T08:32:46.197Z" }, 106 | { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload_time = "2025-05-02T08:32:48.105Z" }, 107 | { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload_time = "2025-05-02T08:32:49.719Z" }, 108 | { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload_time = "2025-05-02T08:32:51.404Z" }, 109 | { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload_time = "2025-05-02T08:32:53.079Z" }, 110 | { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload_time = "2025-05-02T08:32:54.573Z" }, 111 | { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload_time = "2025-05-02T08:32:56.363Z" }, 112 | { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload_time = "2025-05-02T08:32:58.551Z" }, 113 | { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload_time = "2025-05-02T08:33:00.342Z" }, 114 | { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload_time = "2025-05-02T08:33:02.081Z" }, 115 | { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload_time = "2025-05-02T08:33:04.063Z" }, 116 | { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload_time = "2025-05-02T08:33:06.418Z" }, 117 | { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload_time = "2025-05-02T08:33:08.183Z" }, 118 | { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload_time = "2025-05-02T08:33:09.986Z" }, 119 | { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload_time = "2025-05-02T08:33:11.814Z" }, 120 | { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload_time = "2025-05-02T08:33:13.707Z" }, 121 | { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload_time = "2025-05-02T08:33:15.458Z" }, 122 | { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload_time = "2025-05-02T08:33:17.06Z" }, 123 | { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload_time = "2025-05-02T08:33:18.753Z" }, 124 | { url = "https://files.pythonhosted.org/packages/28/f8/dfb01ff6cc9af38552c69c9027501ff5a5117c4cc18dcd27cb5259fa1888/charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", size = 201671, upload_time = "2025-05-02T08:34:12.696Z" }, 125 | { url = "https://files.pythonhosted.org/packages/32/fb/74e26ee556a9dbfe3bd264289b67be1e6d616329403036f6507bb9f3f29c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", size = 144744, upload_time = "2025-05-02T08:34:14.665Z" }, 126 | { url = "https://files.pythonhosted.org/packages/ad/06/8499ee5aa7addc6f6d72e068691826ff093329fe59891e83b092ae4c851c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", size = 154993, upload_time = "2025-05-02T08:34:17.134Z" }, 127 | { url = "https://files.pythonhosted.org/packages/f1/a2/5e4c187680728219254ef107a6949c60ee0e9a916a5dadb148c7ae82459c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", size = 147382, upload_time = "2025-05-02T08:34:19.081Z" }, 128 | { url = "https://files.pythonhosted.org/packages/4c/fe/56aca740dda674f0cc1ba1418c4d84534be51f639b5f98f538b332dc9a95/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", size = 149536, upload_time = "2025-05-02T08:34:21.073Z" }, 129 | { url = "https://files.pythonhosted.org/packages/53/13/db2e7779f892386b589173dd689c1b1e304621c5792046edd8a978cbf9e0/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", size = 151349, upload_time = "2025-05-02T08:34:23.193Z" }, 130 | { url = "https://files.pythonhosted.org/packages/69/35/e52ab9a276186f729bce7a0638585d2982f50402046e4b0faa5d2c3ef2da/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", size = 146365, upload_time = "2025-05-02T08:34:25.187Z" }, 131 | { url = "https://files.pythonhosted.org/packages/a6/d8/af7333f732fc2e7635867d56cb7c349c28c7094910c72267586947561b4b/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", size = 154499, upload_time = "2025-05-02T08:34:27.359Z" }, 132 | { url = "https://files.pythonhosted.org/packages/7a/3d/a5b2e48acef264d71e036ff30bcc49e51bde80219bb628ba3e00cf59baac/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", size = 157735, upload_time = "2025-05-02T08:34:29.798Z" }, 133 | { url = "https://files.pythonhosted.org/packages/85/d8/23e2c112532a29f3eef374375a8684a4f3b8e784f62b01da931186f43494/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", size = 154786, upload_time = "2025-05-02T08:34:31.858Z" }, 134 | { url = "https://files.pythonhosted.org/packages/c7/57/93e0169f08ecc20fe82d12254a200dfaceddc1c12a4077bf454ecc597e33/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", size = 150203, upload_time = "2025-05-02T08:34:33.88Z" }, 135 | { url = "https://files.pythonhosted.org/packages/2c/9d/9bf2b005138e7e060d7ebdec7503d0ef3240141587651f4b445bdf7286c2/charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", size = 98436, upload_time = "2025-05-02T08:34:35.907Z" }, 136 | { url = "https://files.pythonhosted.org/packages/6d/24/5849d46cf4311bbf21b424c443b09b459f5b436b1558c04e45dbb7cc478b/charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", size = 105772, upload_time = "2025-05-02T08:34:37.935Z" }, 137 | { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload_time = "2025-05-02T08:34:40.053Z" }, 138 | ] 139 | 140 | [[package]] 141 | name = "colorama" 142 | version = "0.4.6" 143 | source = { registry = "https://pypi.org/simple" } 144 | sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" } 145 | wheels = [ 146 | { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload_time = "2022-10-25T02:36:20.889Z" }, 147 | ] 148 | 149 | [[package]] 150 | name = "docutils" 151 | version = "0.21.2" 152 | source = { registry = "https://pypi.org/simple" } 153 | sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload_time = "2024-04-23T18:57:18.24Z" } 154 | wheels = [ 155 | { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload_time = "2024-04-23T18:57:14.835Z" }, 156 | ] 157 | 158 | [[package]] 159 | name = "exceptiongroup" 160 | version = "1.3.0" 161 | source = { registry = "https://pypi.org/simple" } 162 | dependencies = [ 163 | { name = "typing-extensions", marker = "python_full_version < '3.11'" }, 164 | ] 165 | sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload_time = "2025-05-10T17:42:51.123Z" } 166 | wheels = [ 167 | { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload_time = "2025-05-10T17:42:49.33Z" }, 168 | ] 169 | 170 | [[package]] 171 | name = "furo" 172 | version = "2024.8.6" 173 | source = { registry = "https://pypi.org/simple" } 174 | dependencies = [ 175 | { name = "beautifulsoup4" }, 176 | { name = "pygments" }, 177 | { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, 178 | { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, 179 | { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, 180 | { name = "sphinx-basic-ng" }, 181 | ] 182 | sdist = { url = "https://files.pythonhosted.org/packages/a0/e2/d351d69a9a9e4badb4a5be062c2d0e87bd9e6c23b5e57337fef14bef34c8/furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01", size = 1661506, upload_time = "2024-08-06T08:07:57.567Z" } 183 | wheels = [ 184 | { url = "https://files.pythonhosted.org/packages/27/48/e791a7ed487dbb9729ef32bb5d1af16693d8925f4366befef54119b2e576/furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c", size = 341333, upload_time = "2024-08-06T08:07:54.44Z" }, 185 | ] 186 | 187 | [[package]] 188 | name = "idna" 189 | version = "3.10" 190 | source = { registry = "https://pypi.org/simple" } 191 | sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload_time = "2024-09-15T18:07:39.745Z" } 192 | wheels = [ 193 | { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload_time = "2024-09-15T18:07:37.964Z" }, 194 | ] 195 | 196 | [[package]] 197 | name = "imagesize" 198 | version = "1.4.1" 199 | source = { registry = "https://pypi.org/simple" } 200 | sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload_time = "2022-07-01T12:21:05.687Z" } 201 | wheels = [ 202 | { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload_time = "2022-07-01T12:21:02.467Z" }, 203 | ] 204 | 205 | [[package]] 206 | name = "importlib-metadata" 207 | version = "8.7.0" 208 | source = { registry = "https://pypi.org/simple" } 209 | dependencies = [ 210 | { name = "zipp", marker = "python_full_version < '3.10'" }, 211 | ] 212 | sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload_time = "2025-04-27T15:29:01.736Z" } 213 | wheels = [ 214 | { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload_time = "2025-04-27T15:29:00.214Z" }, 215 | ] 216 | 217 | [[package]] 218 | name = "iniconfig" 219 | version = "2.1.0" 220 | source = { registry = "https://pypi.org/simple" } 221 | sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload_time = "2025-03-19T20:09:59.721Z" } 222 | wheels = [ 223 | { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload_time = "2025-03-19T20:10:01.071Z" }, 224 | ] 225 | 226 | [[package]] 227 | name = "jinja2" 228 | version = "3.1.6" 229 | source = { registry = "https://pypi.org/simple" } 230 | dependencies = [ 231 | { name = "markupsafe" }, 232 | ] 233 | sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload_time = "2025-03-05T20:05:02.478Z" } 234 | wheels = [ 235 | { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" }, 236 | ] 237 | 238 | [[package]] 239 | name = "livereload" 240 | version = "2.7.1" 241 | source = { registry = "https://pypi.org/simple" } 242 | dependencies = [ 243 | { name = "tornado" }, 244 | ] 245 | sdist = { url = "https://files.pythonhosted.org/packages/43/6e/f2748665839812a9bbe5c75d3f983edbf3ab05fa5cd2f7c2f36fffdf65bd/livereload-2.7.1.tar.gz", hash = "sha256:3d9bf7c05673df06e32bea23b494b8d36ca6d10f7d5c3c8a6989608c09c986a9", size = 22255, upload_time = "2024-12-18T13:42:01.461Z" } 246 | wheels = [ 247 | { url = "https://files.pythonhosted.org/packages/e4/3e/de54dc7f199e85e6ca37e2e5dae2ec3bce2151e9e28f8eb9076d71e83d56/livereload-2.7.1-py3-none-any.whl", hash = "sha256:5201740078c1b9433f4b2ba22cd2729a39b9d0ec0a2cc6b4d3df257df5ad0564", size = 22657, upload_time = "2024-12-18T13:41:56.35Z" }, 248 | ] 249 | 250 | [[package]] 251 | name = "markdown-it-py" 252 | version = "3.0.0" 253 | source = { registry = "https://pypi.org/simple" } 254 | dependencies = [ 255 | { name = "mdurl" }, 256 | ] 257 | sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload_time = "2023-06-03T06:41:14.443Z" } 258 | wheels = [ 259 | { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload_time = "2023-06-03T06:41:11.019Z" }, 260 | ] 261 | 262 | [[package]] 263 | name = "markupsafe" 264 | version = "3.0.2" 265 | source = { registry = "https://pypi.org/simple" } 266 | sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload_time = "2024-10-18T15:21:54.129Z" } 267 | wheels = [ 268 | { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357, upload_time = "2024-10-18T15:20:51.44Z" }, 269 | { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393, upload_time = "2024-10-18T15:20:52.426Z" }, 270 | { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732, upload_time = "2024-10-18T15:20:53.578Z" }, 271 | { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866, upload_time = "2024-10-18T15:20:55.06Z" }, 272 | { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964, upload_time = "2024-10-18T15:20:55.906Z" }, 273 | { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977, upload_time = "2024-10-18T15:20:57.189Z" }, 274 | { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366, upload_time = "2024-10-18T15:20:58.235Z" }, 275 | { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091, upload_time = "2024-10-18T15:20:59.235Z" }, 276 | { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065, upload_time = "2024-10-18T15:21:00.307Z" }, 277 | { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514, upload_time = "2024-10-18T15:21:01.122Z" }, 278 | { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload_time = "2024-10-18T15:21:02.187Z" }, 279 | { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload_time = "2024-10-18T15:21:02.941Z" }, 280 | { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload_time = "2024-10-18T15:21:03.953Z" }, 281 | { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload_time = "2024-10-18T15:21:06.495Z" }, 282 | { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload_time = "2024-10-18T15:21:07.295Z" }, 283 | { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload_time = "2024-10-18T15:21:08.073Z" }, 284 | { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload_time = "2024-10-18T15:21:09.318Z" }, 285 | { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload_time = "2024-10-18T15:21:10.185Z" }, 286 | { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload_time = "2024-10-18T15:21:11.005Z" }, 287 | { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload_time = "2024-10-18T15:21:12.911Z" }, 288 | { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload_time = "2024-10-18T15:21:13.777Z" }, 289 | { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload_time = "2024-10-18T15:21:14.822Z" }, 290 | { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload_time = "2024-10-18T15:21:15.642Z" }, 291 | { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload_time = "2024-10-18T15:21:17.133Z" }, 292 | { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload_time = "2024-10-18T15:21:18.064Z" }, 293 | { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload_time = "2024-10-18T15:21:18.859Z" }, 294 | { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload_time = "2024-10-18T15:21:19.671Z" }, 295 | { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload_time = "2024-10-18T15:21:20.971Z" }, 296 | { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload_time = "2024-10-18T15:21:22.646Z" }, 297 | { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload_time = "2024-10-18T15:21:23.499Z" }, 298 | { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload_time = "2024-10-18T15:21:24.577Z" }, 299 | { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload_time = "2024-10-18T15:21:25.382Z" }, 300 | { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload_time = "2024-10-18T15:21:26.199Z" }, 301 | { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload_time = "2024-10-18T15:21:27.029Z" }, 302 | { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload_time = "2024-10-18T15:21:27.846Z" }, 303 | { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload_time = "2024-10-18T15:21:28.744Z" }, 304 | { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload_time = "2024-10-18T15:21:29.545Z" }, 305 | { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload_time = "2024-10-18T15:21:30.366Z" }, 306 | { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload_time = "2024-10-18T15:21:31.207Z" }, 307 | { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload_time = "2024-10-18T15:21:32.032Z" }, 308 | { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload_time = "2024-10-18T15:21:33.625Z" }, 309 | { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload_time = "2024-10-18T15:21:34.611Z" }, 310 | { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload_time = "2024-10-18T15:21:35.398Z" }, 311 | { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload_time = "2024-10-18T15:21:36.231Z" }, 312 | { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload_time = "2024-10-18T15:21:37.073Z" }, 313 | { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload_time = "2024-10-18T15:21:37.932Z" }, 314 | { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload_time = "2024-10-18T15:21:39.799Z" }, 315 | { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload_time = "2024-10-18T15:21:40.813Z" }, 316 | { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload_time = "2024-10-18T15:21:41.814Z" }, 317 | { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload_time = "2024-10-18T15:21:42.784Z" }, 318 | { url = "https://files.pythonhosted.org/packages/a7/ea/9b1530c3fdeeca613faeb0fb5cbcf2389d816072fab72a71b45749ef6062/MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", size = 14344, upload_time = "2024-10-18T15:21:43.721Z" }, 319 | { url = "https://files.pythonhosted.org/packages/4b/c2/fbdbfe48848e7112ab05e627e718e854d20192b674952d9042ebd8c9e5de/MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", size = 12389, upload_time = "2024-10-18T15:21:44.666Z" }, 320 | { url = "https://files.pythonhosted.org/packages/f0/25/7a7c6e4dbd4f867d95d94ca15449e91e52856f6ed1905d58ef1de5e211d0/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", size = 21607, upload_time = "2024-10-18T15:21:45.452Z" }, 321 | { url = "https://files.pythonhosted.org/packages/53/8f/f339c98a178f3c1e545622206b40986a4c3307fe39f70ccd3d9df9a9e425/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", size = 20728, upload_time = "2024-10-18T15:21:46.295Z" }, 322 | { url = "https://files.pythonhosted.org/packages/1a/03/8496a1a78308456dbd50b23a385c69b41f2e9661c67ea1329849a598a8f9/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", size = 20826, upload_time = "2024-10-18T15:21:47.134Z" }, 323 | { url = "https://files.pythonhosted.org/packages/e6/cf/0a490a4bd363048c3022f2f475c8c05582179bb179defcee4766fb3dcc18/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", size = 21843, upload_time = "2024-10-18T15:21:48.334Z" }, 324 | { url = "https://files.pythonhosted.org/packages/19/a3/34187a78613920dfd3cdf68ef6ce5e99c4f3417f035694074beb8848cd77/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", size = 21219, upload_time = "2024-10-18T15:21:49.587Z" }, 325 | { url = "https://files.pythonhosted.org/packages/17/d8/5811082f85bb88410ad7e452263af048d685669bbbfb7b595e8689152498/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", size = 20946, upload_time = "2024-10-18T15:21:50.441Z" }, 326 | { url = "https://files.pythonhosted.org/packages/7c/31/bd635fb5989440d9365c5e3c47556cfea121c7803f5034ac843e8f37c2f2/MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", size = 15063, upload_time = "2024-10-18T15:21:51.385Z" }, 327 | { url = "https://files.pythonhosted.org/packages/b3/73/085399401383ce949f727afec55ec3abd76648d04b9f22e1c0e99cb4bec3/MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", size = 15506, upload_time = "2024-10-18T15:21:52.974Z" }, 328 | ] 329 | 330 | [[package]] 331 | name = "mdit-py-plugins" 332 | version = "0.4.2" 333 | source = { registry = "https://pypi.org/simple" } 334 | dependencies = [ 335 | { name = "markdown-it-py" }, 336 | ] 337 | sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542, upload_time = "2024-09-09T20:27:49.564Z" } 338 | wheels = [ 339 | { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316, upload_time = "2024-09-09T20:27:48.397Z" }, 340 | ] 341 | 342 | [[package]] 343 | name = "mdurl" 344 | version = "0.1.2" 345 | source = { registry = "https://pypi.org/simple" } 346 | sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" } 347 | wheels = [ 348 | { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" }, 349 | ] 350 | 351 | [[package]] 352 | name = "myst-parser" 353 | version = "3.0.1" 354 | source = { registry = "https://pypi.org/simple" } 355 | resolution-markers = [ 356 | "python_full_version < '3.10'", 357 | ] 358 | dependencies = [ 359 | { name = "docutils", marker = "python_full_version < '3.10'" }, 360 | { name = "jinja2", marker = "python_full_version < '3.10'" }, 361 | { name = "markdown-it-py", marker = "python_full_version < '3.10'" }, 362 | { name = "mdit-py-plugins", marker = "python_full_version < '3.10'" }, 363 | { name = "pyyaml", marker = "python_full_version < '3.10'" }, 364 | { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, 365 | ] 366 | sdist = { url = "https://files.pythonhosted.org/packages/49/64/e2f13dac02f599980798c01156393b781aec983b52a6e4057ee58f07c43a/myst_parser-3.0.1.tar.gz", hash = "sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87", size = 92392, upload_time = "2024-04-28T20:22:42.116Z" } 367 | wheels = [ 368 | { url = "https://files.pythonhosted.org/packages/e2/de/21aa8394f16add8f7427f0a1326ccd2b3a2a8a3245c9252bc5ac034c6155/myst_parser-3.0.1-py3-none-any.whl", hash = "sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1", size = 83163, upload_time = "2024-04-28T20:22:39.985Z" }, 369 | ] 370 | 371 | [[package]] 372 | name = "myst-parser" 373 | version = "4.0.1" 374 | source = { registry = "https://pypi.org/simple" } 375 | resolution-markers = [ 376 | "python_full_version >= '3.11'", 377 | "python_full_version == '3.10.*'", 378 | ] 379 | dependencies = [ 380 | { name = "docutils", marker = "python_full_version >= '3.10'" }, 381 | { name = "jinja2", marker = "python_full_version >= '3.10'" }, 382 | { name = "markdown-it-py", marker = "python_full_version >= '3.10'" }, 383 | { name = "mdit-py-plugins", marker = "python_full_version >= '3.10'" }, 384 | { name = "pyyaml", marker = "python_full_version >= '3.10'" }, 385 | { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, 386 | { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, 387 | ] 388 | sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload_time = "2025-02-12T10:53:03.833Z" } 389 | wheels = [ 390 | { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload_time = "2025-02-12T10:53:02.078Z" }, 391 | ] 392 | 393 | [[package]] 394 | name = "packaging" 395 | version = "25.0" 396 | source = { registry = "https://pypi.org/simple" } 397 | sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload_time = "2025-04-19T11:48:59.673Z" } 398 | wheels = [ 399 | { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload_time = "2025-04-19T11:48:57.875Z" }, 400 | ] 401 | 402 | [[package]] 403 | name = "pluggy" 404 | version = "1.6.0" 405 | source = { registry = "https://pypi.org/simple" } 406 | sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload_time = "2025-05-15T12:30:07.975Z" } 407 | wheels = [ 408 | { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload_time = "2025-05-15T12:30:06.134Z" }, 409 | ] 410 | 411 | [[package]] 412 | name = "pygments" 413 | version = "2.19.1" 414 | source = { registry = "https://pypi.org/simple" } 415 | sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload_time = "2025-01-06T17:26:30.443Z" } 416 | wheels = [ 417 | { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload_time = "2025-01-06T17:26:25.553Z" }, 418 | ] 419 | 420 | [[package]] 421 | name = "pytest" 422 | version = "8.4.1" 423 | source = { registry = "https://pypi.org/simple" } 424 | dependencies = [ 425 | { name = "colorama", marker = "sys_platform == 'win32'" }, 426 | { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, 427 | { name = "iniconfig" }, 428 | { name = "packaging" }, 429 | { name = "pluggy" }, 430 | { name = "pygments" }, 431 | { name = "tomli", marker = "python_full_version < '3.11'" }, 432 | ] 433 | sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714, upload_time = "2025-06-18T05:48:06.109Z" } 434 | wheels = [ 435 | { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474, upload_time = "2025-06-18T05:48:03.955Z" }, 436 | ] 437 | 438 | [[package]] 439 | name = "pyyaml" 440 | version = "6.0.2" 441 | source = { registry = "https://pypi.org/simple" } 442 | sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload_time = "2024-08-06T20:33:50.674Z" } 443 | wheels = [ 444 | { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199, upload_time = "2024-08-06T20:31:40.178Z" }, 445 | { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758, upload_time = "2024-08-06T20:31:42.173Z" }, 446 | { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463, upload_time = "2024-08-06T20:31:44.263Z" }, 447 | { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280, upload_time = "2024-08-06T20:31:50.199Z" }, 448 | { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239, upload_time = "2024-08-06T20:31:52.292Z" }, 449 | { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802, upload_time = "2024-08-06T20:31:53.836Z" }, 450 | { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527, upload_time = "2024-08-06T20:31:55.565Z" }, 451 | { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052, upload_time = "2024-08-06T20:31:56.914Z" }, 452 | { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774, upload_time = "2024-08-06T20:31:58.304Z" }, 453 | { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload_time = "2024-08-06T20:32:03.408Z" }, 454 | { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload_time = "2024-08-06T20:32:04.926Z" }, 455 | { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload_time = "2024-08-06T20:32:06.459Z" }, 456 | { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload_time = "2024-08-06T20:32:08.338Z" }, 457 | { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload_time = "2024-08-06T20:32:14.124Z" }, 458 | { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload_time = "2024-08-06T20:32:16.17Z" }, 459 | { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload_time = "2024-08-06T20:32:18.555Z" }, 460 | { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload_time = "2024-08-06T20:32:19.889Z" }, 461 | { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload_time = "2024-08-06T20:32:21.273Z" }, 462 | { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload_time = "2024-08-06T20:32:25.131Z" }, 463 | { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload_time = "2024-08-06T20:32:26.511Z" }, 464 | { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload_time = "2024-08-06T20:32:28.363Z" }, 465 | { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload_time = "2024-08-06T20:32:30.058Z" }, 466 | { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload_time = "2024-08-06T20:32:31.881Z" }, 467 | { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload_time = "2024-08-06T20:32:37.083Z" }, 468 | { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload_time = "2024-08-06T20:32:38.898Z" }, 469 | { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload_time = "2024-08-06T20:32:40.241Z" }, 470 | { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload_time = "2024-08-06T20:32:41.93Z" }, 471 | { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload_time = "2024-08-06T20:32:43.4Z" }, 472 | { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload_time = "2024-08-06T20:32:44.801Z" }, 473 | { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload_time = "2024-08-06T20:32:46.432Z" }, 474 | { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload_time = "2024-08-06T20:32:51.188Z" }, 475 | { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload_time = "2024-08-06T20:32:53.019Z" }, 476 | { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload_time = "2024-08-06T20:32:54.708Z" }, 477 | { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload_time = "2024-08-06T20:32:56.985Z" }, 478 | { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload_time = "2024-08-06T20:33:03.001Z" }, 479 | { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload_time = "2024-08-06T20:33:04.33Z" }, 480 | { url = "https://files.pythonhosted.org/packages/65/d8/b7a1db13636d7fb7d4ff431593c510c8b8fca920ade06ca8ef20015493c5/PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", size = 184777, upload_time = "2024-08-06T20:33:25.896Z" }, 481 | { url = "https://files.pythonhosted.org/packages/0a/02/6ec546cd45143fdf9840b2c6be8d875116a64076218b61d68e12548e5839/PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", size = 172318, upload_time = "2024-08-06T20:33:27.212Z" }, 482 | { url = "https://files.pythonhosted.org/packages/0e/9a/8cc68be846c972bda34f6c2a93abb644fb2476f4dcc924d52175786932c9/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", size = 720891, upload_time = "2024-08-06T20:33:28.974Z" }, 483 | { url = "https://files.pythonhosted.org/packages/e9/6c/6e1b7f40181bc4805e2e07f4abc10a88ce4648e7e95ff1abe4ae4014a9b2/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", size = 722614, upload_time = "2024-08-06T20:33:34.157Z" }, 484 | { url = "https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", size = 737360, upload_time = "2024-08-06T20:33:35.84Z" }, 485 | { url = "https://files.pythonhosted.org/packages/d7/12/7322c1e30b9be969670b672573d45479edef72c9a0deac3bb2868f5d7469/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", size = 699006, upload_time = "2024-08-06T20:33:37.501Z" }, 486 | { url = "https://files.pythonhosted.org/packages/82/72/04fcad41ca56491995076630c3ec1e834be241664c0c09a64c9a2589b507/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", size = 723577, upload_time = "2024-08-06T20:33:39.389Z" }, 487 | { url = "https://files.pythonhosted.org/packages/ed/5e/46168b1f2757f1fcd442bc3029cd8767d88a98c9c05770d8b420948743bb/PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", size = 144593, upload_time = "2024-08-06T20:33:46.63Z" }, 488 | { url = "https://files.pythonhosted.org/packages/19/87/5124b1c1f2412bb95c59ec481eaf936cd32f0fe2a7b16b97b81c4c017a6a/PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", size = 162312, upload_time = "2024-08-06T20:33:49.073Z" }, 489 | ] 490 | 491 | [[package]] 492 | name = "requests" 493 | version = "2.32.4" 494 | source = { registry = "https://pypi.org/simple" } 495 | dependencies = [ 496 | { name = "certifi" }, 497 | { name = "charset-normalizer" }, 498 | { name = "idna" }, 499 | { name = "urllib3" }, 500 | ] 501 | sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload_time = "2025-06-09T16:43:07.34Z" } 502 | wheels = [ 503 | { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload_time = "2025-06-09T16:43:05.728Z" }, 504 | ] 505 | 506 | [[package]] 507 | name = "resvg-py" 508 | source = { editable = "." } 509 | 510 | [package.dev-dependencies] 511 | dev = [ 512 | { name = "pytest" }, 513 | ] 514 | docs = [ 515 | { name = "furo" }, 516 | { name = "myst-parser", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, 517 | { name = "myst-parser", version = "4.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, 518 | { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, 519 | { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, 520 | { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, 521 | { name = "sphinx-reload" }, 522 | ] 523 | 524 | [package.metadata] 525 | 526 | [package.metadata.requires-dev] 527 | dev = [{ name = "pytest", specifier = ">=8.1.1" }] 528 | docs = [ 529 | { name = "furo", specifier = ">=2024.1.29" }, 530 | { name = "myst-parser", specifier = ">=3.0.1" }, 531 | { name = "sphinx", specifier = ">=7.2.6" }, 532 | { name = "sphinx-reload", specifier = ">=0.2.0" }, 533 | ] 534 | 535 | [[package]] 536 | name = "roman-numerals-py" 537 | version = "3.1.0" 538 | source = { registry = "https://pypi.org/simple" } 539 | sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017, upload_time = "2025-02-22T07:34:54.333Z" } 540 | wheels = [ 541 | { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742, upload_time = "2025-02-22T07:34:52.422Z" }, 542 | ] 543 | 544 | [[package]] 545 | name = "snowballstemmer" 546 | version = "3.0.1" 547 | source = { registry = "https://pypi.org/simple" } 548 | sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload_time = "2025-05-09T16:34:51.843Z" } 549 | wheels = [ 550 | { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload_time = "2025-05-09T16:34:50.371Z" }, 551 | ] 552 | 553 | [[package]] 554 | name = "soupsieve" 555 | version = "2.7" 556 | source = { registry = "https://pypi.org/simple" } 557 | sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload_time = "2025-04-20T18:50:08.518Z" } 558 | wheels = [ 559 | { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload_time = "2025-04-20T18:50:07.196Z" }, 560 | ] 561 | 562 | [[package]] 563 | name = "sphinx" 564 | version = "7.4.7" 565 | source = { registry = "https://pypi.org/simple" } 566 | resolution-markers = [ 567 | "python_full_version < '3.10'", 568 | ] 569 | dependencies = [ 570 | { name = "alabaster", version = "0.7.16", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, 571 | { name = "babel", marker = "python_full_version < '3.10'" }, 572 | { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, 573 | { name = "docutils", marker = "python_full_version < '3.10'" }, 574 | { name = "imagesize", marker = "python_full_version < '3.10'" }, 575 | { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, 576 | { name = "jinja2", marker = "python_full_version < '3.10'" }, 577 | { name = "packaging", marker = "python_full_version < '3.10'" }, 578 | { name = "pygments", marker = "python_full_version < '3.10'" }, 579 | { name = "requests", marker = "python_full_version < '3.10'" }, 580 | { name = "snowballstemmer", marker = "python_full_version < '3.10'" }, 581 | { name = "sphinxcontrib-applehelp", marker = "python_full_version < '3.10'" }, 582 | { name = "sphinxcontrib-devhelp", marker = "python_full_version < '3.10'" }, 583 | { name = "sphinxcontrib-htmlhelp", marker = "python_full_version < '3.10'" }, 584 | { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.10'" }, 585 | { name = "sphinxcontrib-qthelp", marker = "python_full_version < '3.10'" }, 586 | { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.10'" }, 587 | { name = "tomli", marker = "python_full_version < '3.10'" }, 588 | ] 589 | sdist = { url = "https://files.pythonhosted.org/packages/5b/be/50e50cb4f2eff47df05673d361095cafd95521d2a22521b920c67a372dcb/sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe", size = 8067911, upload_time = "2024-07-20T14:46:56.059Z" } 590 | wheels = [ 591 | { url = "https://files.pythonhosted.org/packages/0d/ef/153f6803c5d5f8917dbb7f7fcf6d34a871ede3296fa89c2c703f5f8a6c8e/sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239", size = 3401624, upload_time = "2024-07-20T14:46:52.142Z" }, 592 | ] 593 | 594 | [[package]] 595 | name = "sphinx" 596 | version = "8.1.3" 597 | source = { registry = "https://pypi.org/simple" } 598 | resolution-markers = [ 599 | "python_full_version == '3.10.*'", 600 | ] 601 | dependencies = [ 602 | { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, 603 | { name = "babel", marker = "python_full_version == '3.10.*'" }, 604 | { name = "colorama", marker = "python_full_version == '3.10.*' and sys_platform == 'win32'" }, 605 | { name = "docutils", marker = "python_full_version == '3.10.*'" }, 606 | { name = "imagesize", marker = "python_full_version == '3.10.*'" }, 607 | { name = "jinja2", marker = "python_full_version == '3.10.*'" }, 608 | { name = "packaging", marker = "python_full_version == '3.10.*'" }, 609 | { name = "pygments", marker = "python_full_version == '3.10.*'" }, 610 | { name = "requests", marker = "python_full_version == '3.10.*'" }, 611 | { name = "snowballstemmer", marker = "python_full_version == '3.10.*'" }, 612 | { name = "sphinxcontrib-applehelp", marker = "python_full_version == '3.10.*'" }, 613 | { name = "sphinxcontrib-devhelp", marker = "python_full_version == '3.10.*'" }, 614 | { name = "sphinxcontrib-htmlhelp", marker = "python_full_version == '3.10.*'" }, 615 | { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.10.*'" }, 616 | { name = "sphinxcontrib-qthelp", marker = "python_full_version == '3.10.*'" }, 617 | { name = "sphinxcontrib-serializinghtml", marker = "python_full_version == '3.10.*'" }, 618 | { name = "tomli", marker = "python_full_version == '3.10.*'" }, 619 | ] 620 | sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload_time = "2024-10-13T20:27:13.93Z" } 621 | wheels = [ 622 | { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125, upload_time = "2024-10-13T20:27:10.448Z" }, 623 | ] 624 | 625 | [[package]] 626 | name = "sphinx" 627 | version = "8.2.3" 628 | source = { registry = "https://pypi.org/simple" } 629 | resolution-markers = [ 630 | "python_full_version >= '3.11'", 631 | ] 632 | dependencies = [ 633 | { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, 634 | { name = "babel", marker = "python_full_version >= '3.11'" }, 635 | { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, 636 | { name = "docutils", marker = "python_full_version >= '3.11'" }, 637 | { name = "imagesize", marker = "python_full_version >= '3.11'" }, 638 | { name = "jinja2", marker = "python_full_version >= '3.11'" }, 639 | { name = "packaging", marker = "python_full_version >= '3.11'" }, 640 | { name = "pygments", marker = "python_full_version >= '3.11'" }, 641 | { name = "requests", marker = "python_full_version >= '3.11'" }, 642 | { name = "roman-numerals-py", marker = "python_full_version >= '3.11'" }, 643 | { name = "snowballstemmer", marker = "python_full_version >= '3.11'" }, 644 | { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.11'" }, 645 | { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.11'" }, 646 | { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.11'" }, 647 | { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.11'" }, 648 | { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.11'" }, 649 | { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.11'" }, 650 | ] 651 | sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload_time = "2025-03-02T22:31:59.658Z" } 652 | wheels = [ 653 | { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload_time = "2025-03-02T22:31:56.836Z" }, 654 | ] 655 | 656 | [[package]] 657 | name = "sphinx-basic-ng" 658 | version = "1.0.0b2" 659 | source = { registry = "https://pypi.org/simple" } 660 | dependencies = [ 661 | { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, 662 | { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, 663 | { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, 664 | ] 665 | sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736, upload_time = "2023-07-08T18:40:54.166Z" } 666 | wheels = [ 667 | { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496, upload_time = "2023-07-08T18:40:52.659Z" }, 668 | ] 669 | 670 | [[package]] 671 | name = "sphinx-reload" 672 | version = "0.2.0" 673 | source = { registry = "https://pypi.org/simple" } 674 | dependencies = [ 675 | { name = "livereload" }, 676 | ] 677 | sdist = { url = "https://files.pythonhosted.org/packages/9e/0c/cc638554fbb12066329aff959e6cd0dc24797c3de878326d0decd8c366f3/sphinx-reload-0.2.0.tar.gz", hash = "sha256:800e07bffea6de0e4ee5f9c14ef565ba1d0343c4a516d028e978bbcaf712fa07", size = 3527, upload_time = "2019-01-25T19:58:56.884Z" } 678 | wheels = [ 679 | { url = "https://files.pythonhosted.org/packages/f4/95/9351a63ce7fdaff1bd44b69aa14d6c36b5be5d1f76577c32d5d79430b8d5/sphinx_reload-0.2.0-py3-none-any.whl", hash = "sha256:0c184b990d4bc50cf14b2e6b6cf89ce4f88a2baa9b22e36ae4e2abcb8f3f44b6", size = 4651, upload_time = "2019-01-25T19:58:55.733Z" }, 680 | ] 681 | 682 | [[package]] 683 | name = "sphinxcontrib-applehelp" 684 | version = "2.0.0" 685 | source = { registry = "https://pypi.org/simple" } 686 | sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload_time = "2024-07-29T01:09:00.465Z" } 687 | wheels = [ 688 | { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload_time = "2024-07-29T01:08:58.99Z" }, 689 | ] 690 | 691 | [[package]] 692 | name = "sphinxcontrib-devhelp" 693 | version = "2.0.0" 694 | source = { registry = "https://pypi.org/simple" } 695 | sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload_time = "2024-07-29T01:09:23.417Z" } 696 | wheels = [ 697 | { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload_time = "2024-07-29T01:09:21.945Z" }, 698 | ] 699 | 700 | [[package]] 701 | name = "sphinxcontrib-htmlhelp" 702 | version = "2.1.0" 703 | source = { registry = "https://pypi.org/simple" } 704 | sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload_time = "2024-07-29T01:09:37.889Z" } 705 | wheels = [ 706 | { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload_time = "2024-07-29T01:09:36.407Z" }, 707 | ] 708 | 709 | [[package]] 710 | name = "sphinxcontrib-jsmath" 711 | version = "1.0.1" 712 | source = { registry = "https://pypi.org/simple" } 713 | sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload_time = "2019-01-21T16:10:16.347Z" } 714 | wheels = [ 715 | { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload_time = "2019-01-21T16:10:14.333Z" }, 716 | ] 717 | 718 | [[package]] 719 | name = "sphinxcontrib-qthelp" 720 | version = "2.0.0" 721 | source = { registry = "https://pypi.org/simple" } 722 | sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload_time = "2024-07-29T01:09:56.435Z" } 723 | wheels = [ 724 | { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload_time = "2024-07-29T01:09:54.885Z" }, 725 | ] 726 | 727 | [[package]] 728 | name = "sphinxcontrib-serializinghtml" 729 | version = "2.0.0" 730 | source = { registry = "https://pypi.org/simple" } 731 | sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload_time = "2024-07-29T01:10:09.332Z" } 732 | wheels = [ 733 | { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload_time = "2024-07-29T01:10:08.203Z" }, 734 | ] 735 | 736 | [[package]] 737 | name = "tomli" 738 | version = "2.2.1" 739 | source = { registry = "https://pypi.org/simple" } 740 | sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload_time = "2024-11-27T22:38:36.873Z" } 741 | wheels = [ 742 | { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload_time = "2024-11-27T22:37:54.956Z" }, 743 | { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload_time = "2024-11-27T22:37:56.698Z" }, 744 | { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload_time = "2024-11-27T22:37:57.63Z" }, 745 | { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload_time = "2024-11-27T22:37:59.344Z" }, 746 | { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload_time = "2024-11-27T22:38:00.429Z" }, 747 | { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload_time = "2024-11-27T22:38:02.094Z" }, 748 | { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload_time = "2024-11-27T22:38:03.206Z" }, 749 | { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload_time = "2024-11-27T22:38:04.217Z" }, 750 | { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload_time = "2024-11-27T22:38:05.908Z" }, 751 | { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload_time = "2024-11-27T22:38:06.812Z" }, 752 | { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload_time = "2024-11-27T22:38:07.731Z" }, 753 | { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload_time = "2024-11-27T22:38:09.384Z" }, 754 | { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload_time = "2024-11-27T22:38:10.329Z" }, 755 | { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload_time = "2024-11-27T22:38:11.443Z" }, 756 | { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload_time = "2024-11-27T22:38:13.099Z" }, 757 | { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload_time = "2024-11-27T22:38:14.766Z" }, 758 | { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload_time = "2024-11-27T22:38:15.843Z" }, 759 | { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload_time = "2024-11-27T22:38:17.645Z" }, 760 | { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload_time = "2024-11-27T22:38:19.159Z" }, 761 | { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload_time = "2024-11-27T22:38:20.064Z" }, 762 | { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload_time = "2024-11-27T22:38:21.659Z" }, 763 | { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload_time = "2024-11-27T22:38:22.693Z" }, 764 | { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload_time = "2024-11-27T22:38:24.367Z" }, 765 | { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload_time = "2024-11-27T22:38:26.081Z" }, 766 | { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload_time = "2024-11-27T22:38:27.921Z" }, 767 | { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload_time = "2024-11-27T22:38:29.591Z" }, 768 | { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload_time = "2024-11-27T22:38:30.639Z" }, 769 | { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload_time = "2024-11-27T22:38:31.702Z" }, 770 | { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload_time = "2024-11-27T22:38:32.837Z" }, 771 | { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload_time = "2024-11-27T22:38:34.455Z" }, 772 | { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload_time = "2024-11-27T22:38:35.385Z" }, 773 | ] 774 | 775 | [[package]] 776 | name = "tornado" 777 | version = "6.5.1" 778 | source = { registry = "https://pypi.org/simple" } 779 | sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934, upload_time = "2025-05-22T18:15:38.788Z" } 780 | wheels = [ 781 | { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948, upload_time = "2025-05-22T18:15:20.862Z" }, 782 | { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112, upload_time = "2025-05-22T18:15:22.591Z" }, 783 | { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672, upload_time = "2025-05-22T18:15:24.027Z" }, 784 | { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019, upload_time = "2025-05-22T18:15:25.735Z" }, 785 | { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252, upload_time = "2025-05-22T18:15:27.499Z" }, 786 | { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930, upload_time = "2025-05-22T18:15:29.299Z" }, 787 | { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351, upload_time = "2025-05-22T18:15:31.038Z" }, 788 | { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328, upload_time = "2025-05-22T18:15:32.426Z" }, 789 | { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396, upload_time = "2025-05-22T18:15:34.205Z" }, 790 | { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840, upload_time = "2025-05-22T18:15:36.1Z" }, 791 | { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596, upload_time = "2025-05-22T18:15:37.433Z" }, 792 | ] 793 | 794 | [[package]] 795 | name = "typing-extensions" 796 | version = "4.14.0" 797 | source = { registry = "https://pypi.org/simple" } 798 | sdist = { url = "https://files.pythonhosted.org/packages/d1/bc/51647cd02527e87d05cb083ccc402f93e441606ff1f01739a62c8ad09ba5/typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", size = 107423, upload_time = "2025-06-02T14:52:11.399Z" } 799 | wheels = [ 800 | { url = "https://files.pythonhosted.org/packages/69/e0/552843e0d356fbb5256d21449fa957fa4eff3bbc135a74a691ee70c7c5da/typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af", size = 43839, upload_time = "2025-06-02T14:52:10.026Z" }, 801 | ] 802 | 803 | [[package]] 804 | name = "urllib3" 805 | version = "2.5.0" 806 | source = { registry = "https://pypi.org/simple" } 807 | sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload_time = "2025-06-18T14:07:41.644Z" } 808 | wheels = [ 809 | { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload_time = "2025-06-18T14:07:40.39Z" }, 810 | ] 811 | 812 | [[package]] 813 | name = "zipp" 814 | version = "3.23.0" 815 | source = { registry = "https://pypi.org/simple" } 816 | sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload_time = "2025-06-08T17:06:39.4Z" } 817 | wheels = [ 818 | { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload_time = "2025-06-08T17:06:38.034Z" }, 819 | ] 820 | --------------------------------------------------------------------------------