From bcd260a28b346b10eebfd93749dc1b77c51154e5 Mon Sep 17 00:00:00 2001 From: LUIS NOVO Date: Mon, 21 Oct 2024 14:56:10 -0300 Subject: [PATCH] Initial commit with all features --- .dockerignore | 8 + .env.example | 27 + .gitignore | 118 + .pre-commit-config.yaml | 9 + .streamlit/config.toml | 30 + CONTRIBUTING.md | 52 + Dockerfile | 28 + LICENSE | 17 + Makefile | 27 + README.md | 90 + app_home.py | 19 + db_setup.surrealql | 196 ++ docker-compose.dev.yml | 22 + docker-compose.yml | 22 + docs/SETUP.md | 128 + docs/USAGE.md | 49 + docs/assets/add_source.png | Bin 0 -> 23686 bytes docs/assets/ai_note.png | Bin 0 -> 27582 bytes docs/assets/asset_list.png | Bin 0 -> 64157 bytes docs/assets/context.png | Bin 0 -> 24154 bytes docs/assets/human_note.png | Bin 0 -> 28850 bytes docs/assets/new_notebook.png | Bin 0 -> 42108 bytes docs/assets/search.png | Bin 0 -> 49712 bytes mypy.ini | 8 + open_notebook/__init__.py | 0 open_notebook/domain.py | 433 +++ open_notebook/exceptions.py | 64 + open_notebook/graphs/ask_content.py | 52 + open_notebook/graphs/chat.py | 74 + open_notebook/graphs/content_process.py | 217 ++ open_notebook/graphs/summary.py | 96 + open_notebook/graphs/tools.py | 24 + open_notebook/prompter.py | 93 + open_notebook/repository.py | 109 + open_notebook/utils.py | 83 + pages/2_📒_Notebooks.py | 115 + pages/3_🔍_Search.py | 65 + poetry.lock | 4021 +++++++++++++++++++++++ poetry.toml | 3 + prompts/ask_content.jinja | 26 + prompts/chat.jinja | 45 + prompts/spr.jinja | 11 + prompts/summarize.jinja | 28 + pyproject.toml | 59 + stream_app/__init__.py | 0 stream_app/chat.py | 89 + stream_app/consts.py | 5 + stream_app/note.py | 89 + stream_app/source.py | 161 + stream_app/utils.py | 18 + tests/README.md | 1 + todo.md | 66 + 52 files changed, 6897 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 .streamlit/config.toml create mode 100644 CONTRIBUTING.md create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 app_home.py create mode 100644 db_setup.surrealql create mode 100644 docker-compose.dev.yml create mode 100644 docker-compose.yml create mode 100644 docs/SETUP.md create mode 100644 docs/USAGE.md create mode 100644 docs/assets/add_source.png create mode 100644 docs/assets/ai_note.png create mode 100644 docs/assets/asset_list.png create mode 100644 docs/assets/context.png create mode 100644 docs/assets/human_note.png create mode 100644 docs/assets/new_notebook.png create mode 100644 docs/assets/search.png create mode 100644 mypy.ini create mode 100644 open_notebook/__init__.py create mode 100644 open_notebook/domain.py create mode 100644 open_notebook/exceptions.py create mode 100644 open_notebook/graphs/ask_content.py create mode 100644 open_notebook/graphs/chat.py create mode 100644 open_notebook/graphs/content_process.py create mode 100644 open_notebook/graphs/summary.py create mode 100644 open_notebook/graphs/tools.py create mode 100644 open_notebook/prompter.py create mode 100644 open_notebook/repository.py create mode 100644 open_notebook/utils.py create mode 100644 pages/2_📒_Notebooks.py create mode 100644 pages/3_🔍_Search.py create mode 100644 poetry.lock create mode 100644 poetry.toml create mode 100644 prompts/ask_content.jinja create mode 100644 prompts/chat.jinja create mode 100644 prompts/spr.jinja create mode 100644 prompts/summarize.jinja create mode 100644 pyproject.toml create mode 100644 stream_app/__init__.py create mode 100644 stream_app/chat.py create mode 100644 stream_app/consts.py create mode 100644 stream_app/note.py create mode 100644 stream_app/source.py create mode 100644 stream_app/utils.py create mode 100644 tests/README.md create mode 100644 todo.md diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..a975cf5 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +notebooks/ +data/ +.uploads/ +.venv/ +.mypy_cache/ +.ruff_cache/ +.env +sqlite-db/ \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..8557f70 --- /dev/null +++ b/.env.example @@ -0,0 +1,27 @@ +# YOUR LLM API KEYS +OPENAI_API_KEY=API_KEY + +# MODEL_CONFIGURATIONS +# Only OpenAI models are supported for now +DEFAULT_MODEL="gpt-4o-mini" # This is the default model used for all the features +SUMMARIZATION_MODEL="gpt-4o-mini" # This is the model used for summarization, defaults to the DEFAULT_MODEL if empty +RETRIEVAL_MODEL="gpt-4o-mini" # This is the model used for retrieval, defaults to the DEFAULT_MODEL if empty + + +# CONNECTION DETAILS FOR YOUR SURREAL DB +SURREAL_ADDRESS="ws://localhost:8000/rpc" +SURREAL_USER="root" +SURREAL_PASS="root" +SURREAL_NAMESPACE="open_notebook" +SURREAL_DATABASE="staging" + +# This is used for the summarization feature when the content is to big to fit a single context window +# It is measured in characters, not tokens. +SUMMARY_CHUNK_SIZE=200000 +SUMMARY_CHUNK_OVERLAP=1000 + +# This is used for vector embeddings +# It is measured in characters, not tokens. +EMBEDDING_CHUNK_SIZE=1000 +EMBEDDING_CHUNK_OVERLAP=50 + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dd79131 --- /dev/null +++ b/.gitignore @@ -0,0 +1,118 @@ +notebooks/ +data/ +.uploads/ +sqlite-db/ +surreal-data/ +docker.env +# Python-specific +*.py[cod] +__pycache__/ +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# PyCharm +.idea/ + +# VS Code +.vscode/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# macOS +.DS_Store + +# Windows +Thumbs.db +ehthumbs.db +desktop.ini + +# Linux +*~ + +# Log files +*.log + +# Database files +*.db +*.sqlite3 + +# Virtual environment +.python-version diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..dfa210d --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,9 @@ +repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.4.4 + hooks: + - id: ruff + args: ["--fix"] + exclude: "templates" + - id: ruff-format + exclude: "templates" diff --git a/.streamlit/config.toml b/.streamlit/config.toml new file mode 100644 index 0000000..5fb037a --- /dev/null +++ b/.streamlit/config.toml @@ -0,0 +1,30 @@ +[server] + +port = 8502 +maxMessageSize = 500 + +[browser] +serverPort = 8502 + +# [theme] + +# # The preset Streamlit theme that your custom theme inherits from. +# # One of "light" or "dark". +# base = + +# # Primary accent color for interactive elements. +# primaryColor = + +# # Background color for the main content area. +# backgroundColor = + +# # Background color used for the sidebar and most interactive widgets. +# secondaryBackgroundColor = + +# # Color used for almost all text. +# textColor = + +# # Font family for all text in the app, except code blocks. One of "sans serif", +# # "serif", or "monospace". +# font = + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e103815 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,52 @@ +# Contributing to Open Notebook + +First off, thank you for considering contributing to Open Notebook! What makes open source great is the fact that we can work together and accomplish things we would never do on our own. All suggestions are welcome. + +## Code of Conduct + +By participating in this project, you are expected to uphold our Code of Conduct (to be created separately). + +## How Can I Contribute? + +### Reporting Bugs + +- Ensure the bug was not already reported by searching on GitHub under [Issues](https://github.com/yourusername/open-notebook/issues). +- If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/yourusername/open-notebook/issues/new). Be sure to include a title and clear description, as much relevant information as possible, and a code sample or an executable test case demonstrating the expected behavior that is not occurring. + +### Suggesting Enhancements + +- Open a new issue with a clear title and detailed description of the suggested enhancement. +- Provide any relevant examples or mockups if applicable. + +### Pull Requests + +1. Fork the repo and create your branch from `main`. +2. If you've added code that should be tested, add tests. +3. Ensure the test suite passes. +4. Make sure your code lints. +5. Issue that pull request! + +## Styleguides + +### Git Commit Messages + +- Use the present tense ("Add feature" not "Added feature") +- Use the imperative mood ("Move cursor to..." not "Moves cursor to...") +- Limit the first line to 72 characters or less +- Reference issues and pull requests liberally after the first line + +### Python Styleguide + +- Follow PEP 8 guidelines +- Use type hints where possible +- Write docstrings for all functions, classes, and modules + +### Documentation Styleguide + +- Use Markdown for documentation files +- Reference functions and classes appropriately + +## Additional Notes + + +Thank you for contributing to Open Notebook! \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d6ea62c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +# Use an official Python runtime as a base image +FROM python:3.11.7-slim-bullseye + +# Install system dependencies required for building certain Python packages +RUN apt-get update && apt-get install -y \ + gcc \ + curl wget libmagic-dev \ + && rm -rf /var/lib/apt/lists/* + +# Set the working directory in the container to /app +WORKDIR /app + +RUN pip install poetry --no-cache-dir +RUN poetry self add poetry-plugin-dotenv +RUN poetry config virtualenvs.create false +COPY pyproject.toml poetry.lock* /app/ + +RUN poetry install --only main +#--no-root +COPY . /app +WORKDIR /app + +EXPOSE 8502 + +RUN mkdir -p /app/sqlite-db + +CMD ["poetry", "run", "streamlit", "run", "app_home.py"] + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..13f4e65 --- /dev/null +++ b/LICENSE @@ -0,0 +1,17 @@ +MIT License +Copyright (c) 2024 Luis Novo +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..da0320b --- /dev/null +++ b/Makefile @@ -0,0 +1,27 @@ +.PHONY: run check ruff database lint docker-build docker-push + +# Get version from pyproject.toml +VERSION := $(shell grep -m1 version pyproject.toml | cut -d'"' -f2) +IMAGE_NAME := lfnovo/open_notebook +database: + docker compose up -d + +run: + poetry run streamlit run app_home.py + +lint: + poetry run python -m mypy . + +ruff: + ruff check . --fix + +docker-build: + docker build . -t $(IMAGE_NAME):$(VERSION) + docker tag $(IMAGE_NAME):$(VERSION) $(IMAGE_NAME):latest + +docker-push: + docker push $(IMAGE_NAME):$(VERSION) + docker push $(IMAGE_NAME):latest + +# Combined build and push +docker-release: docker-build docker-push \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8ee0950 --- /dev/null +++ b/README.md @@ -0,0 +1,90 @@ +# Open Notebook + +An open source, privacy-focused alternative to Google's Notebook LM. Why give Google more of our data when we can take control of our own research workflows? + +In a world dominated by Artificial Intelligence, having the ability to think 🧠 and acquire new knowledge 💡, is a skill that should not be a privilege for a few, nor restricted to a single company. + +Open Notebook empowers you to manage your research, generate AI-assisted notes, and interact with your content—on your terms. + +## ⚙️ Setting Up + +Go to the [Setup Guide](docs/SETUP.md) to learn how to set up the tool. + +## Usage Instructions + +Go to the [Usage](docs/USAGE.md) page to learn how to use all features. + +## 🚀 Features + +- **Multi-Notebook Support**: Organize your research across multiple notebooks effortlessly. +- **Broad Content Integration**: Works with links, PDFs, TXT files, PowerPoint presentations, YouTube videos, and pasted text (audio/video support coming soon). +- **AI-Powered Notes**: Write notes yourself or let the AI assist you in generating insights. +- **Recursive Summarization**: Tackle large content by recursively summarizing it. +- **Integrated Search Engines**: Built-in full-text and vector search for faster information retrieval. +- **Fine-Grained Context Management**: Choose exactly what to share with the AI to maintain control. +- **Cost Estimation**: Estimate costs for large context processing to keep budget control in check. + +### 📝 Notebook Page + +Three intuitive columns to streamline your work: +1. **Sources**: Manage all research materials. +2. **Notes**: Create or AI-generate notes. +3. **Chat**: Chat with the AI, leveraging your content. + +### ⚙️ Context Configuration + +Take control of your data. Decide what gets sent to the AI with three context options: +- No context +- Summary only +- Full content + +Plus, you can add your project description to help the AI provide more accurate and helpful responses. + +### 🔍 Integrated Search for Your Items + +Locate anything across your research with ease using full-text and vector-based search. + +### 💬 Powerful open prompts + +Jinja based prompts that are easy to customize to your own preferences. + + + + +## 🌟 Coming Soon + +- **Podcast Generator**: Automatically convert your notes into a podcast format. +- **Multi-model support**: Anthropic, Gemini, Mistral, Ollama coming soon. +- **Enhanced Citations**: Improved layout and finer control for citations. +- **Insight Generation**: New tools for creating insights, leveraging the Fabric framework. +- **Better Embeddings & Summarization**: Smarter ways to distill information. +- **Multiple Chat Sessions**: Juggle different discussions within the same notebook. +- **Live Front-End Updates**: Real-time UI updates for a smoother experience. +- **Async Processing**: Faster UI through asynchronous content processing. +- **Improved Error Handling**: Making everything more robust. +- **Cross-Notebook Sources and Notes**: Reuse research notes across projects. +- **Bookmark Integration**: Integrate with your favorite bookmarking app. + + +## 💻 Tech Stack + +- **Streamlit**: For the front-end (Looking to move out of Streamlit. Contributors welcome!). +- **SurrealDB**: Fast, scalable database solution. +- **Langchain/Langgraph**: The backbone for LLM interactions. + + +## 🙌 Help Wanted + +We would love your contributions! Specifically, we're looking for help with: +- **Front-End Development**: Improve the UI/UX by moving beyond Streamlit. +- **Testing & Bug Fixes**: Help make Open Notebook more robust. +- **Feature Development**: Let’s make the coolest note-taking tool together! + +See more at [CONTRIBUTING](CONTRIBUTING.md) +## 📄 License + +Open Notebook is MIT licensed. See the [LICENSE](LICENSE) file for details. + +--- + +Your contributions, feature requests, and bug reports are always welcome. Let's build a research tool that respects our privacy and makes learning truly open for everyone. ✨ diff --git a/app_home.py b/app_home.py new file mode 100644 index 0000000..132a120 --- /dev/null +++ b/app_home.py @@ -0,0 +1,19 @@ +import streamlit as st + +from open_notebook.exceptions import InvalidDatabaseSchema +from open_notebook.repository import check_version, execute_migration + +try: + check_version() +except InvalidDatabaseSchema as e: + st.error(e) + if st.button("Execute Migration.."): + try: + execute_migration() + st.success("Migration executed successfully") + st.rerun() + except Exception as e: + st.error(e) + st.stop() + +st.switch_page("pages/2_📒_Notebooks.py") diff --git a/db_setup.surrealql b/db_setup.surrealql new file mode 100644 index 0000000..0739e7d --- /dev/null +++ b/db_setup.surrealql @@ -0,0 +1,196 @@ +REMOVE table IF EXISTS source; +REMOVE table IF EXISTS reference; +REMOVE table IF EXISTS notebook; +REMOVE table IF EXISTS note; +REMOVE table IF EXISTS artifact; +REMOVE table IF EXISTS source_chunk; +REMOVE table IF EXISTS source_insight; +REMOVE ANALYZER IF EXISTS my_analyzer; +REMOVE FUNCTION IF EXISTS fn::text_search; + +REMOVE INDEX IF EXISTS idx_source_full ON TABLE source_chunk; +REMOVE INDEX IF EXISTS idx_source_embed_chunk ON TABLE source_embedding; +REMOVE INDEX IF EXISTS idx_source_insight ON TABLE source_insight; +REMOVE INDEX IF EXISTS idx_note ON TABLE note; +REMOVE INDEX IF EXISTS idx_source_title ON TABLE source; +REMOVE INDEX IF EXISTS idx_note_title ON TABLE note; + +DEFINE TABLE IF NOT EXISTS source SCHEMAFULL; + +DEFINE FIELD asset + ON TABLE source + FLEXIBLE TYPE option; + +DEFINE FIELD title ON TABLE source TYPE option; +-- DEFINE FIELD summary ON TABLE source TYPE option; +DEFINE FIELD topics ON TABLE source TYPE option>; + +DEFINE FIELD created ON source DEFAULT time::now() VALUE $before OR time::now(); +DEFINE FIELD updated ON source DEFAULT time::now() VALUE time::now(); + +-- temporary while surreal doesn't fix the sdk +DEFINE TABLE IF NOT EXISTS source_chunk SCHEMAFULL; +DEFINE FIELD source ON TABLE source_chunk TYPE record; +DEFINE FIELD order ON TABLE source_chunk TYPE int; +DEFINE FIELD content ON TABLE source_chunk TYPE string; + +DEFINE TABLE IF NOT EXISTS source_embedding SCHEMAFULL; +DEFINE FIELD source ON TABLE source_embedding TYPE record; +DEFINE FIELD order ON TABLE source_embedding TYPE int; +DEFINE FIELD content ON TABLE source_embedding TYPE string; +DEFINE FIELD embedding ON TABLE source_embedding TYPE array; + +DEFINE TABLE IF NOT EXISTS source_insight SCHEMAFULL; +DEFINE FIELD source ON TABLE source_insight TYPE record; +DEFINE FIELD insight_type ON TABLE source_insight TYPE string; +DEFINE FIELD content ON TABLE source_insight TYPE string; +DEFINE FIELD embedding ON TABLE source_insight TYPE array; + + +DEFINE TABLE IF NOT EXISTS note SCHEMAFULL; + +DEFINE FIELD title ON TABLE note TYPE option; +DEFINE FIELD summary ON TABLE note TYPE option; +DEFINE FIELD content ON TABLE note TYPE option; +DEFINE FIELD embedding ON TABLE note TYPE array; + +DEFINE FIELD created ON note DEFAULT time::now() VALUE $before OR time::now(); +DEFINE FIELD updated ON note DEFAULT time::now() VALUE time::now(); + +DEFINE TABLE IF NOT EXISTS notebook SCHEMAFULL; + +DEFINE FIELD name ON TABLE notebook TYPE option; +DEFINE FIELD description ON TABLE notebook TYPE option; + +DEFINE FIELD created ON notebook DEFAULT time::now() VALUE $before OR time::now(); +DEFINE FIELD updated ON notebook DEFAULT time::now() VALUE time::now(); + +DEFINE TABLE reference +TYPE RELATION +FROM source TO notebook; + +DEFINE TABLE artifact +TYPE RELATION +FROM note TO notebook; + +-- entender o analyzer +DEFINE ANALYZER my_analyzer TOKENIZERS blank,class,camel,punct FILTERS snowball(english), lowercase; + +DEFINE INDEX idx_source_title ON TABLE source COLUMNS title SEARCH ANALYZER my_analyzer BM25 HIGHLIGHTS; +DEFINE INDEX idx_source_full ON TABLE source_chunk COLUMNS content SEARCH ANALYZER my_analyzer BM25 HIGHLIGHTS; +DEFINE INDEX idx_source_embed_chunk ON TABLE source_embedding COLUMNS content SEARCH ANALYZER my_analyzer BM25 HIGHLIGHTS; +DEFINE INDEX idx_source_insight ON TABLE source_insight COLUMNS content SEARCH ANALYZER my_analyzer BM25 HIGHLIGHTS; +DEFINE INDEX idx_note ON TABLE note COLUMNS content SEARCH ANALYZER my_analyzer BM25 HIGHLIGHTS; +DEFINE INDEX idx_note_title ON TABLE note COLUMNS title SEARCH ANALYZER my_analyzer BM25 HIGHLIGHTS; + +DEFINE FUNCTION IF NOT EXISTS fn::text_search($query_text: string, $match_count: int, $sources:bool, $show_notes:bool) { + + + let $source_title_search = + IF $sources {( + SELECT id as item_id, math::max(search::score(1)) AS relevance + FROM source + WHERE title @1@ $query_text + GROUP BY item_id)} + ELSE { [] }; + + let $source_embedding_search = + IF $sources {( + SELECT source as item_id, math::max(search::score(1)) AS relevance + FROM source_embedding + WHERE content @1@ $query_text + GROUP BY item_id)} + ELSE { [] }; + + let $source_chunk_search = + IF $sources {( + SELECT source as item_id, math::max(search::score(1)) AS relevance + FROM source_chunk + WHERE content @1@ $query_text + GROUP BY item_id)} + ELSE { [] }; + + let $source_insight_search = + IF $sources {( + SELECT source as item_id, math::max(search::score(1)) AS relevance + FROM source_insight + WHERE content @1@ $query_text + GROUP BY item_id)} + ELSE { [] }; + + let $note_title_search = + IF $show_notes {( + SELECT id as item_id, math::max(search::score(1)) AS relevance + FROM note + WHERE title @1@ $query_text + GROUP BY item_id)} + ELSE { [] }; + + let $note_content_search = + IF $show_notes {( + SELECT id as item_id, math::max(search::score(1)) AS relevance + FROM note + WHERE content @1@ $query_text + GROUP BY item_id)} + ELSE { [] }; + + let $source_chunk_results = array::union($source_embedding_search, $source_chunk_search); + + let $source_asset_results = array::union($source_title_search, $source_insight_search); + + let $source_results = array::union($source_chunk_results, $source_asset_results ); + let $note_results = array::union($note_title_search, $note_content_search ); + let $final_results = array::union($source_results, $note_results ); + + RETURN (SELECT item_id, math::max(relevance) as relevance from $final_results + group by item_id ORDER BY relevance DESC LIMIT $match_count); + + +}; + + +REMOVE FUNCTION fn::vector_search; + +DEFINE FUNCTION IF NOT EXISTS fn::vector_search($query: array, $match_count: int, $sources:bool, $show_notes:bool) { + + let $source_embedding_search = + IF $sources {( + SELECT source as item_id, content, vector::similarity::cosine(embedding, $query) as similarity + FROM source_embedding LIMIT $match_count)} + ELSE { [] }; + + + let $source_insight_search = + IF $sources {( + SELECT source as item_id, content, vector::similarity::cosine(embedding, $query) as similarity + FROM source_insight LIMIT $match_count)} + ELSE { [] }; + + + let $note_content_search = + IF $show_notes {( + SELECT id as item_id, content, vector::similarity::cosine(embedding, $query) as similarity + FROM note LIMIT $match_count)} + + ELSE { [] }; + + let $source_chunk_results = array::union($source_embedding_search, $source_insight_search); + + let $source_results = array::union($source_chunk_results, $source_insight_search); + + let $note_results = $note_content_search; + let $final_results = array::union($source_results, $note_results ); + + RETURN (SELECT item_id, math::max(similarity) as similarity from $final_results + group by item_id ORDER BY similarity DESC LIMIT $match_count); + + +}; + +CREATE open_notebook:database_info SET + version= "0.0.1"; + +UPDATE open_notebook:database_info SET + version= "0.0.1"; + + diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..80d200b --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,22 @@ +version: '3' + +services: + surrealdb: + image: surrealdb/surrealdb:v2 + ports: + - "8000:8000" + volumes: + - ./surreal-data:/mydata + user: "${UID}:${GID}" + command: start --log trace --user root --pass root rocksdb:mydatabase.db + pull_policy: always + open_notebook: + build: + context: . + dockerfile: Dockerfile + ports: + - "8080:8502" + volumes: + - ./docker.env:/app/.env + depends_on: + - surrealdb diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..7b3edb8 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,22 @@ +version: '3' + +services: + surrealdb: + image: surrealdb/surrealdb:v2 + ports: + - "8000:8000" + volumes: + - ./surreal-data:/mydata + user: "${UID}:${GID}" + command: start --log trace --user root --pass root rocksdb:mydatabase.db + pull_policy: always + open_notebook: + image: lfnovo/open_notebook:latest + ports: + - "8080:8502" + volumes: + - ./docker.env:/app/.env + depends_on: + - surrealdb + pull_policy: always + diff --git a/docs/SETUP.md b/docs/SETUP.md new file mode 100644 index 0000000..3150c06 --- /dev/null +++ b/docs/SETUP.md @@ -0,0 +1,128 @@ +# Installing Open Notebook + + +## 📦 Installing from Source + +Quickly get started by cloning and installing the dependencies. + +```sh +git clone https://github.com/lfnovo/open_notebook.git +cd open_notebook +poetry install +``` + +Make a copy of `example.env` and rename it to `.env`. + +You need to enter at least your OPENAI_API_KEY and the Surreal DB connection details. + +``` +OPENAI_API_KEY= + +# CONNECTION DETAILS FOR YOUR SURREAL DB +SURREAL_ADDRESS="ws://localhost:8000/rpc" +SURREAL_USER="root" +SURREAL_PASS="root" +SURREAL_NAMESPACE="open_notebook" +SURREAL_DATABASE="staging" +``` + +Then, run it by using: + +```sh +poetry run streamlit run app_home.py +``` + +or the shourcut + +```sh +make run +``` + +## 🐳 Docker Setup + +Alternatively, you can use Docker for easy setup. +Copy the `.env.example` file and name it `docker.env` + +```sh +docker run -d \ + --name open_notebook \ + -p 8080:8502 \ + -v $(pwd)/docker.env:/app/.env \ + lfnovo/open_notebook:latest +``` + +You can pass the environment variables manually if you want: + +```sh +docker run -d \ + --name open_notebook \ + -p 8080:8502 \ + -e OPENAI_API_KEY=API_KEY \ + -e DEFAULT_MODEL="gpt-4o-mini" \ + -e SURREAL_ADDRESS="ws://localhost:8000/rpc" \ + -e SURREAL_USER="root" \ + -e SURREAL_PASS="root" \ + -e SURREAL_NAMESPACE="open_notebook" \ + -e SURREAL_DATABASE="staging" \ + lfnovo/open_notebook:latest +``` + +If you need to run Surreal DB on docker as well, it's easier to just use docker-compose, like this: + +```yaml +services: + surrealdb: + image: surrealdb/surrealdb:v2 + ports: + - "8000:8000" + volumes: + - ./surreal-data:/mydata + user: "${UID}:${GID}" + command: start --log trace --user root --pass root rocksdb:mydatabase.db + pull_policy: always + open_notebook: + image: lfnovo/open_notebook:latest + ports: + - "8080:8502" + volumes: + - ./docker.env:/app/.env + depends_on: + - surrealdb + pull_policy: always +``` + +or with the environment variables: + +```yaml +services: + surrealdb: + image: surrealdb/surrealdb:v2 + ports: + - "8000:8000" + volumes: + - ./surreal-data:/mydata + user: "${UID}:${GID}" + command: start --log trace --user root --pass root rocksdb:mydatabase.db + pull_policy: always + open_notebook: + image: lfnovo/open_notebook:latest + ports: + - "8080:8502" + environment: + - OPENAI_API_KEY=API_KEY + - DEFAULT_MODEL=gpt-4o-mini + - SURREAL_ADDRESS=ws://surrealdb:8000/rpc + - SURREAL_USER=root + - SURREAL_PASS=root + - SURREAL_NAMESPACE=open_notebook + - SURREAL_DATABASE=staging + depends_on: + - surrealdb + pull_policy: always +``` + +## Running the app + +After the app is running, you can access it at http://localhost:8080. + +The first time you connect, it will check for the database and see if the schema is ready. If not, it will create the database for you. \ No newline at end of file diff --git a/docs/USAGE.md b/docs/USAGE.md new file mode 100644 index 0000000..442d311 --- /dev/null +++ b/docs/USAGE.md @@ -0,0 +1,49 @@ +# Using Open Notebook + +This first release of Open Notebook is inspired by Notebook LM, so you will find a very similar workflow. + +## Creating a new notebook + +![New Notebook](assets/new_notebook.png) + +Just type a name and description for the Notebook and you are good to go. Make the description as detailed as possible since it will be used by the LLM to understand the context of the notebook and provide you with better answers. + +## Adding sources + +Just click on Add Source and enter the URL, upload the file or paste the content of your source. + +![New Notebook](assets/add_source.png) + +You'll find your new source in the first column of the Notebook Page. + +![New Notebook](assets/asset_list.png) + +## Talk to the Assistant + +Once you have enough content in the notebook, you can decide which of them will be visible to LLM before sending your question. + +![New Notebook](assets/context.png) + +- Not in Context: LLM won't get this as part of the context +- Summary: LLM will get the summary for the content and can ask for the full document if desired +- Full Content: LLM will receive the full transcript of the content together with your question. + +It's recommended that you use the least amount of context so that you can save up on your API spend. + +## Making Notes + +There is 2 ways you can make notes: + +Manually by clicking on New Note + +![New Notebook](assets/human_note.png) + +Or by turning any LLM message into a Note. + +![New Notebook](assets/ai_note.png) + +## Searching + +The search page gives you a glance of all the notes you have made and the sources you have added. You can query the database both by keyword as well as using the vector search. + +![New Notebook](assets/search.png) \ No newline at end of file diff --git a/docs/assets/add_source.png b/docs/assets/add_source.png new file mode 100644 index 0000000000000000000000000000000000000000..59213e9db4bcaf80fe53dc82b18cae34b72a9785 GIT binary patch literal 23686 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

5jo#t7Q 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 IF$4eq0mKpL9smFU literal 0 HcmV?d00001 diff --git a/docs/assets/asset_list.png b/docs/assets/asset_list.png new file mode 100644 index 0000000000000000000000000000000000000000..f2ac3dc0dc57c3e2a453769c2d3d0d29762951c7 GIT binary patch literal 64157 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�p4^n}cwP8` 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 literal 0 HcmV?d00001 diff --git a/docs/assets/context.png b/docs/assets/context.png new file mode 100644 index 0000000000000000000000000000000000000000..ada373f29ac58bb881e56ca85f24ca44d191517b GIT binary patch literal 24154 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 literal 0 HcmV?d00001 diff --git a/docs/assets/human_note.png b/docs/assets/human_note.png new file mode 100644 index 0000000000000000000000000000000000000000..397d392737c915b806d5d0205ceaf94555a89d41 GIT binary patch literal 28850 zcmeFZby$>9_clt0h+qH$5~6@eNz2eGDy<;hF?0yS&?zDcNW;(|64E_%iP9n6p)^BC zH=ND;dzJC~&iU*7bIx^rUKcVv&(5{?T6?W~-FrT~kbg#eiRuyt1_rUz^CyZJ7}#tW z7?|Y*c;HFKyx~vqhmP6f$1kKFKc;_SXJc$;3B|y;7YYxNkimL+!#5a8U_P6o;ah$Q zizw!DN&=;vFZi7;7x?*O!W%nWH~&_CK!*XUZZ9$ zU2K?hyS3)NUQM)(qug|v(@SxLpUj!Rs1ixLG4QjQ^pMLpBukwwR6gSi?$oF|mE&)M z8X5}6)jC=u9gf-de%V|X+AB9bkE(*ibPITUN$yJ-rV~3Ed|RT4Bb>ZL%gb_OBUG>E zyU80EdtRjoC8LzqohxRNdN``h&s5Q*g#$IZGI36@LX!c6YUQJFGVrXN

Jek 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 literal 0 HcmV?d00001 diff --git a/docs/assets/new_notebook.png b/docs/assets/new_notebook.png new file mode 100644 index 0000000000000000000000000000000000000000..6e90a44125965edb0f13e767c82c166e22fa49e8 GIT binary patch literal 42108 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 List[T]: + try: + result = repo_query(f"SELECT * FROM {cls.table_name}") + objects = [cls(**obj) for obj in result] + return objects + except Exception as e: + logger.error(f"Error fetching all {cls.table_name}: {str(e)}") + logger.exception(e) + raise DatabaseOperationError(f"Failed to fetch all {cls.table_name}") + + @classmethod + def get(cls: Type[T], id: str) -> Optional[T]: + if not id: + raise InvalidInputError("ID cannot be empty") + try: + result = repo_query(f"SELECT * FROM {id}") + if result: + return cls(**result[0]) + return None + except Exception as e: + logger.error(f"Error fetching {cls.table_name} with id {id}: {str(e)}") + logger.exception(e) + raise NotFoundError(f"{cls.table_name} with id {id} not found") + + def needs_embedding(self) -> bool: + return False + + def get_embedding_content(self) -> Optional[str]: + return None + + def save(self) -> None: + try: + data = self._prepare_save_data() + + if self.needs_embedding(): + embedding_content = self.get_embedding_content() + if embedding_content: + data["embedding"] = get_embedding(embedding_content) + + if self.id is None: + logger.debug("Creating new record") + repo_result = repo_create(self.__class__.table_name, data) + else: + logger.debug(f"Updating record with id {self.id}") + repo_result = repo_update(self.id, data) + + # Update the current instance with the result + for key, value in repo_result.items(): + if hasattr(self, key): + setattr(self, key, value) + + except Exception as e: + logger.error(f"Error saving {self.__class__.table_name}: {str(e)}") + logger.exception(e) + raise DatabaseOperationError(f"Failed to save {self.__class__.table_name}") + + def _prepare_save_data(self) -> Dict[str, Any]: + data = self.model_dump() + logger.debug(f"Preparing data for save: {data}") + del data["created"] + del data["updated"] + return {key: value for key, value in data.items() if value is not None} + + def delete(self) -> bool: + if self.id is None: + raise InvalidInputError("Cannot delete object without an ID") + try: + logger.debug(f"Deleting record with id {self.id}") + return repo_delete(self.id) + except Exception as e: + logger.error( + f"Error deleting {self.__class__.table_name} with id {self.id}: {str(e)}" + ) + raise DatabaseOperationError( + f"Failed to delete {self.__class__.table_name}" + ) + + def relate(self, relationship: str, target_id: str) -> Any: + if not relationship or not target_id: + raise InvalidInputError("Relationship and target ID must be provided") + try: + return repo_relate(self.id, relationship, target_id) + except Exception as e: + logger.error(f"Error creating relationship: {str(e)}") + logger.exception(e) + raise DatabaseOperationError("Failed to create relationship") + + +class Notebook(ObjectModel): + table_name: ClassVar[str] = "notebook" + name: str + description: str + + @field_validator("name") + @classmethod + def name_must_not_be_empty(cls, v): + if not v.strip(): + raise InvalidInputError("Notebook name cannot be empty") + return v + + @property + def sources(self) -> List["Source"]: + try: + srcs = repo_query(f""" + select * from ( + select + <- source as source + from reference + where out={self.id} + fetch source + ) + order by source.updated desc + """) + return [Source(**src["source"][0]) for src in srcs] if srcs else [] + except Exception as e: + logger.error(f"Error fetching sources for notebook {self.id}: {str(e)}") + logger.exception(e) + raise DatabaseOperationError("Failed to fetch sources for notebook") + + @property + def notes(self) -> List["Note"]: + try: + srcs = repo_query(f""" + select * from ( + select + <- note as note + from artifact + where out={self.id} + fetch note + ) + order by updated desc + """) + return [Note(**src["note"][0]) for src in srcs] if srcs else [] + except Exception as e: + logger.error(f"Error fetching notes for notebook {self.id}: {str(e)}") + logger.exception(e) + raise DatabaseOperationError("Failed to fetch notes for notebook") + + +class Asset(BaseModel): + file_path: Optional[str] = None + url: Optional[str] = None + + +class SourceInsight(ObjectModel): + insight_type: str + content: str + + @field_validator("insight_type") + @classmethod + def validate_insight_type(cls, v): + allowed_types = ["summary", "key_points", "analysis"] # Add more as needed + if v not in allowed_types: + raise InvalidInputError( + f"Invalid insight type. Allowed types are: {', '.join(allowed_types)}" + ) + return v + + +class Source(ObjectModel): + table_name: ClassVar[str] = "source" + asset: Optional[Asset] = None + title: Optional[str] = None + topics: Optional[List[str]] = Field(default_factory=list) + + def get_context( + self, context_size: Literal["short", "long"] = "short" + ) -> Dict[str, Any]: + if context_size == "long": + return dict( + id=self.id, + title=self.title, + insights=self.insights, + full_text=self.full_text, + ) + else: + return dict(id=self.id, title=self.title, insights=self.insights) + + @property + def insights(self) -> List[SourceInsight]: + try: + result = repo_query( + """ + SELECT * FROM source_insight WHERE source=$id + """, + {"id": self.id}, + ) + return [SourceInsight(**insight) for insight in result] + except Exception as e: + logger.error(f"Error fetching insights for source {self.id}: {str(e)}") + logger.exception(e) + raise DatabaseOperationError("Failed to fetch insights for source") + + @property + def full_text(self) -> str: + try: + results = [] + chunk_indexes = repo_query( + """ + select order + from source_chunk + where source=$id + order by order + """, + {"id": self.id}, + ) + for chunk_index in chunk_indexes: + chunk = repo_query( + f""" + select content + from source_chunk + where source={self.id} and order={chunk_index['order']} + """ + ) + results.append(chunk[0]["content"]) + return "".join(results) + except Exception as e: + logger.error(f"Error fetching full text for source {self.id}: {str(e)}") + logger.exception(e) + raise DatabaseOperationError("Failed to fetch full text for source") + + def add_to_notebook(self, notebook_id: str) -> Any: + if not notebook_id: + raise InvalidInputError("Notebook ID must be provided") + return self.relate("reference", notebook_id) + + def save_chunks(self, text: str) -> None: + if not text: + raise InvalidInputError("Text cannot be empty") + try: + chunks = split_text(text, chunk=500000, overlap=1000) + logger.debug(f"Split into {len(chunks)} chunks") + for i, chunk in enumerate(chunks): + logger.debug(f"Saving chunk {i}") + repo_create( + "source_chunk", + {"source": self.id, "order": i, "content": surreal_clean(chunk)}, + ) + except Exception as e: + logger.error(f"Error saving chunks for source {self.id}: {str(e)}") + logger.exception(e) + raise DatabaseOperationError("Failed to save chunks for source") + + def vectorize(self) -> None: + try: + full_text = self.full_text + if not full_text: + return + chunks = split_text( + self.full_text, + chunk=int(os.environ.get("EMBEDDING_CHUNK_SIZE", 1000)), + overlap=int(os.environ.get("EMBEDDING_CHUNK_OVERLAP", 1000)), + ) + logger.debug(f"Split into {len(chunks)} chunks") + + # future: we can increase the batch size after surreal launches their new SDK + for i, chunk in enumerate(chunks): + repo_create( + "source_embedding", + { + "source": self.id, + "order": i, + "content": surreal_clean(chunk), + "embedding": get_embedding(chunk), + }, + ) + except Exception as e: + logger.error(f"Error vectorizing source {self.id}: {str(e)}") + logger.exception(e) + raise DatabaseOperationError(e) + + @classmethod + def search(cls, query: str) -> List[Dict[str, Any]]: + if not query: + raise InvalidInputError("Search query cannot be empty") + try: + result = repo_query( + """ + SELECT * omit full_text + FROM source + WHERE string::lowercase(title) CONTAINS $query or title @@ $query + OR string::lowercase(summary) CONTAINS $query or summary @@ $query + OR string::lowercase(full_text) CONTAINS $query or full_text @@ $query + """, + {"query": query}, + ) + return result + except Exception as e: + logger.error(f"Error searching sources: {str(e)}") + logger.exception(e) + raise DatabaseOperationError("Failed to search sources") + + def _add_insight(self, insight_type: str, content: str) -> Any: + if not insight_type or not content: + raise InvalidInputError("Insight type and content must be provided") + try: + embedding = get_embedding(content) + return repo_create( + "source_insight", + { + "source": self.id, + "insight_type": insight_type, + "content": surreal_clean(content), + "embedding": embedding, + }, + ) + except Exception as e: + logger.error(f"Error adding insight to source {self.id}: {str(e)}") + raise DatabaseOperationError("Failed to add insight to source") + + def summarize(self) -> "Source": + try: + config = RunnableConfig(configurable=dict(thread_id=self.id)) + result = summarizer.invoke({"content": self.full_text}, config=config)[ + "summary" + ] + self._add_insight("summary", surreal_clean(result.summary)) + self.title = surreal_clean(result.title) + self.topics = result.topics + self.save() + return self + except Exception as e: + logger.error(f"Error summarizing source {self.id}: {str(e)}") + logger.exception(e) + raise DatabaseOperationError("Failed to summarize source") + + +class Note(ObjectModel): + table_name: ClassVar[str] = "note" + title: Optional[str] = None + note_type: Optional[Literal["human", "ai"]] = "human" + content: Optional[str] = None + + @field_validator("content") + @classmethod + def content_must_not_be_empty(cls, v): + if v is not None and not v.strip(): + raise InvalidInputError("Note content cannot be empty") + return v + + def add_to_notebook(self, notebook_id: str) -> Any: + if not notebook_id: + raise InvalidInputError("Notebook ID must be provided") + return self.relate("artifact", notebook_id) + + def get_context( + self, context_size: Literal["short", "long"] = "short" + ) -> Dict[str, Any]: + if context_size == "long": + return dict(id=self.id, title=self.title, content=self.content) + else: + return dict( + id=self.id, + title=self.title, + content=self.content[:100] if self.content else None, + ) + + def needs_embedding(self) -> bool: + return True + + def get_embedding_content(self) -> Optional[str]: + return self.content + + +def text_search( + keyword: str, results: int, source: bool = True, note: bool = True +) -> List[Dict[str, Any]]: + if not keyword: + raise InvalidInputError("Search keyword cannot be empty") + try: + results = repo_query( + """ + SELECT * FROM fn::text_search($keyword, $results, $source, $note); + """, + {"keyword": keyword, "results": results, "source": source, "note": note}, + ) + return results + except Exception as e: + logger.error(f"Error performing text search: {str(e)}") + logger.exception(e) + raise DatabaseOperationError("Failed to perform text search") + + +def vector_search( + keyword: str, results: int, source: bool = True, note: bool = True +) -> List[Dict[str, Any]]: + if not keyword: + raise InvalidInputError("Search keyword cannot be empty") + try: + results = repo_query( + """ + SELECT * FROM fn::vector_search($keyword, $results, $source, $note); + """, + {"keyword": keyword, "results": results, "source": source, "note": note}, + ) + return results + except Exception as e: + logger.error(f"Error performing vector search: {str(e)}") + logger.exception(e) + raise DatabaseOperationError("Failed to perform vector search") diff --git a/open_notebook/exceptions.py b/open_notebook/exceptions.py new file mode 100644 index 0000000..7f7aaf5 --- /dev/null +++ b/open_notebook/exceptions.py @@ -0,0 +1,64 @@ +class OpenNotebookError(Exception): + """Base exception class for Open Notebook errors.""" + + pass + + +class DatabaseOperationError(OpenNotebookError): + """Raised when a database operation fails.""" + + pass + + +class InvalidInputError(OpenNotebookError): + """Raised when invalid input is provided.""" + + pass + + +class NotFoundError(OpenNotebookError): + """Raised when a requested resource is not found.""" + + pass + + +class AuthenticationError(OpenNotebookError): + """Raised when there's an authentication problem.""" + + pass + + +class ConfigurationError(OpenNotebookError): + """Raised when there's a configuration problem.""" + + pass + + +class ExternalServiceError(OpenNotebookError): + """Raised when an external service (e.g., AI model) fails.""" + + pass + + +class RateLimitError(OpenNotebookError): + """Raised when a rate limit is exceeded.""" + + pass + + +class FileOperationError(OpenNotebookError): + """Raised when a file operation fails.""" + + pass + + +class NetworkError(OpenNotebookError): + """Raised when a network operation fails.""" + + pass + + +class InvalidDatabaseSchema(OpenNotebookError): + """Raised when the database is not under the expected schema.""" + + pass diff --git a/open_notebook/graphs/ask_content.py b/open_notebook/graphs/ask_content.py new file mode 100644 index 0000000..41d4a40 --- /dev/null +++ b/open_notebook/graphs/ask_content.py @@ -0,0 +1,52 @@ +import os + +from langchain_core.runnables import ( + RunnableConfig, +) +from langchain_openai import ChatOpenAI +from langgraph.graph import END, START, StateGraph +from loguru import logger +from typing_extensions import TypedDict + +from open_notebook.domain import Note, Notebook, Source +from open_notebook.prompter import Prompter + + +class AskState(TypedDict): + doc_id: str + doc_content: str + question: str + answer: str + notebook: Notebook + + +def call_model_with_messages(state: AskState, config: RunnableConfig) -> dict: + model = ChatOpenAI( + model=os.environ.get("RETRIEVAL_MODEL", os.environ["DEFAULT_MODEL"]), + temperature=0, + ) + system_prompt = Prompter(prompt_template="ask_content").render(data=state) + logger.debug(f"System prompt: {system_prompt}") + ai_message = model.invoke(system_prompt) + return {"answer": ai_message} + + +# todo: there is probably a better way to do this and avoid repetition +def get_content(state: AskState) -> dict: + doc_id = state["doc_id"] + if "note:" in doc_id: + doc: Note = Note.get(id=doc_id) + elif "source:" in doc_id: + doc: Source = Source.get(id=doc_id) + doc_content = doc.get_context("long") if doc else None + return {"doc_content": doc_content} + + +agent_state = StateGraph(AskState) +agent_state.add_node("get_content", get_content) +agent_state.add_node("agent", call_model_with_messages) +agent_state.add_edge(START, "get_content") +agent_state.add_edge("get_content", "agent") +agent_state.add_edge("agent", END) + +graph = agent_state.compile() diff --git a/open_notebook/graphs/chat.py b/open_notebook/graphs/chat.py new file mode 100644 index 0000000..8852c0d --- /dev/null +++ b/open_notebook/graphs/chat.py @@ -0,0 +1,74 @@ +import os +import sqlite3 +from typing import Annotated, List, Optional + +from langchain_core.runnables import ( + RunnableConfig, +) +from langchain_openai import ChatOpenAI +from langgraph.checkpoint.sqlite import SqliteSaver +from langgraph.graph import START, StateGraph +from langgraph.graph.message import add_messages +from langgraph.prebuilt import ToolNode, tools_condition +from loguru import logger +from pydantic import BaseModel, Field +from typing_extensions import TypedDict + +from open_notebook.domain import Notebook +from open_notebook.graphs.tools import ask_the_document, get_current_timestamp +from open_notebook.prompter import Prompter + +tools = [get_current_timestamp, ask_the_document] +tool_node = ToolNode(tools) + + +class ChatResponse(BaseModel): + """Respond to the user with this""" + + title: Optional[str] = Field( + description="A title to be used if your question would become a new note on the project" + ) + message: str = Field( + description="The actual message you'd like to reply to the user" + ) + citations: Optional[List[str]] = Field( + description="The ids for the documents you used to formulate your answer" + ) + + +class ThreadState(TypedDict): + messages: Annotated[list, add_messages] + notebook: Optional[Notebook] + context: Optional[str] + context_config: Optional[dict] + response: Optional[ChatResponse] + + +def call_model_with_messages(state: ThreadState, config: RunnableConfig) -> dict: + model = ChatOpenAI(model=os.environ["DEFAULT_MODEL"], temperature=0).bind_tools( + tools + ) + messages = state["messages"] + system_prompt = Prompter(prompt_template="chat").render(data=state) + logger.warning(f"System prompt: {system_prompt}") + ai_message = model.invoke([system_prompt] + messages) + return {"messages": ai_message} + + +conn = sqlite3.connect( + os.environ.get("CHECKPOINT_DATA_PATH", "sqlite-db/checkpoints.sqlite"), + check_same_thread=False, +) +memory = SqliteSaver(conn) + +agent_state = StateGraph(ThreadState) +agent_state.add_node("agent", call_model_with_messages) +agent_state.add_node("tools", tool_node) +agent_state.add_edge(START, "agent") +agent_state.add_conditional_edges( + "agent", + tools_condition, +) +agent_state.add_edge("tools", "agent") + +graph = agent_state.compile(checkpointer=memory) diff --git a/open_notebook/graphs/content_process.py b/open_notebook/graphs/content_process.py new file mode 100644 index 0000000..9534db0 --- /dev/null +++ b/open_notebook/graphs/content_process.py @@ -0,0 +1,217 @@ +import re + +import fitz # type: ignore +import magic +import requests # type: ignore +from langgraph.graph import END, START, StateGraph +from typing_extensions import TypedDict +from youtube_transcript_api import YouTubeTranscriptApi # type: ignore +from youtube_transcript_api.formatters import TextFormatter # type: ignore + + +class SourceState(TypedDict): + content: str + file_path: str + url: str + source_type: str + identified_type: str + identified_provider: str + + +def source_identification(state: SourceState): + """ + Identify the content source based on parameters + """ + if state.get("content"): + doc_type = "text" + elif state.get("file_path"): + doc_type = "file" + elif state.get("url"): + doc_type = "url" + else: + raise ValueError("No source provided.") + + return {"source_type": doc_type} + + +def url_provider(state: SourceState): + """ + Identify the provider + """ + return_dict = {} + url = state.get("url") + if url: + if "youtube.com" in url or "youtu.be" in url: + return_dict["identified_type"] = ( + "youtube" # playlists, channels in the future + ) + else: + return_dict["identified_type"] = "article" + # article providers in the future + return return_dict + + +def file_type(state: SourceState): + """ + Identify the file using python-magic + """ + return_dict = {} + file_path = state.get("file_path") + if file_path is not None: + return_dict["identified_type"] = magic.from_file(file_path, mime=True) + return return_dict + + +def _extract_text_from_pdf(pdf_path): + doc = fitz.open(pdf_path) + text = "" + for page in doc: + text += page.get_text() + doc.close() + return text + + +def extract_pdf(state: SourceState): + """ + Parse the text file and print its content. + """ + return_dict = {} + if ( + state.get("file_path") is not None + and state.get("identified_type") == "application/pdf" + ): + file_path = state.get("file_path") + try: + text = _extract_text_from_pdf(file_path) + return_dict["content"] = text + except FileNotFoundError: + raise FileNotFoundError(f"File not found at {file_path}") + except Exception as e: + raise Exception(f"An error occurred: {e}") + + return return_dict + + +def extract_url(state: SourceState): + """ + Get the content of a URL + """ + response = requests.get(f"https://r.jina.ai/{state.get('url')}") + return {"content": response.text} + + +def extract_txt(state: SourceState): + """ + Parse the text file and print its content. + """ + return_dict = {} + if ( + state.get("file_path") is not None + and state.get("identified_type") == "text/plain" + ): + file_path = state.get("file_path") + if file_path is not None: + try: + with open(file_path, "r", encoding="utf-8") as file: + content = file.read() + return_dict["content"] = content + except FileNotFoundError: + raise FileNotFoundError(f"File not found at {file_path}") + except Exception as e: + raise Exception(f"An error occurred: {e}") + + return return_dict + + +def _extract_youtube_id(url): + """ + Extract the YouTube video ID from a given URL using regular expressions. + + Args: + url (str): The YouTube URL from which to extract the video ID. + + Returns: + str: The extracted YouTube video ID or None if no valid ID is found. + """ + # Define a regular expression pattern to capture the YouTube video ID + youtube_regex = ( + r"(?:https?://)?" # Optional scheme + r"(?:www\.)?" # Optional www. + r"(?:" + r"youtu\.be/" # Shortened URL + r"|youtube\.com" # Main URL + r"(?:" # Group start + r"/embed/" # Embed URL + r"|/v/" # Older video URL + r"|/watch\?v=" # Standard watch URL + r"|/watch\?.+&v=" # Other watch URL + r")" # Group end + r")" # End main group + r"([\w-]{11})" # 11 characters (YouTube video ID) + ) + + # Search the URL for the pattern + match = re.search(youtube_regex, url) + + # Return the video ID if a match is found + return match.group(1) if match else None + + +def extract_youtube_transcript(state: SourceState): + """ + Parse the text file and print its content. + """ + + transcript = YouTubeTranscriptApi.get_transcript( + _extract_youtube_id(state.get("url")), languages=["pt", "en"] + ) + formatter = TextFormatter() + return {"content": formatter.format_transcript(transcript)} + + +def should_continue(data: SourceState): + if data.get("source_type") == "url": + return "parse_url" + else: + return "end" + + +workflow = StateGraph(SourceState) +workflow.add_node("source", source_identification) +workflow.add_node("url_provider", url_provider) +workflow.add_node("file_type", file_type) +workflow.add_node("extract_txt", extract_txt) +workflow.add_node("extract_pdf", extract_pdf) +workflow.add_node("extract_url", extract_url) +workflow.add_node("extract_youtube_transcript", extract_youtube_transcript) + +workflow.add_edge(START, "source") +workflow.add_conditional_edges( + "source", + lambda x: x.get("source_type"), + { + "url": "url_provider", + "file": "file_type", + "text": END, + }, +) +workflow.add_conditional_edges( + "file_type", + lambda x: x.get("identified_type"), + { + "text/plain": "extract_txt", + "application/pdf": "extract_pdf", + }, +) +workflow.add_conditional_edges( + "url_provider", + lambda x: x.get("identified_type"), + {"article": "extract_url", "youtube": "extract_youtube_transcript"}, +) +workflow.add_edge("url_provider", END) +workflow.add_edge("file_type", END) +workflow.add_edge("extract_txt", END) +workflow.add_edge("extract_pdf", END) +workflow.add_edge("extract_url", END) +workflow.add_edge("extract_youtube_transcript", END) +graph = workflow.compile() diff --git a/open_notebook/graphs/summary.py b/open_notebook/graphs/summary.py new file mode 100644 index 0000000..1c771b7 --- /dev/null +++ b/open_notebook/graphs/summary.py @@ -0,0 +1,96 @@ +import os +from typing import List, Literal + +from langchain_core.runnables import ( + RunnableConfig, +) +from langchain_openai import ChatOpenAI +from langgraph.graph import END, START, StateGraph +from langgraph.prebuilt import ToolNode +from pydantic import BaseModel, Field +from typing_extensions import TypedDict + +from open_notebook.graphs.tools import get_current_timestamp +from open_notebook.prompter import Prompter +from open_notebook.utils import split_text + +tools = [get_current_timestamp] +tool_node = ToolNode(tools) + + +class SummaryResponse(BaseModel): + """Respond to the user with this""" + + summary: str = Field(description="The summary of the content") + topics: List[str] = Field(description="List of 4-7 topics related to this content") + title: str = Field(description="The title of the content") + + +class SummaryState(TypedDict): + chunks: List[str] + content: str + summary: SummaryResponse + + +def build_chunks(state: SummaryState) -> dict: + """ + Split the input text into chunks. + """ + return { + "chunks": split_text( + state["content"], + chunk=int(os.environ.get("SUMMARY_CHUNK_SIZE", 200000)), + overlap=int(os.environ.get("SUMMARY_CHUNK_OVERLAP", 1000)), + ) + } + + +def setup_next_chunk(state: SummaryState) -> dict: + """ + Move the next item in the chunk to the processing area + """ + state["content"] = state["chunks"].pop(0) + return {"chunks": state["chunks"], "content": state["content"]} + + +def chunk_condition(state: SummaryState) -> Literal["get_chunk", END]: # type: ignore + """ + Checks whether there are more chunks to process. + """ + if len(state["chunks"]) > 0: + return "get_chunk" + return END + + +# todo: build a helper method for LLM communication on all graphs +def call_model_with_messages(state: SummaryState, config: RunnableConfig) -> dict: + model = ( + ChatOpenAI( + model=os.environ.get("SUMMARIZATION_MODEL", os.environ["DEFAULT_MODEL"]), + temperature=0, + ) + .bind_tools(tools) + .with_structured_output(SummaryResponse) + ) + + system_prompt = Prompter(prompt_template="summarize").render(data=state) + ai_message = model.invoke(system_prompt) + return {"summary": ai_message} + + +agent_state = StateGraph(SummaryState) +agent_state.add_node("setup_chunk", build_chunks) +agent_state.add_edge(START, "setup_chunk") +agent_state.add_conditional_edges( + "setup_chunk", + chunk_condition, +) +agent_state.add_node("get_chunk", setup_next_chunk) +agent_state.add_node("agent", call_model_with_messages) +agent_state.add_edge("get_chunk", "agent") +agent_state.add_conditional_edges( + "agent", + chunk_condition, +) + +graph = agent_state.compile() diff --git a/open_notebook/graphs/tools.py b/open_notebook/graphs/tools.py new file mode 100644 index 0000000..2c35c6f --- /dev/null +++ b/open_notebook/graphs/tools.py @@ -0,0 +1,24 @@ +from datetime import datetime + +from langchain.tools import tool + + +@tool +def get_current_timestamp() -> str: + """ + Returns the current timestamp in the format YYYYMMDDHHmmss. + """ + return datetime.now().strftime("%Y%m%d%H%M%S") + + +@tool +def ask_the_document(doc_id: str, question: str): + """ + Use this tool to ask a question to the document. + Another LLM will ready the document and answer the question. + Be specific and complete in your query given the LLM that will process it is very capable. + """ + from open_notebook.graphs.ask_content import graph + + result = graph.invoke({"doc_id": doc_id, "question": question}) + return result["answer"] diff --git a/open_notebook/prompter.py b/open_notebook/prompter.py new file mode 100644 index 0000000..6782ec3 --- /dev/null +++ b/open_notebook/prompter.py @@ -0,0 +1,93 @@ +""" +A prompt management module using Jinja to generate complex prompts with simple templates. +""" + +import os +from dataclasses import dataclass +from datetime import datetime +from typing import Any, Optional, Union + +from jinja2 import Environment, FileSystemLoader, Template + +env = Environment(loader=FileSystemLoader(os.environ.get("PROMPT_PATH", "prompts"))) + + +@dataclass +class Prompter: + """ + A class for managing and rendering prompt templates. + + Attributes: + prompt_template (str, optional): The name of the prompt template file. + prompt_variation (str, optional): The variation of the prompt template. + prompt_text (str, optional): The raw prompt text. + template (Union[str, Template], optional): The Jinja2 template object. + """ + + prompt_template: Optional[str] = None + prompt_variation: Optional[str] = "default" + prompt_text: Optional[str] = None + template: Optional[Union[str, Template]] = None + parser: Optional[Any] = None + + def __init__(self, prompt_template=None, prompt_text=None): + """ + Initialize the Prompter with either a template file or raw text. + + Args: + prompt_template (str, optional): The name of the prompt template file. + prompt_text (str, optional): The raw prompt text. + """ + self.prompt_template = prompt_template + self.prompt_text = prompt_text + self.setup() + + def setup(self): + """ + Set up the Jinja2 template based on the provided template file or text. + Raises: + ValueError: If neither prompt_template nor prompt_text is provided. + """ + if self.prompt_template: + self.template = env.get_template(f"{self.prompt_template}.jinja") + elif self.prompt_text: + self.template = Template(self.prompt_text) + else: + raise ValueError("Prompter must have a prompt_template or prompt_text") + + assert self.prompt_template or self.prompt_text, "Prompt is required" + + @classmethod + def from_text(cls, text: str): + """ + Create a Prompter instance from raw text, which can contain Jinja code. + + Args: + text (str): The raw prompt text. + + Returns: + Prompter: A new Prompter instance. + """ + return cls(prompt_text=text) + + def render(self, data) -> str: + """ + Render the prompt template with the given data. + + Args: + data (dict): The data to be used in rendering the template. + + Returns: + str: The rendered prompt text. + + Raises: + AssertionError: If the template is not defined or not a Jinja2 Template. + """ + data["current_time"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + if self.parser: + data["format_instructions"] = self.parser.get_format_instructions() + assert self.template, "Prompter template is not defined" + assert isinstance( + self.template, Template + ), "Prompter template is not a Jinja2 Template" + return self.template.render(data) diff --git a/open_notebook/repository.py b/open_notebook/repository.py new file mode 100644 index 0000000..d07ee9b --- /dev/null +++ b/open_notebook/repository.py @@ -0,0 +1,109 @@ +import asyncio +import os +from contextlib import asynccontextmanager + +from loguru import logger +from surrealdb import Surreal + +from open_notebook.exceptions import InvalidDatabaseSchema + +EXPECTED_VERSION = "0.0.1" + + +@asynccontextmanager +async def db_connection(): + db = Surreal(os.environ["SURREAL_ADDRESS"]) + try: + await db.connect() + await db.signin( + {"user": os.environ["SURREAL_USER"], "pass": os.environ["SURREAL_PASS"]} + ) + await db.use(os.environ["SURREAL_NAMESPACE"], os.environ["SURREAL_DATABASE"]) + yield db + finally: + await db.close() + + +def repo_query(query_str, vars=None): + async def _query(): + async with db_connection() as db: + result = await db.query(query_str, vars) + return result + + result = asyncio.run(_query()) + return result[0]["result"] + + +def check_version(): + async def _check_version(): + async with db_connection() as db: + result = await db.query("select * from open_notebook:database_info;") + return result + + try: + result = asyncio.run(_check_version()) + if len(result) == 0 or len(result[0]["result"]) == 0: + raise InvalidDatabaseSchema("Database schema not found") + version = result[0]["result"][0]["version"] + logger.info(f"Connected to SurrealDB, using schema version {version}") + if version != EXPECTED_VERSION: + raise InvalidDatabaseSchema( + f"Version mismatch. Expected {EXPECTED_VERSION}, got {version}" + ) + except Exception as e: + logger.error(e) + raise e + + +def repo_create(table, data): + async def _create(): + async with db_connection() as db: + result = await db.create(table, data) + return result + + result = asyncio.run(_create()) + return result + + +def repo_update(id, data): + async def _update(): + async with db_connection() as db: + result = await db.update(id, data) + return result + + result = asyncio.run(_update()) + return result + + +def repo_delete(id): + async def _delete(): + async with db_connection() as db: + result = await db.delete(id) + return result + + result = asyncio.run(_delete()) + return result + + +def repo_relate(source, relationship, target): + async def _relate(): + async with db_connection() as db: + query = f"RELATE {source}->{relationship}->{target};" + result = await db.query(query) + return result + + result = asyncio.run(_relate()) + return result + + +def execute_migration(): + async def _query(): + content = None + with open("db_setup.surrealql", "r") as file: + content = file.read() + async with db_connection() as db: + result = await db.query(content) + return result + + result = asyncio.run(_query()) + return result[0]["result"] diff --git a/open_notebook/utils.py b/open_notebook/utils.py new file mode 100644 index 0000000..830386f --- /dev/null +++ b/open_notebook/utils.py @@ -0,0 +1,83 @@ +from langchain_text_splitters import CharacterTextSplitter +from openai import OpenAI + +client = OpenAI() + + +def split_text(txt: str, chunk=1000, overlap=0, separator=" "): + """ + Split the input text into chunks. + + Args: + txt (str): The input text to be split. + chunk (int): The size of each chunk. Default is 1000. + overlap (int): The number of characters to overlap between chunks. Default is 0. + separator (str): The separator to use when splitting the text. Default is " ". + + Returns: + list: A list of text chunks. + """ + text_splitter = CharacterTextSplitter( + chunk_size=chunk, chunk_overlap=overlap, separator=separator + ) + return text_splitter.split_text(txt) + + +def token_count(input_string): + """ + Count the number of tokens in the input string using the 'o200k_base' encoding. + + Args: + input_string (str): The input string to count tokens for. + + Returns: + int: The number of tokens in the input string. + """ + import tiktoken + + encoding = tiktoken.get_encoding("o200k_base") + tokens = encoding.encode(input_string) + token_count = len(tokens) + return token_count + + +def token_cost(token_count, cost_per_million=0.150): + """ + Calculate the cost of tokens based on the token count and cost per million tokens. + + Args: + token_count (int): The number of tokens. + cost_per_million (float): The cost per million tokens. Default is 0.150. + + Returns: + float: The calculated cost for the given token count. + """ + return cost_per_million * (token_count / 1_000_000) + + +def get_embedding(text, model="text-embedding-3-small"): + """ + Get the embedding for the input text using the specified model. + + Args: + text (str): The input text to get the embedding for. + model (str): The name of the embedding model to use. Default is "text-embedding-3-small". + + Returns: + list: The embedding vector for the input text. + """ + text = text.replace("\n", " ") + return client.embeddings.create(input=[text], model=model).data[0].embedding + + +def surreal_clean(text): + """ + Clean the input text by escaping colons for SurrealDB compatibility. + + Args: + text (str): The input text to clean. + Returns: + str: The cleaned text with escaped colons. + """ + text = text.replace(":", "\:") + return text diff --git a/pages/2_📒_Notebooks.py b/pages/2_📒_Notebooks.py new file mode 100644 index 0000000..ef3e6b1 --- /dev/null +++ b/pages/2_📒_Notebooks.py @@ -0,0 +1,115 @@ +import streamlit as st +from humanize import naturaltime + +from open_notebook.domain import Notebook +from stream_app.chat import chat_sidebar +from stream_app.note import add_note, note_card +from stream_app.source import add_source, source_card +from stream_app.utils import setup_stream_state + +st.set_page_config( + layout="wide", page_title="📒 Open Notebook", initial_sidebar_state="expanded" +) + + +def notebook_header(current_notebook): + c1, c2, c3 = st.columns([8, 2, 2]) + c1.header(current_notebook.name) + if c2.button("Back to the list", icon="🔙"): + st.session_state["current_notebook"] = None + st.rerun() + + if c3.button("Refresh", icon="🔄"): + st.rerun() + current_description = current_notebook.description + with st.expander( + current_notebook.description + if len(current_description) > 0 + else "click to add a description" + ): + notebook_name = st.text_input("Name", value=current_notebook.name) + notebook_description = st.text_area( + "Description", + value=current_description, + placeholder="Add as much context as you can as this will be used by the AI to generate insights.", + ) + if st.button("Save", key="edit_notebook"): + current_notebook.name = notebook_name + current_notebook.description = notebook_description + current_notebook.save() + st.rerun() + if st.button("Delete forever", icon="☠️"): + current_notebook.delete() + st.session_state["current_notebook"] = None + st.rerun() + + +def notebook_page(current_notebook_id): + current_notebook: Notebook = Notebook.get(current_notebook_id) + if not current_notebook: + st.error("Notebook not found") + return + if current_notebook_id not in st.session_state.keys(): + st.session_state[current_notebook_id] = current_notebook + + session_id = st.session_state["active_session"] + st.session_state[session_id]["notebook"] = current_notebook + sources = current_notebook.sources + notes = current_notebook.notes + + notebook_header(current_notebook) + + work_tab, chat_tab = st.columns([4, 2]) + with work_tab: + sources_tab, notes_tab = st.columns(2) + with sources_tab: + with st.container(border=True): + if st.button("Add Source", icon="➕"): + add_source(session_id) + for source in sources: + source_card(session_id=session_id, source=source) + + with notes_tab: + with st.container(border=True): + if st.button("Write a Note", icon="📝"): + add_note(session_id) + for note in notes: + note_card(session_id=session_id, note=note) + with chat_tab: + chat_sidebar(session_id=session_id) + + +if "current_notebook" not in st.session_state: + st.session_state["current_notebook"] = None + +if st.session_state["current_notebook"]: + notebook_page(st.session_state["current_notebook"]) + st.stop() + +st.title("📒 My Notebooks") +st.caption("Here are all your notebooks") + + +notebooks = Notebook.get_all() + +for notebook in notebooks: + with st.container(border=True): + st.subheader(notebook.name) + st.caption( + f"Created: {naturaltime(notebook.created)}, updated: {naturaltime(notebook.updated)}" + ) + st.write(notebook.description) + if st.button("Open", key=f"open_notebook_{notebook.id}"): + setup_stream_state(notebook.id) + st.session_state["current_notebook"] = notebook.id + st.rerun() + +with st.container(border=True): + new_notebook_title = st.text_input("New Notebook Name") + new_notebook_description = st.text_area("Description") + if st.button("Create a new Notebook", icon="➕"): + notebook = Notebook( + name=new_notebook_title, description=new_notebook_description + ) + notebook.save() + st.rerun() diff --git a/pages/3_🔍_Search.py b/pages/3_🔍_Search.py new file mode 100644 index 0000000..63fc8bd --- /dev/null +++ b/pages/3_🔍_Search.py @@ -0,0 +1,65 @@ +import streamlit as st + +from open_notebook.domain import text_search, vector_search +from open_notebook.utils import get_embedding +from stream_app.note import note_list_item +from stream_app.source import source_list_item + +st.set_page_config( + layout="wide", page_title="🔍 Open Notebook", initial_sidebar_state="expanded" +) + +# search_tab, ask_tab = st.tabs(["Search", "Ask"]) +# notebooks = Notebook.get_all() + +if "search_results" not in st.session_state: + st.session_state["search_results"] = [] + +# with search_tab: +with st.container(border=True): + st.subheader("🔍 Search") + st.caption("Search your knowledge base for specific keywords or concepts") + search_term = st.text_input("Search", "") + search_type = st.radio("Search Type", ["Text Search", "Vector Search"]) + search_sources = st.checkbox("Search Sources", value=True) + search_notes = st.checkbox("Search Notes", value=True) + if st.button("Search"): + if search_type == "Text Search": + st.write(f"Searching for {search_term}") + st.session_state["search_results"] = text_search( + search_term, 100, search_sources, search_notes + ) + elif search_type == "Vector Search": + st.write(f"Searching for {search_term}") + embed_query = get_embedding(search_term) + st.session_state["search_results"] = vector_search( + embed_query, 100, search_sources, search_notes + ) + for item in st.session_state["search_results"]: + score = item.get("relevance", item.get("similarity", 0)) + if item.get("item_id"): + if "source:" in item["item_id"]: + source_list_item(item["item_id"], score) + elif "note:" in item["item_id"]: + note_list_item(item["item_id"], score) + +# coming soon +# with ask_tab: +# with st.form(key="ask_form"): +# st.subheader("Ask Your Knowledge Base") +# st.caption("Let the LLM formulate an answer based on your query") +# question = st.text_input("Your question", "") + +# notebooks = st.multiselect( +# "Notebooks", +# notebooks, +# notebooks, +# format_func=lambda x: x.name, +# ) +# search_sources = st.multiselect( +# "Use Sources", +# ["Sources", "Notes"], +# ["Sources", "Notes"], +# ) +# if st.form_submit_button("Search"): +# st.write(f"Searching for {search_term}") diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..ea38ca9 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,4021 @@ +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + +[[package]] +name = "aiohappyeyeballs" +version = "2.4.3" +description = "Happy Eyeballs for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, + {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, +] + +[[package]] +name = "aiohttp" +version = "3.10.10" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68"}, + {file = "aiohttp-3.10.10-cp310-cp310-win32.whl", hash = "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257"}, + {file = "aiohttp-3.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a"}, + {file = "aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94"}, + {file = "aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205"}, + {file = "aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628"}, + {file = "aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b"}, + {file = "aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8"}, + {file = "aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b"}, + {file = "aiohttp-3.10.10-cp38-cp38-win32.whl", hash = "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c"}, + {file = "aiohttp-3.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91"}, + {file = "aiohttp-3.10.10-cp39-cp39-win32.whl", hash = "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983"}, + {file = "aiohttp-3.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23"}, + {file = "aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a"}, +] + +[package.dependencies] +aiohappyeyeballs = ">=2.3.0" +aiosignal = ">=1.1.2" +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.12.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "aiosqlite" +version = "0.20.0" +description = "asyncio bridge to the standard sqlite3 module" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiosqlite-0.20.0-py3-none-any.whl", hash = "sha256:36a1deaca0cac40ebe32aac9977a6e2bbc7f5189f23f4a54d5908986729e5bd6"}, + {file = "aiosqlite-0.20.0.tar.gz", hash = "sha256:6d35c8c256637f4672f843c31021464090805bf925385ac39473fb16eaaca3d7"}, +] + +[package.dependencies] +typing_extensions = ">=4.0" + +[package.extras] +dev = ["attribution (==1.7.0)", "black (==24.2.0)", "coverage[toml] (==7.4.1)", "flake8 (==7.0.0)", "flake8-bugbear (==24.2.6)", "flit (==3.9.0)", "mypy (==1.8.0)", "ufmt (==2.3.0)", "usort (==1.0.8.post1)"] +docs = ["sphinx (==7.2.6)", "sphinx-mdinclude (==0.5.3)"] + +[[package]] +name = "altair" +version = "5.4.1" +description = "Vega-Altair: A declarative statistical visualization library for Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "altair-5.4.1-py3-none-any.whl", hash = "sha256:0fb130b8297a569d08991fb6fe763582e7569f8a04643bbd9212436e3be04aef"}, + {file = "altair-5.4.1.tar.gz", hash = "sha256:0ce8c2e66546cb327e5f2d7572ec0e7c6feece816203215613962f0ec1d76a82"}, +] + +[package.dependencies] +jinja2 = "*" +jsonschema = ">=3.0" +narwhals = ">=1.5.2" +packaging = "*" +typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""} + +[package.extras] +all = ["altair-tiles (>=0.3.0)", "anywidget (>=0.9.0)", "numpy", "pandas (>=0.25.3)", "pyarrow (>=11)", "vega-datasets (>=0.9.0)", "vegafusion[embed] (>=1.6.6)", "vl-convert-python (>=1.6.0)"] +dev = ["geopandas", "hatch", "ibis-framework[polars]", "ipython[kernel]", "mistune", "mypy", "pandas (>=0.25.3)", "pandas-stubs", "polars (>=0.20.3)", "pytest", "pytest-cov", "pytest-xdist[psutil] (>=3.5,<4.0)", "ruff (>=0.6.0)", "types-jsonschema", "types-setuptools"] +doc = ["docutils", "jinja2", "myst-parser", "numpydoc", "pillow (>=9,<10)", "pydata-sphinx-theme (>=0.14.1)", "scipy", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinxext-altair"] + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anyio" +version = "4.6.2.post1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.9" +files = [ + {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, + {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "attrs" +version = "24.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, +] + +[package.extras] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] + +[[package]] +name = "blinker" +version = "1.8.2" +description = "Fast, simple object-to-object and broadcast signaling" +optional = false +python-versions = ">=3.8" +files = [ + {file = "blinker-1.8.2-py3-none-any.whl", hash = "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01"}, + {file = "blinker-1.8.2.tar.gz", hash = "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83"}, +] + +[[package]] +name = "cachetools" +version = "5.5.0" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, + {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, +] + +[[package]] +name = "certifi" +version = "2024.8.30" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, +] + +[[package]] +name = "cffi" +version = "1.17.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.2.2" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "dataclasses-json" +version = "0.6.7" +description = "Easily serialize dataclasses to and from JSON." +optional = false +python-versions = "<4.0,>=3.7" +files = [ + {file = "dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a"}, + {file = "dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0"}, +] + +[package.dependencies] +marshmallow = ">=3.18.0,<4.0.0" +typing-inspect = ">=0.4.0,<1" + +[[package]] +name = "debugpy" +version = "1.8.7" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.7-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95fe04a573b8b22896c404365e03f4eda0ce0ba135b7667a1e57bd079793b96b"}, + {file = "debugpy-1.8.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:628a11f4b295ffb4141d8242a9bb52b77ad4a63a2ad19217a93be0f77f2c28c9"}, + {file = "debugpy-1.8.7-cp310-cp310-win32.whl", hash = "sha256:85ce9c1d0eebf622f86cc68618ad64bf66c4fc3197d88f74bb695a416837dd55"}, + {file = "debugpy-1.8.7-cp310-cp310-win_amd64.whl", hash = "sha256:29e1571c276d643757ea126d014abda081eb5ea4c851628b33de0c2b6245b037"}, + {file = "debugpy-1.8.7-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:caf528ff9e7308b74a1749c183d6808ffbedbb9fb6af78b033c28974d9b8831f"}, + {file = "debugpy-1.8.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cba1d078cf2e1e0b8402e6bda528bf8fda7ccd158c3dba6c012b7897747c41a0"}, + {file = "debugpy-1.8.7-cp311-cp311-win32.whl", hash = "sha256:171899588bcd412151e593bd40d9907133a7622cd6ecdbdb75f89d1551df13c2"}, + {file = "debugpy-1.8.7-cp311-cp311-win_amd64.whl", hash = "sha256:6e1c4ffb0c79f66e89dfd97944f335880f0d50ad29525dc792785384923e2211"}, + {file = "debugpy-1.8.7-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:4d27d842311353ede0ad572600c62e4bcd74f458ee01ab0dd3a1a4457e7e3706"}, + {file = "debugpy-1.8.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:703c1fd62ae0356e194f3e7b7a92acd931f71fe81c4b3be2c17a7b8a4b546ec2"}, + {file = "debugpy-1.8.7-cp312-cp312-win32.whl", hash = "sha256:2f729228430ef191c1e4df72a75ac94e9bf77413ce5f3f900018712c9da0aaca"}, + {file = "debugpy-1.8.7-cp312-cp312-win_amd64.whl", hash = "sha256:45c30aaefb3e1975e8a0258f5bbd26cd40cde9bfe71e9e5a7ac82e79bad64e39"}, + {file = "debugpy-1.8.7-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:d050a1ec7e925f514f0f6594a1e522580317da31fbda1af71d1530d6ea1f2b40"}, + {file = "debugpy-1.8.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f4349a28e3228a42958f8ddaa6333d6f8282d5edaea456070e48609c5983b7"}, + {file = "debugpy-1.8.7-cp313-cp313-win32.whl", hash = "sha256:11ad72eb9ddb436afb8337891a986302e14944f0f755fd94e90d0d71e9100bba"}, + {file = "debugpy-1.8.7-cp313-cp313-win_amd64.whl", hash = "sha256:2efb84d6789352d7950b03d7f866e6d180284bc02c7e12cb37b489b7083d81aa"}, + {file = "debugpy-1.8.7-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:4b908291a1d051ef3331484de8e959ef3e66f12b5e610c203b5b75d2725613a7"}, + {file = "debugpy-1.8.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da8df5b89a41f1fd31503b179d0a84a5fdb752dddd5b5388dbd1ae23cda31ce9"}, + {file = "debugpy-1.8.7-cp38-cp38-win32.whl", hash = "sha256:b12515e04720e9e5c2216cc7086d0edadf25d7ab7e3564ec8b4521cf111b4f8c"}, + {file = "debugpy-1.8.7-cp38-cp38-win_amd64.whl", hash = "sha256:93176e7672551cb5281577cdb62c63aadc87ec036f0c6a486f0ded337c504596"}, + {file = "debugpy-1.8.7-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:90d93e4f2db442f8222dec5ec55ccfc8005821028982f1968ebf551d32b28907"}, + {file = "debugpy-1.8.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6db2a370e2700557a976eaadb16243ec9c91bd46f1b3bb15376d7aaa7632c81"}, + {file = "debugpy-1.8.7-cp39-cp39-win32.whl", hash = "sha256:a6cf2510740e0c0b4a40330640e4b454f928c7b99b0c9dbf48b11efba08a8cda"}, + {file = "debugpy-1.8.7-cp39-cp39-win_amd64.whl", hash = "sha256:6a9d9d6d31846d8e34f52987ee0f1a904c7baa4912bf4843ab39dadf9b8f3e0d"}, + {file = "debugpy-1.8.7-py2.py3-none-any.whl", hash = "sha256:57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae"}, + {file = "debugpy-1.8.7.zip", hash = "sha256:18b8f731ed3e2e1df8e9cdaa23fb1fc9c24e570cd0081625308ec51c82efe42e"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "distlib" +version = "0.3.9" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, + {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, +] + +[[package]] +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "executing" +version = "2.1.0" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.8" +files = [ + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "filelock" +version = "3.16.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2)"] + +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "gitdb" +version = "4.0.11" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.43" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] + +[[package]] +name = "greenlet" +version = "3.1.1" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, + {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, + {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, + {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, + {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, + {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, + {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, + {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, + {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, + {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, + {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.6" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, + {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<1.0)"] + +[[package]] +name = "httpx" +version = "0.27.2" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, + {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "httpx-sse" +version = "0.4.0" +description = "Consume Server-Sent Event (SSE) messages with HTTPX." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721"}, + {file = "httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f"}, +] + +[[package]] +name = "humanize" +version = "4.11.0" +description = "Python humanize utilities" +optional = false +python-versions = ">=3.9" +files = [ + {file = "humanize-4.11.0-py3-none-any.whl", hash = "sha256:b53caaec8532bcb2fff70c8826f904c35943f8cecaca29d272d9df38092736c0"}, + {file = "humanize-4.11.0.tar.gz", hash = "sha256:e66f36020a2d5a974c504bd2555cf770621dbdbb6d82f94a6857c0b1ea2608be"}, +] + +[package.extras] +tests = ["freezegun", "pytest", "pytest-cov"] + +[[package]] +name = "icecream" +version = "2.1.3" +description = "Never use print() to debug again; inspect variables, expressions, and program execution with a single, simple function call." +optional = false +python-versions = "*" +files = [ + {file = "icecream-2.1.3-py2.py3-none-any.whl", hash = "sha256:757aec31ad4488b949bc4f499d18e6e5973c40cc4d4fc607229e78cfaec94c34"}, + {file = "icecream-2.1.3.tar.gz", hash = "sha256:0aa4a7c3374ec36153a1d08f81e3080e83d8ac1eefd97d2f4fe9544e8f9b49de"}, +] + +[package.dependencies] +asttokens = ">=2.0.1" +colorama = ">=0.3.9" +executing = ">=0.3.1" +pygments = ">=2.2.0" + +[[package]] +name = "identify" +version = "2.6.1" +description = "File identification library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, + {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "ipykernel" +version = "6.29.5" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.28.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.10" +files = [ + {file = "ipython-8.28.0-py3-none-any.whl", hash = "sha256:530ef1e7bb693724d3cdc37287c80b07ad9b25986c007a53aa1857272dac3f35"}, + {file = "ipython-8.28.0.tar.gz", hash = "sha256:0d0d15ca1e01faeb868ef56bc7ee5a0de5bd66885735682e8a322ae289a13d1a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5.13.0" +typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing-extensions"] +kernel = ["ipykernel"] +matplotlib = ["matplotlib"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jiter" +version = "0.6.1" +description = "Fast iterable JSON parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jiter-0.6.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d08510593cb57296851080018006dfc394070178d238b767b1879dc1013b106c"}, + {file = "jiter-0.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adef59d5e2394ebbad13b7ed5e0306cceb1df92e2de688824232a91588e77aa7"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e02f7a27f2bcc15b7d455c9df05df8ffffcc596a2a541eeda9a3110326e7a3"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed69a7971d67b08f152c17c638f0e8c2aa207e9dd3a5fcd3cba294d39b5a8d2d"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2019d966e98f7c6df24b3b8363998575f47d26471bfb14aade37630fae836a1"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36c0b51a285b68311e207a76c385650322734c8717d16c2eb8af75c9d69506e7"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:220e0963b4fb507c525c8f58cde3da6b1be0bfddb7ffd6798fb8f2531226cdb1"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa25c7a9bf7875a141182b9c95aed487add635da01942ef7ca726e42a0c09058"}, + {file = "jiter-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e90552109ca8ccd07f47ca99c8a1509ced93920d271bb81780a973279974c5ab"}, + {file = "jiter-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:67723a011964971864e0b484b0ecfee6a14de1533cff7ffd71189e92103b38a8"}, + {file = "jiter-0.6.1-cp310-none-win32.whl", hash = "sha256:33af2b7d2bf310fdfec2da0177eab2fedab8679d1538d5b86a633ebfbbac4edd"}, + {file = "jiter-0.6.1-cp310-none-win_amd64.whl", hash = "sha256:7cea41c4c673353799906d940eee8f2d8fd1d9561d734aa921ae0f75cb9732f4"}, + {file = "jiter-0.6.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b03c24e7da7e75b170c7b2b172d9c5e463aa4b5c95696a368d52c295b3f6847f"}, + {file = "jiter-0.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:47fee1be677b25d0ef79d687e238dc6ac91a8e553e1a68d0839f38c69e0ee491"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0d2f6e01a8a0fb0eab6d0e469058dab2be46ff3139ed2d1543475b5a1d8e7"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b809e39e342c346df454b29bfcc7bca3d957f5d7b60e33dae42b0e5ec13e027"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e9ac7c2f092f231f5620bef23ce2e530bd218fc046098747cc390b21b8738a7a"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e51a2d80d5fe0ffb10ed2c82b6004458be4a3f2b9c7d09ed85baa2fbf033f54b"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3343d4706a2b7140e8bd49b6c8b0a82abf9194b3f0f5925a78fc69359f8fc33c"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82521000d18c71e41c96960cb36e915a357bc83d63a8bed63154b89d95d05ad1"}, + {file = "jiter-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3c843e7c1633470708a3987e8ce617ee2979ee18542d6eb25ae92861af3f1d62"}, + {file = "jiter-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a2e861658c3fe849efc39b06ebb98d042e4a4c51a8d7d1c3ddc3b1ea091d0784"}, + {file = "jiter-0.6.1-cp311-none-win32.whl", hash = "sha256:7d72fc86474862c9c6d1f87b921b70c362f2b7e8b2e3c798bb7d58e419a6bc0f"}, + {file = "jiter-0.6.1-cp311-none-win_amd64.whl", hash = "sha256:3e36a320634f33a07794bb15b8da995dccb94f944d298c8cfe2bd99b1b8a574a"}, + {file = "jiter-0.6.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1fad93654d5a7dcce0809aff66e883c98e2618b86656aeb2129db2cd6f26f867"}, + {file = "jiter-0.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4e6e340e8cd92edab7f6a3a904dbbc8137e7f4b347c49a27da9814015cc0420c"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:691352e5653af84ed71763c3c427cff05e4d658c508172e01e9c956dfe004aba"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:defee3949313c1f5b55e18be45089970cdb936eb2a0063f5020c4185db1b63c9"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26d2bdd5da097e624081c6b5d416d3ee73e5b13f1703bcdadbb1881f0caa1933"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18aa9d1626b61c0734b973ed7088f8a3d690d0b7f5384a5270cd04f4d9f26c86"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a3567c8228afa5ddcce950631c6b17397ed178003dc9ee7e567c4c4dcae9fa0"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e5c0507131c922defe3f04c527d6838932fcdfd69facebafd7d3574fa3395314"}, + {file = "jiter-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:540fcb224d7dc1bcf82f90f2ffb652df96f2851c031adca3c8741cb91877143b"}, + {file = "jiter-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e7b75436d4fa2032b2530ad989e4cb0ca74c655975e3ff49f91a1a3d7f4e1df2"}, + {file = "jiter-0.6.1-cp312-none-win32.whl", hash = "sha256:883d2ced7c21bf06874fdeecab15014c1c6d82216765ca6deef08e335fa719e0"}, + {file = "jiter-0.6.1-cp312-none-win_amd64.whl", hash = "sha256:91e63273563401aadc6c52cca64a7921c50b29372441adc104127b910e98a5b6"}, + {file = "jiter-0.6.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:852508a54fe3228432e56019da8b69208ea622a3069458252f725d634e955b31"}, + {file = "jiter-0.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f491cc69ff44e5a1e8bc6bf2b94c1f98d179e1aaf4a554493c171a5b2316b701"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc56c8f0b2a28ad4d8047f3ae62d25d0e9ae01b99940ec0283263a04724de1f3"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51b58f7a0d9e084a43b28b23da2b09fc5e8df6aa2b6a27de43f991293cab85fd"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f79ce15099154c90ef900d69c6b4c686b64dfe23b0114e0971f2fecd306ec6c"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:03a025b52009f47e53ea619175d17e4ded7c035c6fbd44935cb3ada11e1fd592"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c74a8d93718137c021d9295248a87c2f9fdc0dcafead12d2930bc459ad40f885"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40b03b75f903975f68199fc4ec73d546150919cb7e534f3b51e727c4d6ccca5a"}, + {file = "jiter-0.6.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:825651a3f04cf92a661d22cad61fc913400e33aa89b3e3ad9a6aa9dc8a1f5a71"}, + {file = "jiter-0.6.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:928bf25eb69ddb292ab8177fe69d3fbf76c7feab5fce1c09265a7dccf25d3991"}, + {file = "jiter-0.6.1-cp313-none-win32.whl", hash = "sha256:352cd24121e80d3d053fab1cc9806258cad27c53cad99b7a3cac57cf934b12e4"}, + {file = "jiter-0.6.1-cp313-none-win_amd64.whl", hash = "sha256:be7503dd6f4bf02c2a9bacb5cc9335bc59132e7eee9d3e931b13d76fd80d7fda"}, + {file = "jiter-0.6.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:31d8e00e1fb4c277df8ab6f31a671f509ebc791a80e5c61fdc6bc8696aaa297c"}, + {file = "jiter-0.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77c296d65003cd7ee5d7b0965f6acbe6cffaf9d1fa420ea751f60ef24e85fed5"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeeb0c0325ef96c12a48ea7e23e2e86fe4838e6e0a995f464cf4c79fa791ceeb"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a31c6fcbe7d6c25d6f1cc6bb1cba576251d32795d09c09961174fe461a1fb5bd"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59e2b37f3b9401fc9e619f4d4badcab2e8643a721838bcf695c2318a0475ae42"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bae5ae4853cb9644144e9d0755854ce5108d470d31541d83f70ca7ecdc2d1637"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9df588e9c830b72d8db1dd7d0175af6706b0904f682ea9b1ca8b46028e54d6e9"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15f8395e835cf561c85c1adee72d899abf2733d9df72e9798e6d667c9b5c1f30"}, + {file = "jiter-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a99d4e0b5fc3b05ea732d67eb2092fe894e95a90e6e413f2ea91387e228a307"}, + {file = "jiter-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a311df1fa6be0ccd64c12abcd85458383d96e542531bafbfc0a16ff6feda588f"}, + {file = "jiter-0.6.1-cp38-none-win32.whl", hash = "sha256:81116a6c272a11347b199f0e16b6bd63f4c9d9b52bc108991397dd80d3c78aba"}, + {file = "jiter-0.6.1-cp38-none-win_amd64.whl", hash = "sha256:13f9084e3e871a7c0b6e710db54444088b1dd9fbefa54d449b630d5e73bb95d0"}, + {file = "jiter-0.6.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:f1c53615fcfec3b11527c08d19cff6bc870da567ce4e57676c059a3102d3a082"}, + {file = "jiter-0.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f791b6a4da23238c17a81f44f5b55d08a420c5692c1fda84e301a4b036744eb1"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c97e90fec2da1d5f68ef121444c2c4fa72eabf3240829ad95cf6bbeca42a301"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3cbc1a66b4e41511209e97a2866898733c0110b7245791ac604117b7fb3fedb7"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4e85f9e12cd8418ab10e1fcf0e335ae5bb3da26c4d13a0fd9e6a17a674783b6"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08be33db6dcc374c9cc19d3633af5e47961a7b10d4c61710bd39e48d52a35824"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:677be9550004f5e010d673d3b2a2b815a8ea07a71484a57d3f85dde7f14cf132"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e8bd065be46c2eecc328e419d6557bbc37844c88bb07b7a8d2d6c91c7c4dedc9"}, + {file = "jiter-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bd95375ce3609ec079a97c5d165afdd25693302c071ca60c7ae1cf826eb32022"}, + {file = "jiter-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db459ed22d0208940d87f614e1f0ea5a946d29a3cfef71f7e1aab59b6c6b2afb"}, + {file = "jiter-0.6.1-cp39-none-win32.whl", hash = "sha256:d71c962f0971347bd552940ab96aa42ceefcd51b88c4ced8a27398182efa8d80"}, + {file = "jiter-0.6.1-cp39-none-win_amd64.whl", hash = "sha256:d465db62d2d10b489b7e7a33027c4ae3a64374425d757e963f86df5b5f2e7fc5"}, + {file = "jiter-0.6.1.tar.gz", hash = "sha256:e19cd21221fc139fb032e4112986656cb2739e9fe6d84c13956ab30ccc7d4449"}, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jsonschema" +version = "4.23.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2024.10.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.9" +files = [ + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "jupyter-client" +version = "8.6.3" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, +] + +[package.dependencies] +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "langchain" +version = "0.3.4" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0,>=3.9" +files = [ + {file = "langchain-0.3.4-py3-none-any.whl", hash = "sha256:7a1241d9429510d2083c62df0da998a7b2b05c730cd4255b89da9d47c57f48fd"}, + {file = "langchain-0.3.4.tar.gz", hash = "sha256:3596515fcd0157dece6ec96e0240d29f4cf542d91ecffc815d32e35198dfff37"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +langchain-core = ">=0.3.12,<0.4.0" +langchain-text-splitters = ">=0.3.0,<0.4.0" +langsmith = ">=0.1.17,<0.2.0" +numpy = [ + {version = ">=1,<2", markers = "python_version < \"3.12\""}, + {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, +] +pydantic = ">=2.7.4,<3.0.0" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10" + +[[package]] +name = "langchain-community" +version = "0.3.3" +description = "Community contributed LangChain integrations." +optional = false +python-versions = "<4.0,>=3.9" +files = [ + {file = "langchain_community-0.3.3-py3-none-any.whl", hash = "sha256:319cfc2f923a066c91fbb8e02decd7814018af952b6b98298b8ac9d30ea1da56"}, + {file = "langchain_community-0.3.3.tar.gz", hash = "sha256:bfb3f2b219aed21087e0ecb7d2ebd1c81401c02b92239e11645c822d5be63f80"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +dataclasses-json = ">=0.5.7,<0.7" +langchain = ">=0.3.4,<0.4.0" +langchain-core = ">=0.3.12,<0.4.0" +langsmith = ">=0.1.125,<0.2.0" +numpy = [ + {version = ">=1,<2", markers = "python_version < \"3.12\""}, + {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, +] +pydantic-settings = ">=2.4.0,<3.0.0" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10" + +[[package]] +name = "langchain-core" +version = "0.3.12" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0,>=3.9" +files = [ + {file = "langchain_core-0.3.12-py3-none-any.whl", hash = "sha256:46050d34f5fa36dc57dca971c6a26f505643dd05ee0492c7ac286d0a78a82037"}, + {file = "langchain_core-0.3.12.tar.gz", hash = "sha256:98a3c078e375786aa84939bfd1111263af2f3bc402bbe2cac9fa18a387459cf2"}, +] + +[package.dependencies] +jsonpatch = ">=1.33,<2.0" +langsmith = ">=0.1.125,<0.2.0" +packaging = ">=23.2,<25" +pydantic = [ + {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, +] +PyYAML = ">=5.3" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10.0.0" +typing-extensions = ">=4.7" + +[[package]] +name = "langchain-openai" +version = "0.2.3" +description = "An integration package connecting OpenAI and LangChain" +optional = false +python-versions = "<4.0,>=3.9" +files = [ + {file = "langchain_openai-0.2.3-py3-none-any.whl", hash = "sha256:f498c94817c980cb302439b95d3f3275cdf2743e022ee674692c75898523cf57"}, + {file = "langchain_openai-0.2.3.tar.gz", hash = "sha256:e142031704de1104735f503f76352c53b27ac0a2806466392993c4508c42bf0c"}, +] + +[package.dependencies] +langchain-core = ">=0.3.12,<0.4.0" +openai = ">=1.52.0,<2.0.0" +tiktoken = ">=0.7,<1" + +[[package]] +name = "langchain-text-splitters" +version = "0.3.0" +description = "LangChain text splitting utilities" +optional = false +python-versions = "<4.0,>=3.9" +files = [ + {file = "langchain_text_splitters-0.3.0-py3-none-any.whl", hash = "sha256:e84243e45eaff16e5b776cd9c81b6d07c55c010ebcb1965deb3d1792b7358e83"}, + {file = "langchain_text_splitters-0.3.0.tar.gz", hash = "sha256:f9fe0b4d244db1d6de211e7343d4abc4aa90295aa22e1f0c89e51f33c55cd7ce"}, +] + +[package.dependencies] +langchain-core = ">=0.3.0,<0.4.0" + +[[package]] +name = "langdetect" +version = "1.0.9" +description = "Language detection library ported from Google's language-detection." +optional = false +python-versions = "*" +files = [ + {file = "langdetect-1.0.9-py2-none-any.whl", hash = "sha256:7cbc0746252f19e76f77c0b1690aadf01963be835ef0cd4b56dddf2a8f1dfc2a"}, + {file = "langdetect-1.0.9.tar.gz", hash = "sha256:cbc1fef89f8d062739774bd51eda3da3274006b3661d199c2655f6b3f6d605a0"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "langgraph" +version = "0.2.39" +description = "Building stateful, multi-actor applications with LLMs" +optional = false +python-versions = "<4.0,>=3.9.0" +files = [ + {file = "langgraph-0.2.39-py3-none-any.whl", hash = "sha256:5dfbdeefbf599f16d245799609f2b43c1ec7a7e8ed6e1d7981b1a7979a4ad7fe"}, + {file = "langgraph-0.2.39.tar.gz", hash = "sha256:32af60291f9260c3acb8a3d4bec99e32abd89ddb6b4a10a79aa3dbc90fa920ac"}, +] + +[package.dependencies] +langchain-core = ">=0.2.39,<0.4" +langgraph-checkpoint = ">=2.0.0,<3.0.0" +langgraph-sdk = ">=0.1.32,<0.2.0" + +[[package]] +name = "langgraph-checkpoint" +version = "2.0.1" +description = "Library with base interfaces for LangGraph checkpoint savers." +optional = false +python-versions = "<4.0.0,>=3.9.0" +files = [ + {file = "langgraph_checkpoint-2.0.1-py3-none-any.whl", hash = "sha256:760edb722f6c64f2a39f41c7fbd56aaee47524f3399cf7c4bb8f5563b590ee68"}, + {file = "langgraph_checkpoint-2.0.1.tar.gz", hash = "sha256:31c34952b11a93108d76e5ad05398bfc94d8aafda5b4da7d17c26a121acce8e0"}, +] + +[package.dependencies] +langchain-core = ">=0.2.38,<0.4" +msgpack = ">=1.1.0,<2.0.0" + +[[package]] +name = "langgraph-checkpoint-sqlite" +version = "2.0.0" +description = "Library with a SQLite implementation of LangGraph checkpoint saver." +optional = false +python-versions = "<4.0.0,>=3.9.0" +files = [ + {file = "langgraph_checkpoint_sqlite-2.0.0-py3-none-any.whl", hash = "sha256:55e796830ea7f4dda4cce53ee7d5cc9f8cc789a730378a980e47fcbdf2babde1"}, + {file = "langgraph_checkpoint_sqlite-2.0.0.tar.gz", hash = "sha256:e6bb27583e4d26f5c9aede40ea66eb6216bec9c2c8beb39408cd50a0b8bb9a7b"}, +] + +[package.dependencies] +aiosqlite = ">=0.20.0,<0.21.0" +langgraph-checkpoint = ">=2.0.0,<3.0.0" + +[[package]] +name = "langgraph-sdk" +version = "0.1.33" +description = "SDK for interacting with LangGraph API" +optional = false +python-versions = "<4.0.0,>=3.9.0" +files = [ + {file = "langgraph_sdk-0.1.33-py3-none-any.whl", hash = "sha256:fe2311ebfe231219a7ad06c3dad4860a9e2917e780aaa2f228d1a9f5653da686"}, + {file = "langgraph_sdk-0.1.33.tar.gz", hash = "sha256:addffc33554b690e81525c12fe9b2656cc7b740678e4724bc706d1ca13b3de93"}, +] + +[package.dependencies] +httpx = ">=0.25.2" +httpx-sse = ">=0.4.0" +orjson = ">=3.10.1" + +[[package]] +name = "langsmith" +version = "0.1.136" +description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langsmith-0.1.136-py3-none-any.whl", hash = "sha256:cad2215eb7a754ee259878e19c558f4f8d3795aa1b699f087d4500e640f80d0a"}, + {file = "langsmith-0.1.136.tar.gz", hash = "sha256:5c0de01a313db70dd9a85845c0f416a69b5b653b3e98ba413d7d41e8851315b1"}, +] + +[package.dependencies] +httpx = ">=0.23.0,<1" +orjson = ">=3.9.14,<4.0.0" +pydantic = [ + {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, +] +requests = ">=2,<3" +requests-toolbelt = ">=1.0.0,<2.0.0" + +[[package]] +name = "loguru" +version = "0.7.2" +description = "Python logging made (stupidly) simple" +optional = false +python-versions = ">=3.5" +files = [ + {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, + {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} + +[package.extras] +dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "marshmallow" +version = "3.23.0" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.9" +files = [ + {file = "marshmallow-3.23.0-py3-none-any.whl", hash = "sha256:82f20a2397834fe6d9611b241f2f7e7b680ed89c49f84728a1ad937be6b4bdf4"}, + {file = "marshmallow-3.23.0.tar.gz", hash = "sha256:98d8827a9f10c03d44ead298d2e99c6aea8197df18ccfad360dae7f89a50da2e"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["marshmallow[tests]", "pre-commit (>=3.5,<5.0)", "tox"] +docs = ["alabaster (==1.0.0)", "autodocsumm (==0.2.13)", "sphinx (==8.1.3)", "sphinx-issues (==5.0.0)", "sphinx-version-warning (==1.1.2)"] +tests = ["pytest", "simplejson"] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "msgpack" +version = "1.1.0" +description = "MessagePack serializer" +optional = false +python-versions = ">=3.8" +files = [ + {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b"}, + {file = "msgpack-1.1.0-cp310-cp310-win32.whl", hash = "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044"}, + {file = "msgpack-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5"}, + {file = "msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88"}, + {file = "msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b"}, + {file = "msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b"}, + {file = "msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c"}, + {file = "msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc"}, + {file = "msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f"}, + {file = "msgpack-1.1.0-cp38-cp38-win32.whl", hash = "sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b"}, + {file = "msgpack-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8"}, + {file = "msgpack-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd"}, + {file = "msgpack-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325"}, + {file = "msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e"}, +] + +[[package]] +name = "multidict" +version = "6.1.0" +description = "multidict implementation" +optional = false +python-versions = ">=3.8" +files = [ + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, +] + +[[package]] +name = "mypy" +version = "1.12.1" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3d7d4371829184e22fda4015278fbfdef0327a4b955a483012bd2d423a788801"}, + {file = "mypy-1.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f59f1dfbf497d473201356966e353ef09d4daec48caeacc0254db8ef633a28a5"}, + {file = "mypy-1.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b947097fae68004b8328c55161ac9db7d3566abfef72d9d41b47a021c2fba6b1"}, + {file = "mypy-1.12.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:96af62050971c5241afb4701c15189ea9507db89ad07794a4ee7b4e092dc0627"}, + {file = "mypy-1.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:d90da248f4c2dba6c44ddcfea94bb361e491962f05f41990ff24dbd09969ce20"}, + {file = "mypy-1.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1230048fec1380faf240be6385e709c8570604d2d27ec6ca7e573e3bc09c3735"}, + {file = "mypy-1.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:02dcfe270c6ea13338210908f8cadc8d31af0f04cee8ca996438fe6a97b4ec66"}, + {file = "mypy-1.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5a437c9102a6a252d9e3a63edc191a3aed5f2fcb786d614722ee3f4472e33f6"}, + {file = "mypy-1.12.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:186e0c8346efc027ee1f9acf5ca734425fc4f7dc2b60144f0fbe27cc19dc7931"}, + {file = "mypy-1.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:673ba1140a478b50e6d265c03391702fa11a5c5aff3f54d69a62a48da32cb811"}, + {file = "mypy-1.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9fb83a7be97c498176fb7486cafbb81decccaef1ac339d837c377b0ce3743a7f"}, + {file = "mypy-1.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:389e307e333879c571029d5b93932cf838b811d3f5395ed1ad05086b52148fb0"}, + {file = "mypy-1.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94b2048a95a21f7a9ebc9fbd075a4fcd310410d078aa0228dbbad7f71335e042"}, + {file = "mypy-1.12.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ee5932370ccf7ebf83f79d1c157a5929d7ea36313027b0d70a488493dc1b179"}, + {file = "mypy-1.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:19bf51f87a295e7ab2894f1d8167622b063492d754e69c3c2fed6563268cb42a"}, + {file = "mypy-1.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d34167d43613ffb1d6c6cdc0cc043bb106cac0aa5d6a4171f77ab92a3c758bcc"}, + {file = "mypy-1.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:427878aa54f2e2c5d8db31fa9010c599ed9f994b3b49e64ae9cd9990c40bd635"}, + {file = "mypy-1.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5fcde63ea2c9f69d6be859a1e6dd35955e87fa81de95bc240143cf00de1f7f81"}, + {file = "mypy-1.12.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d54d840f6c052929f4a3d2aab2066af0f45a020b085fe0e40d4583db52aab4e4"}, + {file = "mypy-1.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:20db6eb1ca3d1de8ece00033b12f793f1ea9da767334b7e8c626a4872090cf02"}, + {file = "mypy-1.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b16fe09f9c741d85a2e3b14a5257a27a4f4886c171d562bc5a5e90d8591906b8"}, + {file = "mypy-1.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0dcc1e843d58f444fce19da4cce5bd35c282d4bde232acdeca8279523087088a"}, + {file = "mypy-1.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e10ba7de5c616e44ad21005fa13450cd0de7caaa303a626147d45307492e4f2d"}, + {file = "mypy-1.12.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0e6fe449223fa59fbee351db32283838a8fee8059e0028e9e6494a03802b4004"}, + {file = "mypy-1.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:dc6e2a2195a290a7fd5bac3e60b586d77fc88e986eba7feced8b778c373f9afe"}, + {file = "mypy-1.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:de5b2a8988b4e1269a98beaf0e7cc71b510d050dce80c343b53b4955fff45f19"}, + {file = "mypy-1.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:843826966f1d65925e8b50d2b483065c51fc16dc5d72647e0236aae51dc8d77e"}, + {file = "mypy-1.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9fe20f89da41a95e14c34b1ddb09c80262edcc295ad891f22cc4b60013e8f78d"}, + {file = "mypy-1.12.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8135ffec02121a75f75dc97c81af7c14aa4ae0dda277132cfcd6abcd21551bfd"}, + {file = "mypy-1.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:a7b76fa83260824300cc4834a3ab93180db19876bce59af921467fd03e692810"}, + {file = "mypy-1.12.1-py3-none-any.whl", hash = "sha256:ce561a09e3bb9863ab77edf29ae3a50e65685ad74bba1431278185b7e5d5486e"}, + {file = "mypy-1.12.1.tar.gz", hash = "sha256:f5b3936f7a6d0e8280c9bdef94c7ce4847f5cdfc258fbb2c29a8c1711e8bb96d"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +typing-extensions = ">=4.6.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "narwhals" +version = "1.10.0" +description = "Extremely lightweight compatibility layer between dataframe libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "narwhals-1.10.0-py3-none-any.whl", hash = "sha256:c83a378960651c391e5f3d68af3a821eda74c9713073518fe0c39aefc5ad8f8e"}, + {file = "narwhals-1.10.0.tar.gz", hash = "sha256:a380e64110c3169c4b0b592c5b64ae6dc4cce76e9d3c56edc608a8ae5994cfc1"}, +] + +[package.extras] +cudf = ["cudf (>=23.08.00)"] +dask = ["dask[dataframe] (>=2024.7)"] +modin = ["modin"] +pandas = ["pandas (>=0.25.3)"] +polars = ["polars (>=0.20.3)"] +pyarrow = ["pyarrow (>=11.0.0)"] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "nodeenv" +version = "1.9.1" +description = "Node.js virtual environment builder" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, +] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "openai" +version = "1.52.0" +description = "The official Python library for the openai API" +optional = false +python-versions = ">=3.7.1" +files = [ + {file = "openai-1.52.0-py3-none-any.whl", hash = "sha256:0c249f20920183b0a2ca4f7dba7b0452df3ecd0fa7985eb1d91ad884bc3ced9c"}, + {file = "openai-1.52.0.tar.gz", hash = "sha256:95c65a5f77559641ab8f3e4c3a050804f7b51d278870e2ec1f7444080bfe565a"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.11,<5" + +[package.extras] +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] + +[[package]] +name = "orjson" +version = "3.10.9" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "orjson-3.10.9-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a377186a11b48c55969e34f0aa414c2826a234f212d6f2b312ba512e3cdb2c6f"}, + {file = "orjson-3.10.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bf37bf0ca538065c34efe1803378b2dadd7e05b06610a086c2857f15ee59e12"}, + {file = "orjson-3.10.9-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d9d83a91168aa48309acba804e393b7d9216b66f15e38f339b9fbb00db8986d"}, + {file = "orjson-3.10.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0014038a17a1fe273da0a5489787677ef5a64566ab383ad6d929e44ed5683f4"}, + {file = "orjson-3.10.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6ae1b1733e4528e45675ed09a732b6ac37d716bce2facaf467f84ce774adecd"}, + {file = "orjson-3.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe91c2259c4a859356b6db1c6e649b40577492f66d483da8b8af6da0f87c00e3"}, + {file = "orjson-3.10.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a04f912c32463386ba117591c99a3d9e40b3b69bed9c5123d89dff06f0f5a4b0"}, + {file = "orjson-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae82ca347829ca47431767b079f96bb977f592189250ccdede676339a80c8982"}, + {file = "orjson-3.10.9-cp310-none-win32.whl", hash = "sha256:fd5083906825d7f5d23089425ce5424d783d6294020bcabb8518a3e1f97833e5"}, + {file = "orjson-3.10.9-cp310-none-win_amd64.whl", hash = "sha256:e9ff9521b5be0340c8e686bcfe2619777fd7583f71e7b494601cc91ad3919d2e"}, + {file = "orjson-3.10.9-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f3bd9df47385b8fabb3b2ee1e83f9960b8accc1905be971a1c257f16c32b491e"}, + {file = "orjson-3.10.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4948961b6bce1e2086b2cf0b56cc454cdab589d40c7f85be71fb5a5556c51d3"}, + {file = "orjson-3.10.9-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a9fc7a6cf2b229ddc323e136df13b3fb4466c50d84ed600cd0898223dd2fea3"}, + {file = "orjson-3.10.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2314846e1029a2d2b899140f350eaaf3a73281df43ba84ac44d94ca861b5b269"}, + {file = "orjson-3.10.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f52d993504827503411df2d60e60acf52885561458d6273f99ecd172f31c4352"}, + {file = "orjson-3.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e29bbf08d907756c145a3a3a1f7ce2f11f15e3edbd3342842589d6030981b76f"}, + {file = "orjson-3.10.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ae82992c00b480c3cc7dac6739324554be8c5d8e858a90044928506a3333ef4"}, + {file = "orjson-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6fdf8d32b6d94019dc15163542d345e9ce4c4661f56b318608aa3088a1a3a23b"}, + {file = "orjson-3.10.9-cp311-none-win32.whl", hash = "sha256:01f5fef452b4d7615f2e94153479370a4b59e0c964efb32dd902978f807a45cd"}, + {file = "orjson-3.10.9-cp311-none-win_amd64.whl", hash = "sha256:95361c4197c7ce9afdf56255de6f4e2474c39d16a277cce31d1b99a2520486d8"}, + {file = "orjson-3.10.9-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:43ad5560db54331c007dc38be5ba7706cb72974a29ae8227019d89305d750a6f"}, + {file = "orjson-3.10.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1471c3274b1a4a9b8f4b9ed6effaea9ad885796373797515c44b365b375c256d"}, + {file = "orjson-3.10.9-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:41d8cac575acd15918903d74cfaabb5dbe57b357b93341332f647d1013928dcc"}, + {file = "orjson-3.10.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2920c8754f1aedc98bd357ec172af18ce48f5f1017a92244c85fe41d16d3c6e0"}, + {file = "orjson-3.10.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7fa3ff6a0d9d15a0d0d2254cca16cd919156a18423654ce5574591392fe9914"}, + {file = "orjson-3.10.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1e91b90c0c26bd79593967c1adef421bcff88c9e723d49c93bb7ad8af80bc6b"}, + {file = "orjson-3.10.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f11949024f785ace1a516db32fa6255f6227226b2c988abf66f5aee61d43d8f7"}, + {file = "orjson-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:060e020d85d0ec145bc1b536b1fd9c10a0519c91991ead9724d6f759ebe26b9a"}, + {file = "orjson-3.10.9-cp312-none-win32.whl", hash = "sha256:71f73439999fe662843da3607cdf6e75b1551c330f487e5801d463d969091c63"}, + {file = "orjson-3.10.9-cp312-none-win_amd64.whl", hash = "sha256:12e2efe81356b8448f1cd130f8d75d3718de583112d71f2e2f8baa81bd835bb9"}, + {file = "orjson-3.10.9-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:0ab6e3ad10e964392f0e838751bcce2ef9c8fa8be7deddffff83088e5791566d"}, + {file = "orjson-3.10.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68ef65223baab00f469c8698f771ab3e6ccf6af2a987e77de5b566b4ec651150"}, + {file = "orjson-3.10.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6f130848205fea90a2cb9fa2b11cafff9a9f31f4efad225800bc8b9e4a702f24"}, + {file = "orjson-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2ea7a98f3295ed8adb6730a5788cc78dafea28300d19932a1d2143457f7db802"}, + {file = "orjson-3.10.9-cp313-none-win32.whl", hash = "sha256:bdce39f96149a74fddeb2674c54f1da5e57724d32952eb6df2ac719b66d453cc"}, + {file = "orjson-3.10.9-cp313-none-win_amd64.whl", hash = "sha256:d11383701d4b58e795039b662ada46987744293d57bfa2719e7379b8d67bc796"}, + {file = "orjson-3.10.9-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1c3a1e845916a3739ab4162bb48dee66e0e727a19faf397176a7db0d9826cc3c"}, + {file = "orjson-3.10.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:063ca59d93d93d1387f0c4bb766c6d4f5b0e423fe7c366d0bd4401a56d1669d1"}, + {file = "orjson-3.10.9-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:938b7fcd79cf06fe348fb24b6163fbaa2fdc9fbed8b1f06318f24467f1487e63"}, + {file = "orjson-3.10.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cc32a9e43c7693011ccde6f8eff8cba75ca0d2a55de11092faa4a716101e67f5"}, + {file = "orjson-3.10.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b3069b7e2f57f3eef2282029b9c2ba21f08a55f1018e483663a3356f046af4c"}, + {file = "orjson-3.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4289b5d1f88fd05dcafdd7a1f3b17bb722e77712b7618f98e86bdda560e0a1a"}, + {file = "orjson-3.10.9-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:74f5a7a7f282d326be71b722b0c350da7af6f5f15b9378da177e0e4a09bd91a3"}, + {file = "orjson-3.10.9-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:80e0c013e50cf7198319d8137931684eb9f32daa067e8276d9dbdd4010bb4add"}, + {file = "orjson-3.10.9-cp38-none-win32.whl", hash = "sha256:9d989152df8f60a76867354e0e08d896292ab9fb96a7ef89a5b3838de174522c"}, + {file = "orjson-3.10.9-cp38-none-win_amd64.whl", hash = "sha256:485358fe9892d6bfd88e5885b66bf88496e1842c8f35f61682ff9928b12a6cf0"}, + {file = "orjson-3.10.9-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ca54e6f320e33c8a6e471c424ee16576361d905c15d69e134c2906d3fcb31795"}, + {file = "orjson-3.10.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9a9eb03a29c9b30b6c8bb35e5fa20d96589a76e0042005be59b7c3af10a7e43"}, + {file = "orjson-3.10.9-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:731e8859fc99b398c286320726906404091141e9223dd5e9e6917f7e32e1cc68"}, + {file = "orjson-3.10.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75b061c11f5aab979a95927a76394b4a85e3e4d63d0a2a16b56a4f7c6503afab"}, + {file = "orjson-3.10.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b61b08f6397f004570fd6a840f4a58946b63b4c7029408cdedb45fe85c7d17f7"}, + {file = "orjson-3.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c4f5e0360b7f0aba91dafe12469108109a0e8973956d4a9865ca262a6881406"}, + {file = "orjson-3.10.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e403429e2947a059545e305d97e4b0eb90d3bb44b396d6f327d7ae2018391e13"}, + {file = "orjson-3.10.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0e492b93e122264c2dc78700859122631a4715bda88fabf57d9226954cfe7ec5"}, + {file = "orjson-3.10.9-cp39-none-win32.whl", hash = "sha256:bfba9605e85bfd19b83a21c2c25c2bed2000d5f097f3fa3ad5b5f8a7263a3148"}, + {file = "orjson-3.10.9-cp39-none-win_amd64.whl", hash = "sha256:77d277fa138d4bf145e8b24042004891c188c52ac8492724a183f42b0031cf0c"}, + {file = "orjson-3.10.9.tar.gz", hash = "sha256:c378074e0c46035dc66e57006993233ec66bf8487d501bab41649b4b7289ed4d"}, +] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "pandas" +version = "2.2.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, + {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, + {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, + {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, + {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, + {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pillow" +version = "10.4.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "platformdirs" +version = "4.3.6" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] + +[[package]] +name = "pre-commit" +version = "4.0.1" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.9" +files = [ + {file = "pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878"}, + {file = "pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "prompt-toolkit" +version = "3.0.48" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "propcache" +version = "0.2.0" +description = "Accelerated property cache" +optional = false +python-versions = ">=3.8" +files = [ + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336"}, + {file = "propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad"}, + {file = "propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"}, + {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"}, + {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348"}, + {file = "propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5"}, + {file = "propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544"}, + {file = "propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032"}, + {file = "propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed"}, + {file = "propcache-0.2.0-cp38-cp38-win32.whl", hash = "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d"}, + {file = "propcache-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798"}, + {file = "propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9"}, + {file = "propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df"}, + {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"}, + {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"}, +] + +[[package]] +name = "protobuf" +version = "5.28.2" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-5.28.2-cp310-abi3-win32.whl", hash = "sha256:eeea10f3dc0ac7e6b4933d32db20662902b4ab81bf28df12218aa389e9c2102d"}, + {file = "protobuf-5.28.2-cp310-abi3-win_amd64.whl", hash = "sha256:2c69461a7fcc8e24be697624c09a839976d82ae75062b11a0972e41fd2cd9132"}, + {file = "protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8b9403fc70764b08d2f593ce44f1d2920c5077bf7d311fefec999f8c40f78b7"}, + {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:35cfcb15f213449af7ff6198d6eb5f739c37d7e4f1c09b5d0641babf2cc0c68f"}, + {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:5e8a95246d581eef20471b5d5ba010d55f66740942b95ba9b872d918c459452f"}, + {file = "protobuf-5.28.2-cp38-cp38-win32.whl", hash = "sha256:87317e9bcda04a32f2ee82089a204d3a2f0d3c8aeed16568c7daf4756e4f1fe0"}, + {file = "protobuf-5.28.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0ea0123dac3399a2eeb1a1443d82b7afc9ff40241433296769f7da42d142ec3"}, + {file = "protobuf-5.28.2-cp39-cp39-win32.whl", hash = "sha256:ca53faf29896c526863366a52a8f4d88e69cd04ec9571ed6082fa117fac3ab36"}, + {file = "protobuf-5.28.2-cp39-cp39-win_amd64.whl", hash = "sha256:8ddc60bf374785fb7cb12510b267f59067fa10087325b8e1855b898a0d81d276"}, + {file = "protobuf-5.28.2-py3-none-any.whl", hash = "sha256:52235802093bd8a2811abbe8bf0ab9c5f54cca0a751fdd3f6ac2a21438bffece"}, + {file = "protobuf-5.28.2.tar.gz", hash = "sha256:59379674ff119717404f7454647913787034f03fe7049cbef1d74a97bb4593f0"}, +] + +[[package]] +name = "psutil" +version = "6.1.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, + {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, + {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, + {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, +] + +[package.extras] +dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pyarrow" +version = "17.0.0" +description = "Python library for Apache Arrow" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyarrow-17.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a5c8b238d47e48812ee577ee20c9a2779e6a5904f1708ae240f53ecbee7c9f07"}, + {file = "pyarrow-17.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db023dc4c6cae1015de9e198d41250688383c3f9af8f565370ab2b4cb5f62655"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da1e060b3876faa11cee287839f9cc7cdc00649f475714b8680a05fd9071d545"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c06d4624c0ad6674364bb46ef38c3132768139ddec1c56582dbac54f2663e2"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:fa3c246cc58cb5a4a5cb407a18f193354ea47dd0648194e6265bd24177982fe8"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:f7ae2de664e0b158d1607699a16a488de3d008ba99b3a7aa5de1cbc13574d047"}, + {file = "pyarrow-17.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:5984f416552eea15fd9cee03da53542bf4cddaef5afecefb9aa8d1010c335087"}, + {file = "pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977"}, + {file = "pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b244dc8e08a23b3e352899a006a26ae7b4d0da7bb636872fa8f5884e70acf15"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b72e87fe3e1db343995562f7fff8aee354b55ee83d13afba65400c178ab2597"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4"}, + {file = "pyarrow-17.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03"}, + {file = "pyarrow-17.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9b8a823cea605221e61f34859dcc03207e52e409ccf6354634143e23af7c8d22"}, + {file = "pyarrow-17.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1e70de6cb5790a50b01d2b686d54aaf73da01266850b05e3af2a1bc89e16053"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0071ce35788c6f9077ff9ecba4858108eebe2ea5a3f7cf2cf55ebc1dbc6ee24a"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:757074882f844411fcca735e39aae74248a1531367a7c80799b4266390ae51cc"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9ba11c4f16976e89146781a83833df7f82077cdab7dc6232c897789343f7891a"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b0c6ac301093b42d34410b187bba560b17c0330f64907bfa4f7f7f2444b0cf9b"}, + {file = "pyarrow-17.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:392bc9feabc647338e6c89267635e111d71edad5fcffba204425a7c8d13610d7"}, + {file = "pyarrow-17.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:af5ff82a04b2171415f1410cff7ebb79861afc5dae50be73ce06d6e870615204"}, + {file = "pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:edca18eaca89cd6382dfbcff3dd2d87633433043650c07375d095cd3517561d8"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c7916bff914ac5d4a8fe25b7a25e432ff921e72f6f2b7547d1e325c1ad9d155"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f553ca691b9e94b202ff741bdd40f6ccb70cdd5fbf65c187af132f1317de6145"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0cdb0e627c86c373205a2f94a510ac4376fdc523f8bb36beab2e7f204416163c"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:d7d192305d9d8bc9082d10f361fc70a73590a4c65cf31c3e6926cd72b76bc35c"}, + {file = "pyarrow-17.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:02dae06ce212d8b3244dd3e7d12d9c4d3046945a5933d28026598e9dbbda1fca"}, + {file = "pyarrow-17.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:13d7a460b412f31e4c0efa1148e1d29bdf18ad1411eb6757d38f8fbdcc8645fb"}, + {file = "pyarrow-17.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b564a51fbccfab5a04a80453e5ac6c9954a9c5ef2890d1bcf63741909c3f8df"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32503827abbc5aadedfa235f5ece8c4f8f8b0a3cf01066bc8d29de7539532687"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a155acc7f154b9ffcc85497509bcd0d43efb80d6f733b0dc3bb14e281f131c8b"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:dec8d129254d0188a49f8a1fc99e0560dc1b85f60af729f47de4046015f9b0a5"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a48ddf5c3c6a6c505904545c25a4ae13646ae1f8ba703c4df4a1bfe4f4006bda"}, + {file = "pyarrow-17.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:42bf93249a083aca230ba7e2786c5f673507fa97bbd9725a1e2754715151a204"}, + {file = "pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28"}, +] + +[package.dependencies] +numpy = ">=1.16.6" + +[package.extras] +test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pydantic" +version = "2.9.2" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.23.4" +typing-extensions = [ + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, +] + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] + +[[package]] +name = "pydantic-core" +version = "2.23.4" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydantic-settings" +version = "2.6.0" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.6.0-py3-none-any.whl", hash = "sha256:4a819166f119b74d7f8c765196b165f95cc7487ce58ea27dec8a5a26be0970e0"}, + {file = "pydantic_settings-2.6.0.tar.gz", hash = "sha256:44a1804abffac9e6a30372bb45f6cafab945ef5af25e66b1c634c01dd39e0188"}, +] + +[package.dependencies] +pydantic = ">=2.7.0" +python-dotenv = ">=0.21.0" + +[package.extras] +azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0)"] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + +[[package]] +name = "pydeck" +version = "0.9.1" +description = "Widget for deck.gl maps" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydeck-0.9.1-py2.py3-none-any.whl", hash = "sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038"}, + {file = "pydeck-0.9.1.tar.gz", hash = "sha256:f74475ae637951d63f2ee58326757f8d4f9cd9f2a457cf42950715003e2cb605"}, +] + +[package.dependencies] +jinja2 = ">=2.10.1" +numpy = ">=1.16.4" + +[package.extras] +carto = ["pydeck-carto"] +jupyter = ["ipykernel (>=5.1.2)", "ipython (>=5.8.0)", "ipywidgets (>=7,<8)", "traitlets (>=4.3.2)"] + +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pymupdf" +version = "1.24.11" +description = "A high performance Python library for data extraction, analysis, conversion & manipulation of PDF (and other) documents." +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyMuPDF-1.24.11-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:24c35ba9e731027ff24566b90d4986e9aac75e1ce47589b25de51e3c687ddb73"}, + {file = "PyMuPDF-1.24.11-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:20c8eb65b855a33411246d6697a3f3166727fe2d8585753cf0db648730104be6"}, + {file = "PyMuPDF-1.24.11-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:32fd013e3c844f105c0a6a43ee82acc7cd0c900f6ff14f5eed9492840bbcbdd9"}, + {file = "PyMuPDF-1.24.11-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2efb793644df99db0fe2468149048175cf25c5803997828efc9152aca838f5f2"}, + {file = "PyMuPDF-1.24.11-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9b7ac5b8ec3daec17f2e830962ed091610e576a5e531d2fe28c437fbd69b1969"}, + {file = "PyMuPDF-1.24.11-cp38-abi3-win32.whl", hash = "sha256:6fda6c7ed7e6ad74d9cfac5c3837ef42efd58c506440e2513a0a200bc3c4dbc0"}, + {file = "PyMuPDF-1.24.11-cp38-abi3-win_amd64.whl", hash = "sha256:745ce77532702d6ddeeecb47306d3669629aa5ff82708318cd652881f493b0ba"}, + {file = "PyMuPDF-1.24.11.tar.gz", hash = "sha256:6e45e57f14ac902029d4aacf07684958d0e58c769f47d9045b2048d0a3d20155"}, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-magic" +version = "0.4.27" +description = "File type identification using libmagic" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "python-magic-0.4.27.tar.gz", hash = "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b"}, + {file = "python_magic-0.4.27-py2.py3-none-any.whl", hash = "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3"}, +] + +[[package]] +name = "pytz" +version = "2024.2" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, +] + +[[package]] +name = "pywin32" +version = "308" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "pyzmq" +version = "26.2.0" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea"}, + {file = "pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6"}, + {file = "pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"}, + {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e"}, + {file = "pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0"}, + {file = "pyzmq-26.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win32.whl", hash = "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd"}, + {file = "pyzmq-26.2.0-cp38-cp38-win32.whl", hash = "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988"}, + {file = "pyzmq-26.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940"}, + {file = "pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f"}, + {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "referencing" +version = "0.35.1" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[package]] +name = "regex" +version = "2024.9.11" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, + {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, + {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, + {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, + {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, + {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, + {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, + {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, + {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, + {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, + {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, + {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, + {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, + {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "rich" +version = "13.9.2" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1"}, + {file = "rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "rpds-py" +version = "0.20.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94"}, + {file = "rpds_py-0.20.0-cp310-none-win32.whl", hash = "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee"}, + {file = "rpds_py-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58"}, + {file = "rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0"}, + {file = "rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, + {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, + {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57"}, + {file = "rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a"}, + {file = "rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a"}, + {file = "rpds_py-0.20.0-cp38-none-win32.whl", hash = "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5"}, + {file = "rpds_py-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b"}, + {file = "rpds_py-0.20.0-cp39-none-win32.whl", hash = "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7"}, + {file = "rpds_py-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8"}, + {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, +] + +[[package]] +name = "ruff" +version = "0.5.7" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.5.7-py3-none-linux_armv6l.whl", hash = "sha256:548992d342fc404ee2e15a242cdbea4f8e39a52f2e7752d0e4cbe88d2d2f416a"}, + {file = "ruff-0.5.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:00cc8872331055ee017c4f1071a8a31ca0809ccc0657da1d154a1d2abac5c0be"}, + {file = "ruff-0.5.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eaf3d86a1fdac1aec8a3417a63587d93f906c678bb9ed0b796da7b59c1114a1e"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a01c34400097b06cf8a6e61b35d6d456d5bd1ae6961542de18ec81eaf33b4cb8"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcc8054f1a717e2213500edaddcf1dbb0abad40d98e1bd9d0ad364f75c763eea"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f70284e73f36558ef51602254451e50dd6cc479f8b6f8413a95fcb5db4a55fc"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a78ad870ae3c460394fc95437d43deb5c04b5c29297815a2a1de028903f19692"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ccd078c66a8e419475174bfe60a69adb36ce04f8d4e91b006f1329d5cd44bcf"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e31c9bad4ebf8fdb77b59cae75814440731060a09a0e0077d559a556453acbb"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d796327eed8e168164346b769dd9a27a70e0298d667b4ecee6877ce8095ec8e"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a09ea2c3f7778cc635e7f6edf57d566a8ee8f485f3c4454db7771efb692c499"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a36d8dcf55b3a3bc353270d544fb170d75d2dff41eba5df57b4e0b67a95bb64e"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9369c218f789eefbd1b8d82a8cf25017b523ac47d96b2f531eba73770971c9e5"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b88ca3db7eb377eb24fb7c82840546fb7acef75af4a74bd36e9ceb37a890257e"}, + {file = "ruff-0.5.7-py3-none-win32.whl", hash = "sha256:33d61fc0e902198a3e55719f4be6b375b28f860b09c281e4bdbf783c0566576a"}, + {file = "ruff-0.5.7-py3-none-win_amd64.whl", hash = "sha256:083bbcbe6fadb93cd86709037acc510f86eed5a314203079df174c40bbbca6b3"}, + {file = "ruff-0.5.7-py3-none-win_arm64.whl", hash = "sha256:2dca26154ff9571995107221d0aeaad0e75a77b5a682d6236cf89a58c70b76f4"}, + {file = "ruff-0.5.7.tar.gz", hash = "sha256:8dfc0a458797f5d9fb622dd0efc52d796f23f0a1493a9527f4e49a550ae9a7e5"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.36" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8318f4776c85abc3f40ab185e388bee7a6ea99e7fa3a30686580b209eaa35c08"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c245b1fbade9c35e5bd3b64270ab49ce990369018289ecfde3f9c318411aaa07"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69f93723edbca7342624d09f6704e7126b152eaed3cdbb634cb657a54332a3c5"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f9511d8dd4a6e9271d07d150fb2f81874a3c8c95e11ff9af3a2dfc35fe42ee44"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-win32.whl", hash = "sha256:c3f3631693003d8e585d4200730616b78fafd5a01ef8b698f6967da5c605b3fa"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-win_amd64.whl", hash = "sha256:a86bfab2ef46d63300c0f06936bd6e6c0105faa11d509083ba8f2f9d237fb5b5"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fd3a55deef00f689ce931d4d1b23fa9f04c880a48ee97af488fd215cf24e2a6c"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f5e9cd989b45b73bd359f693b935364f7e1f79486e29015813c338450aa5a71"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ddd9db6e59c44875211bc4c7953a9f6638b937b0a88ae6d09eb46cced54eff"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2519f3a5d0517fc159afab1015e54bb81b4406c278749779be57a569d8d1bb0d"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59b1ee96617135f6e1d6f275bbe988f419c5178016f3d41d3c0abb0c819f75bb"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39769a115f730d683b0eb7b694db9789267bcd027326cccc3125e862eb03bfd8"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-win32.whl", hash = "sha256:66bffbad8d6271bb1cc2f9a4ea4f86f80fe5e2e3e501a5ae2a3dc6a76e604e6f"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-win_amd64.whl", hash = "sha256:23623166bfefe1487d81b698c423f8678e80df8b54614c2bf4b4cfcd7c711959"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7b64e6ec3f02c35647be6b4851008b26cff592a95ecb13b6788a54ef80bbdd4"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46331b00096a6db1fdc052d55b101dbbfc99155a548e20a0e4a8e5e4d1362855"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdf3386a801ea5aba17c6410dd1dc8d39cf454ca2565541b5ac42a84e1e28f53"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9dfa18ff2a67b09b372d5db8743c27966abf0e5344c555d86cc7199f7ad83a"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:90812a8933df713fdf748b355527e3af257a11e415b613dd794512461eb8a686"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1bc330d9d29c7f06f003ab10e1eaced295e87940405afe1b110f2eb93a233588"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-win32.whl", hash = "sha256:79d2e78abc26d871875b419e1fd3c0bca31a1cb0043277d0d850014599626c2e"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-win_amd64.whl", hash = "sha256:b544ad1935a8541d177cb402948b94e871067656b3a0b9e91dbec136b06a2ff5"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5cc79df7f4bc3d11e4b542596c03826063092611e481fcf1c9dfee3c94355ef"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3c01117dd36800f2ecaa238c65365b7b16497adc1522bf84906e5710ee9ba0e8"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bc633f4ee4b4c46e7adcb3a9b5ec083bf1d9a97c1d3854b92749d935de40b9b"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e46ed38affdfc95d2c958de328d037d87801cfcbea6d421000859e9789e61c2"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2985c0b06e989c043f1dc09d4fe89e1616aadd35392aea2844f0458a989eacf"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a121d62ebe7d26fec9155f83f8be5189ef1405f5973ea4874a26fab9f1e262c"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-win32.whl", hash = "sha256:0572f4bd6f94752167adfd7c1bed84f4b240ee6203a95e05d1e208d488d0d436"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-win_amd64.whl", hash = "sha256:8c78ac40bde930c60e0f78b3cd184c580f89456dd87fc08f9e3ee3ce8765ce88"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:be9812b766cad94a25bc63bec11f88c4ad3629a0cec1cd5d4ba48dc23860486b"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aae840ebbd6cdd41af1c14590e5741665e5272d2fee999306673a1bb1fdb4d"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4557e1f11c5f653ebfdd924f3f9d5ebfc718283b0b9beebaa5dd6b77ec290971"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07b441f7d03b9a66299ce7ccf3ef2900abc81c0db434f42a5694a37bd73870f2"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:28120ef39c92c2dd60f2721af9328479516844c6b550b077ca450c7d7dc68575"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-win32.whl", hash = "sha256:b81ee3d84803fd42d0b154cb6892ae57ea6b7c55d8359a02379965706c7efe6c"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-win_amd64.whl", hash = "sha256:f942a799516184c855e1a32fbc7b29d7e571b52612647866d4ec1c3242578fcb"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3d6718667da04294d7df1670d70eeddd414f313738d20a6f1d1f379e3139a545"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:72c28b84b174ce8af8504ca28ae9347d317f9dba3999e5981a3cd441f3712e24"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b11d0cfdd2b095e7b0686cf5fabeb9c67fae5b06d265d8180715b8cfa86522e3"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e32092c47011d113dc01ab3e1d3ce9f006a47223b18422c5c0d150af13a00687"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6a440293d802d3011028e14e4226da1434b373cbaf4a4bbb63f845761a708346"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c54a1e53a0c308a8e8a7dffb59097bff7facda27c70c286f005327f21b2bd6b1"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-win32.whl", hash = "sha256:1e0d612a17581b6616ff03c8e3d5eff7452f34655c901f75d62bd86449d9750e"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-win_amd64.whl", hash = "sha256:8958b10490125124463095bbdadda5aa22ec799f91958e410438ad6c97a7b793"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc022184d3e5cacc9579e41805a681187650e170eb2fd70e28b86192a479dcaa"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b817d41d692bf286abc181f8af476c4fbef3fd05e798777492618378448ee689"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e46a888b54be23d03a89be510f24a7652fe6ff660787b96cd0e57a4ebcb46d"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ae3005ed83f5967f961fd091f2f8c5329161f69ce8480aa8168b2d7fe37f06"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:03e08af7a5f9386a43919eda9de33ffda16b44eb11f3b313e6822243770e9763"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3dbb986bad3ed5ceaf090200eba750b5245150bd97d3e67343a3cfed06feecf7"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-win32.whl", hash = "sha256:9fe53b404f24789b5ea9003fc25b9a3988feddebd7e7b369c8fac27ad6f52f28"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-win_amd64.whl", hash = "sha256:af148a33ff0349f53512a049c6406923e4e02bf2f26c5fb285f143faf4f0e46a"}, + {file = "SQLAlchemy-2.0.36-py3-none-any.whl", hash = "sha256:fddbe92b4760c6f5d48162aef14824add991aeda8ddadb3c31d56eb15ca69f8e"}, + {file = "sqlalchemy-2.0.36.tar.gz", hash = "sha256:7f2767680b6d2398aea7082e45a774b2b0767b5c8d8ffb9c8b683088ea9b29c5"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "streamlit" +version = "1.39.0" +description = "A faster way to build and share data apps" +optional = false +python-versions = "!=3.9.7,>=3.8" +files = [ + {file = "streamlit-1.39.0-py2.py3-none-any.whl", hash = "sha256:a359fc54ed568b35b055ff1d453c320735539ad12e264365a36458aef55a5fba"}, + {file = "streamlit-1.39.0.tar.gz", hash = "sha256:fef9de7983c4ee65c08e85607d7ffccb56b00482b1041fa62f90e4815d39df3a"}, +] + +[package.dependencies] +altair = ">=4.0,<6" +blinker = ">=1.0.0,<2" +cachetools = ">=4.0,<6" +click = ">=7.0,<9" +gitpython = ">=3.0.7,<3.1.19 || >3.1.19,<4" +numpy = ">=1.20,<3" +packaging = ">=20,<25" +pandas = ">=1.4.0,<3" +pillow = ">=7.1.0,<11" +protobuf = ">=3.20,<6" +pyarrow = ">=7.0" +pydeck = ">=0.8.0b4,<1" +requests = ">=2.27,<3" +rich = ">=10.14.0,<14" +tenacity = ">=8.1.0,<10" +toml = ">=0.10.1,<2" +tornado = ">=6.0.3,<7" +typing-extensions = ">=4.3.0,<5" +watchdog = {version = ">=2.1.5,<6", markers = "platform_system != \"Darwin\""} + +[package.extras] +snowflake = ["snowflake-connector-python (>=2.8.0)", "snowflake-snowpark-python[modin] (>=1.17.0)"] + +[[package]] +name = "streamlit-monaco" +version = "0.1.3" +description = "Monaco Editor (Visual Studio Code) for Streamlit" +optional = false +python-versions = ">=3.9" +files = [ + {file = "streamlit-monaco-0.1.3.tar.gz", hash = "sha256:cb0ea842f26a89c5987d7e962712603d3594082613387a91403520c79288c519"}, + {file = "streamlit_monaco-0.1.3-py3-none-any.whl", hash = "sha256:3e60cb853b0b15c59b372fbc10c0df7d5f2852d4ef259d8489a98341804b7eb0"}, +] + +[package.dependencies] +streamlit = ">=1.20" + +[[package]] +name = "streamlit-scrollable-textbox" +version = "0.0.3" +description = "Scrollable textbox for Streamlit." +optional = false +python-versions = ">=3.6" +files = [ + {file = "streamlit_scrollable_textbox-0.0.3-py3-none-any.whl", hash = "sha256:e48d57f5477491b58afde2cd6a81d6c98bdb8063570fc2467958ae286d883b5c"}, + {file = "streamlit_scrollable_textbox-0.0.3.tar.gz", hash = "sha256:f32c22fb28a16caa4f952f4ce6bc8ab8dc79c5adf36b188ac8938bc458905fbc"}, +] + +[package.dependencies] +streamlit = ">=0.63" + +[[package]] +name = "streamlit-tags" +version = "1.2.8" +description = "Tags custom component for Streamlit" +optional = false +python-versions = ">=3.6" +files = [ + {file = "streamlit_tags-1.2.8-py3-none-any.whl", hash = "sha256:c71b10666f3fce67d8e0b3c089aa50dc48830d310223fb88005b08f157586f95"}, + {file = "streamlit_tags-1.2.8.tar.gz", hash = "sha256:9ea46b21f206dc73164e59e3c800a96c863c90af57afde20115f001a6d986583"}, +] + +[package.dependencies] +streamlit = ">=0.63" + +[[package]] +name = "surrealdb" +version = "0.3.2" +description = "The official SurrealDB library for Python." +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "surrealdb-0.3.2-py3-none-any.whl", hash = "sha256:30424971be9698f0fce61dc8387576d19302e0bb0ae708d311e79a261ead7701"}, + {file = "surrealdb-0.3.2.tar.gz", hash = "sha256:8ab570b8d4299f35443f0d4fa636947cf1a18f67fd88acc00e5e5a36356e82cd"}, +] + +[package.dependencies] +httpx = ">=0.23.0" +pydantic = ">=2.1.0,<3.0.0" +websockets = ">=10.4,<11.0" + +[[package]] +name = "tenacity" +version = "9.0.0" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"}, + {file = "tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b"}, +] + +[package.extras] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] + +[[package]] +name = "tiktoken" +version = "0.8.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = false +python-versions = ">=3.9" +files = [ + {file = "tiktoken-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b07e33283463089c81ef1467180e3e00ab00d46c2c4bbcef0acab5f771d6695e"}, + {file = "tiktoken-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9269348cb650726f44dd3bbb3f9110ac19a8dcc8f54949ad3ef652ca22a38e21"}, + {file = "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e13f37bc4ef2d012731e93e0fef21dc3b7aea5bb9009618de9a4026844e560"}, + {file = "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f13d13c981511331eac0d01a59b5df7c0d4060a8be1e378672822213da51e0a2"}, + {file = "tiktoken-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6b2ddbc79a22621ce8b1166afa9f9a888a664a579350dc7c09346a3b5de837d9"}, + {file = "tiktoken-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d8c2d0e5ba6453a290b86cd65fc51fedf247e1ba170191715b049dac1f628005"}, + {file = "tiktoken-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d622d8011e6d6f239297efa42a2657043aaed06c4f68833550cac9e9bc723ef1"}, + {file = "tiktoken-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2efaf6199717b4485031b4d6edb94075e4d79177a172f38dd934d911b588d54a"}, + {file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5637e425ce1fc49cf716d88df3092048359a4b3bbb7da762840426e937ada06d"}, + {file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb0e352d1dbe15aba082883058b3cce9e48d33101bdaac1eccf66424feb5b47"}, + {file = "tiktoken-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56edfefe896c8f10aba372ab5706b9e3558e78db39dd497c940b47bf228bc419"}, + {file = "tiktoken-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:326624128590def898775b722ccc327e90b073714227175ea8febbc920ac0a99"}, + {file = "tiktoken-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:881839cfeae051b3628d9823b2e56b5cc93a9e2efb435f4cf15f17dc45f21586"}, + {file = "tiktoken-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fe9399bdc3f29d428f16a2f86c3c8ec20be3eac5f53693ce4980371c3245729b"}, + {file = "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a58deb7075d5b69237a3ff4bb51a726670419db6ea62bdcd8bd80c78497d7ab"}, + {file = "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2908c0d043a7d03ebd80347266b0e58440bdef5564f84f4d29fb235b5df3b04"}, + {file = "tiktoken-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:294440d21a2a51e12d4238e68a5972095534fe9878be57d905c476017bff99fc"}, + {file = "tiktoken-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:d8f3192733ac4d77977432947d563d7e1b310b96497acd3c196c9bddb36ed9db"}, + {file = "tiktoken-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:02be1666096aff7da6cbd7cdaa8e7917bfed3467cd64b38b1f112e96d3b06a24"}, + {file = "tiktoken-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94ff53c5c74b535b2cbf431d907fc13c678bbd009ee633a2aca269a04389f9a"}, + {file = "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b231f5e8982c245ee3065cd84a4712d64692348bc609d84467c57b4b72dcbc5"}, + {file = "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4177faa809bd55f699e88c96d9bb4635d22e3f59d635ba6fd9ffedf7150b9953"}, + {file = "tiktoken-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5376b6f8dc4753cd81ead935c5f518fa0fbe7e133d9e25f648d8c4dabdd4bad7"}, + {file = "tiktoken-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:18228d624807d66c87acd8f25fc135665617cab220671eb65b50f5d70fa51f69"}, + {file = "tiktoken-0.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e17807445f0cf1f25771c9d86496bd8b5c376f7419912519699f3cc4dc5c12e"}, + {file = "tiktoken-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:886f80bd339578bbdba6ed6d0567a0d5c6cfe198d9e587ba6c447654c65b8edc"}, + {file = "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6adc8323016d7758d6de7313527f755b0fc6c72985b7d9291be5d96d73ecd1e1"}, + {file = "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b591fb2b30d6a72121a80be24ec7a0e9eb51c5500ddc7e4c2496516dd5e3816b"}, + {file = "tiktoken-0.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:845287b9798e476b4d762c3ebda5102be87ca26e5d2c9854002825d60cdb815d"}, + {file = "tiktoken-0.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:1473cfe584252dc3fa62adceb5b1c763c1874e04511b197da4e6de51d6ce5a02"}, + {file = "tiktoken-0.8.0.tar.gz", hash = "sha256:9ccbb2740f24542534369c5635cfd9b2b3c2490754a78ac8831d99f89f94eeb2"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + +[[package]] +name = "tornado" +version = "6.4.1" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">=3.8" +files = [ + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, +] + +[[package]] +name = "tqdm" +version = "4.66.5" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, + {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "typing-inspect" +version = "0.9.0" +description = "Runtime inspection utilities for typing module." +optional = false +python-versions = "*" +files = [ + {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, + {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, +] + +[package.dependencies] +mypy-extensions = ">=0.3.0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "tzdata" +version = "2024.2" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, +] + +[[package]] +name = "urllib3" +version = "2.2.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "virtualenv" +version = "20.27.0" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.8" +files = [ + {file = "virtualenv-20.27.0-py3-none-any.whl", hash = "sha256:44a72c29cceb0ee08f300b314848c86e57bf8d1f13107a5e671fb9274138d655"}, + {file = "virtualenv-20.27.0.tar.gz", hash = "sha256:2ca56a68ed615b8fe4326d11a0dca5dfbe8fd68510fb6c6349163bed3c15f2b2"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "watchdog" +version = "5.0.3" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.9" +files = [ + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85527b882f3facda0579bce9d743ff7f10c3e1e0db0a0d0e28170a7d0e5ce2ea"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53adf73dcdc0ef04f7735066b4a57a4cd3e49ef135daae41d77395f0b5b692cb"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25adddab85f674acac303cf1f5835951345a56c5f7f582987d266679979c75b"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:752fb40efc7cc8d88ebc332b8f4bcbe2b5cc7e881bccfeb8e25054c00c994ee3"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2e8f3f955d68471fa37b0e3add18500790d129cc7efe89971b8a4cc6fdeb0b2"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8ca4d854adcf480bdfd80f46fdd6fb49f91dd020ae11c89b3a79e19454ec627"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:223160bb359281bb8e31c8f1068bf71a6b16a8ad3d9524ca6f523ac666bb6a1e"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:560135542c91eaa74247a2e8430cf83c4342b29e8ad4f520ae14f0c8a19cfb5b"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"}, + {file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"}, + {file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"}, + {file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"}, + {file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "websockets" +version = "10.4" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "websockets-10.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d58804e996d7d2307173d56c297cf7bc132c52df27a3efaac5e8d43e36c21c48"}, + {file = "websockets-10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc0b82d728fe21a0d03e65f81980abbbcb13b5387f733a1a870672c5be26edab"}, + {file = "websockets-10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba089c499e1f4155d2a3c2a05d2878a3428cf321c848f2b5a45ce55f0d7d310c"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33d69ca7612f0ddff3316b0c7b33ca180d464ecac2d115805c044bf0a3b0d032"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62e627f6b6d4aed919a2052efc408da7a545c606268d5ab5bfab4432734b82b4"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ea7b82bfcae927eeffc55d2ffa31665dc7fec7b8dc654506b8e5a518eb4d50"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e0cb5cc6ece6ffa75baccfd5c02cffe776f3f5c8bf486811f9d3ea3453676ce8"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae5e95cfb53ab1da62185e23b3130e11d64431179debac6dc3c6acf08760e9b1"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7c584f366f46ba667cfa66020344886cf47088e79c9b9d39c84ce9ea98aaa331"}, + {file = "websockets-10.4-cp310-cp310-win32.whl", hash = "sha256:b029fb2032ae4724d8ae8d4f6b363f2cc39e4c7b12454df8df7f0f563ed3e61a"}, + {file = "websockets-10.4-cp310-cp310-win_amd64.whl", hash = "sha256:8dc96f64ae43dde92530775e9cb169979f414dcf5cff670455d81a6823b42089"}, + {file = "websockets-10.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47a2964021f2110116cc1125b3e6d87ab5ad16dea161949e7244ec583b905bb4"}, + {file = "websockets-10.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e789376b52c295c4946403bd0efecf27ab98f05319df4583d3c48e43c7342c2f"}, + {file = "websockets-10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d3f0b61c45c3fa9a349cf484962c559a8a1d80dae6977276df8fd1fa5e3cb8c"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55b5905705725af31ccef50e55391621532cd64fbf0bc6f4bac935f0fccec46"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00c870522cdb69cd625b93f002961ffb0c095394f06ba8c48f17eef7c1541f96"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f38706e0b15d3c20ef6259fd4bc1700cd133b06c3c1bb108ffe3f8947be15fa"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f2c38d588887a609191d30e902df2a32711f708abfd85d318ca9b367258cfd0c"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fe10ddc59b304cb19a1bdf5bd0a7719cbbc9fbdd57ac80ed436b709fcf889106"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:90fcf8929836d4a0e964d799a58823547df5a5e9afa83081761630553be731f9"}, + {file = "websockets-10.4-cp311-cp311-win32.whl", hash = "sha256:b9968694c5f467bf67ef97ae7ad4d56d14be2751000c1207d31bf3bb8860bae8"}, + {file = "websockets-10.4-cp311-cp311-win_amd64.whl", hash = "sha256:a7a240d7a74bf8d5cb3bfe6be7f21697a28ec4b1a437607bae08ac7acf5b4882"}, + {file = "websockets-10.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74de2b894b47f1d21cbd0b37a5e2b2392ad95d17ae983e64727e18eb281fe7cb"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3a686ecb4aa0d64ae60c9c9f1a7d5d46cab9bfb5d91a2d303d00e2cd4c4c5cc"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d15c968ea7a65211e084f523151dbf8ae44634de03c801b8bd070b74e85033"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00213676a2e46b6ebf6045bc11d0f529d9120baa6f58d122b4021ad92adabd41"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e23173580d740bf8822fd0379e4bf30aa1d5a92a4f252d34e893070c081050df"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:dd500e0a5e11969cdd3320935ca2ff1e936f2358f9c2e61f100a1660933320ea"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4239b6027e3d66a89446908ff3027d2737afc1a375f8fd3eea630a4842ec9a0c"}, + {file = "websockets-10.4-cp37-cp37m-win32.whl", hash = "sha256:8a5cc00546e0a701da4639aa0bbcb0ae2bb678c87f46da01ac2d789e1f2d2038"}, + {file = "websockets-10.4-cp37-cp37m-win_amd64.whl", hash = "sha256:a9f9a735deaf9a0cadc2d8c50d1a5bcdbae8b6e539c6e08237bc4082d7c13f28"}, + {file = "websockets-10.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c1289596042fad2cdceb05e1ebf7aadf9995c928e0da2b7a4e99494953b1b94"}, + {file = "websockets-10.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0cff816f51fb33c26d6e2b16b5c7d48eaa31dae5488ace6aae468b361f422b63"}, + {file = "websockets-10.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dd9becd5fe29773d140d68d607d66a38f60e31b86df75332703757ee645b6faf"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45ec8e75b7dbc9539cbfafa570742fe4f676eb8b0d3694b67dabe2f2ceed8aa6"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f72e5cd0f18f262f5da20efa9e241699e0cf3a766317a17392550c9ad7b37d8"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185929b4808b36a79c65b7865783b87b6841e852ef5407a2fb0c03381092fa3b"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d27a7e34c313b3a7f91adcd05134315002aaf8540d7b4f90336beafaea6217c"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:884be66c76a444c59f801ac13f40c76f176f1bfa815ef5b8ed44321e74f1600b"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:931c039af54fc195fe6ad536fde4b0de04da9d5916e78e55405436348cfb0e56"}, + {file = "websockets-10.4-cp38-cp38-win32.whl", hash = "sha256:db3c336f9eda2532ec0fd8ea49fef7a8df8f6c804cdf4f39e5c5c0d4a4ad9a7a"}, + {file = "websockets-10.4-cp38-cp38-win_amd64.whl", hash = "sha256:48c08473563323f9c9debac781ecf66f94ad5a3680a38fe84dee5388cf5acaf6"}, + {file = "websockets-10.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:40e826de3085721dabc7cf9bfd41682dadc02286d8cf149b3ad05bff89311e4f"}, + {file = "websockets-10.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56029457f219ade1f2fc12a6504ea61e14ee227a815531f9738e41203a429112"}, + {file = "websockets-10.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5fc088b7a32f244c519a048c170f14cf2251b849ef0e20cbbb0fdf0fdaf556f"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc8709c00704194213d45e455adc106ff9e87658297f72d544220e32029cd3d"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0154f7691e4fe6c2b2bc275b5701e8b158dae92a1ab229e2b940efe11905dff4"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c6d2264f485f0b53adf22697ac11e261ce84805c232ed5dbe6b1bcb84b00ff0"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9bc42e8402dc5e9905fb8b9649f57efcb2056693b7e88faa8fb029256ba9c68c"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:edc344de4dac1d89300a053ac973299e82d3db56330f3494905643bb68801269"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:84bc2a7d075f32f6ed98652db3a680a17a4edb21ca7f80fe42e38753a58ee02b"}, + {file = "websockets-10.4-cp39-cp39-win32.whl", hash = "sha256:c94ae4faf2d09f7c81847c63843f84fe47bf6253c9d60b20f25edfd30fb12588"}, + {file = "websockets-10.4-cp39-cp39-win_amd64.whl", hash = "sha256:bbccd847aa0c3a69b5f691a84d2341a4f8a629c6922558f2a70611305f902d74"}, + {file = "websockets-10.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:82ff5e1cae4e855147fd57a2863376ed7454134c2bf49ec604dfe71e446e2193"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d210abe51b5da0ffdbf7b43eed0cfdff8a55a1ab17abbec4301c9ff077dd0342"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:942de28af58f352a6f588bc72490ae0f4ccd6dfc2bd3de5945b882a078e4e179"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9b27d6c1c6cd53dc93614967e9ce00ae7f864a2d9f99fe5ed86706e1ecbf485"}, + {file = "websockets-10.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3d3cac3e32b2c8414f4f87c1b2ab686fa6284a980ba283617404377cd448f631"}, + {file = "websockets-10.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:da39dd03d130162deb63da51f6e66ed73032ae62e74aaccc4236e30edccddbb0"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389f8dbb5c489e305fb113ca1b6bdcdaa130923f77485db5b189de343a179393"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09a1814bb15eff7069e51fed0826df0bc0702652b5cb8f87697d469d79c23576"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff64a1d38d156d429404aaa84b27305e957fd10c30e5880d1765c9480bea490f"}, + {file = "websockets-10.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b343f521b047493dc4022dd338fc6db9d9282658862756b4f6fd0e996c1380e1"}, + {file = "websockets-10.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:932af322458da7e4e35df32f050389e13d3d96b09d274b22a7aa1808f292fee4"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a4162139374a49eb18ef5b2f4da1dd95c994588f5033d64e0bbfda4b6b6fcf"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c57e4c1349fbe0e446c9fa7b19ed2f8a4417233b6984277cce392819123142d3"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b627c266f295de9dea86bd1112ed3d5fafb69a348af30a2422e16590a8ecba13"}, + {file = "websockets-10.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:05a7233089f8bd355e8cbe127c2e8ca0b4ea55467861906b80d2ebc7db4d6b72"}, + {file = "websockets-10.4.tar.gz", hash = "sha256:eef610b23933c54d5d921c92578ae5f89813438fded840c2e9809d378dc765d3"}, +] + +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" +files = [ + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, +] + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + +[[package]] +name = "yarl" +version = "1.15.5" +description = "Yet another URL library" +optional = false +python-versions = ">=3.9" +files = [ + {file = "yarl-1.15.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b6c57972a406ea0f61e3f28f2b3a780fb71fbe1d82d267afe5a2f889a83ee7e7"}, + {file = "yarl-1.15.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c3ac5bdcc1375c8ee52784adf94edbce37c471dd2100a117cfef56fe8dbc2b4"}, + {file = "yarl-1.15.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:68d21d0563d82aaf46163eac529adac301b20be3181b8a2811f7bd5615466055"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7d317fb80bc17ed4b34a9aad8b80cef34bea0993654f3e8566daf323def7ef9"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed9c72d5361cfd5af5ccadffa8f8077f4929640e1f938aa0f4b92c5a24996ac5"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bb707859218e8335447b210f41a755e7b1367c33e87add884128bba144694a7f"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6563394492c96cb57f4dff0c69c63d2b28b5469c59c66f35a1e6451583cd0ab4"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c2d1109c8d92059314cc34dd8f0a31f74b720dc140744923ed7ca228bf9b491"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8fc727f0fb388debc771eaa7091c092bd2e8b6b4741b73354b8efadcf96d6031"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:94189746c5ad62e1014a16298130e696fe593d031d442ef135fb7787b7a1f820"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b06d8b05d0fafef204d635a4711283ddbf19c7c0facdc61b4b775f6e47e2d4be"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:de6917946dc6bc237d4b354e38aa13a232e0c7948fdbdb160edee3862e9d735f"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:34816f1d833433a16c4832562a050b0a60eac53dcb71b2032e6ebff82d74b6a7"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:19e2a4b2935f95fad0949f420514c5d862f5f18058fbbfd8854f496a97d9fd87"}, + {file = "yarl-1.15.5-cp310-cp310-win32.whl", hash = "sha256:30ca64521f1a96b72886dd9e8652f16eab11891b4572dcfcfc1ad6d6ccb27abd"}, + {file = "yarl-1.15.5-cp310-cp310-win_amd64.whl", hash = "sha256:86648c53b10c53db8b967a75fb41e0c89dbec7398f6525e34af2b6c456bb0ac0"}, + {file = "yarl-1.15.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e652aa9f8dfa808bc5b2da4d1f4e286cf1d640570fdfa72ffc0c1d16ba114651"}, + {file = "yarl-1.15.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21050b6cd569980fe20ceeab4baeb900d3f7247270475e42bafe117416a5496c"}, + {file = "yarl-1.15.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:18940191ec9a83bbfe63eea61c3e9d12474bb910d5613bce8fa46e84a80b75b2"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a082dc948045606f62dca0228ab24f13737180b253378d6443f5b2b9ef8beefe"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a843e692f9d5402b3455653f4607dc521de2385f01c5cad7ba4a87c46e2ea8d"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5093a453176a4fad4f9c3006f507cf300546190bb3e27944275a37cfd6323a65"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2597a589859b94d0a5e2f5d30fee95081867926e57cb751f8b44a7dd92da4e79"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f5a1ca6eaabfe62718b87eac06d9a47b30cf92ffa065fee9196d3ecd24a3cf1"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4ac83b307cc4b8907345b52994055c6c3c2601ceb6fcb94c5ed6a93c6b4e8257"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:325e2beb2cd8654b276e7686a3cd203628dd3fe32d5c616e632bc35a2901fb16"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:75d04ba8ed335042328086e643e01165e0c24598216f72da709b375930ae3bdb"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7abd7d15aedb3961a967cc65f8144dbbca42e3626a21c5f4f29919cf43eeafb9"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:294c742a273f44511f14b03a9e06b66094dcdf4bbb75a5e23fead548fd5310ae"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:63d46606b20f80a6476f1044bab78e1a69c2e0747f174583e2f12fc70bad2170"}, + {file = "yarl-1.15.5-cp311-cp311-win32.whl", hash = "sha256:b1217102a455e3ac9ac293081093f21f0183e978c7692171ff669fee5296fa28"}, + {file = "yarl-1.15.5-cp311-cp311-win_amd64.whl", hash = "sha256:5848500b6a01497560969e8c3a7eb1b2570853c74a0ca6f67ebaf6064106c49b"}, + {file = "yarl-1.15.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d3309ee667f2d9c7ac9ecf44620d6b274bfdd8065b8c5019ff6795dd887b8fed"}, + {file = "yarl-1.15.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:96ce879799fee124d241ea3b84448378f638e290c49493d00b706f3fd57ec22b"}, + {file = "yarl-1.15.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c884dfa56b050f718ea3cbbfd972e29a6f07f63a7449b10d9a20d64f7eec92e2"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0327081978fe186c3390dd4f73f95f825d0bb9c74967e22c2a1a87735974d8f5"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:524b3bb7dff320e305bc979c65eddc0342548c56ea9241502f907853fe53c408"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd56de8b645421ff09c993fdb0ee9c5a3b50d290a8f55793b500d99b34d0c1ce"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c166ad987265bb343be58cdf4fbc4478cc1d81f2246d2be9a15f94393b269faa"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d56980374a10c74255fcea6ebcfb0aeca7166d212ee9fd7e823ddef35fb62ad0"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cbf36099a9b407e1456dbf55844743a98603fcba32d2a46fb3a698d926facf1b"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d7fa4b033e2f267e37aabcc36949fa89f9f1716a723395912147f9cf3fb437c7"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bb129f77ddaea2d8e6e00417b8d907448de3407af4eddacca0a515574ad71493"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:68e837b3edfcd037f9706157e7cb8efda832de6248c7d9e893e2638356dfae5d"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5b8af4165e097ff84d9bbb97bb4f4d7f71b9c1c9565a2d0e27d93e5f92dae220"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:70d074d5a96e0954fe6db81ff356f4361397da1cda3f7c127fc0902f671a087e"}, + {file = "yarl-1.15.5-cp312-cp312-win32.whl", hash = "sha256:362da97ad4360e4ef1dd24ccdd3bceb18332da7f40026a42f49b7edd686e31c3"}, + {file = "yarl-1.15.5-cp312-cp312-win_amd64.whl", hash = "sha256:9aa054d97033beac9cb9b19b7c0b8784b85b12cd17879087ca6bffba57884e02"}, + {file = "yarl-1.15.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5fadcf532fd9f6cbad71485ef8c2462dd9a91d3efc72ca01eb0970792c92552a"}, + {file = "yarl-1.15.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8b7dd6983c81523f9de0ae6334c3b7a3cb33283936e0525f80c4f713f54a9bb6"}, + {file = "yarl-1.15.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fcfd663dc88465ebe41c7c938bdc91c4b01cda96a0d64bf38fd66c1877323771"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd529e637cd23204bd82072f6637cff7af2516ad2c132e8f3342cbc84871f7d1"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b30f13fac56598474071a4f1ecd66c78fdaf2f8619042d7ca135f72dbb348cf"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44088ec0be82fba118ed29b6b429f80bf295297727adae4c257ac297e01e8bcd"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607683991bab8607e5158cd290dd8fdaa613442aeab802fe1c237d3a3eee7358"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da48cdff56b01ea4282a6d04b83b07a2088351a4a3ff7aacc1e7e9b6b04b90b9"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9162ea117ce8bad8ebc95b7376b4135988acd888d2cf4702f8281e3c11f8b81f"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:e8aa19c39cb20bfb16f0266df175a6004943122cf20707fbf0cacc21f6468a25"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5d6be369488d503c8edc14e2f63d71ab2a607041ad216a8ad444fa18e8dea792"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6e2c674cfe4c03ad7a4d536b1f808221f0d11a360486b4b032d2557c0bd633ad"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:041bafaa82b77fd4ec2826d42a55461ec86d999adf7ed9644eef7e8a9febb366"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2eeb9ba53c055740cd282ae9d34eb7970d65e73a46f15adec4b0c1b0f2e55cc2"}, + {file = "yarl-1.15.5-cp313-cp313-win32.whl", hash = "sha256:73143dd279e641543da52c55652ad7b4c7c5f79e797f124f58f04cc060f14271"}, + {file = "yarl-1.15.5-cp313-cp313-win_amd64.whl", hash = "sha256:94ab1185900f43760d5487c8e49f5f1a66f864e36092f282f1813597479b9dfa"}, + {file = "yarl-1.15.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6b3d2767bd64c62909ea33525b954ba05c8f9726bfdf2141d175da4e344f19ae"}, + {file = "yarl-1.15.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:44359c52af9c383e5107f3b6301446fc8269599721fa42fafb2afb5f31a42dcb"}, + {file = "yarl-1.15.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6493da9ba5c551978c679ab04856c2cf8f79c316e8ec8c503460a135705edc3b"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a6b6e95bc621c11cf9ff21012173337e789f2461ebc3b4e5bf65c74ef69adb8"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7983290ede3aaa2c9620879530849532529b4dcbf5b12a0b6a91163a773eadb9"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07a4b53abe85813c538b9cdbb02909ebe3734e3af466a587df516e960d500cc8"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5882faa2a6e684f65ee44f18c701768749a950cbd5e72db452fc07805f6bdec0"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e27861251d9c094f641d39a8a78dd2371fb9a252ea2f689d1ad353a31d46a0bc"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8669a110f655c9eb22f16fb68a7d4942020aeaa09f1def584a80183e3e89953c"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:10bfe0bef4cf5ea0383886beda004071faadedf2647048b9f876664284c5b60d"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f7de0d4b6b4d8a77e422eb54d765255c0ec6883ee03b8fd537101633948619d7"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:00bb3a559d7bd006a5302ecd7e409916939106a8cdbe31f4eb5e5b9ffcca57ea"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:06ec070a2d71415f90dbe9d70af3158e7da97a128519dba2d1581156ee27fb92"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b997a806846c00d1f41d6a251803732837771b2091bead7566f68820e317bfe7"}, + {file = "yarl-1.15.5-cp39-cp39-win32.whl", hash = "sha256:7825506fbee4055265528ec3532a8197ff26fc53d4978917a4c8ddbb4c1667d7"}, + {file = "yarl-1.15.5-cp39-cp39-win_amd64.whl", hash = "sha256:71730658be0b5de7c570a9795d7404c577b2313c1db370407092c66f70e04ccb"}, + {file = "yarl-1.15.5-py3-none-any.whl", hash = "sha256:625f31d6650829fba4030b4e7bdb2d69e41510dddfa29a1da27076c199521757"}, + {file = "yarl-1.15.5.tar.gz", hash = "sha256:8249147ee81c1cf4d1dc6f26ba28a1b9d92751529f83c308ad02164bb93abd0d"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" +propcache = ">=0.2.0" + +[[package]] +name = "youtube-transcript-api" +version = "0.6.2" +description = "This is an python API which allows you to get the transcripts/subtitles for a given YouTube video. It also works for automatically generated subtitles, supports translating subtitles and it does not require a headless browser, like other selenium based solutions do!" +optional = false +python-versions = "*" +files = [ + {file = "youtube_transcript_api-0.6.2-py3-none-any.whl", hash = "sha256:019dbf265c6a68a0591c513fff25ed5a116ce6525832aefdfb34d4df5567121c"}, + {file = "youtube_transcript_api-0.6.2.tar.gz", hash = "sha256:cad223d7620633cec44f657646bffc8bbc5598bd8e70b1ad2fa8277dec305eb7"}, +] + +[package.dependencies] +requests = "*" + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "40278dff3b2c308d27ecc2f54e1e4999efe6bb74b82ee5c0e37d2021cb877fd0" diff --git a/poetry.toml b/poetry.toml new file mode 100644 index 0000000..2dac8f4 --- /dev/null +++ b/poetry.toml @@ -0,0 +1,3 @@ +[virtualenvs] +in-project = true +path = "." diff --git a/prompts/ask_content.jinja b/prompts/ask_content.jinja new file mode 100644 index 0000000..4212bff --- /dev/null +++ b/prompts/ask_content.jinja @@ -0,0 +1,26 @@ + +# BACKGROUND + +Your are a cognitive assistant that helps me study and research. + +# OUR WORKING FRAMEWORK + +You have access to some information about the project I am working on +as well as the content of a specific item I am interested about. + +Your goal is to respond to the question using purely the content in your CONTEXT. + +If the content in CONTEXT is not enough to answer the question, do not make up any information and just reply that you can't answer that. +Kindly tell the user what sort of things you'd be able to talk about. + +# PROJECT INFO + +{{ notebook }} + +# CONTENT + +{{ doc_content }} + +# QUESTION + +{{ question}} \ No newline at end of file diff --git a/prompts/chat.jinja b/prompts/chat.jinja new file mode 100644 index 0000000..5593915 --- /dev/null +++ b/prompts/chat.jinja @@ -0,0 +1,45 @@ + +# BACKGROUND + +Your are a cognitive assistant that helps me study and research. + +# OUR WORKING FRAMEWORK + +We are working within a virtual Notebook, +which is a learning workspace for a specific project. + +You have access to some information about the project, +the contents that are selected for discussion, and relevant contexts. + +Your goal is to respond to the user's commands and questions, +using purely the content in your context. + +# YOUR TOOLS + +You might find that some of the documents in the CONTEXT are worth an extra look. For that, you can use the `ask_the_document` tool. +Just ask the question as if you were talking to someone that knows the document deeply and the tool will provide you with the answer. +Use the document id to specify which source or note you'd like to ask about. + +# INSTRUCTIONS + +- You can ask tools until you are satisfied with the information +- You have a optional field in your answer called title. Only use this field if you believe your answer is important to be saved as a note. If it's just a quick chat, send an empty string to it. +- Please add to the citations list all the ids for sources and notes that you used for your anwer. + +# RESPONSE FORMAT +``` +[ANSWER] + +### CITATIONS +- id1 +- id2 +- etc +``` + +# PROJECT INFO + +{{ notebook }} + +# CONTEXT + +{{ context }} diff --git a/prompts/spr.jinja b/prompts/spr.jinja new file mode 100644 index 0000000..441e0e1 --- /dev/null +++ b/prompts/spr.jinja @@ -0,0 +1,11 @@ + +# MISSION +You are a Sparse Priming Representation (SPR) writer. An SPR is a particular kind of use of language for advanced NLP, NLU, and NLG tasks, particularly useful for the latest generation of Large Language Models (LLMs). You will be given information by the USER which you are to render as an SPR. + +# THEORY +LLMs are a kind of deep neural network. They have been demonstrated to embed knowledge, abilities, and concepts, ranging from reasoning to planning, and even to theory of mind. These are called latent abilities and latent content, collectively referred to as latent space. The latent space of an LLM can be activated with the correct series of words as inputs, which will create a useful internal state of the neural network. This is not unlike how the right shorthand cues can prime a human mind to think in a certain way. Like human minds, LLMs are associative, meaning you only need to use the correct associations to "prime" another model to think in the same way. + +# METHODOLOGY +Render the input as a distilled list of succinct statements, assertions, associations, concepts, analogies, and metaphors. The idea is to capture as much, conceptually, as possible but with as few words as possible. Write it in a way that makes sense to you, as the future audience will be another language model, not a human. Use complete sentences. + +{# thanks to https://github.com/daveshap/SparsePrimingRepresentations #} \ No newline at end of file diff --git a/prompts/summarize.jinja b/prompts/summarize.jinja new file mode 100644 index 0000000..c106dea --- /dev/null +++ b/prompts/summarize.jinja @@ -0,0 +1,28 @@ + +{% include "spr.jinja" %} + +# YOUR TASK + +You are part of a content summarization platform. +Sometimes, you need to summarize the content gradually since it might be very big. +Please summarize the content below in a few sentences, making it the most complete, dense and SPR compatible as you can. + +## INSTRUCTIONS + +- If the content already has a current summary, rewrite the summary to add the new information without losing the previous context +- Always make it dense and SPR compatible +- Do not reply with anything feedback or message other than the summary itself + +## FORMATTING INSTRUCTIONS + +{{ format_instructions }} + +## CONTENT + +{{content}} + +## PREVIOUS SUMMARY + +{{summary}} + +## SUMMARY \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..7407f8d --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,59 @@ +[tool.poetry] +name = "open-notebook" +version = "0.0.1" +description = "An open source implementation of a research assistant, inspired by Google Notebook LM" +authors = ["Luis Novo "] +license = "MIT" +readme = "README.md" +classifiers = [ + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", +] + +[tool.poetry.dependencies] +python = "^3.11" +streamlit = "^1.39.0" +watchdog = "^5.0.3" +pydantic = "^2.9.2" +loguru = "^0.7.2" +icecream = "^2.1.3" +langchain = "^0.3.3" +langgraph = "^0.2.38" +humanize = "^4.11.0" +streamlit-tags = "^1.2.8" +streamlit-scrollable-textbox = "^0.0.3" +tiktoken = "^0.8.0" +streamlit-monaco = "^0.1.3" +langgraph-checkpoint-sqlite = "^2.0.0" +pymupdf = "1.24.11" +python-magic = "^0.4.27" +langdetect = "^1.0.9" +youtube-transcript-api = "^0.6.2" +surrealdb = "^0.3.2" +openai = "^1.52.0" +pre-commit = "^4.0.1" +langchain-community = "^0.3.3" +langchain-openai = "^0.2.3" + +[tool.poetry.group.dev.dependencies] +ipykernel = "^6.29.5" +ruff = "^0.5.5" +mypy = "^1.11.1" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + + +[tool.isort] +profile = "black" +line_length = 88 + +[tool.ruff] +line-length = 88 + +[tool.ruff.lint] +select = ["E", "F", "I"] +ignore = ["E501"] + diff --git a/stream_app/__init__.py b/stream_app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/stream_app/chat.py b/stream_app/chat.py new file mode 100644 index 0000000..05759d6 --- /dev/null +++ b/stream_app/chat.py @@ -0,0 +1,89 @@ +import streamlit as st +from langchain_core.runnables import RunnableConfig + +from open_notebook.domain import Note, Source +from open_notebook.graphs.chat import graph as chat_graph +from open_notebook.utils import token_cost, token_count + + +# todo: build a smarter, more robust context manager function +def build_context(session_id): + st.session_state[session_id]["context"] = dict(note=[], source=[]) + + for id, status in st.session_state[session_id]["context_config"].items(): + if not id: + continue + + item_type, item_id = id.split(":") + if item_type not in ["note", "source"]: + continue + + if "not in" in status: + continue + + if item_type == "note": + item: Note = Note.get(id) + elif item_type == "source": + item: Source = Source.get(id) + else: + continue + + if not item: + continue + if "summary" in status: + st.session_state[session_id]["context"][item_type] += [ + item.get_context(context_size="short") + ] + elif "full content" in status: + st.session_state[session_id]["context"][item_type] += [ + item.get_context(context_size="long") + ] + + return st.session_state[session_id]["context"] + + +def execute_chat(txt_input, session_id): + current_state = st.session_state[session_id] + current_state["messages"] += [txt_input] + result = chat_graph.invoke( + input=current_state, + config=RunnableConfig(configurable={"thread_id": session_id}), + ) + return result + + +# todo: se eu for usar o token count, preciso deixar configuravel +# seria bom ter um total de tokens no admin em algum lugar +def chat_sidebar(session_id): + context = build_context(session_id=session_id) + tokens = token_count(str(context)) + cost = token_cost(tokens) + with st.container(border=True): + request = st.chat_input("Enter your question") + st.caption(f"Total tokens: {tokens}, cost: ${cost:.4f}") + if request: + response = execute_chat(txt_input=request, session_id=session_id) + st.session_state[session_id]["messages"] = response["messages"] + + for msg in st.session_state[session_id]["messages"][::-1]: + if msg.type not in ["human", "ai"]: + continue + if not msg.content: + continue + + with st.chat_message(name=msg.type): + st.write(msg.content) + if msg.type == "ai": + if st.button("💾 New Note", key=f"render_save_{msg.id}"): + title = "New Note" + content = msg.content + note = Note( + title=title, + content=content, + note_type="ai", + ) + note.save() + note.add_to_notebook( + st.session_state[session_id]["notebook"].id + ) + st.rerun() diff --git a/stream_app/consts.py b/stream_app/consts.py new file mode 100644 index 0000000..352b338 --- /dev/null +++ b/stream_app/consts.py @@ -0,0 +1,5 @@ +context_icons = [ + "⛔ not in context", + "🟡 summary", + "🟢 full content", +] diff --git a/stream_app/note.py b/stream_app/note.py new file mode 100644 index 0000000..bbca4e8 --- /dev/null +++ b/stream_app/note.py @@ -0,0 +1,89 @@ +import streamlit as st +from humanize import naturaltime +from loguru import logger +from streamlit_monaco import st_monaco # type: ignore + +from open_notebook.domain import Note + +from .consts import context_icons + + +@st.dialog("Write a Note", width="large") +def add_note(session_id): + note_title = st.text_input("Title") + note_content = st.text_area("Content") + if st.button("Save", key="add_note"): + logger.debug("Adding note") + note = Note(title=note_title, content=note_content, note_type="human") + note.save() + note.add_to_notebook(st.session_state[session_id]["notebook"].id) + st.rerun() + + +@st.dialog("Add a Source", width="large") +def note_panel(session_id=None, note_id=None): + if note_id: + note: Note = Note.get(note_id) + else: + note: Note = Note() + + t_preview, t_edit = st.tabs(["Preview", "Edit"]) + with t_preview: + st.subheader(note.title) + st.markdown(note.content) + with t_edit: + note.title = st.text_input("Title", value=note.title) + note.content = st_monaco( + value=note.content, height="600px", language="markdown" + ) + if st.button("Save", key=f"edit_note_{note_id}"): + logger.debug("Editing note") + note.save() + if not note.id: + note.add_to_notebook(st.session_state[session_id]["notebook"].id) + st.rerun() + if st.button("Delete", key=f"delete_note_{note_id}"): + logger.debug("Deleting note") + note.delete() + st.rerun() + + +def note_card(session_id, note): + if note.note_type == "human": + icon = "🤵" + else: + icon = "🤖" + + context_state = st.selectbox( + "Context", + label_visibility="collapsed", + options=context_icons, + index=0, + key=f"note_{note.id}", + ) + with st.expander(f"{icon} **{note.title}** {naturaltime(note.updated)}"): + st.write(note.content) + with st.popover("Actions"): + if st.button("Edit Note", icon="📝", key=f"edit_note_{note.id}"): + note_panel(session_id, note.id) + if st.button("Delete", icon="🗑️", key=f"delete_options_{note.id}"): + note.delete() + st.rerun() + + st.session_state[session_id]["context_config"][note.id] = context_state + + +def note_list_item(note_id, score=None): + logger.debug(note_id) + note: Note = Note.get(note_id) + if note.note_type == "human": + icon = "🤵" + else: + icon = "🤖" + + with st.expander( + f"{icon} [{score:.2f}] **{note.title}** {naturaltime(note.updated)}" + ): + st.write(note.content) + if st.button("Edit Note", icon="📝", key=f"x_edit_note_{note.id}"): + note_panel(note_id=note.id) diff --git a/stream_app/source.py b/stream_app/source.py new file mode 100644 index 0000000..f0d78f2 --- /dev/null +++ b/stream_app/source.py @@ -0,0 +1,161 @@ +from pathlib import Path + +import streamlit as st +import streamlit_scrollable_textbox as stx # type: ignore +from humanize import naturaltime +from loguru import logger +from streamlit_tags import st_tags # type: ignore + +from open_notebook.domain import Asset, Source +from open_notebook.graphs.content_process import graph +from open_notebook.utils import token_cost, token_count + +from .consts import context_icons + +uploads_dir = Path("./.uploads") +uploads_dir.mkdir(parents=True, exist_ok=True) + + +@st.dialog("Source", width="large") +def source_panel(source_id): + source: Source = Source.get(source_id) + if not source: + st.error("Source not found") + return + title = st.empty() + if source.title: + title.subheader(source.title) + st.caption(f"Created {naturaltime(source.created)}") + # st.markdown(f"**URL:** {source.url}, **File:** {source.file_path}") + summary = st.empty() + for insight in source.insights: + summary.write(insight.insight_type) + summary.write(insight.content) + + topics = source.topics or [] + if len(topics) > 0: + st_tags( + label="", + text="Press enter to add more", + value=source.topics, + suggestions=source.topics, + maxtags=10, + key="1", + ) + + if st.button("Delete", icon="🗑️"): + source.delete() + st.rerun() + + cost = token_cost(token_count(source.full_text)) * 1.2 + if st.button(f"Summarize (about ${cost:.4f})", icon="📝"): + source.summarize() + st.rerun(scope="fragment") + + cost_embedding = token_cost(token_count(source.full_text), 0.02) + + if st.button(f"Embed (${cost_embedding:.4f})", icon="📝"): + source.vectorize() + st.success("Embedding complete") + + st.subheader("Content") + stx.scrollableTextbox(source.full_text, height=300) + + +@st.dialog("Add a Source", width="large") +def add_source(session_id): + source_link = None + source_file = None + source_text = None + source_type = st.radio("Type", ["Link", "Upload", "Text"]) + req = {} + if source_type == "Link": + source_link = st.text_input("Link") + req["url"] = source_link + elif source_type == "Upload": + source_file = st.file_uploader("Upload") + if source_file is not None: + # Get the file name and extension + file_name = source_file.name + + file_extension = Path(file_name).suffix + + # Generate a unique file name + base_name = Path(file_name).stem + counter = 1 + new_path = uploads_dir / file_name + while new_path.exists(): + new_file_name = f"{base_name}_{counter}{file_extension}" + new_path = uploads_dir / new_file_name + counter += 1 + + req["file_path"] = str(new_path) + # Save the file + with open(new_path, "wb") as f: + f.write(source_file.getbuffer()) + + else: + source_text = st.text_area("Text") + req["content"] = source_text + if st.button("Process", key="add_source"): + logger.debug("Adding source") + with st.status("Processing...", expanded=True): + st.write("Processing document...") + result = graph.invoke(req) + st.write("Saving..") + source = Source( + asset=Asset(url=req.get("url"), file_path=req.get("file_path")), + ) + source.save() + source.save_chunks(result["content"]) + source.add_to_notebook(st.session_state[session_id]["notebook"].id) + st.write("Summarizing...") + source.summarize() + + st.rerun() + # else: + # st.stop() + + +def source_card(session_id, source): + icon = "🔗" + context_state = st.selectbox( + "Context", + label_visibility="collapsed", + options=context_icons, + index=0, + key=f"source_{source.id}", + ) + with st.expander(f"**{source.title}**"): + st.markdown(f"{icon} Updated: {naturaltime(source.updated)}") + st.markdown("**" + ", ".join(source.topics) + "**") + for insight in source.insights: + st.write(insight.insight_type) + st.write(insight.content) + + with st.popover("Actions"): + if st.button("Edit Source", icon="📝", key=source.id): + result = source_panel(source.id) + st.write(result) + if st.button("Delete", icon="🗑️", key=f"delete_options_{source.id}"): + source.delete() + st.rerun() + + st.session_state[session_id]["context_config"][source.id] = context_state + + +def source_list_item(source_id, score=None): + source: Source = Source.get(source_id) + if not source: + st.error("Source not found") + return + icon = "🔗" + + with st.expander( + f"{icon} [{score:.2f}] **{source.title}** {naturaltime(source.updated)}" + ): + for insight in source.insights: + st.markdown(f"**{insight.insight_type}**") + st.write(insight.content) + if st.button("Edit source", icon="📝", key=f"x_edit_source_{source.id}"): + source_panel(source_id=source.id) diff --git a/stream_app/utils.py b/stream_app/utils.py new file mode 100644 index 0000000..fabd925 --- /dev/null +++ b/stream_app/utils.py @@ -0,0 +1,18 @@ +import streamlit as st + +from open_notebook.graphs.chat import ThreadState, graph + + +def setup_stream_state(session_id) -> None: + """ + Sets the value of the current session_id for langgraph thread state. + If there is no existing thread state for this session_id, it creates a new one. + """ + existing_state = graph.get_state({"configurable": {"thread_id": session_id}}).values + if len(existing_state.keys()) == 0: + st.session_state[session_id] = ThreadState( + messages=[], context=None, notebook=None, context_config={}, response=None + ) + else: + st.session_state[session_id] = existing_state + st.session_state["active_session"] = session_id diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..ca69ef1 --- /dev/null +++ b/tests/README.md @@ -0,0 +1 @@ +Coming Soon \ No newline at end of file diff --git a/todo.md b/todo.md new file mode 100644 index 0000000..2cd7ca8 --- /dev/null +++ b/todo.md @@ -0,0 +1,66 @@ + +Auto summarize + + +# Code stuff +- Linting + +# Future versions: +- Suporte more models other than OpenAI + - Any LLM do crew ai + - permitir mais de um vetorizer + - Colocar o Gemini como modelo de consulta de documentos + - Permitir usar modelos como Ollama entre outros + - Tentar usar o Pydantic Output Parser + - Tentar remover langchain_openai e anthropic +- DB consistency + - delete notebook (o que fazer com os filhos) + - Ta acumulando 2 sumaries + - deletar filhos quando deletar pais +- Brincar com o tema do Streamlit +- Docstrings +- Arrumar o chat quando houver utilização de ferramentas +- Implementar streaming no chat também +- Citacions: explicar de onde vieram os insights +- Usar propósito do projeto para sumarizar +- Melhorar Citacions: explicar de onde vieram os insights +- Melhorar as estratégias de embedding e limpeza de conteúdo e indexação +- Improve streamlit navigation and refresh +- Mais de uma sessão de chats? +- Melhorias no banco, menos tabelas, mais inteligentes +- Live Query for the front end +- Implementar a ideia do Fabric de prompts e perguntas recomendadas +- Menu bar: sources, notes, projects, search, topics +- Trazer algum sistema de busca +- Multiple study sessions + +- Melhorar a visão dos dados + - Usar as queries corretas no Surreal + - Dar um talento de nada no models + - Transformar tudo em lambda? + - Por information nos edges para contexto? + +- Processamento tinha que ser async + - Ta dando pau em arquivos grandes + - Precisa de um sistema de fila + - Automatizar o processo de analise + - Suportar transcrição de audio e de video +https://www.youtube.com/watch?v=mdLBr9IMmgI +- Langgraph + - Mudar a memória das threads para o SurrealDB + +- Estratégias mais poderosas que combinem fabric com embeddings + +- Uma ideia legal seria usar um LLM muito barato para limpar textos e o vision para entender pdfs + +---- +There is a known issue with the surreal sdk for large content + + +FEATURES + +- Recursive sumarizationa cima de 500k de texto +- Estimativa de custo do vetorizer para os conteudos +- Context Manager - fine grained +- Campo de busca de texto, vetor e híbrida +- Vector search on my own notes