From a44a60673e8a811e57074575572514507d0fda8a Mon Sep 17 00:00:00 2001 From: Jorben Date: Sat, 24 May 2025 17:37:04 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=96=B0=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=BB=93=E6=9E=84=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E4=BE=9D=E8=B5=96=E7=AE=A1=E7=90=86=EF=BC=8C=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E6=97=A7=E7=9A=84=E4=BE=9D=E8=B5=96=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=92=8C=E6=B3=A8=E9=87=8A=EF=BC=8C=E6=96=B0=E5=A2=9E=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=B4=A8=E9=87=8F=E5=B7=A5=E5=85=B7=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/changelog.yml | 2 +- .gitignore | 2 +- .pre-commit-config.yaml | 17 + .python-version | 1 + Dockerfile | 4 +- Makefile | 23 ++ README.md | 89 ++++- README_zh.md | 81 +++- core/FileWorker.py | 32 +- core/ImageWorker.py | 14 +- core/LLMClient.py | 55 ++- core/PDFWorker.py | 63 +-- core/Util.py | 6 +- main.py | 77 ++-- pyproject.toml | 55 +++ requirements-dev.txt | 24 -- requirements.txt | 23 -- setup.py | 11 - tests/cases/formula_01.md | 2 - tests/cases/input_tables.pdf | Bin 0 -> 63128 bytes tests/cases/table_01.md | 2 - tests/test_util.py | 33 +- uv.lock | 684 ++++++++++++++++++++++++++++++++ 23 files changed, 1104 insertions(+), 196 deletions(-) create mode 100644 .pre-commit-config.yaml create mode 100644 .python-version create mode 100644 Makefile create mode 100644 pyproject.toml delete mode 100644 requirements-dev.txt delete mode 100644 requirements.txt delete mode 100644 setup.py create mode 100644 tests/cases/input_tables.pdf create mode 100644 uv.lock diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 4730161..9046187 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -25,4 +25,4 @@ jobs: changelog_filename: CHANGELOG.md committer_username: 'github-actions[bot]' committer_email: 'github-actions[bot]@users.noreply.github.com' - release_version: ${{ github.event.inputs.release_version }} \ No newline at end of file + release_version: ${{ github.event.inputs.release_version }} diff --git a/.gitignore b/.gitignore index 6017c88..cb6ff03 100644 --- a/.gitignore +++ b/.gitignore @@ -175,4 +175,4 @@ cython_debug/ .pypirc # MacOS ds_store files -.DS_Store \ No newline at end of file +.DS_Store diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..fa31d6c --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,17 @@ +repos: + - repo: https://github.com/charliermarsh/ruff-pre-commit + rev: v0.11.11 + hooks: + - id: ruff + args: [ --fix ] + - id: ruff-format + + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 # 2025-05-24 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-toml + - id: check-merge-conflict + - id: check-added-large-files diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..94a78fc --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.9.22 diff --git a/Dockerfile b/Dockerfile index 8b91747..03a93ae 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ from python:3.9-slim WORKDIR /app COPY . /app -RUN pip install -r requirements.txt -CMD ["python", "main.py"] \ No newline at end of file +RUN pip install -e . +CMD ["python", "main.py"] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..eb74ba4 --- /dev/null +++ b/Makefile @@ -0,0 +1,23 @@ +.PHONY: install format lint test check update + +install: + uv sync + +format: + uv run ruff format . + +lint: + uv run ruff check . + +fix: + uv run ruff check . --fix + +test: + uv run pytest + +check: + uv run pre-commit run --all-files + +update: + uv lock --upgrade + uv run pre-commit autoupdate diff --git a/README.md b/README.md index ff2bb54..f9e67c3 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,23 @@ MarkPDFDown is designed to simplify the process of converting PDF documents into ## Installation +### Using uv (Recommended) + +```bash +# Install uv if you haven't already +curl -LsSf https://astral.sh/uv/install.sh | sh + +# Clone the repository +git clone https://github.com/MarkPDFdown/markpdfdown.git +cd markpdfdown + +# Install dependencies and create virtual environment +uv sync + +``` + +### Using conda + ```bash conda create -n markpdfdown python=3.9 conda activate markpdfdown @@ -39,17 +56,16 @@ git clone https://github.com/MarkPDFdown/markpdfdown.git cd markpdfdown # Install dependencies -pip install -r requirements.txt - +pip install -e . ``` ## Usage ```bash # Set up your OpenAI API key -export OPENAI_API_KEY= +export OPENAI_API_KEY="your-api-key" # Optionally, set up your OpenAI API base -export OPENAI_API_BASE= +export OPENAI_API_BASE="your-api-base" # Optionally, set up your OpenAI API model -export OPENAI_DEFAULT_MODEL= +export OPENAI_DEFAULT_MODEL="your-model" # pdf to markdown python main.py < tests/input.pdf > output.md @@ -64,12 +80,52 @@ python main.py page_start page_end < tests/input.pdf > output.md ## Docker Usage ```bash -docker run -i -e OPENAI_API_KEY= -e OPENAI_API_BASE= -e OPENAI_DEFAULT_MODEL= jorbenzhu/markpdfdown < input.pdf > output.md +docker run -i -e OPENAI_API_KEY=your-api-key -e OPENAI_API_BASE=your-api-base -e OPENAI_DEFAULT_MODEL=your-model jorbenzhu/markpdfdown < input.pdf > output.md +``` + +## Development Setup + +### Code Quality Tools + +This project uses `ruff` for linting and formatting, and `pre-commit` for automated code quality checks. + +#### Install development dependencies + +```bash +# If using uv +uv sync --group dev + +# If using pip +pip install -e ".[dev]" +``` + +#### Set up pre-commit hooks + +```bash +# Install pre-commit hooks +pre-commit install + +# Run pre-commit on all files (optional) +pre-commit run --all-files +``` + +#### Code formatting and linting + +```bash +# Format code with ruff +ruff format + +# Run linting checks +ruff check + +# Fix auto-fixable issues +ruff check --fix ``` ## Requirements - Python 3.9+ -- Dependencies listed in `requirements.txt` +- [uv](https://astral.sh/uv/) (recommended for package management) or conda/pip +- Dependencies specified in `pyproject.toml` - Access to the specified multimodal AI model ## Contributing @@ -77,9 +133,22 @@ Contributions are welcome! Please feel free to submit a Pull Request. 1. Fork the repository 2. Create your feature branch ( `git checkout -b feature/amazing-feature` ) -3. Commit your changes ( `git commit -m 'feat: Add some amazing feature'` ) -4. Push to the branch ( `git push origin feature/amazing-feature` ) -5. Open a Pull Request +3. Set up the development environment: + ```bash + uv sync --group dev + pre-commit install + ``` +4. Make your changes and ensure code quality: + ```bash + ruff format + ruff check --fix + pre-commit run --all-files + ``` +5. Commit your changes ( `git commit -m 'feat: Add some amazing feature'` ) +6. Push to the branch ( `git push origin feature/amazing-feature` ) +7. Open a Pull Request + +Please ensure your code follows the project's coding standards by running the linting and formatting tools before submitting. ## License This project is licensed under the Apache License 2.0. See the LICENSE file for details. diff --git a/README_zh.md b/README_zh.md index 4603e31..79df3d7 100644 --- a/README_zh.md +++ b/README_zh.md @@ -30,6 +30,22 @@ MarkPDFDown 是一款智能PDF转换Markdown工具,通过先进的多模态AI ## 安装指南 +### 使用 uv(推荐) + +```bash +# 安装 uv(如果尚未安装) +curl -LsSf https://astral.sh/uv/install.sh | sh + +# 克隆仓库 +git clone https://github.com/MarkPDFdown/markpdfdown.git +cd markpdfdown + +# 安装依赖并创建虚拟环境 +uv sync +``` + +### 使用 conda + ```bash conda create -n markpdfdown python=3.9 conda activate markpdfdown @@ -39,7 +55,7 @@ git clone https://github.com/MarkPDFdown/markpdfdown.git cd markpdfdown # 安装依赖 -pip install -r requirements.txt +pip install -e . ``` ## 使用指南 @@ -69,9 +85,49 @@ python main.py 起始页码 结束页码 < input.pdf > output.md docker run -i -e OPENAI_API_KEY=<你的API密钥> -e OPENAI_API_BASE=<你的API端点> -e OPENAI_DEFAULT_MODEL=<你的模型> jorbenzhu/markpdfdown < input.pdf > output.md ``` +## 开发环境设置 + +### 代码质量工具 + +本项目使用 `ruff` 进行代码检查和格式化,使用 `pre-commit` 进行自动化代码质量检查。 + +#### 安装开发依赖 + +```bash +# 如果使用 uv +uv sync --group dev + +# 如果使用 pip +pip install -e ".[dev]" +``` + +#### 设置 pre-commit 钩子 + +```bash +# 安装 pre-commit 钩子 +pre-commit install + +# 在所有文件上运行 pre-commit(可选) +pre-commit run --all-files +``` + +#### 代码格式化和检查 + +```bash +# 使用 ruff 格式化代码 +ruff format + +# 运行代码检查 +ruff check + +# 修复可自动修复的问题 +ruff check --fix +``` + ## 依赖环境 - Python 3.9+ -- 依赖库详见 `requirements.txt` +- [uv](https://astral.sh/uv/)(推荐的包管理工具)或 conda/pip +- 项目依赖详见 `pyproject.toml` - 可访问的多模态AI模型服务 ## 贡献指南 @@ -79,9 +135,22 @@ docker run -i -e OPENAI_API_KEY=<你的API密钥> -e OPENAI_API_BASE=<你的API 1. Fork 本仓库 2. 新建功能分支( `git checkout -b feature/somefeat` ) -3. 提交修改( `git commit -m 'feat: 添加XX新功能'` ) -4. 推送分支( `git push origin feature/somefeat` ) -5. 提交Pull Request +3. 设置开发环境: + ```bash + uv sync --group dev + pre-commit install + ``` +4. 进行修改并确保代码质量: + ```bash + ruff format + ruff check --fix + pre-commit run --all-files + ``` +5. 提交修改( `git commit -m 'feat: 添加XX新功能'` ) +6. 推送分支( `git push origin feature/somefeat` ) +7. 提交Pull Request + +请确保在提交前运行代码检查和格式化工具,以符合项目的代码规范。 ## 开源协议 本项目采用 Apache License 2.0 开源协议,详见 LICENSE 文件。 @@ -97,4 +166,4 @@ docker run -i -e OPENAI_API_KEY=<你的API密钥> -e OPENAI_API_BASE=<你的API [Size]: https://img.shields.io/docker/image-size/jorbenzhu/markpdfdown/latest?color=066da5&label=size [Pulls]: https://img.shields.io/docker/pulls/jorbenzhu/markpdfdown.svg?style=flat&label=pulls&logo=docker [Tag]: https://img.shields.io/github/release/markpdfdown/markpdfdown.svg -[License]: https://img.shields.io/github/license/markpdfdown/markpdfdown \ No newline at end of file +[License]: https://img.shields.io/github/license/markpdfdown/markpdfdown diff --git a/core/FileWorker.py b/core/FileWorker.py index bb3c58a..4bf03d5 100644 --- a/core/FileWorker.py +++ b/core/FileWorker.py @@ -1,58 +1,62 @@ -import os import logging -from typing import List +import os logger = logging.getLogger(__name__) + class FileWorker: """ Base class Worker, define common interface """ + def __init__(self, input_path: str): """ Initialize Worker - + Args: input_path (str): Input file path """ self.input_path = input_path - - def convert_to_images(self, output_dir: str = ".", **kwargs) -> List[str]: + + def convert_to_images(self, output_dir: str = ".", **kwargs) -> list[str]: """ Convert input file to images - + Args: output_dir (str): Output directory **kwargs: Other parameters - + Returns: List[str]: List of generated image paths """ raise NotImplementedError("Subclasses must implement this method") + def create_worker(input_path: str, start_page: int = 1, end_page: int = 0): """ Create corresponding Worker instance based on file extension - + Args: input_path (str): Input file path start_page (int): Starting page number end_page (int): Ending page number - + Returns: Worker: Worker instance """ _, ext = os.path.splitext(input_path) ext = ext.lower() - + worker = None - if ext == '.pdf': + if ext == ".pdf": from .PDFWorker import PDFWorker + worker = PDFWorker(input_path, start_page, end_page) - elif ext == '.jpg' or ext == '.jpeg' or ext == '.png' or ext == '.bmp': + elif ext == ".jpg" or ext == ".jpeg" or ext == ".png" or ext == ".bmp": from .ImageWorker import ImageWorker + worker = ImageWorker(input_path) else: raise ValueError(f"Unsupported file type: {ext}") - - return worker \ No newline at end of file + + return worker diff --git a/core/ImageWorker.py b/core/ImageWorker.py index 905f1df..7ca8e53 100644 --- a/core/ImageWorker.py +++ b/core/ImageWorker.py @@ -1,26 +1,26 @@ -import os import logging -from typing import List +import os + from .FileWorker import FileWorker logger = logging.getLogger(__name__) + class ImageWorker(FileWorker): """ Worker class for processing image files """ + def __init__(self, input_path: str): super().__init__(input_path) - self.output_dir = os.path.dirname(input_path) + self.output_dir = os.path.dirname(input_path) logger.info("Processing image file %s", input_path) - - - def convert_to_images(self) -> List[str]: + def convert_to_images(self) -> list[str]: """ Mock function for image conversion Returns: List[str]: List of generated image paths """ - return [self.input_path] \ No newline at end of file + return [self.input_path] diff --git a/core/LLMClient.py b/core/LLMClient.py index 53d264a..d2827ad 100644 --- a/core/LLMClient.py +++ b/core/LLMClient.py @@ -1,14 +1,17 @@ import logging +from typing import Optional + import openai -from typing import List, Dict, Optional logger = logging.getLogger(__name__) + class LLMClient: """ OpenAI API compatible client class """ - def __init__(self, base_url:str, api_key: str, model: str): + + def __init__(self, base_url: str, api_key: str, model: str): """ Initialize OpenAI API client :param base_url: Base URL for OpenAI API @@ -18,29 +21,26 @@ def __init__(self, base_url:str, api_key: str, model: str): self.base_url = base_url self.api_key = api_key self.model = model - self.client = openai.OpenAI( - base_url=base_url, - api_key=api_key - ) - + self.client = openai.OpenAI(base_url=base_url, api_key=api_key) + def completion( self, user_message: str, system_prompt: Optional[str] = None, - image_paths: Optional[List[str]] = None, + image_paths: Optional[list[str]] = None, temperature: float = 0.7, - max_tokens: int = 8192 + max_tokens: int = 8192, ) -> str: """ Create chat dialogue (supports multimodal) - + Args: user_message: User message content system_prompt: System prompt (optional) image_paths: List of image paths (optional) temperature: Generation temperature max_tokens: Maximum number of tokens - + Returns: str: Model generated response content """ @@ -49,24 +49,22 @@ def completion( if image_paths: for img_path in image_paths: base64_image = self.encode_image(img_path) - user_content.append({ - "type": "image_url", - "image_url": { - "url": f"data:image/jpeg;base64,{base64_image}" + user_content.append( + { + "type": "image_url", + "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}, } - }) + ) messages = [] if system_prompt: messages = [ {"role": "system", "content": system_prompt}, - {"role": "user", "content": user_content} + {"role": "user", "content": user_content}, ] else: - messages = [ - {"role": "user", "content": user_content} - ] - + messages = [{"role": "user", "content": user_content}] + try: response = None if "openrouter.ai" in str(self.base_url).lower(): @@ -78,22 +76,23 @@ def completion( extra_headers={ "X-Title": "MarkPDFdown", "HTTP-Referer": "https://github.com/jorben/markpdfdown", - }, - ) + }, + ) else: response = self.client.chat.completions.create( model=self.model, messages=messages, temperature=temperature, - max_tokens=max_tokens - ) + max_tokens=max_tokens, + ) return response.choices[0].message.content - + except Exception as e: logger.error(f"API request failed: {str(e)}") raise e - + def encode_image(self, image_path: str) -> str: import base64 + with open(image_path, "rb") as image_file: - return base64.b64encode(image_file.read()).decode('utf-8') \ No newline at end of file + return base64.b64encode(image_file.read()).decode("utf-8") diff --git a/core/PDFWorker.py b/core/PDFWorker.py index f90ea0b..1651a3e 100644 --- a/core/PDFWorker.py +++ b/core/PDFWorker.py @@ -1,19 +1,22 @@ -import os import logging +import os + import PyPDF2 -from typing import List + from .FileWorker import FileWorker logger = logging.getLogger(__name__) + class PDFWorker(FileWorker): """ Worker class for processing PDF files """ + def __init__(self, input_path: str, start_page: int = 1, end_page: int = 0): super().__init__(input_path) self.reader = PyPDF2.PdfReader(input_path) - self.total_pages = len(self.reader.pages) + self.total_pages = len(self.reader.pages) self.start_page = start_page self.end_page = end_page self.output_dir = os.path.dirname(input_path) @@ -23,19 +26,19 @@ def __init__(self, input_path: str, start_page: int = 1, end_page: int = 0): start_page = 1 if end_page == 0 or end_page > self.total_pages: end_page = self.total_pages - + logger.info("Processing PDF from page %d to page %d", start_page, end_page) - + # If page number range is the entire document, no extraction is needed if start_page == 1 and end_page == self.total_pages: return - + # Extract specified page number range of PDF extracted_path = self.extract_pages(start_page, end_page) if not extracted_path: logger.warning("Page extraction failed, using original file") return - + logger.info("Page extraction completed") self.input_path = extracted_path @@ -47,17 +50,18 @@ def get_total_pages(self) -> int: int: Total number of pages """ return self.total_pages - - def extract_pages(self, start_page: int, end_page: int, output_name: str = None) -> str: + def extract_pages( + self, start_page: int, end_page: int, output_name: str = None + ) -> str: """ Extract PDF content from a specified page range - + Args: start_page (int): Starting page number (starts from 1) end_page (int): Ending page number (starts from 1) output_name (str): Custom output file name (optional) - + Returns: str: Generated PDF file path, empty string on failure """ @@ -65,47 +69,48 @@ def extract_pages(self, start_page: int, end_page: int, output_name: str = None) # Convert page numbers to 0-based index start = max(0, start_page - 1) end = min(self.total_pages - 1, end_page - 1) - + if start > end: start, end = end, start # Automatically correct page number order - + writer = PyPDF2.PdfWriter() - + # Add content from specified pages for page_num in range(start, end + 1): writer.add_page(self.reader.pages[page_num]) - + # Generate output file name if not output_name: - base_name = os.path.basename(self.input_path).rsplit('.', 1)[0] + base_name = os.path.basename(self.input_path).rsplit(".", 1)[0] output_name = f"{base_name}_pages_{start_page}-{end_page}.pdf" - + os.makedirs(self.output_dir, exist_ok=True) output_path = os.path.join(self.output_dir, output_name) - + # Write to file - with open(output_path, 'wb') as out_file: + with open(output_path, "wb") as out_file: writer.write(out_file) - + return output_path - + except Exception as e: logger.error(f"Page extraction failed: {str(e)}") return "" - def convert_to_images(self, dpi: int = 300, fmt: str = 'jpg') -> List[str]: + def convert_to_images(self, dpi: int = 300, fmt: str = "jpg") -> list[str]: """ Convert each PDF page to a high-quality image - + Args: dpi (int): Output image resolution (default 300) fmt (str): Image format (supports jpg/png, default jpg) - + Returns: List[str]: List of generated image paths """ try: import fitz # PyMuPDF + os.makedirs(self.output_dir, exist_ok=True) img_paths = [] @@ -113,12 +118,14 @@ def convert_to_images(self, dpi: int = 300, fmt: str = 'jpg') -> List[str]: for page_num in range(len(doc)): page = doc.load_page(page_num) pix = page.get_pixmap(dpi=dpi) - output_path = os.path.join(self.output_dir, f"page_{page_num+1:04d}.{fmt}") + output_path = os.path.join( + self.output_dir, f"page_{page_num + 1:04d}.{fmt}" + ) pix.save(output_path) img_paths.append(output_path) - + return img_paths - + except Exception as e: logger.error(f"PDF conversion to images failed: {str(e)}") - return [] \ No newline at end of file + return [] diff --git a/core/Util.py b/core/Util.py index 0cb002e..5a64530 100644 --- a/core/Util.py +++ b/core/Util.py @@ -4,9 +4,7 @@ def remove_markdown_warp(text, language="markdown"): """ text = text.strip() if text.startswith("```" + language): - text = text[len("```" + language):] + text = text[len("```" + language) :] if text.endswith("```"): - text = text[:-len("```")] + text = text[: -len("```")] return text.strip() - - diff --git a/main.py b/main.py index 94536df..adbe2ec 100644 --- a/main.py +++ b/main.py @@ -1,22 +1,30 @@ +import logging import os +import shutil import sys import time -import shutil -import logging + from core import LLMClient from core.FileWorker import create_worker -from core.Util import * +from core.Util import remove_markdown_warp logging.basicConfig( level=logging.INFO, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', - handlers=[ - logging.StreamHandler(sys.stderr) - ] + format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", + handlers=[logging.StreamHandler(sys.stderr)], ) logger = logging.getLogger(__name__) -def completion(message, model="", system_prompt="", image_paths=None, temperature=0.5, max_tokens=8192, retry_times=3): + +def completion( + message, + model="", + system_prompt="", + image_paths=None, + temperature=0.5, + max_tokens=8192, + retry_times=3, +): """ Call OpenAI's completion interface for text generation @@ -30,7 +38,7 @@ def completion(message, model="", system_prompt="", image_paths=None, temperatur Returns: str: Generated text content """ - + # Get API key and API base URL from environment variables api_key = os.getenv("OPENAI_API_KEY") if not api_key: @@ -39,7 +47,7 @@ def completion(message, model="", system_prompt="", image_paths=None, temperatur base_url = os.getenv("OPENAI_API_BASE") if not base_url: base_url = "https://api.openai.com/v1/" - + # If no model is specified, use the default model if not model: model = os.getenv("OPENAI_DEFAULT_MODEL") @@ -51,7 +59,13 @@ def completion(message, model="", system_prompt="", image_paths=None, temperatur # Call completion method with retry mechanism for _ in range(retry_times): try: - response = client.completion(user_message=message, system_prompt=system_prompt, image_paths=image_paths, temperature=temperature, max_tokens=max_tokens) + response = client.completion( + user_message=message, + system_prompt=system_prompt, + image_paths=image_paths, + temperature=temperature, + max_tokens=max_tokens, + ) return response except Exception as e: logger.error(f"LLM call failed: {str(e)}") @@ -59,6 +73,7 @@ def completion(message, model="", system_prompt="", image_paths=None, temperatur time.sleep(0.5) return "" + def convert_image_to_markdown(image_path): """ Convert image to Markdown format @@ -81,11 +96,18 @@ def convert_image_to_markdown(image_path): {example} ``` """ - - response = completion(message=user_prompt, system_prompt=system_prompt, image_paths=[image_path], temperature=0.3, max_tokens=8192) + + response = completion( + message=user_prompt, + system_prompt=system_prompt, + image_paths=[image_path], + temperature=0.3, + max_tokens=8192, + ) response = remove_markdown_warp(response, "markdown") return response + if __name__ == "__main__": start_page = 1 end_page = 0 @@ -100,7 +122,9 @@ def convert_image_to_markdown(image_path): input_data = sys.stdin.buffer.read() if not input_data: logger.error("No input data received") - logger.error("Usage: python main.py [start_page] [end_page] < path_to_input.pdf") + logger.error( + "Usage: python main.py [start_page] [end_page] < path_to_input.pdf" + ) exit(1) # Create output directory @@ -110,29 +134,29 @@ def convert_image_to_markdown(image_path): # Try to get extension from file name input_filename = os.path.basename(sys.stdin.buffer.name) input_ext = os.path.splitext(input_filename)[1] - + # If there is no extension or the file comes from standard input, try to determine the type by file content - if not input_ext or input_filename == '': + if not input_ext or input_filename == "": # PDF file magic number/signature is %PDF- - if input_data.startswith(b'%PDF-'): - input_ext = '.pdf' + if input_data.startswith(b"%PDF-"): + input_ext = ".pdf" logger.info("Recognized as PDF file by file content") # JPEG file magic number/signature is FF D8 FF DB - elif input_data.startswith(b'\xFF\xD8\xFF\xDB'): - input_ext = '.jpg' + elif input_data.startswith(b"\xff\xd8\xff\xdb"): + input_ext = ".jpg" logger.info("Recognized as JPEG file by file content") # PNG file magic number/signature is 89 50 4E 47 - elif input_data.startswith(b'\x89\x50\x4E\x47'): - input_ext = '.png' + elif input_data.startswith(b"\x89\x50\x4e\x47"): + input_ext = ".png" logger.info("Recognized as PNG file by file content") # BMP file magic number/signature is 42 4D - elif input_data.startswith(b'\x42\x4D'): - input_ext = '.bmp' + elif input_data.startswith(b"\x42\x4d"): + input_ext = ".bmp" logger.info("Recognized as BMP file by file content") else: logger.error("Unsupported file type") exit(1) - + input_path = os.path.join(output_dir, f"input{input_ext}") with open(input_path, "wb") as f: f.write(input_data) @@ -143,7 +167,7 @@ def convert_image_to_markdown(image_path): except ValueError as e: logger.error(str(e)) exit(1) - + # convert to images img_paths = worker.convert_to_images() logger.info("Image conversion completed") @@ -161,4 +185,3 @@ def convert_image_to_markdown(image_path): # Remote output path shutil.rmtree(output_dir) exit(0) - \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..e9cd1bd --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,55 @@ +[project] +name = "markpdfdown" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.9" +dependencies = [ + "openai==1.66.3", + "pymupdf==1.25.3", + "pypdf2==3.0.1", +] + +[dependency-groups] +dev = [ + "pre-commit>=4.2.0", + "pytest==8.3.5", + "ruff>=0.11.11", +] + +# Ruff 配置 +[tool.ruff] +line-length = 88 +target-version = "py313" + +[tool.ruff.lint] +select = [ + "E", # pycodestyle errors + "W", # pycodestyle warnings + "F", # pyflakes + "I", # isort + "B", # flake8-bugbear + "C4", # flake8-comprehensions + "UP", # pyupgrade +] +ignore = [ + "E501", # line too long (handled by formatter) + "UP007", # Use `X | Y` for type annotations +] + +[tool.ruff.format] +quote-style = "double" +indent-style = "space" + +[tool.ruff.lint.isort] +known-first-party = ["markpdfdown"] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["markpdfdown"] + +[tool.hatch.build.targets.wheel.force-include] +"." = "." diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index 8977a92..0000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,24 +0,0 @@ -annotated-types==0.7.0 -anyio==4.8.0 -certifi==2025.1.31 -distro==1.9.0 -exceptiongroup==1.2.2 -h11==0.14.0 -httpcore==1.0.7 -httpx==0.28.1 -idna==3.10 -iniconfig==2.0.0 -jiter==0.9.0 --e . -openai==1.66.3 -packaging==24.2 -pluggy==1.5.0 -pydantic==2.10.6 -pydantic_core==2.27.2 -PyMuPDF==1.25.3 -PyPDF2==3.0.1 -pytest==8.3.5 -sniffio==1.3.1 -tomli==2.2.1 -tqdm==4.67.1 -typing_extensions==4.12.2 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 60f1551..0000000 --- a/requirements.txt +++ /dev/null @@ -1,23 +0,0 @@ -annotated-types==0.7.0 -anyio==4.8.0 -certifi==2025.1.31 -distro==1.9.0 -exceptiongroup==1.2.2 -h11==0.14.0 -httpcore==1.0.7 -httpx==0.28.1 -idna==3.10 -iniconfig==2.0.0 -jiter==0.9.0 -openai==1.66.3 -packaging==24.2 -pluggy==1.5.0 -pydantic==2.10.6 -pydantic_core==2.27.2 -PyMuPDF==1.25.3 -PyPDF2==3.0.1 -pytest==8.3.5 -sniffio==1.3.1 -tomli==2.2.1 -tqdm==4.67.1 -typing_extensions==4.12.2 diff --git a/setup.py b/setup.py deleted file mode 100644 index 78f719d..0000000 --- a/setup.py +++ /dev/null @@ -1,11 +0,0 @@ -from setuptools import setup, find_packages - -setup( - name="markpdfdown", - version="1.0.4", - packages=find_packages(), - install_requires=[ - # 从 requirements.txt 中读取依赖 - ], - python_requires=">=3.9", -) \ No newline at end of file diff --git a/tests/cases/formula_01.md b/tests/cases/formula_01.md index b4b3508..1d02372 100644 --- a/tests/cases/formula_01.md +++ b/tests/cases/formula_01.md @@ -35,5 +35,3 @@ $p_{cls}("correct"|\tilde{X}, P) = p_M("correct"|T(P, \tilde{X}))$, (5) ¹We note that the tokenizer we used tokenizes the words "correct" and "incorrect" both into a single token. 3 - - diff --git a/tests/cases/input_tables.pdf b/tests/cases/input_tables.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8c2c5987ee6f4c7407614d0d75a7cafee53c9b1b GIT binary patch literal 63128 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%0Dt0hrIl4E9`iF>aVb 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 literal 0 HcmV?d00001 diff --git a/tests/cases/table_01.md b/tests/cases/table_01.md index 505c694..4f612d8 100644 --- a/tests/cases/table_01.md +++ b/tests/cases/table_01.md @@ -36,5 +36,3 @@ Table 3: Performance of aligned models with a scale of around 2B on benchmark. T Safety Evaluation We also evaluate the safety score of CT-LLM-SFT-DPO compared with baselines such as MiniCPM-2B-sft-fp, Bloom-1.7B, and StableIm-zephyr-3B, etc on evalues responsibility benchmark (Xu et al., 2023). The evaluation consists of two parts: multiple-choice and question-answering. The multiple-choice part includes 1,712 input examples, each comprising a human query and two candidate responses. The evaluated models are 7 - - diff --git a/tests/test_util.py b/tests/test_util.py index 3da27c9..0ca7e93 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -1,10 +1,31 @@ -from core.Util import * +from core.Util import remove_markdown_warp + def test_remove_markdown_warp(): assert remove_markdown_warp("```markdown\nHello, world!\n```") == "Hello, world!" - assert remove_markdown_warp("```markdown\nHello, world!\n```", "markdown") == "Hello, world!" - assert remove_markdown_warp("\n\n```markdown\nHello, world!\n```\n\n", "markdown") == "Hello, world!" - assert remove_markdown_warp("```markdown\nHello, world!\n\`\`\`text\nHi, world!\n\`\`\`\n```", "markdown") == "Hello, world!\n\`\`\`text\nHi, world!\n\`\`\`" - assert remove_markdown_warp("\nHello, world!\n\`\`\`text\nHi, world!\n\`\`\`\n", "markdown") == "Hello, world!\n\`\`\`text\nHi, world!\n\`\`\`" - assert remove_markdown_warp("```python\nprint('Hello, world!')\n```", "python") == "print('Hello, world!')" + assert ( + remove_markdown_warp("```markdown\nHello, world!\n```", "markdown") + == "Hello, world!" + ) + assert ( + remove_markdown_warp("\n\n```markdown\nHello, world!\n```\n\n", "markdown") + == "Hello, world!" + ) + assert ( + remove_markdown_warp( + "```markdown\nHello, world!\n\\`\\`\\`text\nHi, world!\n\\`\\`\\`\n```", + "markdown", + ) + == "Hello, world!\n\\`\\`\\`text\nHi, world!\n\\`\\`\\`" + ) + assert ( + remove_markdown_warp( + "\nHello, world!\n\\`\\`\\`text\nHi, world!\n\\`\\`\\`\n", "markdown" + ) + == "Hello, world!\n\\`\\`\\`text\nHi, world!\n\\`\\`\\`" + ) + assert ( + remove_markdown_warp("```python\nprint('Hello, world!')\n```", "python") + == "print('Hello, world!')" + ) assert remove_markdown_warp("```bash\nls -l\n```", "bash") == "ls -l" diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..c882111 --- /dev/null +++ b/uv.lock @@ -0,0 +1,684 @@ +version = 1 +revision = 2 +requires-python = ">=3.9" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" }, +] + +[[package]] +name = "certifi" +version = "2025.4.26" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705, upload-time = "2025-04-26T02:12:29.51Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618, upload-time = "2025-04-26T02:12:27.662Z" }, +] + +[[package]] +name = "cfgv" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +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" } +wheels = [ + { 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" }, +] + +[[package]] +name = "distlib" +version = "0.3.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923, upload-time = "2024-10-09T18:35:47.551Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload-time = "2024-10-09T18:35:44.272Z" }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +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" } +wheels = [ + { 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" }, +] + +[[package]] +name = "filelock" +version = "3.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload-time = "2025-03-14T07:11:40.47Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload-time = "2025-03-14T07:11:39.145Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "identify" +version = "2.6.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/88/d193a27416618628a5eea64e3223acd800b40749a96ffb322a9b55a49ed1/identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6", size = 99254, upload-time = "2025-05-23T20:37:53.3Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/cd/18f8da995b658420625f7ef13f037be53ae04ec5ad33f9b718240dcfd48c/identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2", size = 99145, upload-time = "2025-05-23T20:37:51.495Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +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" } +wheels = [ + { 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" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +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" } +wheels = [ + { 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" }, +] + +[[package]] +name = "jiter" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/9d/ae7ddb4b8ab3fb1b51faf4deb36cb48a4fbbd7cb36bad6a5fca4741306f7/jiter-0.10.0.tar.gz", hash = "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500", size = 162759, upload-time = "2025-05-18T19:04:59.73Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/7e/4011b5c77bec97cb2b572f566220364e3e21b51c48c5bd9c4a9c26b41b67/jiter-0.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cd2fb72b02478f06a900a5782de2ef47e0396b3e1f7d5aba30daeb1fce66f303", size = 317215, upload-time = "2025-05-18T19:03:04.303Z" }, + { url = "https://files.pythonhosted.org/packages/8a/4f/144c1b57c39692efc7ea7d8e247acf28e47d0912800b34d0ad815f6b2824/jiter-0.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32bb468e3af278f095d3fa5b90314728a6916d89ba3d0ffb726dd9bf7367285e", size = 322814, upload-time = "2025-05-18T19:03:06.433Z" }, + { url = "https://files.pythonhosted.org/packages/63/1f/db977336d332a9406c0b1f0b82be6f71f72526a806cbb2281baf201d38e3/jiter-0.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8b3e0068c26ddedc7abc6fac37da2d0af16b921e288a5a613f4b86f050354f", size = 345237, upload-time = "2025-05-18T19:03:07.833Z" }, + { url = "https://files.pythonhosted.org/packages/d7/1c/aa30a4a775e8a672ad7f21532bdbfb269f0706b39c6ff14e1f86bdd9e5ff/jiter-0.10.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:286299b74cc49e25cd42eea19b72aa82c515d2f2ee12d11392c56d8701f52224", size = 370999, upload-time = "2025-05-18T19:03:09.338Z" }, + { url = "https://files.pythonhosted.org/packages/35/df/f8257abc4207830cb18880781b5f5b716bad5b2a22fb4330cfd357407c5b/jiter-0.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ed5649ceeaeffc28d87fb012d25a4cd356dcd53eff5acff1f0466b831dda2a7", size = 491109, upload-time = "2025-05-18T19:03:11.13Z" }, + { url = "https://files.pythonhosted.org/packages/06/76/9e1516fd7b4278aa13a2cc7f159e56befbea9aa65c71586305e7afa8b0b3/jiter-0.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2ab0051160cb758a70716448908ef14ad476c3774bd03ddce075f3c1f90a3d6", size = 388608, upload-time = "2025-05-18T19:03:12.911Z" }, + { url = "https://files.pythonhosted.org/packages/6d/64/67750672b4354ca20ca18d3d1ccf2c62a072e8a2d452ac3cf8ced73571ef/jiter-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03997d2f37f6b67d2f5c475da4412be584e1cec273c1cfc03d642c46db43f8cf", size = 352454, upload-time = "2025-05-18T19:03:14.741Z" }, + { url = "https://files.pythonhosted.org/packages/96/4d/5c4e36d48f169a54b53a305114be3efa2bbffd33b648cd1478a688f639c1/jiter-0.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c404a99352d839fed80d6afd6c1d66071f3bacaaa5c4268983fc10f769112e90", size = 391833, upload-time = "2025-05-18T19:03:16.426Z" }, + { url = "https://files.pythonhosted.org/packages/0b/de/ce4a6166a78810bd83763d2fa13f85f73cbd3743a325469a4a9289af6dae/jiter-0.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66e989410b6666d3ddb27a74c7e50d0829704ede652fd4c858e91f8d64b403d0", size = 523646, upload-time = "2025-05-18T19:03:17.704Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a6/3bc9acce53466972964cf4ad85efecb94f9244539ab6da1107f7aed82934/jiter-0.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b532d3af9ef4f6374609a3bcb5e05a1951d3bf6190dc6b176fdb277c9bbf15ee", size = 514735, upload-time = "2025-05-18T19:03:19.44Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d8/243c2ab8426a2a4dea85ba2a2ba43df379ccece2145320dfd4799b9633c5/jiter-0.10.0-cp310-cp310-win32.whl", hash = "sha256:da9be20b333970e28b72edc4dff63d4fec3398e05770fb3205f7fb460eb48dd4", size = 210747, upload-time = "2025-05-18T19:03:21.184Z" }, + { url = "https://files.pythonhosted.org/packages/37/7a/8021bd615ef7788b98fc76ff533eaac846322c170e93cbffa01979197a45/jiter-0.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:f59e533afed0c5b0ac3eba20d2548c4a550336d8282ee69eb07b37ea526ee4e5", size = 207484, upload-time = "2025-05-18T19:03:23.046Z" }, + { url = "https://files.pythonhosted.org/packages/1b/dd/6cefc6bd68b1c3c979cecfa7029ab582b57690a31cd2f346c4d0ce7951b6/jiter-0.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3bebe0c558e19902c96e99217e0b8e8b17d570906e72ed8a87170bc290b1e978", size = 317473, upload-time = "2025-05-18T19:03:25.942Z" }, + { url = "https://files.pythonhosted.org/packages/be/cf/fc33f5159ce132be1d8dd57251a1ec7a631c7df4bd11e1cd198308c6ae32/jiter-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:558cc7e44fd8e507a236bee6a02fa17199ba752874400a0ca6cd6e2196cdb7dc", size = 321971, upload-time = "2025-05-18T19:03:27.255Z" }, + { url = "https://files.pythonhosted.org/packages/68/a4/da3f150cf1d51f6c472616fb7650429c7ce053e0c962b41b68557fdf6379/jiter-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d613e4b379a07d7c8453c5712ce7014e86c6ac93d990a0b8e7377e18505e98d", size = 345574, upload-time = "2025-05-18T19:03:28.63Z" }, + { url = "https://files.pythonhosted.org/packages/84/34/6e8d412e60ff06b186040e77da5f83bc158e9735759fcae65b37d681f28b/jiter-0.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f62cf8ba0618eda841b9bf61797f21c5ebd15a7a1e19daab76e4e4b498d515b2", size = 371028, upload-time = "2025-05-18T19:03:30.292Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d9/9ee86173aae4576c35a2f50ae930d2ccb4c4c236f6cb9353267aa1d626b7/jiter-0.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:919d139cdfa8ae8945112398511cb7fca58a77382617d279556b344867a37e61", size = 491083, upload-time = "2025-05-18T19:03:31.654Z" }, + { url = "https://files.pythonhosted.org/packages/d9/2c/f955de55e74771493ac9e188b0f731524c6a995dffdcb8c255b89c6fb74b/jiter-0.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13ddbc6ae311175a3b03bd8994881bc4635c923754932918e18da841632349db", size = 388821, upload-time = "2025-05-18T19:03:33.184Z" }, + { url = "https://files.pythonhosted.org/packages/81/5a/0e73541b6edd3f4aada586c24e50626c7815c561a7ba337d6a7eb0a915b4/jiter-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c440ea003ad10927a30521a9062ce10b5479592e8a70da27f21eeb457b4a9c5", size = 352174, upload-time = "2025-05-18T19:03:34.965Z" }, + { url = "https://files.pythonhosted.org/packages/1c/c0/61eeec33b8c75b31cae42be14d44f9e6fe3ac15a4e58010256ac3abf3638/jiter-0.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc347c87944983481e138dea467c0551080c86b9d21de6ea9306efb12ca8f606", size = 391869, upload-time = "2025-05-18T19:03:36.436Z" }, + { url = "https://files.pythonhosted.org/packages/41/22/5beb5ee4ad4ef7d86f5ea5b4509f680a20706c4a7659e74344777efb7739/jiter-0.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:13252b58c1f4d8c5b63ab103c03d909e8e1e7842d302473f482915d95fefd605", size = 523741, upload-time = "2025-05-18T19:03:38.168Z" }, + { url = "https://files.pythonhosted.org/packages/ea/10/768e8818538e5817c637b0df52e54366ec4cebc3346108a4457ea7a98f32/jiter-0.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7d1bbf3c465de4a24ab12fb7766a0003f6f9bce48b8b6a886158c4d569452dc5", size = 514527, upload-time = "2025-05-18T19:03:39.577Z" }, + { url = "https://files.pythonhosted.org/packages/73/6d/29b7c2dc76ce93cbedabfd842fc9096d01a0550c52692dfc33d3cc889815/jiter-0.10.0-cp311-cp311-win32.whl", hash = "sha256:db16e4848b7e826edca4ccdd5b145939758dadf0dc06e7007ad0e9cfb5928ae7", size = 210765, upload-time = "2025-05-18T19:03:41.271Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c9/d394706deb4c660137caf13e33d05a031d734eb99c051142e039d8ceb794/jiter-0.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c9c1d5f10e18909e993f9641f12fe1c77b3e9b533ee94ffa970acc14ded3812", size = 209234, upload-time = "2025-05-18T19:03:42.918Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b5/348b3313c58f5fbfb2194eb4d07e46a35748ba6e5b3b3046143f3040bafa/jiter-0.10.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1e274728e4a5345a6dde2d343c8da018b9d4bd4350f5a472fa91f66fda44911b", size = 312262, upload-time = "2025-05-18T19:03:44.637Z" }, + { url = "https://files.pythonhosted.org/packages/9c/4a/6a2397096162b21645162825f058d1709a02965606e537e3304b02742e9b/jiter-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7202ae396446c988cb2a5feb33a543ab2165b786ac97f53b59aafb803fef0744", size = 320124, upload-time = "2025-05-18T19:03:46.341Z" }, + { url = "https://files.pythonhosted.org/packages/2a/85/1ce02cade7516b726dd88f59a4ee46914bf79d1676d1228ef2002ed2f1c9/jiter-0.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ba7722d6748b6920ed02a8f1726fb4b33e0fd2f3f621816a8b486c66410ab2", size = 345330, upload-time = "2025-05-18T19:03:47.596Z" }, + { url = "https://files.pythonhosted.org/packages/75/d0/bb6b4f209a77190ce10ea8d7e50bf3725fc16d3372d0a9f11985a2b23eff/jiter-0.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:371eab43c0a288537d30e1f0b193bc4eca90439fc08a022dd83e5e07500ed026", size = 369670, upload-time = "2025-05-18T19:03:49.334Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f5/a61787da9b8847a601e6827fbc42ecb12be2c925ced3252c8ffcb56afcaf/jiter-0.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c675736059020365cebc845a820214765162728b51ab1e03a1b7b3abb70f74c", size = 489057, upload-time = "2025-05-18T19:03:50.66Z" }, + { url = "https://files.pythonhosted.org/packages/12/e4/6f906272810a7b21406c760a53aadbe52e99ee070fc5c0cb191e316de30b/jiter-0.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c5867d40ab716e4684858e4887489685968a47e3ba222e44cde6e4a2154f959", size = 389372, upload-time = "2025-05-18T19:03:51.98Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ba/77013b0b8ba904bf3762f11e0129b8928bff7f978a81838dfcc958ad5728/jiter-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395bb9a26111b60141757d874d27fdea01b17e8fac958b91c20128ba8f4acc8a", size = 352038, upload-time = "2025-05-18T19:03:53.703Z" }, + { url = "https://files.pythonhosted.org/packages/67/27/c62568e3ccb03368dbcc44a1ef3a423cb86778a4389e995125d3d1aaa0a4/jiter-0.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6842184aed5cdb07e0c7e20e5bdcfafe33515ee1741a6835353bb45fe5d1bd95", size = 391538, upload-time = "2025-05-18T19:03:55.046Z" }, + { url = "https://files.pythonhosted.org/packages/c0/72/0d6b7e31fc17a8fdce76164884edef0698ba556b8eb0af9546ae1a06b91d/jiter-0.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62755d1bcea9876770d4df713d82606c8c1a3dca88ff39046b85a048566d56ea", size = 523557, upload-time = "2025-05-18T19:03:56.386Z" }, + { url = "https://files.pythonhosted.org/packages/2f/09/bc1661fbbcbeb6244bd2904ff3a06f340aa77a2b94e5a7373fd165960ea3/jiter-0.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533efbce2cacec78d5ba73a41756beff8431dfa1694b6346ce7af3a12c42202b", size = 514202, upload-time = "2025-05-18T19:03:57.675Z" }, + { url = "https://files.pythonhosted.org/packages/1b/84/5a5d5400e9d4d54b8004c9673bbe4403928a00d28529ff35b19e9d176b19/jiter-0.10.0-cp312-cp312-win32.whl", hash = "sha256:8be921f0cadd245e981b964dfbcd6fd4bc4e254cdc069490416dd7a2632ecc01", size = 211781, upload-time = "2025-05-18T19:03:59.025Z" }, + { url = "https://files.pythonhosted.org/packages/9b/52/7ec47455e26f2d6e5f2ea4951a0652c06e5b995c291f723973ae9e724a65/jiter-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:a7c7d785ae9dda68c2678532a5a1581347e9c15362ae9f6e68f3fdbfb64f2e49", size = 206176, upload-time = "2025-05-18T19:04:00.305Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b0/279597e7a270e8d22623fea6c5d4eeac328e7d95c236ed51a2b884c54f70/jiter-0.10.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e0588107ec8e11b6f5ef0e0d656fb2803ac6cf94a96b2b9fc675c0e3ab5e8644", size = 311617, upload-time = "2025-05-18T19:04:02.078Z" }, + { url = "https://files.pythonhosted.org/packages/91/e3/0916334936f356d605f54cc164af4060e3e7094364add445a3bc79335d46/jiter-0.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cafc4628b616dc32530c20ee53d71589816cf385dd9449633e910d596b1f5c8a", size = 318947, upload-time = "2025-05-18T19:04:03.347Z" }, + { url = "https://files.pythonhosted.org/packages/6a/8e/fd94e8c02d0e94539b7d669a7ebbd2776e51f329bb2c84d4385e8063a2ad/jiter-0.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:520ef6d981172693786a49ff5b09eda72a42e539f14788124a07530f785c3ad6", size = 344618, upload-time = "2025-05-18T19:04:04.709Z" }, + { url = "https://files.pythonhosted.org/packages/6f/b0/f9f0a2ec42c6e9c2e61c327824687f1e2415b767e1089c1d9135f43816bd/jiter-0.10.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:554dedfd05937f8fc45d17ebdf298fe7e0c77458232bcb73d9fbbf4c6455f5b3", size = 368829, upload-time = "2025-05-18T19:04:06.912Z" }, + { url = "https://files.pythonhosted.org/packages/e8/57/5bbcd5331910595ad53b9fd0c610392ac68692176f05ae48d6ce5c852967/jiter-0.10.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bc299da7789deacf95f64052d97f75c16d4fc8c4c214a22bf8d859a4288a1c2", size = 491034, upload-time = "2025-05-18T19:04:08.222Z" }, + { url = "https://files.pythonhosted.org/packages/9b/be/c393df00e6e6e9e623a73551774449f2f23b6ec6a502a3297aeeece2c65a/jiter-0.10.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5161e201172de298a8a1baad95eb85db4fb90e902353b1f6a41d64ea64644e25", size = 388529, upload-time = "2025-05-18T19:04:09.566Z" }, + { url = "https://files.pythonhosted.org/packages/42/3e/df2235c54d365434c7f150b986a6e35f41ebdc2f95acea3036d99613025d/jiter-0.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2227db6ba93cb3e2bf67c87e594adde0609f146344e8207e8730364db27041", size = 350671, upload-time = "2025-05-18T19:04:10.98Z" }, + { url = "https://files.pythonhosted.org/packages/c6/77/71b0b24cbcc28f55ab4dbfe029f9a5b73aeadaba677843fc6dc9ed2b1d0a/jiter-0.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15acb267ea5e2c64515574b06a8bf393fbfee6a50eb1673614aa45f4613c0cca", size = 390864, upload-time = "2025-05-18T19:04:12.722Z" }, + { url = "https://files.pythonhosted.org/packages/6a/d3/ef774b6969b9b6178e1d1e7a89a3bd37d241f3d3ec5f8deb37bbd203714a/jiter-0.10.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:901b92f2e2947dc6dfcb52fd624453862e16665ea909a08398dde19c0731b7f4", size = 522989, upload-time = "2025-05-18T19:04:14.261Z" }, + { url = "https://files.pythonhosted.org/packages/0c/41/9becdb1d8dd5d854142f45a9d71949ed7e87a8e312b0bede2de849388cb9/jiter-0.10.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d0cb9a125d5a3ec971a094a845eadde2db0de85b33c9f13eb94a0c63d463879e", size = 513495, upload-time = "2025-05-18T19:04:15.603Z" }, + { url = "https://files.pythonhosted.org/packages/9c/36/3468e5a18238bdedae7c4d19461265b5e9b8e288d3f86cd89d00cbb48686/jiter-0.10.0-cp313-cp313-win32.whl", hash = "sha256:48a403277ad1ee208fb930bdf91745e4d2d6e47253eedc96e2559d1e6527006d", size = 211289, upload-time = "2025-05-18T19:04:17.541Z" }, + { url = "https://files.pythonhosted.org/packages/7e/07/1c96b623128bcb913706e294adb5f768fb7baf8db5e1338ce7b4ee8c78ef/jiter-0.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:75f9eb72ecb640619c29bf714e78c9c46c9c4eaafd644bf78577ede459f330d4", size = 205074, upload-time = "2025-05-18T19:04:19.21Z" }, + { url = "https://files.pythonhosted.org/packages/54/46/caa2c1342655f57d8f0f2519774c6d67132205909c65e9aa8255e1d7b4f4/jiter-0.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:28ed2a4c05a1f32ef0e1d24c2611330219fed727dae01789f4a335617634b1ca", size = 318225, upload-time = "2025-05-18T19:04:20.583Z" }, + { url = "https://files.pythonhosted.org/packages/43/84/c7d44c75767e18946219ba2d703a5a32ab37b0bc21886a97bc6062e4da42/jiter-0.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a4c418b1ec86a195f1ca69da8b23e8926c752b685af665ce30777233dfe070", size = 350235, upload-time = "2025-05-18T19:04:22.363Z" }, + { url = "https://files.pythonhosted.org/packages/01/16/f5a0135ccd968b480daad0e6ab34b0c7c5ba3bc447e5088152696140dcb3/jiter-0.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d7bfed2fe1fe0e4dda6ef682cee888ba444b21e7a6553e03252e4feb6cf0adca", size = 207278, upload-time = "2025-05-18T19:04:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9b/1d646da42c3de6c2188fdaa15bce8ecb22b635904fc68be025e21249ba44/jiter-0.10.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:5e9251a5e83fab8d87799d3e1a46cb4b7f2919b895c6f4483629ed2446f66522", size = 310866, upload-time = "2025-05-18T19:04:24.891Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0e/26538b158e8a7c7987e94e7aeb2999e2e82b1f9d2e1f6e9874ddf71ebda0/jiter-0.10.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:023aa0204126fe5b87ccbcd75c8a0d0261b9abdbbf46d55e7ae9f8e22424eeb8", size = 318772, upload-time = "2025-05-18T19:04:26.161Z" }, + { url = "https://files.pythonhosted.org/packages/7b/fb/d302893151caa1c2636d6574d213e4b34e31fd077af6050a9c5cbb42f6fb/jiter-0.10.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c189c4f1779c05f75fc17c0c1267594ed918996a231593a21a5ca5438445216", size = 344534, upload-time = "2025-05-18T19:04:27.495Z" }, + { url = "https://files.pythonhosted.org/packages/01/d8/5780b64a149d74e347c5128d82176eb1e3241b1391ac07935693466d6219/jiter-0.10.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15720084d90d1098ca0229352607cd68256c76991f6b374af96f36920eae13c4", size = 369087, upload-time = "2025-05-18T19:04:28.896Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5b/f235a1437445160e777544f3ade57544daf96ba7e96c1a5b24a6f7ac7004/jiter-0.10.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4f2fb68e5f1cfee30e2b2a09549a00683e0fde4c6a2ab88c94072fc33cb7426", size = 490694, upload-time = "2025-05-18T19:04:30.183Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/9c3d4617caa2ff89cf61b41e83820c27ebb3f7b5fae8a72901e8cd6ff9be/jiter-0.10.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce541693355fc6da424c08b7edf39a2895f58d6ea17d92cc2b168d20907dee12", size = 388992, upload-time = "2025-05-18T19:04:32.028Z" }, + { url = "https://files.pythonhosted.org/packages/68/b1/344fd14049ba5c94526540af7eb661871f9c54d5f5601ff41a959b9a0bbd/jiter-0.10.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31c50c40272e189d50006ad5c73883caabb73d4e9748a688b216e85a9a9ca3b9", size = 351723, upload-time = "2025-05-18T19:04:33.467Z" }, + { url = "https://files.pythonhosted.org/packages/41/89/4c0e345041186f82a31aee7b9d4219a910df672b9fef26f129f0cda07a29/jiter-0.10.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa3402a2ff9815960e0372a47b75c76979d74402448509ccd49a275fa983ef8a", size = 392215, upload-time = "2025-05-18T19:04:34.827Z" }, + { url = "https://files.pythonhosted.org/packages/55/58/ee607863e18d3f895feb802154a2177d7e823a7103f000df182e0f718b38/jiter-0.10.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:1956f934dca32d7bb647ea21d06d93ca40868b505c228556d3373cbd255ce853", size = 522762, upload-time = "2025-05-18T19:04:36.19Z" }, + { url = "https://files.pythonhosted.org/packages/15/d0/9123fb41825490d16929e73c212de9a42913d68324a8ce3c8476cae7ac9d/jiter-0.10.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:fcedb049bdfc555e261d6f65a6abe1d5ad68825b7202ccb9692636c70fcced86", size = 513427, upload-time = "2025-05-18T19:04:37.544Z" }, + { url = "https://files.pythonhosted.org/packages/d8/b3/2bd02071c5a2430d0b70403a34411fc519c2f227da7b03da9ba6a956f931/jiter-0.10.0-cp314-cp314-win32.whl", hash = "sha256:ac509f7eccca54b2a29daeb516fb95b6f0bd0d0d8084efaf8ed5dfc7b9f0b357", size = 210127, upload-time = "2025-05-18T19:04:38.837Z" }, + { url = "https://files.pythonhosted.org/packages/03/0c/5fe86614ea050c3ecd728ab4035534387cd41e7c1855ef6c031f1ca93e3f/jiter-0.10.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5ed975b83a2b8639356151cef5c0d597c68376fc4922b45d0eb384ac058cfa00", size = 318527, upload-time = "2025-05-18T19:04:40.612Z" }, + { url = "https://files.pythonhosted.org/packages/b3/4a/4175a563579e884192ba6e81725fc0448b042024419be8d83aa8a80a3f44/jiter-0.10.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa96f2abba33dc77f79b4cf791840230375f9534e5fac927ccceb58c5e604a5", size = 354213, upload-time = "2025-05-18T19:04:41.894Z" }, + { url = "https://files.pythonhosted.org/packages/98/fd/aced428e2bd3c6c1132f67c5a708f9e7fd161d0ca8f8c5862b17b93cdf0a/jiter-0.10.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bd6292a43c0fc09ce7c154ec0fa646a536b877d1e8f2f96c19707f65355b5a4d", size = 317665, upload-time = "2025-05-18T19:04:43.417Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2e/47d42f15d53ed382aef8212a737101ae2720e3697a954f9b95af06d34e89/jiter-0.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39de429dcaeb6808d75ffe9effefe96a4903c6a4b376b2f6d08d77c1aaee2f18", size = 312152, upload-time = "2025-05-18T19:04:44.797Z" }, + { url = "https://files.pythonhosted.org/packages/7b/02/aae834228ef4834fc18718724017995ace8da5f70aa1ec225b9bc2b2d7aa/jiter-0.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52ce124f13a7a616fad3bb723f2bfb537d78239d1f7f219566dc52b6f2a9e48d", size = 346708, upload-time = "2025-05-18T19:04:46.127Z" }, + { url = "https://files.pythonhosted.org/packages/35/d4/6ff39dee2d0a9abd69d8a3832ce48a3aa644eed75e8515b5ff86c526ca9a/jiter-0.10.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:166f3606f11920f9a1746b2eea84fa2c0a5d50fd313c38bdea4edc072000b0af", size = 371360, upload-time = "2025-05-18T19:04:47.448Z" }, + { url = "https://files.pythonhosted.org/packages/a9/67/c749d962b4eb62445867ae4e64a543cbb5d63cc7d78ada274ac515500a7f/jiter-0.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28dcecbb4ba402916034fc14eba7709f250c4d24b0c43fc94d187ee0580af181", size = 492105, upload-time = "2025-05-18T19:04:48.792Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d3/8fe1b1bae5161f27b1891c256668f598fa4c30c0a7dacd668046a6215fca/jiter-0.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86c5aa6910f9bebcc7bc4f8bc461aff68504388b43bfe5e5c0bd21efa33b52f4", size = 389577, upload-time = "2025-05-18T19:04:50.13Z" }, + { url = "https://files.pythonhosted.org/packages/ef/28/ecb19d789b4777898a4252bfaac35e3f8caf16c93becd58dcbaac0dc24ad/jiter-0.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ceeb52d242b315d7f1f74b441b6a167f78cea801ad7c11c36da77ff2d42e8a28", size = 353849, upload-time = "2025-05-18T19:04:51.443Z" }, + { url = "https://files.pythonhosted.org/packages/77/69/261f798f84790da6482ebd8c87ec976192b8c846e79444d0a2e0d33ebed8/jiter-0.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ff76d8887c8c8ee1e772274fcf8cc1071c2c58590d13e33bd12d02dc9a560397", size = 392029, upload-time = "2025-05-18T19:04:52.792Z" }, + { url = "https://files.pythonhosted.org/packages/cb/08/b8d15140d4d91f16faa2f5d416c1a71ab1bbe2b66c57197b692d04c0335f/jiter-0.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a9be4d0fa2b79f7222a88aa488bd89e2ae0a0a5b189462a12def6ece2faa45f1", size = 524386, upload-time = "2025-05-18T19:04:54.203Z" }, + { url = "https://files.pythonhosted.org/packages/9b/1d/23c41765cc95c0e23ac492a88450d34bf0fd87a37218d1b97000bffe0f53/jiter-0.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ab7fd8738094139b6c1ab1822d6f2000ebe41515c537235fd45dabe13ec9324", size = 515234, upload-time = "2025-05-18T19:04:55.838Z" }, + { url = "https://files.pythonhosted.org/packages/9f/14/381d8b151132e79790579819c3775be32820569f23806769658535fe467f/jiter-0.10.0-cp39-cp39-win32.whl", hash = "sha256:5f51e048540dd27f204ff4a87f5d79294ea0aa3aa552aca34934588cf27023cf", size = 211436, upload-time = "2025-05-18T19:04:57.183Z" }, + { url = "https://files.pythonhosted.org/packages/59/66/f23ae51dea8ee8ce429027b60008ca895d0fa0704f0c7fe5f09014a6cffb/jiter-0.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:1b28302349dc65703a9e4ead16f163b1c339efffbe1049c30a44b001a2a4fff9", size = 208777, upload-time = "2025-05-18T19:04:58.454Z" }, +] + +[[package]] +name = "markpdfdown" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "openai" }, + { name = "pymupdf" }, + { name = "pypdf2" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pre-commit" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "openai", specifier = "==1.66.3" }, + { name = "pymupdf", specifier = "==1.25.3" }, + { name = "pypdf2", specifier = "==3.0.1" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "pre-commit", specifier = ">=4.2.0" }, + { name = "pytest", specifier = "==8.3.5" }, + { name = "ruff", specifier = ">=0.11.11" }, +] + +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, +] + +[[package]] +name = "openai" +version = "1.66.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/77/5172104ca1df35ed2ed8fb26dbc787f721c39498fc51d666c4db07756a0c/openai-1.66.3.tar.gz", hash = "sha256:8dde3aebe2d081258d4159c4cb27bdc13b5bb3f7ea2201d9bd940b9a89faf0c9", size = 397244, upload-time = "2025-03-12T19:54:07.03Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/5a/e20182f7b6171642d759c548daa0ba20a1d3ac10d2bd0a13fd75704a9ac3/openai-1.66.3-py3-none-any.whl", hash = "sha256:a427c920f727711877ab17c11b95f1230b27767ba7a01e5b66102945141ceca9", size = 567400, upload-time = "2025-03-12T19:54:05.466Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +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" } +wheels = [ + { 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" }, +] + +[[package]] +name = "platformdirs" +version = "4.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +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" } +wheels = [ + { 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" }, +] + +[[package]] +name = "pre-commit" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424, upload-time = "2025-03-18T21:35:20.987Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707, upload-time = "2025-03-18T21:35:19.343Z" }, +] + +[[package]] +name = "pydantic" +version = "2.11.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f0/86/8ce9040065e8f924d642c58e4a344e33163a07f6b57f836d0d734e0ad3fb/pydantic-2.11.5.tar.gz", hash = "sha256:7f853db3d0ce78ce8bbb148c401c2cdd6431b3473c0cdff2755c7690952a7b7a", size = 787102, upload-time = "2025-05-22T21:18:08.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/69/831ed22b38ff9b4b64b66569f0e5b7b97cf3638346eb95a2147fdb49ad5f/pydantic-2.11.5-py3-none-any.whl", hash = "sha256:f9c26ba06f9747749ca1e5c94d6a85cb84254577553c8785576fd38fa64dc0f7", size = 444229, upload-time = "2025-05-22T21:18:06.329Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/92/b31726561b5dae176c2d2c2dc43a9c5bfba5d32f96f8b4c0a600dd492447/pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", size = 2028817, upload-time = "2025-04-23T18:30:43.919Z" }, + { url = "https://files.pythonhosted.org/packages/a3/44/3f0b95fafdaca04a483c4e685fe437c6891001bf3ce8b2fded82b9ea3aa1/pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", size = 1861357, upload-time = "2025-04-23T18:30:46.372Z" }, + { url = "https://files.pythonhosted.org/packages/30/97/e8f13b55766234caae05372826e8e4b3b96e7b248be3157f53237682e43c/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", size = 1898011, upload-time = "2025-04-23T18:30:47.591Z" }, + { url = "https://files.pythonhosted.org/packages/9b/a3/99c48cf7bafc991cc3ee66fd544c0aae8dc907b752f1dad2d79b1b5a471f/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", size = 1982730, upload-time = "2025-04-23T18:30:49.328Z" }, + { url = "https://files.pythonhosted.org/packages/de/8e/a5b882ec4307010a840fb8b58bd9bf65d1840c92eae7534c7441709bf54b/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", size = 2136178, upload-time = "2025-04-23T18:30:50.907Z" }, + { url = "https://files.pythonhosted.org/packages/e4/bb/71e35fc3ed05af6834e890edb75968e2802fe98778971ab5cba20a162315/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", size = 2736462, upload-time = "2025-04-23T18:30:52.083Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/c8f7593e6bc7066289bbc366f2235701dcbebcd1ff0ef8e64f6f239fb47d/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", size = 2005652, upload-time = "2025-04-23T18:30:53.389Z" }, + { url = "https://files.pythonhosted.org/packages/d2/7a/996d8bd75f3eda405e3dd219ff5ff0a283cd8e34add39d8ef9157e722867/pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", size = 2113306, upload-time = "2025-04-23T18:30:54.661Z" }, + { url = "https://files.pythonhosted.org/packages/ff/84/daf2a6fb2db40ffda6578a7e8c5a6e9c8affb251a05c233ae37098118788/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", size = 2073720, upload-time = "2025-04-23T18:30:56.11Z" }, + { url = "https://files.pythonhosted.org/packages/77/fb/2258da019f4825128445ae79456a5499c032b55849dbd5bed78c95ccf163/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", size = 2244915, upload-time = "2025-04-23T18:30:57.501Z" }, + { url = "https://files.pythonhosted.org/packages/d8/7a/925ff73756031289468326e355b6fa8316960d0d65f8b5d6b3a3e7866de7/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", size = 2241884, upload-time = "2025-04-23T18:30:58.867Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b0/249ee6d2646f1cdadcb813805fe76265745c4010cf20a8eba7b0e639d9b2/pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", size = 1910496, upload-time = "2025-04-23T18:31:00.078Z" }, + { url = "https://files.pythonhosted.org/packages/66/ff/172ba8f12a42d4b552917aa65d1f2328990d3ccfc01d5b7c943ec084299f/pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", size = 1955019, upload-time = "2025-04-23T18:31:01.335Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584, upload-time = "2025-04-23T18:31:03.106Z" }, + { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071, upload-time = "2025-04-23T18:31:04.621Z" }, + { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823, upload-time = "2025-04-23T18:31:06.377Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792, upload-time = "2025-04-23T18:31:07.93Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338, upload-time = "2025-04-23T18:31:09.283Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998, upload-time = "2025-04-23T18:31:11.7Z" }, + { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200, upload-time = "2025-04-23T18:31:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890, upload-time = "2025-04-23T18:31:15.011Z" }, + { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359, upload-time = "2025-04-23T18:31:16.393Z" }, + { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883, upload-time = "2025-04-23T18:31:17.892Z" }, + { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074, upload-time = "2025-04-23T18:31:19.205Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538, upload-time = "2025-04-23T18:31:20.541Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909, upload-time = "2025-04-23T18:31:22.371Z" }, + { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786, upload-time = "2025-04-23T18:31:24.161Z" }, + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, + { url = "https://files.pythonhosted.org/packages/53/ea/bbe9095cdd771987d13c82d104a9c8559ae9aec1e29f139e286fd2e9256e/pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d", size = 2028677, upload-time = "2025-04-23T18:32:27.227Z" }, + { url = "https://files.pythonhosted.org/packages/49/1d/4ac5ed228078737d457a609013e8f7edc64adc37b91d619ea965758369e5/pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954", size = 1864735, upload-time = "2025-04-23T18:32:29.019Z" }, + { url = "https://files.pythonhosted.org/packages/23/9a/2e70d6388d7cda488ae38f57bc2f7b03ee442fbcf0d75d848304ac7e405b/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb", size = 1898467, upload-time = "2025-04-23T18:32:31.119Z" }, + { url = "https://files.pythonhosted.org/packages/ff/2e/1568934feb43370c1ffb78a77f0baaa5a8b6897513e7a91051af707ffdc4/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7", size = 1983041, upload-time = "2025-04-23T18:32:33.655Z" }, + { url = "https://files.pythonhosted.org/packages/01/1a/1a1118f38ab64eac2f6269eb8c120ab915be30e387bb561e3af904b12499/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4", size = 2136503, upload-time = "2025-04-23T18:32:35.519Z" }, + { url = "https://files.pythonhosted.org/packages/5c/da/44754d1d7ae0f22d6d3ce6c6b1486fc07ac2c524ed8f6eca636e2e1ee49b/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b", size = 2736079, upload-time = "2025-04-23T18:32:37.659Z" }, + { url = "https://files.pythonhosted.org/packages/4d/98/f43cd89172220ec5aa86654967b22d862146bc4d736b1350b4c41e7c9c03/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3", size = 2006508, upload-time = "2025-04-23T18:32:39.637Z" }, + { url = "https://files.pythonhosted.org/packages/2b/cc/f77e8e242171d2158309f830f7d5d07e0531b756106f36bc18712dc439df/pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a", size = 2113693, upload-time = "2025-04-23T18:32:41.818Z" }, + { url = "https://files.pythonhosted.org/packages/54/7a/7be6a7bd43e0a47c147ba7fbf124fe8aaf1200bc587da925509641113b2d/pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782", size = 2074224, upload-time = "2025-04-23T18:32:44.033Z" }, + { url = "https://files.pythonhosted.org/packages/2a/07/31cf8fadffbb03be1cb520850e00a8490c0927ec456e8293cafda0726184/pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9", size = 2245403, upload-time = "2025-04-23T18:32:45.836Z" }, + { url = "https://files.pythonhosted.org/packages/b6/8d/bbaf4c6721b668d44f01861f297eb01c9b35f612f6b8e14173cb204e6240/pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e", size = 2242331, upload-time = "2025-04-23T18:32:47.618Z" }, + { url = "https://files.pythonhosted.org/packages/bb/93/3cc157026bca8f5006250e74515119fcaa6d6858aceee8f67ab6dc548c16/pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9", size = 1910571, upload-time = "2025-04-23T18:32:49.401Z" }, + { url = "https://files.pythonhosted.org/packages/5b/90/7edc3b2a0d9f0dda8806c04e511a67b0b7a41d2187e2003673a996fb4310/pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3", size = 1956504, upload-time = "2025-04-23T18:32:51.287Z" }, + { url = "https://files.pythonhosted.org/packages/30/68/373d55e58b7e83ce371691f6eaa7175e3a24b956c44628eb25d7da007917/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", size = 2023982, upload-time = "2025-04-23T18:32:53.14Z" }, + { url = "https://files.pythonhosted.org/packages/a4/16/145f54ac08c96a63d8ed6442f9dec17b2773d19920b627b18d4f10a061ea/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", size = 1858412, upload-time = "2025-04-23T18:32:55.52Z" }, + { url = "https://files.pythonhosted.org/packages/41/b1/c6dc6c3e2de4516c0bb2c46f6a373b91b5660312342a0cf5826e38ad82fa/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", size = 1892749, upload-time = "2025-04-23T18:32:57.546Z" }, + { url = "https://files.pythonhosted.org/packages/12/73/8cd57e20afba760b21b742106f9dbdfa6697f1570b189c7457a1af4cd8a0/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", size = 2067527, upload-time = "2025-04-23T18:32:59.771Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d5/0bb5d988cc019b3cba4a78f2d4b3854427fc47ee8ec8e9eaabf787da239c/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", size = 2108225, upload-time = "2025-04-23T18:33:04.51Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c5/00c02d1571913d496aabf146106ad8239dc132485ee22efe08085084ff7c/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", size = 2069490, upload-time = "2025-04-23T18:33:06.391Z" }, + { url = "https://files.pythonhosted.org/packages/22/a8/dccc38768274d3ed3a59b5d06f59ccb845778687652daa71df0cab4040d7/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", size = 2237525, upload-time = "2025-04-23T18:33:08.44Z" }, + { url = "https://files.pythonhosted.org/packages/d4/e7/4f98c0b125dda7cf7ccd14ba936218397b44f50a56dd8c16a3091df116c3/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", size = 2238446, upload-time = "2025-04-23T18:33:10.313Z" }, + { url = "https://files.pythonhosted.org/packages/ce/91/2ec36480fdb0b783cd9ef6795753c1dea13882f2e68e73bce76ae8c21e6a/pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", size = 2066678, upload-time = "2025-04-23T18:33:12.224Z" }, + { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200, upload-time = "2025-04-23T18:33:14.199Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123, upload-time = "2025-04-23T18:33:16.555Z" }, + { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852, upload-time = "2025-04-23T18:33:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484, upload-time = "2025-04-23T18:33:20.475Z" }, + { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896, upload-time = "2025-04-23T18:33:22.501Z" }, + { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475, upload-time = "2025-04-23T18:33:24.528Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013, upload-time = "2025-04-23T18:33:26.621Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715, upload-time = "2025-04-23T18:33:28.656Z" }, + { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" }, + { url = "https://files.pythonhosted.org/packages/08/98/dbf3fdfabaf81cda5622154fda78ea9965ac467e3239078e0dcd6df159e7/pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101", size = 2024034, upload-time = "2025-04-23T18:33:32.843Z" }, + { url = "https://files.pythonhosted.org/packages/8d/99/7810aa9256e7f2ccd492590f86b79d370df1e9292f1f80b000b6a75bd2fb/pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64", size = 1858578, upload-time = "2025-04-23T18:33:34.912Z" }, + { url = "https://files.pythonhosted.org/packages/d8/60/bc06fa9027c7006cc6dd21e48dbf39076dc39d9abbaf718a1604973a9670/pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d", size = 1892858, upload-time = "2025-04-23T18:33:36.933Z" }, + { url = "https://files.pythonhosted.org/packages/f2/40/9d03997d9518816c68b4dfccb88969756b9146031b61cd37f781c74c9b6a/pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535", size = 2068498, upload-time = "2025-04-23T18:33:38.997Z" }, + { url = "https://files.pythonhosted.org/packages/d8/62/d490198d05d2d86672dc269f52579cad7261ced64c2df213d5c16e0aecb1/pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d", size = 2108428, upload-time = "2025-04-23T18:33:41.18Z" }, + { url = "https://files.pythonhosted.org/packages/9a/ec/4cd215534fd10b8549015f12ea650a1a973da20ce46430b68fc3185573e8/pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6", size = 2069854, upload-time = "2025-04-23T18:33:43.446Z" }, + { url = "https://files.pythonhosted.org/packages/1a/1a/abbd63d47e1d9b0d632fee6bb15785d0889c8a6e0a6c3b5a8e28ac1ec5d2/pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca", size = 2237859, upload-time = "2025-04-23T18:33:45.56Z" }, + { url = "https://files.pythonhosted.org/packages/80/1c/fa883643429908b1c90598fd2642af8839efd1d835b65af1f75fba4d94fe/pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039", size = 2239059, upload-time = "2025-04-23T18:33:47.735Z" }, + { url = "https://files.pythonhosted.org/packages/d4/29/3cade8a924a61f60ccfa10842f75eb12787e1440e2b8660ceffeb26685e7/pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27", size = 2066661, upload-time = "2025-04-23T18:33:49.995Z" }, +] + +[[package]] +name = "pymupdf" +version = "1.25.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/47/b61c1c44b87cbdaeecdec3f43ce524ed6b3c72172bc6184eb82c94fbc43d/pymupdf-1.25.3.tar.gz", hash = "sha256:b640187c64c5ac5d97505a92e836da299da79c2f689f3f94a67a37a493492193", size = 67259841, upload-time = "2025-02-06T13:06:03.067Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/9b/98ef4b98309e9db3baa9fe572f0e61b6130bb9852d13189970f35b703499/pymupdf-1.25.3-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:96878e1b748f9c2011aecb2028c5f96b5a347a9a91169130ad0133053d97915e", size = 19343576, upload-time = "2025-02-06T13:03:51.663Z" }, + { url = "https://files.pythonhosted.org/packages/14/62/4e12126db174c8cfbf692281cda971cc4046c5f5226032c2cfaa6f83e08d/pymupdf-1.25.3-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:6ef753005b72ebfd23470f72f7e30f61e21b0b5e748045ec5b8f89e6e3068d62", size = 18580114, upload-time = "2025-02-06T13:03:25.619Z" }, + { url = "https://files.pythonhosted.org/packages/ec/c5/cf7ecf005e4f8ba3664d6aaa0613adeba4c2ab524832c452c69857e7184f/pymupdf-1.25.3-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cbff443d899f37b17f1e67563cc03673d50b4bf33ccc237e73d34f18f3a07ccf", size = 19442580, upload-time = "2025-03-12T11:47:22.196Z" }, + { url = "https://files.pythonhosted.org/packages/52/de/bd1418e31f73d37b8381cd5deacfd681e6be702b8890e123e83724569ee1/pymupdf-1.25.3-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:46d90c4f9e62d1856e8db4b9f04a202ff4a7f086a816af73abdc86adb7f5e25a", size = 19999825, upload-time = "2025-02-06T13:04:39.487Z" }, + { url = "https://files.pythonhosted.org/packages/42/ee/3c449b0de061440ba1ac984aa845315e9e2dca0ff2003c5adfc6febff203/pymupdf-1.25.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5de51efdbe4d486b6c1111c84e8a231cbfb426f3d6ff31ab530ad70e6f39756", size = 21123157, upload-time = "2025-02-06T13:03:06.966Z" }, + { url = "https://files.pythonhosted.org/packages/83/53/71faaaf91c56f2883b13f3dd849bf2697f012eb35eb7b952d62734cff41f/pymupdf-1.25.3-cp39-abi3-win32.whl", hash = "sha256:bca72e6089f985d800596e22973f79cc08af6cbff1d93e5bda9248326a03857c", size = 15094211, upload-time = "2025-02-06T13:04:52.08Z" }, + { url = "https://files.pythonhosted.org/packages/09/e0/d72e88a1d5e23aa381fd463057dc3d0fb29090e1e7308a870c334716579c/pymupdf-1.25.3-cp39-abi3-win_amd64.whl", hash = "sha256:4fb357438c9129fbf939b5af85323434df64e36759c399c376b62ad6da95498c", size = 16542949, upload-time = "2025-02-06T13:04:22.444Z" }, +] + +[[package]] +name = "pypdf2" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/bb/18dc3062d37db6c491392007dfd1a7f524bb95886eb956569ac38a23a784/PyPDF2-3.0.1.tar.gz", hash = "sha256:a74408f69ba6271f71b9352ef4ed03dc53a31aa404d29b5d31f53bfecfee1440", size = 227419, upload-time = "2022-12-31T10:36:13.13Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/5e/c86a5643653825d3c913719e788e41386bee415c2b87b4f955432f2de6b2/pypdf2-3.0.1-py3-none-any.whl", hash = "sha256:d16e4205cfee272fbdc0568b68d82be796540b1537508cef59388f839c191928", size = 232572, upload-time = "2022-12-31T10:36:10.327Z" }, +] + +[[package]] +name = "pytest" +version = "8.3.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +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" } +wheels = [ + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, +] + +[[package]] +name = "ruff" +version = "0.11.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/53/ae4857030d59286924a8bdb30d213d6ff22d8f0957e738d0289990091dd8/ruff-0.11.11.tar.gz", hash = "sha256:7774173cc7c1980e6bf67569ebb7085989a78a103922fb83ef3dfe230cd0687d", size = 4186707, upload-time = "2025-05-22T19:19:34.363Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/14/f2326676197bab099e2a24473158c21656fbf6a207c65f596ae15acb32b9/ruff-0.11.11-py3-none-linux_armv6l.whl", hash = "sha256:9924e5ae54125ed8958a4f7de320dab7380f6e9fa3195e3dc3b137c6842a0092", size = 10229049, upload-time = "2025-05-22T19:18:45.516Z" }, + { url = "https://files.pythonhosted.org/packages/9a/f3/bff7c92dd66c959e711688b2e0768e486bbca46b2f35ac319bb6cce04447/ruff-0.11.11-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c8a93276393d91e952f790148eb226658dd275cddfde96c6ca304873f11d2ae4", size = 11053601, upload-time = "2025-05-22T19:18:49.269Z" }, + { url = "https://files.pythonhosted.org/packages/e2/38/8e1a3efd0ef9d8259346f986b77de0f62c7a5ff4a76563b6b39b68f793b9/ruff-0.11.11-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d6e333dbe2e6ae84cdedefa943dfd6434753ad321764fd937eef9d6b62022bcd", size = 10367421, upload-time = "2025-05-22T19:18:51.754Z" }, + { url = "https://files.pythonhosted.org/packages/b4/50/557ad9dd4fb9d0bf524ec83a090a3932d284d1a8b48b5906b13b72800e5f/ruff-0.11.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7885d9a5e4c77b24e8c88aba8c80be9255fa22ab326019dac2356cff42089fc6", size = 10581980, upload-time = "2025-05-22T19:18:54.011Z" }, + { url = "https://files.pythonhosted.org/packages/c4/b2/e2ed82d6e2739ece94f1bdbbd1d81b712d3cdaf69f0a1d1f1a116b33f9ad/ruff-0.11.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b5ab797fcc09121ed82e9b12b6f27e34859e4227080a42d090881be888755d4", size = 10089241, upload-time = "2025-05-22T19:18:56.041Z" }, + { url = "https://files.pythonhosted.org/packages/3d/9f/b4539f037a5302c450d7c695c82f80e98e48d0d667ecc250e6bdeb49b5c3/ruff-0.11.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e231ff3132c1119ece836487a02785f099a43992b95c2f62847d29bace3c75ac", size = 11699398, upload-time = "2025-05-22T19:18:58.248Z" }, + { url = "https://files.pythonhosted.org/packages/61/fb/32e029d2c0b17df65e6eaa5ce7aea5fbeaed22dddd9fcfbbf5fe37c6e44e/ruff-0.11.11-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a97c9babe1d4081037a90289986925726b802d180cca784ac8da2bbbc335f709", size = 12427955, upload-time = "2025-05-22T19:19:00.981Z" }, + { url = "https://files.pythonhosted.org/packages/6e/e3/160488dbb11f18c8121cfd588e38095ba779ae208292765972f7732bfd95/ruff-0.11.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8c4ddcbe8a19f59f57fd814b8b117d4fcea9bee7c0492e6cf5fdc22cfa563c8", size = 12069803, upload-time = "2025-05-22T19:19:03.258Z" }, + { url = "https://files.pythonhosted.org/packages/ff/16/3b006a875f84b3d0bff24bef26b8b3591454903f6f754b3f0a318589dcc3/ruff-0.11.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6224076c344a7694c6fbbb70d4f2a7b730f6d47d2a9dc1e7f9d9bb583faf390b", size = 11242630, upload-time = "2025-05-22T19:19:05.871Z" }, + { url = "https://files.pythonhosted.org/packages/65/0d/0338bb8ac0b97175c2d533e9c8cdc127166de7eb16d028a43c5ab9e75abd/ruff-0.11.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:882821fcdf7ae8db7a951df1903d9cb032bbe838852e5fc3c2b6c3ab54e39875", size = 11507310, upload-time = "2025-05-22T19:19:08.584Z" }, + { url = "https://files.pythonhosted.org/packages/6f/bf/d7130eb26174ce9b02348b9f86d5874eafbf9f68e5152e15e8e0a392e4a3/ruff-0.11.11-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:dcec2d50756463d9df075a26a85a6affbc1b0148873da3997286caf1ce03cae1", size = 10441144, upload-time = "2025-05-22T19:19:13.621Z" }, + { url = "https://files.pythonhosted.org/packages/b3/f3/4be2453b258c092ff7b1761987cf0749e70ca1340cd1bfb4def08a70e8d8/ruff-0.11.11-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:99c28505ecbaeb6594701a74e395b187ee083ee26478c1a795d35084d53ebd81", size = 10081987, upload-time = "2025-05-22T19:19:15.821Z" }, + { url = "https://files.pythonhosted.org/packages/6c/6e/dfa4d2030c5b5c13db158219f2ec67bf333e8a7748dccf34cfa2a6ab9ebc/ruff-0.11.11-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9263f9e5aa4ff1dec765e99810f1cc53f0c868c5329b69f13845f699fe74f639", size = 11073922, upload-time = "2025-05-22T19:19:18.104Z" }, + { url = "https://files.pythonhosted.org/packages/ff/f4/f7b0b0c3d32b593a20ed8010fa2c1a01f2ce91e79dda6119fcc51d26c67b/ruff-0.11.11-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:64ac6f885e3ecb2fdbb71de2701d4e34526651f1e8503af8fb30d4915a3fe345", size = 11568537, upload-time = "2025-05-22T19:19:20.889Z" }, + { url = "https://files.pythonhosted.org/packages/d2/46/0e892064d0adc18bcc81deed9aaa9942a27fd2cd9b1b7791111ce468c25f/ruff-0.11.11-py3-none-win32.whl", hash = "sha256:1adcb9a18802268aaa891ffb67b1c94cd70578f126637118e8099b8e4adcf112", size = 10536492, upload-time = "2025-05-22T19:19:23.642Z" }, + { url = "https://files.pythonhosted.org/packages/1b/d9/232e79459850b9f327e9f1dc9c047a2a38a6f9689e1ec30024841fc4416c/ruff-0.11.11-py3-none-win_amd64.whl", hash = "sha256:748b4bb245f11e91a04a4ff0f96e386711df0a30412b9fe0c74d5bdc0e4a531f", size = 11612562, upload-time = "2025-05-22T19:19:27.013Z" }, + { url = "https://files.pythonhosted.org/packages/ce/eb/09c132cff3cc30b2e7244191dcce69437352d6d6709c0adf374f3e6f476e/ruff-0.11.11-py3-none-win_arm64.whl", hash = "sha256:6c51f136c0364ab1b774767aa8b86331bd8e9d414e2d107db7a2189f35ea1f7b", size = 10735951, upload-time = "2025-05-22T19:19:30.043Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "tomli" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +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" } +wheels = [ + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, +] + +[[package]] +name = "virtualenv" +version = "20.31.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/2c/444f465fb2c65f40c3a104fd0c495184c4f2336d65baf398e3c75d72ea94/virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af", size = 6076316, upload-time = "2025-05-08T17:58:23.811Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/40/b1c265d4b2b62b58576588510fc4d1fe60a86319c8de99fd8e9fec617d2c/virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11", size = 6057982, upload-time = "2025-05-08T17:58:21.15Z" }, +]