From a30d97263f2272604154637efc44515e947fbce5 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Wed, 23 Oct 2024 15:20:29 -0400 Subject: [PATCH 001/201] Pin python 3.11 as the desired default version for running this code --- .gitignore | 2 -- .python-version | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 .python-version diff --git a/.gitignore b/.gitignore index 609eda39..ae396e42 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,3 @@ -.python-version - # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/.python-version b/.python-version new file mode 100644 index 00000000..2c073331 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.11 From 268d48c0949a2ee55e27bebc8507706c5388d79a Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Wed, 23 Oct 2024 15:38:21 -0400 Subject: [PATCH 002/201] Delete old legacy unused code --- predictionnet/api/exporter.py | 176 ---------------------------------- 1 file changed, 176 deletions(-) delete mode 100644 predictionnet/api/exporter.py diff --git a/predictionnet/api/exporter.py b/predictionnet/api/exporter.py deleted file mode 100644 index 898c71af..00000000 --- a/predictionnet/api/exporter.py +++ /dev/null @@ -1,176 +0,0 @@ -import os -from datetime import datetime - -import bittensor as bt -import psycopg -from dotenv import load_dotenv -from psycopg import OperationalError, sql - -from predictionnet.api.get_query_axons import get_query_api_axons -from predictionnet.api.prediction import PredictionAPI - -bt.debug() -load_dotenv() -pg_connection_string = os.environ.get("POSTGRESQL_CONNECTION_STRING") - -# ---------------------------------------------------------------------------- # -# Select/Insert/Update # -# ---------------------------------------------------------------------------- # -find_miner_by_hot_key_cold_key = sql.SQL( - "SELECT * FROM miners_table WHERE hot_key = %s AND cold_key = %s" -) -update_miner_by_hot_key_cold_key = sql.SQL( - "UPDATE miners_table SET uid = %s, is_current_uid = %s, rank = %s, trust = %s WHERE hot_key = %s AND cold_key = %s" -) -update_miner_uid_to_false_by_hot_key_cold_key = sql.SQL( - "UPDATE miners_table SET is_current_uid = %s WHERE NOT hot_key = %s AND NOT cold_key = %s AND uid=%s" -) -insert_miner_query = sql.SQL( - "INSERT INTO miners_table (hot_key, cold_key, uid, is_current_uid, rank, trust) VALUES (%s, %s, %s, %s, %s, %s)" -) -insert_prediction_query = sql.SQL( - "INSERT INTO predictions_table (prediction, timestamp, miner_id) VALUES (%s, %s, %s)" -) - - -# ---------------------------------------------------------------------------- # -# Connect to DB # -# ---------------------------------------------------------------------------- # -def create_connection(conn_str): - """ - Create a database connection using the provided connection string. - :param conn_str: Database connection string - :return: Connection object or None - """ - conn = None - try: - conn = psycopg.connect(conn_str) - print("Connection to PostgreSQL DB successful") - except OperationalError as e: - print(f"The error '{e}' occurred") - return conn - - -# ---------------------------------------------------------------------------- # -# Example usage # -# ---------------------------------------------------------------------------- # -async def test_prediction(): - - wallet = bt.wallet() - - # Fetch the axons of the available API nodes, or specify UIDs directly - metagraph = bt.subtensor("local").metagraph(netuid=28) - - uids = [uid.item() for uid in metagraph.uids if metagraph.trust[uid] > 0] - - axons = await get_query_api_axons( - wallet=wallet, metagraph=metagraph, uids=uids - ) - - # Store some data! - # Read timestamp from the text file - with open("timestamp.txt", "r") as file: - timestamp = file.read() - - bt.logging.info(f"Sending {timestamp} to predict a price.") - retrieve_handler = PredictionAPI(wallet) - retrieve_response = await retrieve_handler( - axons=axons, - # Arugmnts for the proper synapse - timestamp=timestamp, - timeout=120, - ) - - ranks = metagraph.R - ck = metagraph.coldkeys - hk = metagraph.hotkeys - trust = metagraph.T - - exporter_list = [] - - # For each UID, store the predictions in PostgresQL: - connection = create_connection(pg_connection_string) - cursor = connection.cursor() - for i in range(len(retrieve_response)): - export_dict = {} - export_dict["UID"] = str(uids[i]) - export_dict["prediction"] = retrieve_response[i] - export_dict["rank"] = ranks[uids[i]].item() - export_dict["trust"] = trust[uids[i]].item() - export_dict["hotKey"] = hk[uids[i]] - export_dict["coldKey"] = ck[uids[i]] - print(export_dict) - exporter_list.append(export_dict) - # -------------------- Insert/Update the miner in the DB: -------------------- # - # Check if HKey + CKey exists in the DB - # This returns an array with all the matching rows. You can use array length to check if a miner was found. - _ = cursor.execute( - find_miner_by_hot_key_cold_key, - (export_dict["hotKey"], export_dict["coldKey"]), - ) - result = cursor.fetchall() - if len(result) == 0: - # Miner not found, insert miner: - _ = cursor.execute( - insert_miner_query, - ( - export_dict["hotKey"], - export_dict["coldKey"], - export_dict["UID"], - True, - export_dict["rank"], - export_dict["trust"], - ), - ) - connection.commit() - else: - # Miner found, update miner: - _ = cursor.execute( - update_miner_by_hot_key_cold_key, - ( - export_dict["UID"], - True, - export_dict["rank"], - export_dict["trust"], - export_dict["hotKey"], - export_dict["coldKey"], - ), - ) - connection.commit() - - # Update the other UID that is not the same HK + CK to False: - _ = cursor.execute( - update_miner_uid_to_false_by_hot_key_cold_key, - ( - False, - export_dict["hotKey"], - export_dict["coldKey"], - export_dict["UID"], - ), - ) - connection.commit() - - # ------------------------ Fetch the updated version: ------------------------ # - _ = cursor.execute( - find_miner_by_hot_key_cold_key, - (export_dict["hotKey"], export_dict["coldKey"]), - ) - result = cursor.fetchall() - updated_miner = result[0] - - # Insert the prediction: - cursor.execute( - insert_prediction_query, - ( - export_dict["prediction"], - datetime.datetime.now().isoformat(), - updated_miner[0], - ), - ) - connection.commit() - - -if __name__ == "__main__": - import asyncio - - asyncio.run(test_prediction()) From 3d44d890cefde5f7a00e617d7dfde9aaafdbc4cd Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Wed, 23 Oct 2024 16:16:41 -0400 Subject: [PATCH 003/201] Remove unused dependencies and add joblib --- requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index e4da4c1c..6d4fd1e0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,10 @@ bittensor==7.4.0 huggingface_hub==0.22.2 +joblib loguru numpy pandas pandas_market_calendars -psycopg pydantic python_dotenv pytz @@ -12,7 +12,6 @@ rich scikit_learn setuptools starlette -statsmodels ta template tensorflow==2.17.0 From 39648ddfeafb8b7d371c18d0e827f4fb52a6770a Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 24 Oct 2024 10:28:38 -0400 Subject: [PATCH 004/201] These two packages are only referenced in tests --- dev_requirements.txt | 2 ++ requirements.txt | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev_requirements.txt b/dev_requirements.txt index fc093cbc..cbc7efc2 100644 --- a/dev_requirements.txt +++ b/dev_requirements.txt @@ -4,3 +4,5 @@ isort mypy pre-commit pre-commit-hooks==5.0.0 +rich +template diff --git a/requirements.txt b/requirements.txt index 6d4fd1e0..9dc057e2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,12 +8,10 @@ pandas_market_calendars pydantic python_dotenv pytz -rich scikit_learn setuptools starlette ta -template tensorflow==2.17.0 torch transformers From dcdeeaddb1d7e504d5334c1f2f176ebb90d8e667 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 24 Oct 2024 10:31:14 -0400 Subject: [PATCH 005/201] These two packages are only referenced in docs --- dev_requirements.txt | 2 ++ requirements.txt | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev_requirements.txt b/dev_requirements.txt index cbc7efc2..81602a07 100644 --- a/dev_requirements.txt +++ b/dev_requirements.txt @@ -5,4 +5,6 @@ mypy pre-commit pre-commit-hooks==5.0.0 rich +starlette template +transformers diff --git a/requirements.txt b/requirements.txt index 9dc057e2..373f2d48 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,10 +10,8 @@ python_dotenv pytz scikit_learn setuptools -starlette ta tensorflow==2.17.0 torch -transformers wandb==0.16.6 yfinance==0.2.37 From 44de288084ef931825580233e813b934996dd3a9 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 24 Oct 2024 10:45:24 -0400 Subject: [PATCH 006/201] Update release notes --- docs/Release Notes.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/Release Notes.md b/docs/Release Notes.md index 42abd9c5..a98c6ae6 100644 --- a/docs/Release Notes.md +++ b/docs/Release Notes.md @@ -1,6 +1,12 @@ Release Notes ============= +2.3.0 +----- +Released on +- Reduce packages required to deploy miners and validators + + 2.2.0 ----- Released on October 22nd 2024 From 3dad1cc8918ca61d620430804745738d74b4e18e Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 24 Oct 2024 12:29:21 -0400 Subject: [PATCH 007/201] Remove legacy otf workflow --- .circleci/config.yml | 161 ------------------------------------------- 1 file changed, 161 deletions(-) delete mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index c9d214ba..00000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,161 +0,0 @@ -version: 2.1 - -orbs: - python: circleci/python@2.1.1 - python-lib: dialogue/python-lib@0.1.55 - # coveralls: coveralls/coveralls@1.0.6 - -jobs: - black: - resource_class: small - parameters: - python-version: - type: string - docker: - - image: cimg/python:<< parameters.python-version >> - - steps: - - checkout - - - restore_cache: - name: Restore cached black venv - keys: - - v1-pypi-py-black-<< parameters.python-version >> - - - run: - name: Update & Activate black venv - command: | - python -m venv env/ - . env/bin/activate - python -m pip install --upgrade pip - pip install black - - - save_cache: - name: Save cached black venv - paths: - - "env/" - key: v1-pypi-py-black-<< parameters.python-version >> - - - run: - name: Black format check - command: | - . env/bin/activate - black --line-length 79 --exclude '(env|venv|.eggs)' --check . - - pylint: - resource_class: small - parameters: - python-version: - type: string - docker: - - image: cimg/python:<< parameters.python-version >> - - steps: - - checkout - - - run: - name: Install Pylint - command: | - python -m venv env/ - . env/bin/activate - pip install pylint - - - run: - name: Pylint check - command: | - . env/bin/activate - pylint --fail-on=W,E,F --exit-zero ./ - - check_compatibility: - parameters: - python_version: - type: string - docker: - - image: cimg/python:3.10 - steps: - - checkout - - run: - name: Check if requirements files have changed - command: ./scripts/check_requirements_changes.sh - - run: - name: Install dependencies and Check compatibility - command: | - if [ "$REQUIREMENTS_CHANGED" == "true" ]; then - sudo apt-get update - sudo apt-get install -y jq curl - ./scripts/check_compatibility.sh << parameters.python_version >> - else - echo "Skipping compatibility checks..." - fi - - build: - resource_class: medium - parallelism: 2 - parameters: - python-version: - type: string - docker: - - image: cimg/python:<< parameters.python-version >> - - steps: - - checkout - - - restore_cache: - name: Restore cached venv - keys: - - v1-pypi-py<< parameters.python-version >>-{{ checksum "requirements.txt" }} - - v1-pypi-py<< parameters.python-version >> - - - run: - name: Update & Activate venv - command: | - python -m venv env/ - . env/bin/activate - python -m pip install --upgrade pip - - - save_cache: - name: Save cached venv - paths: - - "env/" - key: v1-pypi-py<< parameters.python-version >>-{{ checksum "requirements.txt" }} - - - run: - name: Install Bittensor Subnet Template - command: | - . env/bin/activate - pip install -e . - - - store_test_results: - path: test-results - - store_artifacts: - path: test-results - - coveralls: - docker: - - image: cimg/python:3.10 - steps: - - run: - name: Combine Coverage - command: | - pip3 install --upgrade coveralls - coveralls --finish --rcfile .coveragerc || echo "Failed to upload coverage" - -workflows: - compatibility_checks: - jobs: - - check_compatibility: - python_version: "3.9" - name: check-compatibility-3.9 - - check_compatibility: - python_version: "3.10" - name: check-compatibility-3.10 - - check_compatibility: - python_version: "3.11" - name: check-compatibility-3.11 - - pr-requirements: - jobs: - - black: - python-version: ["3.9.13", "3.10.6", "3.11.4"] - - pylint: - python-version: ["3.9.13", "3.10.6", "3.11.4"] From 9d4fb672f6159645d1b543d701adaec6b2a595f4 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 24 Oct 2024 12:30:28 -0400 Subject: [PATCH 008/201] Move default otf contribution guidelines --- {contrib => docs/otf_default/contrib}/CODE_REVIEW_DOCS.md | 0 {contrib => docs/otf_default/contrib}/CONTRIBUTING.md | 0 {contrib => docs/otf_default/contrib}/DEVELOPMENT_WORKFLOW.md | 0 {contrib => docs/otf_default/contrib}/STYLE.md | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename {contrib => docs/otf_default/contrib}/CODE_REVIEW_DOCS.md (100%) rename {contrib => docs/otf_default/contrib}/CONTRIBUTING.md (100%) rename {contrib => docs/otf_default/contrib}/DEVELOPMENT_WORKFLOW.md (100%) rename {contrib => docs/otf_default/contrib}/STYLE.md (100%) diff --git a/contrib/CODE_REVIEW_DOCS.md b/docs/otf_default/contrib/CODE_REVIEW_DOCS.md similarity index 100% rename from contrib/CODE_REVIEW_DOCS.md rename to docs/otf_default/contrib/CODE_REVIEW_DOCS.md diff --git a/contrib/CONTRIBUTING.md b/docs/otf_default/contrib/CONTRIBUTING.md similarity index 100% rename from contrib/CONTRIBUTING.md rename to docs/otf_default/contrib/CONTRIBUTING.md diff --git a/contrib/DEVELOPMENT_WORKFLOW.md b/docs/otf_default/contrib/DEVELOPMENT_WORKFLOW.md similarity index 100% rename from contrib/DEVELOPMENT_WORKFLOW.md rename to docs/otf_default/contrib/DEVELOPMENT_WORKFLOW.md diff --git a/contrib/STYLE.md b/docs/otf_default/contrib/STYLE.md similarity index 100% rename from contrib/STYLE.md rename to docs/otf_default/contrib/STYLE.md From 6dedece83c51dafb81aa15a9d62cbc9ee606d21e Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 24 Oct 2024 12:30:59 -0400 Subject: [PATCH 009/201] Move default otf docs --- docs/{ => otf_default}/running_on_mainnet.md | 0 docs/{ => otf_default}/running_on_staging.md | 0 docs/{ => otf_default}/running_on_testnet.md | 0 docs/{ => otf_default}/what_are_subnets.md | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename docs/{ => otf_default}/running_on_mainnet.md (100%) rename docs/{ => otf_default}/running_on_staging.md (100%) rename docs/{ => otf_default}/running_on_testnet.md (100%) rename docs/{ => otf_default}/what_are_subnets.md (100%) diff --git a/docs/running_on_mainnet.md b/docs/otf_default/running_on_mainnet.md similarity index 100% rename from docs/running_on_mainnet.md rename to docs/otf_default/running_on_mainnet.md diff --git a/docs/running_on_staging.md b/docs/otf_default/running_on_staging.md similarity index 100% rename from docs/running_on_staging.md rename to docs/otf_default/running_on_staging.md diff --git a/docs/running_on_testnet.md b/docs/otf_default/running_on_testnet.md similarity index 100% rename from docs/running_on_testnet.md rename to docs/otf_default/running_on_testnet.md diff --git a/docs/what_are_subnets.md b/docs/otf_default/what_are_subnets.md similarity index 100% rename from docs/what_are_subnets.md rename to docs/otf_default/what_are_subnets.md From 91fb6fda2a105fa08e059679b52ad1ebf485ff05 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 24 Oct 2024 12:31:33 -0400 Subject: [PATCH 010/201] Move default otf tutorial code --- docs/{ => otf_default}/stream_tutorial/README.md | 0 docs/{ => otf_default}/stream_tutorial/client.py | 0 docs/{ => otf_default}/stream_tutorial/config.py | 0 docs/{ => otf_default}/stream_tutorial/miner.py | 0 docs/{ => otf_default}/stream_tutorial/protocol.py | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename docs/{ => otf_default}/stream_tutorial/README.md (100%) rename docs/{ => otf_default}/stream_tutorial/client.py (100%) rename docs/{ => otf_default}/stream_tutorial/config.py (100%) rename docs/{ => otf_default}/stream_tutorial/miner.py (100%) rename docs/{ => otf_default}/stream_tutorial/protocol.py (100%) diff --git a/docs/stream_tutorial/README.md b/docs/otf_default/stream_tutorial/README.md similarity index 100% rename from docs/stream_tutorial/README.md rename to docs/otf_default/stream_tutorial/README.md diff --git a/docs/stream_tutorial/client.py b/docs/otf_default/stream_tutorial/client.py similarity index 100% rename from docs/stream_tutorial/client.py rename to docs/otf_default/stream_tutorial/client.py diff --git a/docs/stream_tutorial/config.py b/docs/otf_default/stream_tutorial/config.py similarity index 100% rename from docs/stream_tutorial/config.py rename to docs/otf_default/stream_tutorial/config.py diff --git a/docs/stream_tutorial/miner.py b/docs/otf_default/stream_tutorial/miner.py similarity index 100% rename from docs/stream_tutorial/miner.py rename to docs/otf_default/stream_tutorial/miner.py diff --git a/docs/stream_tutorial/protocol.py b/docs/otf_default/stream_tutorial/protocol.py similarity index 100% rename from docs/stream_tutorial/protocol.py rename to docs/otf_default/stream_tutorial/protocol.py From 4bd0cbed3f9d78cd13a1f94c43e77daa32040edd Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 24 Oct 2024 12:32:14 -0400 Subject: [PATCH 011/201] Remove unused empty file --- .dependencies_installed | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .dependencies_installed diff --git a/.dependencies_installed b/.dependencies_installed deleted file mode 100644 index e69de29b..00000000 From b7c75d9323f73c72e7564ddc2c94b6038f95b71d Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 24 Oct 2024 12:32:53 -0400 Subject: [PATCH 012/201] Remove unused docker files --- Dockerfile | 26 -------------------------- docker-compose.yml | 11 ----------- 2 files changed, 37 deletions(-) delete mode 100644 Dockerfile delete mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 0cdb63b1..00000000 --- a/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# Use a base image with CUDA and cuDNN -FROM python:3.10.12-slim - -# Set non-interactive environment -ENV DEBIAN_FRONTEND=noninteractive - -WORKDIR /app - -# Update and install git and necessary dependencies -RUN apt-get update && \ - apt-get install -y git - -# Verify Python and pip installation -RUN python3.10 -m venv venv - -ENV PATH=/app/venv/bin:$PATH - -# Set the working directory -WORKDIR /root/.bittensor/subnets/snpOracle - -COPY . /root/.bittensor/subnets/snpOracle - -# Install dependencies -RUN python -m pip install -e . - -RUN git config --global --add safe.directory /root/.bittensor/subnets/snpOracle diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 96732b5b..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,11 +0,0 @@ -version: '3.7' - -services: - my_container: - image: zrross11/snporacle:1.0.4 - container_name: subnet28-miner - network_mode: host - volumes: - - /home/ubuntu/.bittensor:/root/.bittensor - restart: always - command: "python ./neurons/miner.py --wallet.name default --wallet.hotkey default --netuid 28 --axon.port 30334 --subtensor.network local --subtensor.chain_endpoint 127.0.0.1:9944 --logging.debug" From 6b07ee817a0e4a7d2106294059bed4e124d5c173 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 24 Oct 2024 12:38:54 -0400 Subject: [PATCH 013/201] Place requirements in a directory, inspired by bittensor source code --- dev_requirements.txt => requirements/dev_requirements.txt | 0 requirements.txt => requirements/requirements.txt | 0 setup.py | 8 ++++++-- 3 files changed, 6 insertions(+), 2 deletions(-) rename dev_requirements.txt => requirements/dev_requirements.txt (100%) rename requirements.txt => requirements/requirements.txt (100%) diff --git a/dev_requirements.txt b/requirements/dev_requirements.txt similarity index 100% rename from dev_requirements.txt rename to requirements/dev_requirements.txt diff --git a/requirements.txt b/requirements/requirements.txt similarity index 100% rename from requirements.txt rename to requirements/requirements.txt diff --git a/setup.py b/setup.py index f41abaaa..93c8373f 100644 --- a/setup.py +++ b/setup.py @@ -46,9 +46,13 @@ def read_requirements(path): return processed_requirements -requirements = read_requirements("requirements.txt") -dev_requirements = read_requirements("dev_requirements.txt") here = path.abspath(path.dirname(__file__)) +requirements = read_requirements( + path.join(here, "requirements", "requirements.txt") +) +dev_requirements = read_requirements( + path.join(here, "requirements", "dev_requirements.txt") +) with open(path.join(here, "README.md"), encoding="utf-8") as f: long_description = f.read() From 9f045b41d01aa82bd76be27b2ca0f0650e3c9698 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 24 Oct 2024 12:41:22 -0400 Subject: [PATCH 014/201] Move the foundry logo image to docs folder --- README.md | 14 +++++++++++--- accelerate.png => docs/images/accelerate.png | Bin 2 files changed, 11 insertions(+), 3 deletions(-) rename accelerate.png => docs/images/accelerate.png (100%) diff --git a/README.md b/README.md index 097ab1ab..4a55f660 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
- + # **Foundry S&P 500 Oracle** --- @@ -15,9 +15,17 @@ - [Design Decisions](#design-decisions) - [Installation](#installation) - [Install PM2](#install-pm2) - - [Install Repo](#install-repo) + - [Compute Requirements](#compute-requirements) + - [Install-Repo](#install-repo) + - [Running a Miner](#running-a-miner) + - [Running a Validator](#running-a-validator) + - [Obtain \& Setup WandB API Key](#obtain--setup-wandb-api-key) + - [Running Miner/Validator in Docker](#running-minervalidator-in-docker) - [About the Rewards Mechanism](#about-the-rewards-mechanism) -- [Road Map](#road-map) + - [Miner Ranking](#miner-ranking) + - [$\\Delta$ Calculation for ranking miners](#delta-calculation-for-ranking-miners) + - [Exponential Decay Weighting](#exponential-decay-weighting) +- [Roadmap](#roadmap) - [License](#license) --- diff --git a/accelerate.png b/docs/images/accelerate.png similarity index 100% rename from accelerate.png rename to docs/images/accelerate.png From 2d4da8f8e1fa5d93dba9729bcc98883efa6e8370 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 24 Oct 2024 12:42:13 -0400 Subject: [PATCH 015/201] Remove unused json file --- subnet_links.json | 136 ---------------------------------------------- 1 file changed, 136 deletions(-) delete mode 100644 subnet_links.json diff --git a/subnet_links.json b/subnet_links.json deleted file mode 100644 index 1a355ecf..00000000 --- a/subnet_links.json +++ /dev/null @@ -1,136 +0,0 @@ -{ - "subnet_repositories": [ - { - "name": "sn0", - "url": "" - }, - { - "name": "sn1", - "url": "https://github.com/opentensor/text-prompting/" - }, - { - "name": "sn2", - "url": "https://github.com/bittranslateio/bittranslate/" - }, - { - "name": "sn3", - "url": "https://github.com/gitphantomman/scraping_subnet/" - }, - { - "name": "sn4", - "url": "https://github.com/manifold-inc/targon/" - }, - { - "name": "sn5", - "url": "https://github.com/unconst/ImageSubnet/" - }, - { - "name": "sn6", - "url": "" - }, - { - "name": "sn7", - "url": "https://github.com/tensorage/tensorage/" - }, - { - "name": "sn8", - "url": "https://github.com/taoshidev/time-series-prediction-subnet/" - }, - { - "name": "sn9", - "url": "https://github.com/unconst/pretrain-subnet/" - }, - { - "name": "sn10", - "url": "https://github.com/dream-well/map-reduce-subnet/" - }, - { - "name": "sn11", - "url": "https://github.com/opentensor/text-prompting/" - }, - { - "name": "sn12", - "url": "" - }, - { - "name": "sn13", - "url": "https://github.com/RusticLuftig/data-universe/" - }, - { - "name": "sn14", - "url": "https://github.com/ceterum1/llm-defender-subnet/" - }, - { - "name": "sn15", - "url": "https://github.com/blockchain-insights/blockchain-data-subnet/" - }, - { - "name": "sn16", - "url": "https://github.com/UncleTensor/AudioSubnet/" - }, - { - "name": "sn17", - "url": "https://github.com/CortexLM/flavia/" - }, - { - "name": "sn18", - "url": "https://github.com/corcel-api/cortex.t/" - }, - { - "name": "sn19", - "url": "https://github.com/namoray/vision/" - }, - { - "name": "sn20", - "url": "https://github.com/oracle-subnet/oracle-subnet/" - }, - { - "name": "sn21", - "url": "https://github.com/ifrit98/storage-subnet/" - }, - { - "name": "sn22", - "url": "https://github.com/surcyf123/smart-scrape/" - }, - { - "name": "sn23", - "url": "https://github.com/NicheTensor/NicheImage/" - }, - { - "name": "sn24", - "url": "https://github.com/eseckft/BitAds.ai/tree/main" - }, - { - "name": "sn25", - "url": "https://github.com/KMFODA/DistributedTraining/" - }, - { - "name": "sn26", - "url": "https://github.com/Supreme-Emperor-Wang/ImageAlchemy/" - }, - { - "name": "sn27", - "url": "https://github.com/neuralinternet/compute-subnet/" - }, - { - "name": "sn28", - "url": "https://github.com/zktensor/zktensor_subnet/" - }, - { - "name": "sn29", - "url": "https://github.com/404-Repo/Subnet-29/" - }, - { - "name": "sn30", - "url": "" - }, - { - "name": "sn31", - "url": "https://github.com/bthealthcare/healthcare-subnet" - }, - { - "name": "sn32", - "url": "https://github.com/RoyalTensor/roleplay/" - } - ] -} From ce31c1f4aed9cad669e42547b18d8bcae0093a8b Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 1 Nov 2024 09:34:17 -0400 Subject: [PATCH 016/201] Initial attempt at readme badges --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 4a55f660..26cf23e8 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,13 @@ [Website](https://foundrydigital.com/accelerate/) • [Validator](https://taostats.io/validators/foundry/) • [Twitter](https://x.com/FoundryServices?s=20)
+| | | +| :-: | :-: | +| Status | ![GitHub Release](https://img.shields.io/github/v/release/foundryservices/snpOracle) ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/foundryservices/snpOracle/ci.yml) [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![Checked with mypy](https://img.shields.io/badge/type--checked-mypy-blue?style=flat-square&logo=python)](http://mypy-lang.org/) ![GitHub License](https://img.shields.io/github/license/foundryservices/snpOracle) | +| Activity | ![GitHub commit activity](https://img.shields.io/github/commit-activity/m/foundryservices/snpOracle) ![GitHub commits since latest release (branch)](https://img.shields.io/github/commits-since/foundryservices/snpOracle/latest/dev) ![GitHub contributors](https://img.shields.io/github/contributors/foundryservices/snpOracle) ![GitHub Release Date](https://img.shields.io/github/release-date/foundryservices/snpOracle) ![GitHub last commit (branch)](https://img.shields.io/github/last-commit/foundryservices/snpOracle/dev) | +| Compatability | ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmacrocosm-os%2Fprompting%2Frefs%2Fheads%2Fmain%2Fpyproject.toml&query=%24.tool.poetry.dependencies.bittensor&prefix=v&label=Bittensor) ![Python Version from PEP 621 TOML](https://img.shields.io/python/required-version-toml?tomlFilePath=https%3A%2F%2Fraw.githubusercontent.com%2Fnumpy%2Fnumpy%2Fmain%2Fpyproject.toml&logo=python) | +| Social | ![Website](https://img.shields.io/website?url=https%3A%2F%2Ffoundrydigital.com%2Faccelerate%2F&up_message=Foundry%20Accelerate&label=Website) ![Website](https://img.shields.io/website?url=https%3A%2F%2Ftaostats.io%2Fvalidators%2Ffoundry%2F&up_message=Foundry%20Accelerate&label=Validator) ![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/FoundryServices) | + --- - [Introduction](#introduction) - [Design Decisions](#design-decisions) From 291bccacd3b98638e7fcb9622815c68f3213fd78 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 1 Nov 2024 09:56:58 -0400 Subject: [PATCH 017/201] Draft poetry dependencies to pull into readme badges --- pyproject.toml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 8a93fa0a..2aec17a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,24 @@ +[tool.poetry] +name = "snp_oracle" +version = "2.2.1" +description = "" +authors = ["Foundry Digital"] +readme = "README.md" + +[tool.poetry.dependencies] +# Python version - 3.9, 3.10, 3.11 +python = ">= 3.9, < 3.12" + +# Copied from requirements.txt +bittensor = "7.4.0" +huggingface_hub = "0.22.2" +tensorflow = "2.17.0" +wandb = "0.16.6" +yfinance = "0.2.37" + +[tool.poetry.group.dev.dependencies] +pre-commit-hooks = "5.0.0" + [tool.black] line-length = 79 include = '\.pyi?$' @@ -37,3 +58,7 @@ skip = [ #[tool.flake8] # Refer to the `.flake8` file + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" \ No newline at end of file From eff2d95cea81455602cb83705945651f95db8420 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 1 Nov 2024 10:04:59 -0400 Subject: [PATCH 018/201] Remove build syntax from toml file --- pyproject.toml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2aec17a6..589d640a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,7 +58,3 @@ skip = [ #[tool.flake8] # Refer to the `.flake8` file - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" \ No newline at end of file From 82e4a1fcb9b5ae8369ef73aa4c03acb431209650 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 1 Nov 2024 10:35:05 -0400 Subject: [PATCH 019/201] Clean spacing labels and links for badges --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 26cf23e8..abdd6736 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,10 @@ | | | | :-: | :-: | -| Status | ![GitHub Release](https://img.shields.io/github/v/release/foundryservices/snpOracle) ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/foundryservices/snpOracle/ci.yml) [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![Checked with mypy](https://img.shields.io/badge/type--checked-mypy-blue?style=flat-square&logo=python)](http://mypy-lang.org/) ![GitHub License](https://img.shields.io/github/license/foundryservices/snpOracle) | -| Activity | ![GitHub commit activity](https://img.shields.io/github/commit-activity/m/foundryservices/snpOracle) ![GitHub commits since latest release (branch)](https://img.shields.io/github/commits-since/foundryservices/snpOracle/latest/dev) ![GitHub contributors](https://img.shields.io/github/contributors/foundryservices/snpOracle) ![GitHub Release Date](https://img.shields.io/github/release-date/foundryservices/snpOracle) ![GitHub last commit (branch)](https://img.shields.io/github/last-commit/foundryservices/snpOracle/dev) | -| Compatability | ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmacrocosm-os%2Fprompting%2Frefs%2Fheads%2Fmain%2Fpyproject.toml&query=%24.tool.poetry.dependencies.bittensor&prefix=v&label=Bittensor) ![Python Version from PEP 621 TOML](https://img.shields.io/python/required-version-toml?tomlFilePath=https%3A%2F%2Fraw.githubusercontent.com%2Fnumpy%2Fnumpy%2Fmain%2Fpyproject.toml&logo=python) | -| Social | ![Website](https://img.shields.io/website?url=https%3A%2F%2Ffoundrydigital.com%2Faccelerate%2F&up_message=Foundry%20Accelerate&label=Website) ![Website](https://img.shields.io/website?url=https%3A%2F%2Ftaostats.io%2Fvalidators%2Ffoundry%2F&up_message=Foundry%20Accelerate&label=Validator) ![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/FoundryServices) | +| Status | ![GitHub Release](https://img.shields.io/github/v/release/foundryservices/snpOracle?label=Release) ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/foundryservices/snpOracle/ci.yml?label=Build)
[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&label=Pre-Commit)](https://github.com/pre-commit/pre-commit) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg?label=Code%20Style)](https://github.com/psf/black)
![GitHub License](https://img.shields.io/github/license/foundryservices/snpOracle?label=License) | +| Activity | ![GitHub commit activity](https://img.shields.io/github/commit-activity/m/foundryservices/snpOracle?label=Commit%20Activity) ![GitHub commits since latest release (branch)](https://img.shields.io/github/commits-since/foundryservices/snpOracle/latest/dev?label=Commits%20Since%20Latest%20Release)
![GitHub Release Date](https://img.shields.io/github/release-date/foundryservices/snpOracle?label=Latest%20Release%20Date) ![GitHub last commit (branch)](https://img.shields.io/github/last-commit/foundryservices/snpOracle/dev?label=Last%20Commit)
![GitHub contributors](https://img.shields.io/github/contributors/foundryservices/snpOracle?label=Contributors) | +| Compatability | ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.python&logo=python&label=Python&logoColor=yellow) ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.bittensor&prefix=v&label=Bittensor)
![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.tensorflow&prefix=v&logo=tensorflow&label=TensorFlow) ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.yfinance&prefix=v&label=yfinance) | +| Social | [![Website](https://img.shields.io/website?url=https%3A%2F%2Ffoundrydigital.com%2Faccelerate%2F&up_message=Foundry%20Accelerate&label=Website)](https://foundrydigital.com/accelerate/) [![Website](https://img.shields.io/website?url=https%3A%2F%2Ftaostats.io%2Fvalidators%2Ffoundry%2F&up_message=Foundry%20Accelerate&label=Validator)](https://taostats.io/validators/5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2) [![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/FoundryServices)](https://x.com/FoundryServices?s=20) | --- - [Introduction](#introduction) From c399da078450e64d5ac5f9d2cc4f37957e90b1b0 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 1 Nov 2024 14:02:04 -0400 Subject: [PATCH 020/201] Increase line length to 120 --- .flake8 | 2 +- pyproject.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.flake8 b/.flake8 index 1e0c0365..84ebd3be 100644 --- a/.flake8 +++ b/.flake8 @@ -30,5 +30,5 @@ exclude = scripts, .venv max-complexity = 10 -max-line-length = 79 +max-line-length = 120 per-file-ignores = __init__.py:F401 diff --git a/pyproject.toml b/pyproject.toml index 8a93fa0a..c202d077 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [tool.black] -line-length = 79 +line-length = 120 include = '\.pyi?$' exclude = ''' /( @@ -21,7 +21,7 @@ exclude = ''' [tool.isort] profile = "black" -line_length = 79 +line_length = 120 skip_gitignore = true skip = [ ".venv", From e174fa78ea292e1bb4962689d388cbd68d5dcd3a Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 1 Nov 2024 14:03:35 -0400 Subject: [PATCH 021/201] Run pre commit on all files --- base_miner/get_data.py | 4 +- base_miner/model.py | 24 +++------ neurons/miner.py | 57 +++++--------------- neurons/validator.py | 24 +++------ predictionnet/__init__.py | 6 +-- predictionnet/api/__init__.py | 8 +-- predictionnet/api/example.py | 4 +- predictionnet/api/get_query_axons.py | 38 +++---------- predictionnet/api/prediction.py | 4 +- predictionnet/base/miner.py | 40 ++++---------- predictionnet/base/neuron.py | 14 ++--- predictionnet/base/validator.py | 37 ++++--------- predictionnet/utils/config.py | 4 +- predictionnet/utils/uids.py | 8 +-- predictionnet/validator/forward.py | 16 ++---- predictionnet/validator/reward.py | 80 +++++++--------------------- setup.py | 16 ++---- tests/helpers.py | 23 ++------ tests/test_template_validator.py | 4 +- 19 files changed, 99 insertions(+), 312 deletions(-) diff --git a/base_miner/get_data.py b/base_miner/get_data.py index f7b2b4d0..cfb46176 100644 --- a/base_miner/get_data.py +++ b/base_miner/get_data.py @@ -41,9 +41,7 @@ def prep_data(drop_na: bool = True) -> DataFrame: data["SMA_50"] = data["Close"].rolling(window=50).mean() data["SMA_200"] = data["Close"].rolling(window=200).mean() data["RSI"] = ta.momentum.RSIIndicator(data["Close"]).rsi() - data["CCI"] = ta.trend.CCIIndicator( - data["High"], data["Low"], data["Close"] - ).cci() + data["CCI"] = ta.trend.CCIIndicator(data["High"], data["Low"], data["Close"]).cci() data["Momentum"] = ta.momentum.ROCIndicator(data["Close"]).roc() for i in range(1, 7): data[f"NextClose{i}"] = data["Close"].shift(-1 * i) diff --git a/base_miner/model.py b/base_miner/model.py index e0d0b8a8..f92b33b7 100644 --- a/base_miner/model.py +++ b/base_miner/model.py @@ -18,15 +18,11 @@ load_dotenv() if not os.getenv("HF_ACCESS_TOKEN"): - print( - "Cannot find a Huggingface Access Token - unable to upload model to Huggingface." - ) + print("Cannot find a Huggingface Access Token - unable to upload model to Huggingface.") token = os.getenv("HF_ACCESS_TOKEN") -def create_and_save_base_model_lstm( - scaler: MinMaxScaler, X_scaled: np.ndarray, y_scaled: np.ndarray -) -> float: +def create_and_save_base_model_lstm(scaler: MinMaxScaler, X_scaled: np.ndarray, y_scaled: np.ndarray) -> float: """ Base model that can be created for predicting the S&P 500 close price @@ -55,9 +51,7 @@ def create_and_save_base_model_lstm( X_scaled = X_scaled.reshape((X_scaled.shape[0], 1, X_scaled.shape[1])) # Split data into training and testing - X_train, X_test, y_train, y_test = train_test_split( - X_scaled, y_scaled, test_size=0.2, random_state=42 - ) + X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled, test_size=0.2, random_state=42) # LSTM model - all hyperparameters are baseline params - should be changed according to your required # architecture. LSTMs are also not the only way to do this, can be done using any algo deemed fit by @@ -107,9 +101,7 @@ def create_and_save_base_model_lstm( return mse -def create_and_save_base_model_regression( - scaler: MinMaxScaler, X_scaled: np.ndarray, y_scaled: np.ndarray -) -> float: +def create_and_save_base_model_regression(scaler: MinMaxScaler, X_scaled: np.ndarray, y_scaled: np.ndarray) -> float: """ Base model that can be created for predicting the S&P 500 close price @@ -135,9 +127,7 @@ def create_and_save_base_model_regression( model_name = "mining_models/base_linear_regression" # Split data into training and testing - X_train, X_test, y_train, y_test = train_test_split( - X_scaled, y_scaled, test_size=0.2, random_state=42 - ) + X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled, test_size=0.2, random_state=42) # LSTM model - all hyperparameters are baseline params - should be changed according to your required # architecture. LSTMs are also not the only way to do this, can be done using any algo deemed fit by @@ -155,9 +145,7 @@ def create_and_save_base_model_regression( predicted_prices = model.predict(X_test) # Rescale back to original range - predicted_prices = scaler.inverse_transform( - predicted_prices.reshape(-1, 1) - ) + predicted_prices = scaler.inverse_transform(predicted_prices.reshape(-1, 1)) y_test_rescaled = scaler.inverse_transform(y_test.reshape(-1, 1)) # Evaluate diff --git a/neurons/miner.py b/neurons/miner.py index eac91733..ebe9ab89 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -55,13 +55,9 @@ def __init__(self, config=None): # TODO(developer): Anything specific to your use case you can do here self.model_loc = self.config.model if self.config.neuron.device == "cpu": - os.environ["CUDA_VISIBLE_DEVICES"] = ( - "-1" # This will force TensorFlow to use CPU only - ) + os.environ["CUDA_VISIBLE_DEVICES"] = "-1" # This will force TensorFlow to use CPU only - async def blacklist( - self, synapse: predictionnet.protocol.Challenge - ) -> typing.Tuple[bool, str]: + async def blacklist(self, synapse: predictionnet.protocol.Challenge) -> typing.Tuple[bool, str]: """ Determines whether an incoming request should be blacklisted and thus ignored. Your implementation should define the logic for blacklisting requests based on your needs and desired security parameters. @@ -99,14 +95,9 @@ async def blacklist( uid = self.metagraph.hotkeys.index(synapse.dendrite.hotkey) stake = self.metagraph.S[uid].item() - if ( - not self.config.blacklist.allow_non_registered - and synapse.dendrite.hotkey not in self.metagraph.hotkeys - ): + if not self.config.blacklist.allow_non_registered and synapse.dendrite.hotkey not in self.metagraph.hotkeys: # Ignore requests from un-registered entities. - bt.logging.trace( - f"Blacklisting un-registered hotkey {synapse.dendrite.hotkey}" - ) + bt.logging.trace(f"Blacklisting un-registered hotkey {synapse.dendrite.hotkey}") return True, "Unrecognized hotkey" uid = self.metagraph.hotkeys.index(synapse.dendrite.hotkey) @@ -122,19 +113,13 @@ async def blacklist( if self.config.blacklist.force_validator_permit: # If the config is set to force validator permit, then we should only allow requests from validators. if not self.metagraph.validator_permit[uid]: - bt.logging.warning( - f"Blacklisting a request from non-validator hotkey {synapse.dendrite.hotkey}" - ) + bt.logging.warning(f"Blacklisting a request from non-validator hotkey {synapse.dendrite.hotkey}") return True, "Non-validator hotkey" - bt.logging.trace( - f"Not Blacklisting recognized hotkey {synapse.dendrite.hotkey}" - ) + bt.logging.trace(f"Not Blacklisting recognized hotkey {synapse.dendrite.hotkey}") return False, "Hotkey recognized!" - async def priority( - self, synapse: predictionnet.protocol.Challenge - ) -> float: + async def priority(self, synapse: predictionnet.protocol.Challenge) -> float: """ The priority function determines the order in which requests are handled. More valuable or higher-priority requests are processed before others. You should design your own priority mechanism with care. @@ -155,20 +140,12 @@ async def priority( - A higher stake results in a higher priority value. """ # TODO(developer): Define how miners should prioritize requests. - caller_uid = self.metagraph.hotkeys.index( - synapse.dendrite.hotkey - ) # Get the caller index. - prirority = float( - self.metagraph.S[caller_uid] - ) # Return the stake as the priority. - bt.logging.trace( - f"Prioritizing {synapse.dendrite.hotkey} with value: ", prirority - ) + caller_uid = self.metagraph.hotkeys.index(synapse.dendrite.hotkey) # Get the caller index. + prirority = float(self.metagraph.S[caller_uid]) # Return the stake as the priority. + bt.logging.trace(f"Prioritizing {synapse.dendrite.hotkey} with value: ", prirority) return prirority - async def forward( - self, synapse: predictionnet.protocol.Challenge - ) -> predictionnet.protocol.Challenge: + async def forward(self, synapse: predictionnet.protocol.Challenge) -> predictionnet.protocol.Challenge: """ Processes the incoming 'Challenge' synapse by performing a predefined operation on the input data. This method should be replaced with actual logic relevant to the miner's purpose. @@ -195,18 +172,14 @@ async def forward( ) else: if not os.getenv("HF_ACCESS_TOKEN"): - print( - "Cannot find a Huggingface Access Token - model download halted." - ) + print("Cannot find a Huggingface Access Token - model download halted.") token = os.getenv("HF_ACCESS_TOKEN") model_path = hf_hub_download( repo_id=self.config.hf_repo_id, filename=self.config.model, use_auth_token=token, ) - bt.logging.info( - f"Model downloaded from huggingface at {model_path}" - ) + bt.logging.info(f"Model downloaded from huggingface at {model_path}") model = load_model(model_path) data = prep_data() @@ -237,9 +210,7 @@ def load_state(self): def print_info(self): metagraph = self.metagraph - self.uid = self.metagraph.hotkeys.index( - self.wallet.hotkey.ss58_address - ) + self.uid = self.metagraph.hotkeys.index(self.wallet.hotkey.ss58_address) log = ( "Miner | " diff --git a/neurons/validator.py b/neurons/validator.py index 2f5fdb6f..14810d7e 100644 --- a/neurons/validator.py +++ b/neurons/validator.py @@ -54,27 +54,19 @@ def __init__(self, config=None): # basic params self.prediction_interval = 5 # in minutes self.N_TIMEPOINTS = 6 # number of timepoints to predict - self.INTERVAL = ( - self.prediction_interval * self.N_TIMEPOINTS - ) # 30 Minutes + self.INTERVAL = self.prediction_interval * self.N_TIMEPOINTS # 30 Minutes self.past_predictions = {} for uid in range(len(self.metagraph.S)): - uid_is_available = check_uid_availability( - self.metagraph, uid, self.config.neuron.vpermit_tao_limit - ) + uid_is_available = check_uid_availability(self.metagraph, uid, self.config.neuron.vpermit_tao_limit) if uid_is_available: - self.past_predictions[uid] = full( - (self.N_TIMEPOINTS, self.N_TIMEPOINTS), nan - ) + self.past_predictions[uid] = full((self.N_TIMEPOINTS, self.N_TIMEPOINTS), nan) netrc_path = pathlib.Path.home() / ".netrc" wandb_api_key = os.getenv("WANDB_API_KEY") if wandb_api_key is not None: bt.logging.info("WANDB_API_KEY is set") bt.logging.info("~/.netrc exists:", netrc_path.exists()) if wandb_api_key is None and not netrc_path.exists(): - bt.logging.warning( - "WANDB_API_KEY not found in environment variables." - ) + bt.logging.warning("WANDB_API_KEY not found in environment variables.") wandb.init( project=f"sn{self.config.netuid}-validators", @@ -130,9 +122,7 @@ def market_is_open(self, date): False otherwise """ - result = mcal.get_calendar("NYSE").schedule( - start_date=date, end_date=date - ) + result = mcal.get_calendar("NYSE").schedule(start_date=date, end_date=date) return not result.empty async def forward(self): @@ -149,9 +139,7 @@ async def forward(self): def print_info(self): metagraph = self.metagraph - self.uid = self.metagraph.hotkeys.index( - self.wallet.hotkey.ss58_address - ) + self.uid = self.metagraph.hotkeys.index(self.wallet.hotkey.ss58_address) log = ( "Validator | " diff --git a/predictionnet/__init__.py b/predictionnet/__init__.py index bec4de00..cede0dca 100644 --- a/predictionnet/__init__.py +++ b/predictionnet/__init__.py @@ -27,11 +27,7 @@ __version__ = "2.2.1" version_split = __version__.split(".") -__spec_version__ = ( - (1000 * int(version_split[0])) - + (10 * int(version_split[1])) - + (1 * int(version_split[2])) -) +__spec_version__ = (1000 * int(version_split[0])) + (10 * int(version_split[1])) + (1 * int(version_split[2])) SUBNET_LINKS = None with open("subnet_links.json") as f: diff --git a/predictionnet/api/__init__.py b/predictionnet/api/__init__.py index 7ce53171..98479af7 100644 --- a/predictionnet/api/__init__.py +++ b/predictionnet/api/__init__.py @@ -40,9 +40,7 @@ def prepare_synapse(self, *args, **kwargs) -> Any: ... @abstractmethod - def process_responses( - self, responses: List[Union["bt.Synapse", Any]] - ) -> Any: + def process_responses(self, responses: List[Union["bt.Synapse", Any]]) -> Any: """ Process the responses from the network. """ @@ -72,9 +70,7 @@ async def query_api( Any: The result of the process_responses_fn. """ synapse = self.prepare_synapse(**kwargs) - bt.logging.debug( - f"Quering valdidator axons with synapse {synapse.name}..." - ) + bt.logging.debug(f"Quering valdidator axons with synapse {synapse.name}...") responses = await self.dendrite( axons=axons, synapse=synapse, diff --git a/predictionnet/api/example.py b/predictionnet/api/example.py index 4baf7918..cd7b6480 100644 --- a/predictionnet/api/example.py +++ b/predictionnet/api/example.py @@ -15,9 +15,7 @@ async def test_prediction(): uids = [uid.item() for uid in metagraph.uids if metagraph.trust[uid] > 0] - axons = await get_query_api_axons( - wallet=wallet, metagraph=metagraph, uids=uids - ) + axons = await get_query_api_axons(wallet=wallet, metagraph=metagraph, uids=uids) # Store some data! # Read timestamp from the text file diff --git a/predictionnet/api/get_query_axons.py b/predictionnet/api/get_query_axons.py index 5c4d6ced..aa02150d 100644 --- a/predictionnet/api/get_query_axons.py +++ b/predictionnet/api/get_query_axons.py @@ -46,16 +46,8 @@ async def ping_uids(dendrite, metagraph, uids, timeout=3): deserialize=False, timeout=timeout, ) - successful_uids = [ - uid - for uid, response in zip(uids, responses) - if response.dendrite.status_code == 200 - ] - failed_uids = [ - uid - for uid, response in zip(uids, responses) - if response.dendrite.status_code != 200 - ] + successful_uids = [uid for uid, response in zip(uids, responses) if response.dendrite.status_code == 200] + failed_uids = [uid for uid, response in zip(uids, responses) if response.dendrite.status_code != 200] except Exception as e: bt.logging.error(f"Dendrite ping failed: {e}") successful_uids = [] @@ -78,31 +70,19 @@ async def get_query_api_nodes(dendrite, metagraph, n=0.1, timeout=3): Returns: list: A list of UIDs representing the available API nodes. """ - bt.logging.debug( - f"Fetching available API nodes for subnet {metagraph.netuid}" - ) - vtrust_uids = [ - uid.item() - for uid in metagraph.uids - if metagraph.validator_trust[uid] > 0 - ] + bt.logging.debug(f"Fetching available API nodes for subnet {metagraph.netuid}") + vtrust_uids = [uid.item() for uid in metagraph.uids if metagraph.validator_trust[uid] > 0] top_uids = torch.where(metagraph.S > torch.quantile(metagraph.S, 1 - n)) top_uids = top_uids[0].tolist() init_query_uids = set(top_uids).intersection(set(vtrust_uids)) - query_uids, _ = await ping_uids( - dendrite, metagraph, init_query_uids, timeout=timeout - ) - bt.logging.debug( - f"Available API node UIDs for subnet {metagraph.netuid}: {query_uids}" - ) + query_uids, _ = await ping_uids(dendrite, metagraph, init_query_uids, timeout=timeout) + bt.logging.debug(f"Available API node UIDs for subnet {metagraph.netuid}: {query_uids}") if len(query_uids) > 3: query_uids = random.sample(query_uids, 3) return query_uids -async def get_query_api_axons( - wallet, metagraph=None, n=0.1, timeout=3, uids=None -): +async def get_query_api_axons(wallet, metagraph=None, n=0.1, timeout=3, uids=None): """ Retrieves the axons of query API nodes based on their availability and stake. @@ -124,7 +104,5 @@ async def get_query_api_axons( if uids is not None: query_uids = [uids] if isinstance(uids, int) else uids else: - query_uids = await get_query_api_nodes( - dendrite, metagraph, n=n, timeout=timeout - ) + query_uids = await get_query_api_nodes(dendrite, metagraph, n=n, timeout=timeout) return [metagraph.axons[uid] for uid in query_uids] diff --git a/predictionnet/api/prediction.py b/predictionnet/api/prediction.py index b1ec903b..369dee39 100644 --- a/predictionnet/api/prediction.py +++ b/predictionnet/api/prediction.py @@ -35,9 +35,7 @@ def prepare_synapse(self, timestamp: str) -> Challenge: synapse = Challenge(timestamp=timestamp) return synapse - def process_responses( - self, responses: List[Union["bt.Synapse", Any]] - ) -> List[int]: + def process_responses(self, responses: List[Union["bt.Synapse", Any]]) -> List[int]: outputs = [] for response in responses: if response.dendrite.status_code != 200: diff --git a/predictionnet/base/miner.py b/predictionnet/base/miner.py index 04cb4b22..b467b6a5 100644 --- a/predictionnet/base/miner.py +++ b/predictionnet/base/miner.py @@ -108,10 +108,7 @@ def run(self): # This loop maintains the miner's operations until intentionally stopped. try: while not self.should_exit: - while ( - self.block - self.metagraph.last_update[self.uid] - < self.config.neuron.epoch_length - ): + while self.block - self.metagraph.last_update[self.uid] < self.config.neuron.epoch_length: # Wait before checking again. time.sleep(1) @@ -207,50 +204,31 @@ async def verify(self, synapse: Challenge) -> None: # Requests must have nonces to be safe from replays if synapse.dendrite.nonce is None: raise Exception("Missing Nonce") - if ( - synapse.dendrite.version is not None - and synapse.dendrite.version >= V_7_2_0 - ): + if synapse.dendrite.version is not None and synapse.dendrite.version >= V_7_2_0: bt.logging.debug("Using custom synapse verification logic") # If we don't have a nonce stored, ensure that the nonce falls within # a reasonable delta. cur_time = time.time_ns() - allowed_delta = ( - self.config.timeout * 1_000_000_000 - ) # nanoseconds + allowed_delta = self.config.timeout * 1_000_000_000 # nanoseconds latest_allowed_nonce = synapse.dendrite.nonce + allowed_delta - bt.logging.debug( - f"synapse.dendrite.nonce: {synapse.dendrite.nonce}" - ) - bt.logging.debug( - f"latest_allowed_nonce: {latest_allowed_nonce}" - ) + bt.logging.debug(f"synapse.dendrite.nonce: {synapse.dendrite.nonce}") + bt.logging.debug(f"latest_allowed_nonce: {latest_allowed_nonce}") bt.logging.debug(f"cur time: {cur_time}") - bt.logging.debug( - f"delta: {self._to_seconds(cur_time - synapse.dendrite.nonce)}" - ) + bt.logging.debug(f"delta: {self._to_seconds(cur_time - synapse.dendrite.nonce)}") - if ( - self.nonces.get(endpoint_key) is None - and synapse.dendrite.nonce > latest_allowed_nonce - ): + if self.nonces.get(endpoint_key) is None and synapse.dendrite.nonce > latest_allowed_nonce: raise Exception( f"Nonce is too old. Allowed delta in seconds: {self._to_seconds(allowed_delta)}, got delta: {self._to_seconds(cur_time - synapse.dendrite.nonce)}" ) - if ( - self.nonces.get(endpoint_key) is not None - and synapse.dendrite.nonce <= self.nonces[endpoint_key] - ): + if self.nonces.get(endpoint_key) is not None and synapse.dendrite.nonce <= self.nonces[endpoint_key]: raise Exception( f"Nonce is too small, already have a newer nonce in the nonce store, got: {synapse.dendrite.nonce}, already have: {self.nonces[endpoint_key]}" ) else: - bt.logging.warning( - f"Using synapse verification logic for version < 7.2.0: {synapse.dendrite.version}" - ) + bt.logging.warning(f"Using synapse verification logic for version < 7.2.0: {synapse.dendrite.version}") if ( endpoint_key in self.nonces.keys() and self.nonces[endpoint_key] is not None diff --git a/predictionnet/base/neuron.py b/predictionnet/base/neuron.py index f4dc3f3e..a5294469 100644 --- a/predictionnet/base/neuron.py +++ b/predictionnet/base/neuron.py @@ -98,9 +98,7 @@ def __init__(self, config=None): self.check_registered() # Each miner gets a unique identity (UID) in the network for differentiation. - self.uid = self.metagraph.hotkeys.index( - self.wallet.hotkey.ss58_address - ) + self.uid = self.metagraph.hotkeys.index(self.wallet.hotkey.ss58_address) bt.logging.info( f"Running neuron on subnet: {self.config.netuid} with uid {self.uid} using network: {self.subtensor.chain_endpoint}" ) @@ -144,9 +142,7 @@ def should_sync_metagraph(self): """ Check if enough epoch blocks have elapsed since the last checkpoint to sync. """ - return ( - self.block - self.metagraph.last_update[self.uid] - ) > self.config.neuron.epoch_length + return (self.block - self.metagraph.last_update[self.uid]) > self.config.neuron.epoch_length def should_set_weights(self) -> bool: # Don't set weights on initialization. @@ -159,10 +155,8 @@ def should_set_weights(self) -> bool: # Define appropriate logic for when set weights. return ( - (self.block - self.metagraph.last_update[self.uid]) - > self.config.neuron.epoch_length - and self.neuron_type != "MinerNeuron" - ) # don't set weights if you're a miner + self.block - self.metagraph.last_update[self.uid] + ) > self.config.neuron.epoch_length and self.neuron_type != "MinerNeuron" # don't set weights if you're a miner def save_state(self): bt.logging.warning( diff --git a/predictionnet/base/validator.py b/predictionnet/base/validator.py index 02fc616f..5575adff 100644 --- a/predictionnet/base/validator.py +++ b/predictionnet/base/validator.py @@ -93,16 +93,11 @@ def serve_axon(self): pass except Exception as e: - bt.logging.error( - f"Failed to create Axon initialize with exception: {e}" - ) + bt.logging.error(f"Failed to create Axon initialize with exception: {e}") pass async def concurrent_forward(self): - coroutines = [ - self.forward() - for _ in range(self.config.neuron.num_concurrent_forwards) - ] + coroutines = [self.forward() for _ in range(self.config.neuron.num_concurrent_forwards)] await asyncio.gather(*coroutines) def run(self): @@ -156,9 +151,7 @@ def run(self): # In case of unforeseen errors, the validator will log the error and continue operations. except Exception as err: bt.logging.error("Error during validation", str(err)) - bt.logging.debug( - print_exception(type(err), err, err.__traceback__) - ) + bt.logging.debug(print_exception(type(err), err, err.__traceback__)) def run_in_background_thread(self): """ @@ -261,9 +254,7 @@ def set_weights(self): if result: bt.logging.info("set_weights on chain successfully!") else: - bt.logging.debug( - "Failed to set weights this iteration with message:", msg - ) + bt.logging.debug("Failed to set weights this iteration with message:", msg) def resync_metagraph(self): """Resyncs the metagraph and updates the hotkeys and moving averages based on the new metagraph.""" @@ -279,16 +270,12 @@ def resync_metagraph(self): if previous_metagraph.axons == self.metagraph.axons: return - bt.logging.info( - "Metagraph updated, re-syncing hotkeys, dendrite pool and moving averages" - ) + bt.logging.info("Metagraph updated, re-syncing hotkeys, dendrite pool and moving averages") # Zero out all hotkeys that have been replaced. for uid, hotkey in enumerate(self.hotkeys): if hotkey != self.metagraph.hotkeys[uid]: self.scores[uid] = 0 # hotkey has been replaced - self.past_predictions[uid] = full( - (self.N_TIMEPOINTS, self.N_TIMEPOINTS), nan - ) # reset past predictions + self.past_predictions[uid] = full((self.N_TIMEPOINTS, self.N_TIMEPOINTS), nan) # reset past predictions # Check to see if the metagraph has changed size. # If so, we need to add new hotkeys and moving averages. @@ -313,9 +300,7 @@ def update_scores(self, rewards: ndarray, uids: List[int]): # Compute forward pass rewards, assumes uids are mutually exclusive. # shape: [ metagraph.n ] for i, value in zip(uids, rewards): - self.moving_avg_scores[i] = (1 - self.alpha) * self.scores[ - i - ] + self.alpha * value + self.moving_avg_scores[i] = (1 - self.alpha) * self.scores[i] + self.alpha * value self.scores = array(self.moving_avg_scores) bt.logging.info(f"New Average Scores: {self.scores}") @@ -336,9 +321,7 @@ def load_state(self): bt.logging.info("Loading validator state.") state_path = os.path.join(self.config.neuron.full_path, "state.pt") if not os.path.exists(state_path): - bt.logging.info( - "Skipping state load due to missing state.pt file." - ) + bt.logging.info("Skipping state load due to missing state.pt file.") return # backwards compatability with torch version try: @@ -353,9 +336,7 @@ def load_state(self): import torch state = torch.load(state_path) - bt.logging.info( - "Found torch state.pt file, converting to pickle..." - ) + bt.logging.info("Found torch state.pt file, converting to pickle...") self.step = state["step"] self.scores = state["scores"] self.hotkeys = state["hotkeys"] diff --git a/predictionnet/utils/config.py b/predictionnet/utils/config.py index e54d0871..dd62ead5 100644 --- a/predictionnet/utils/config.py +++ b/predictionnet/utils/config.py @@ -63,9 +63,7 @@ def add_args(cls, parser): # Netuid Arg: The netuid of the subnet to connect to. parser.add_argument("--netuid", type=int, help="Subnet netuid", default=1) - neuron_type = ( - "validator" if "miner" not in cls.__name__.lower() else "miner" - ) + neuron_type = "validator" if "miner" not in cls.__name__.lower() else "miner" # MINER AND VALIDATOR CONFIG parser.add_argument( diff --git a/predictionnet/utils/uids.py b/predictionnet/utils/uids.py index c1359d59..12e0a46a 100644 --- a/predictionnet/utils/uids.py +++ b/predictionnet/utils/uids.py @@ -5,9 +5,7 @@ from numpy import array, ndarray -def check_uid_availability( - metagraph: "bt.metagraph.Metagraph", uid: int, vpermit_tao_limit: int -) -> bool: +def check_uid_availability(metagraph: "bt.metagraph.Metagraph", uid: int, vpermit_tao_limit: int) -> bool: """Check if uid is available. The UID should be available if it is serving and has less than vpermit_tao_limit stake Args: metagraph (:obj: bt.metagraph.Metagraph): Metagraph object @@ -41,9 +39,7 @@ def get_random_uids(self, k: int, exclude: List[int] = None) -> ndarray: avail_uids = [] for uid in range(self.metagraph.n.item()): - uid_is_available = check_uid_availability( - self.metagraph, uid, self.config.neuron.vpermit_tao_limit - ) + uid_is_available = check_uid_availability(self.metagraph, uid, self.config.neuron.vpermit_tao_limit) uid_is_not_excluded = exclude is None or uid not in exclude if uid_is_available: diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index c9d95460..6199c326 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -49,23 +49,17 @@ async def forward(self): else: bt.logging.info("Market is closed. Sleeping for 2 minutes...") time.sleep(120) # Sleep for 5 minutes before checking again - if datetime.now(ny_timezone) - current_time_ny >= timedelta( - hours=1 - ): + if datetime.now(ny_timezone) - current_time_ny >= timedelta(hours=1): self.resync_metagraph() self.set_weights() - self.past_predictions = [ - full((self.N_TIMEPOINTS, self.N_TIMEPOINTS), nan) - ] * len(self.hotkeys) + self.past_predictions = [full((self.N_TIMEPOINTS, self.N_TIMEPOINTS), nan)] * len(self.hotkeys) current_time_ny = datetime.now(ny_timezone) # miner_uids = get_random_uids(self, k=min(self.config.neuron.sample_size, self.metagraph.n.item())) # get all uids miner_uids = [] for uid in range(len(self.metagraph.S)): - uid_is_available = check_uid_availability( - self.metagraph, uid, self.config.neuron.vpermit_tao_limit - ) + uid_is_available = check_uid_availability(self.metagraph, uid, self.config.neuron.vpermit_tao_limit) if uid_is_available: miner_uids.append(uid) @@ -105,9 +99,7 @@ async def forward(self): "miner_response": response.prediction, "miner_reward": reward, } - for miner_uid, response, reward in zip( - miner_uids, responses, rewards.tolist() - ) + for miner_uid, response, reward in zip(miner_uids, responses, rewards.tolist()) } } diff --git a/predictionnet/validator/reward.py b/predictionnet/validator/reward.py index eba204c8..23725a3c 100644 --- a/predictionnet/validator/reward.py +++ b/predictionnet/validator/reward.py @@ -77,22 +77,16 @@ def calc_raw(self, uid, response: Challenge, close_price: float): # add the timepoint before the first t from past history for each epoch past_timepoint = close_price[0:-1] past_timepoint.reverse() - before_close_vector = np.array(past_timepoint).reshape( - self.N_TIMEPOINTS, 1 - ) + before_close_vector = np.array(past_timepoint).reshape(self.N_TIMEPOINTS, 1) # take the difference between timepoints and remove the oldest prediction epoch (it is now obselete) pred_dir = before_close_vector - prediction_array[:-1, :] close_dir = before_close_vector - close_price_array correct_dirs = (close_dir >= 0) == time_shift((pred_dir >= 0)) - deltas = np.abs( - close_price_array - time_shift(prediction_array[:-1, :]) - ) + deltas = np.abs(close_price_array - time_shift(prediction_array[:-1, :])) return deltas, correct_dirs -def rank_miners_by_epoch( - deltas: np.ndarray, correct_dirs: np.ndarray -) -> np.ndarray: +def rank_miners_by_epoch(deltas: np.ndarray, correct_dirs: np.ndarray) -> np.ndarray: """ Generates the rankings for each miner (rows) first according to their correct_dirs (bool), then by deltas (float) @@ -108,9 +102,7 @@ def rank_miners_by_epoch( incorrect_deltas = np.full(deltas.shape, np.nan) incorrect_deltas[~correct_dirs] = deltas[~correct_dirs] correct_ranks = rank_columns(correct_deltas) - incorrect_ranks = rank_columns(incorrect_deltas) + np.nanmax( - correct_ranks, axis=0 - ) + incorrect_ranks = rank_columns(incorrect_deltas) + np.nanmax(correct_ranks, axis=0) all_ranks = correct_ranks all_ranks[~correct_dirs] = incorrect_ranks[~correct_dirs] return all_ranks @@ -190,20 +182,14 @@ def update_synapse(self, uid, response: Challenge) -> None: past_predictions = self.past_predictions[uid] # does not save predictions that mature after market close if ( - datetime.now(timezone("America/New_York")).replace( - hour=16, minute=5, second=0, microsecond=0 - ) + datetime.now(timezone("America/New_York")).replace(hour=16, minute=5, second=0, microsecond=0) - datetime.fromisoformat(response.timestamp) ).seconds < self.prediction_interval * 60: sec_to_market_close = ( - datetime.now(timezone("America/New_York")).replace( - hour=16, minute=0, second=0, microsecond=0 - ) + datetime.now(timezone("America/New_York")).replace(hour=16, minute=0, second=0, microsecond=0) - datetime.fromisoformat(response.timestamp) ).seconds - epochs_to_market_close = int( - (sec_to_market_close / 60) / self.prediction_interval - ) + epochs_to_market_close = int((sec_to_market_close / 60) / self.prediction_interval) prediction_vector = np.concatenate( ( np.array(response.prediction[0:epochs_to_market_close]), @@ -212,15 +198,9 @@ def update_synapse(self, uid, response: Challenge) -> None: axis=0, ) else: - prediction_vector = np.array(response.prediction).reshape( - 1, self.N_TIMEPOINTS - ) - new_past_predictions = np.concatenate( - (prediction_vector, past_predictions), axis=0 - ) - self.past_predictions[uid] = new_past_predictions[ - 0:-1, : - ] # remove the oldest epoch + prediction_vector = np.array(response.prediction).reshape(1, self.N_TIMEPOINTS) + new_past_predictions = np.concatenate((prediction_vector, past_predictions), axis=0) + self.past_predictions[uid] = new_past_predictions[0:-1, :] # remove the oldest epoch ################################################################################ @@ -245,9 +225,7 @@ def get_rewards( prediction_interval = self.prediction_interval if len(responses) == 0: bt.logging.info("Got no responses. Returning reward tensor of zeros.") - return [], np.full( - len(self.metagraph.S), 0.0 - ) # Fallback strategy: Log and return 0. + return [], np.full(len(self.metagraph.S), 0.0) # Fallback strategy: Log and return 0. # Prepare to extract close price for this timestamp ticker_symbol = "^GSPC" @@ -275,35 +253,23 @@ def get_rewards( time.sleep(15) prediction_times = [] - rounded_up_time = rounded_up_time.replace(tzinfo=None) - timedelta( - seconds=10 - ) + rounded_up_time = rounded_up_time.replace(tzinfo=None) - timedelta(seconds=10) # add an extra timepoint for dir_acc calculation for i in range(N_TIMEPOINTS + 1): - prediction_times.append( - rounded_up_time - timedelta(minutes=(i + 1) * prediction_interval) - ) + prediction_times.append(rounded_up_time - timedelta(minutes=(i + 1) * prediction_interval)) bt.logging.info(f"Prediction times: {prediction_times}") - data = yf.download( - tickers=ticker_symbol, period="5d", interval="5m", progress=False - ) - close_price = data.iloc[ - data.index.tz_localize(None).isin(prediction_times) - ]["Close"].tolist() + data = yf.download(tickers=ticker_symbol, period="5d", interval="5m", progress=False) + close_price = data.iloc[data.index.tz_localize(None).isin(prediction_times)]["Close"].tolist() if len(close_price) < (N_TIMEPOINTS + 1): # edge case where its between 9:30am and 10am close_price = data.iloc[-N_TIMEPOINTS - 1 :]["Close"].tolist() close_price_revealed = " ".join(str(price) for price in close_price) - bt.logging.info( - f"Revealing close prices for this interval: {close_price_revealed}" - ) + bt.logging.info(f"Revealing close prices for this interval: {close_price_revealed}") # Preallocate an array (nMiners x N_TIMEPOINTS x N_TIMEPOINTS) where the third dimension is t-1, t-2,...,t-N_TIMEPOINTS for past predictions raw_deltas = np.full((len(responses), N_TIMEPOINTS, N_TIMEPOINTS), np.nan) - raw_correct_dir = np.full( - (len(responses), N_TIMEPOINTS, N_TIMEPOINTS), False - ) + raw_correct_dir = np.full((len(responses), N_TIMEPOINTS, N_TIMEPOINTS), False) ranks = np.full((len(responses), N_TIMEPOINTS, N_TIMEPOINTS), np.nan) for x, response in enumerate(responses): # calc_raw also does many helpful things like shifting epoch to @@ -311,9 +277,7 @@ def get_rewards( if delta is None or correct is None: if response.prediction is None: # no response generated - bt.logging.info( - f"Netuid {x} returned no response. Setting incentive to 0" - ) + bt.logging.info(f"Netuid {x} returned no response. Setting incentive to 0") raw_deltas[x, :, :], raw_correct_dir[x, :, :] = np.nan, np.nan else: # wrong size response generated @@ -330,13 +294,9 @@ def get_rewards( # raw_deltas is now a full of the last N_TIMEPOINTS of prediction deltas, same for raw_correct_dir ranks = np.full((len(responses), N_TIMEPOINTS, N_TIMEPOINTS), np.nan) for t in range(N_TIMEPOINTS): - ranks[:, :, t] = rank_miners_by_epoch( - raw_deltas[:, :, t], raw_correct_dir[:, :, t] - ) + ranks[:, :, t] = rank_miners_by_epoch(raw_deltas[:, :, t], raw_correct_dir[:, :, t]) - incentive_ranks = ( - np.nanmean(np.nanmean(ranks, axis=2), axis=1).argsort().argsort() - ) + incentive_ranks = np.nanmean(np.nanmean(ranks, axis=2), axis=1).argsort().argsort() reward = np.exp(-0.05 * incentive_ranks) reward[incentive_ranks > 100] = 0 reward = reward / np.max(reward) diff --git a/setup.py b/setup.py index 93c8373f..4a3f3ee5 100644 --- a/setup.py +++ b/setup.py @@ -47,23 +47,15 @@ def read_requirements(path): here = path.abspath(path.dirname(__file__)) -requirements = read_requirements( - path.join(here, "requirements", "requirements.txt") -) -dev_requirements = read_requirements( - path.join(here, "requirements", "dev_requirements.txt") -) +requirements = read_requirements(path.join(here, "requirements", "requirements.txt")) +dev_requirements = read_requirements(path.join(here, "requirements", "dev_requirements.txt")) with open(path.join(here, "README.md"), encoding="utf-8") as f: long_description = f.read() # loading version from setup.py -with codecs.open( - os.path.join(here, "predictionnet/__init__.py"), encoding="utf-8" -) as init_file: - version_match = re.search( - r"^__version__ = ['\"]([^'\"]*)['\"]", init_file.read(), re.M - ) +with codecs.open(os.path.join(here, "predictionnet/__init__.py"), encoding="utf-8") as init_file: + version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", init_file.read(), re.M) version_string = version_match.group(1) setup( diff --git a/tests/helpers.py b/tests/helpers.py index c896dcd3..40f72250 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -49,12 +49,8 @@ def __init__( def __eq__(self, __o: Union[float, int, Balance]) -> bool: # True if __o \in [value - tolerance, value + tolerance] # or if value \in [__o - tolerance, __o + tolerance] - return ( - (self.value - self.tolerance) <= __o - and __o <= (self.value + self.tolerance) - ) or ( - (__o - self.tolerance) <= self.value - and self.value <= (__o + self.tolerance) + return ((self.value - self.tolerance) <= __o and __o <= (self.value + self.tolerance)) or ( + (__o - self.tolerance) <= self.value and self.value <= (__o + self.tolerance) ) @@ -76,9 +72,7 @@ def get_mock_neuron(**kwargs) -> NeuronInfo: placeholder1=0, placeholder2=0, ), - "prometheus_info": PrometheusInfo( - block=0, version=1, ip=0, port=0, ip_type=0 - ), + "prometheus_info": PrometheusInfo(block=0, version=1, ip=0, port=0, ip_type=0), "validator_permit": True, "uid": 1, "hotkey": "some_hotkey", @@ -116,12 +110,7 @@ def get_mock_neuron(**kwargs) -> NeuronInfo: def get_mock_neuron_by_uid(uid: int, **kwargs) -> NeuronInfo: - return get_mock_neuron( - uid=uid, - hotkey=_get_mock_hotkey(uid), - coldkey=_get_mock_coldkey(uid), - **kwargs - ) + return get_mock_neuron(uid=uid, hotkey=_get_mock_hotkey(uid), coldkey=_get_mock_coldkey(uid), **kwargs) class MockStatus: @@ -153,9 +142,7 @@ def status(self, *args, **kwargs): return MockStatus() def print(self, *args, **kwargs): - console = Console( - width=1000, no_color=True, markup=False - ) # set width to 1000 to avoid truncation + console = Console(width=1000, no_color=True, markup=False) # set width to 1000 to avoid truncation console.begin_capture() console.print(*args, **kwargs) self.captured_print = console.end_capture() diff --git a/tests/test_template_validator.py b/tests/test_template_validator.py index b20e5236..14492e5e 100644 --- a/tests/test_template_validator.py +++ b/tests/test_template_validator.py @@ -64,9 +64,7 @@ def test_dummy_responses(self): responses = self.neuron.dendrite.query( # Send the query to miners in the network. - axons=[ - self.neuron.metagraph.axons[uid] for uid in self.miner_uids - ], + axons=[self.neuron.metagraph.axons[uid] for uid in self.miner_uids], # Construct a dummy query. synapse=Dummy(dummy_input=self.neuron.step), # All responses have the deserialize function called on them before returning. From b7c00dbfdc1329bc023ccf57c40ff14a948f99be Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 1 Nov 2024 14:08:37 -0400 Subject: [PATCH 022/201] Update release notes --- docs/Release Notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Release Notes.md b/docs/Release Notes.md index d7380580..2c587999 100644 --- a/docs/Release Notes.md +++ b/docs/Release Notes.md @@ -6,6 +6,7 @@ Release Notes Released on - Reduce dependencies required to deploy miners and validators - Move top level files to sensible locations +- Enahnce README with badges and other cosmetic updates 2.2.1 From 4eebe21ab736a4f20c8fbd8fe6b6e17ddb98813d Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Mon, 4 Nov 2024 14:00:03 -0500 Subject: [PATCH 023/201] Remove links and center the badge table --- README.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index abdd6736..fb24b5ab 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,7 @@ # **Foundry S&P 500 Oracle** ---- ---- ---- -## Foundry Accelerate -[Website](https://foundrydigital.com/accelerate/) • [Validator](https://taostats.io/validators/foundry/) • [Twitter](https://x.com/FoundryServices?s=20) - | | | | :-: | :-: | @@ -17,7 +11,11 @@ | Compatability | ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.python&logo=python&label=Python&logoColor=yellow) ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.bittensor&prefix=v&label=Bittensor)
![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.tensorflow&prefix=v&logo=tensorflow&label=TensorFlow) ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.yfinance&prefix=v&label=yfinance) | | Social | [![Website](https://img.shields.io/website?url=https%3A%2F%2Ffoundrydigital.com%2Faccelerate%2F&up_message=Foundry%20Accelerate&label=Website)](https://foundrydigital.com/accelerate/) [![Website](https://img.shields.io/website?url=https%3A%2F%2Ftaostats.io%2Fvalidators%2Ffoundry%2F&up_message=Foundry%20Accelerate&label=Validator)](https://taostats.io/validators/5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2) [![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/FoundryServices)](https://x.com/FoundryServices?s=20) | + + + --- + - [Introduction](#introduction) - [Design Decisions](#design-decisions) - [Installation](#installation) From 348373666f2f7d8003c1ad8c14775a44863319a4 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Mon, 4 Nov 2024 14:01:17 -0500 Subject: [PATCH 024/201] Increase table font size --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fb24b5ab..dd1d3ed8 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ # **Foundry S&P 500 Oracle** +
| | | | :-: | :-: | @@ -11,7 +12,7 @@ | Compatability | ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.python&logo=python&label=Python&logoColor=yellow) ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.bittensor&prefix=v&label=Bittensor)
![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.tensorflow&prefix=v&logo=tensorflow&label=TensorFlow) ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.yfinance&prefix=v&label=yfinance) | | Social | [![Website](https://img.shields.io/website?url=https%3A%2F%2Ffoundrydigital.com%2Faccelerate%2F&up_message=Foundry%20Accelerate&label=Website)](https://foundrydigital.com/accelerate/) [![Website](https://img.shields.io/website?url=https%3A%2F%2Ftaostats.io%2Fvalidators%2Ffoundry%2F&up_message=Foundry%20Accelerate&label=Validator)](https://taostats.io/validators/5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2) [![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/FoundryServices)](https://x.com/FoundryServices?s=20) | - +
--- From aa40ace8be2865d04ca2a7ac0f5c91399a4dc6dd Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Mon, 4 Nov 2024 14:02:57 -0500 Subject: [PATCH 025/201] Display one social link per line --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dd1d3ed8..284a9934 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ | Status | ![GitHub Release](https://img.shields.io/github/v/release/foundryservices/snpOracle?label=Release) ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/foundryservices/snpOracle/ci.yml?label=Build)
[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&label=Pre-Commit)](https://github.com/pre-commit/pre-commit) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg?label=Code%20Style)](https://github.com/psf/black)
![GitHub License](https://img.shields.io/github/license/foundryservices/snpOracle?label=License) | | Activity | ![GitHub commit activity](https://img.shields.io/github/commit-activity/m/foundryservices/snpOracle?label=Commit%20Activity) ![GitHub commits since latest release (branch)](https://img.shields.io/github/commits-since/foundryservices/snpOracle/latest/dev?label=Commits%20Since%20Latest%20Release)
![GitHub Release Date](https://img.shields.io/github/release-date/foundryservices/snpOracle?label=Latest%20Release%20Date) ![GitHub last commit (branch)](https://img.shields.io/github/last-commit/foundryservices/snpOracle/dev?label=Last%20Commit)
![GitHub contributors](https://img.shields.io/github/contributors/foundryservices/snpOracle?label=Contributors) | | Compatability | ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.python&logo=python&label=Python&logoColor=yellow) ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.bittensor&prefix=v&label=Bittensor)
![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.tensorflow&prefix=v&logo=tensorflow&label=TensorFlow) ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.yfinance&prefix=v&label=yfinance) | -| Social | [![Website](https://img.shields.io/website?url=https%3A%2F%2Ffoundrydigital.com%2Faccelerate%2F&up_message=Foundry%20Accelerate&label=Website)](https://foundrydigital.com/accelerate/) [![Website](https://img.shields.io/website?url=https%3A%2F%2Ftaostats.io%2Fvalidators%2Ffoundry%2F&up_message=Foundry%20Accelerate&label=Validator)](https://taostats.io/validators/5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2) [![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/FoundryServices)](https://x.com/FoundryServices?s=20) | +| Social | [![Website](https://img.shields.io/website?url=https%3A%2F%2Ffoundrydigital.com%2Faccelerate%2F&up_message=Foundry%20Accelerate&label=Website)](https://foundrydigital.com/accelerate/)
[![Website](https://img.shields.io/website?url=https%3A%2F%2Ftaostats.io%2Fvalidators%2Ffoundry%2F&up_message=Foundry%20Accelerate&label=Validator)](https://taostats.io/validators/5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2)
[![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/FoundryServices)](https://x.com/FoundryServices?s=20) | From c5e30880dfd8e831fbd064cd938db80ecc319627 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Mon, 4 Nov 2024 14:40:02 -0500 Subject: [PATCH 026/201] Make badge text larger --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 284a9934..e701ac81 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,14 @@ # **Foundry S&P 500 Oracle** -
+
| | | | :-: | :-: | -| Status | ![GitHub Release](https://img.shields.io/github/v/release/foundryservices/snpOracle?label=Release) ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/foundryservices/snpOracle/ci.yml?label=Build)
[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&label=Pre-Commit)](https://github.com/pre-commit/pre-commit) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg?label=Code%20Style)](https://github.com/psf/black)
![GitHub License](https://img.shields.io/github/license/foundryservices/snpOracle?label=License) | -| Activity | ![GitHub commit activity](https://img.shields.io/github/commit-activity/m/foundryservices/snpOracle?label=Commit%20Activity) ![GitHub commits since latest release (branch)](https://img.shields.io/github/commits-since/foundryservices/snpOracle/latest/dev?label=Commits%20Since%20Latest%20Release)
![GitHub Release Date](https://img.shields.io/github/release-date/foundryservices/snpOracle?label=Latest%20Release%20Date) ![GitHub last commit (branch)](https://img.shields.io/github/last-commit/foundryservices/snpOracle/dev?label=Last%20Commit)
![GitHub contributors](https://img.shields.io/github/contributors/foundryservices/snpOracle?label=Contributors) | -| Compatability | ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.python&logo=python&label=Python&logoColor=yellow) ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.bittensor&prefix=v&label=Bittensor)
![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.tensorflow&prefix=v&logo=tensorflow&label=TensorFlow) ![Dynamic TOML Badge](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffoundryservices%2FsnpOracle%2Frefs%2Fheads%2F234-readme-badges%2Fpyproject.toml&query=%24.tool.poetry.dependencies.yfinance&prefix=v&label=yfinance) | -| Social | [![Website](https://img.shields.io/website?url=https%3A%2F%2Ffoundrydigital.com%2Faccelerate%2F&up_message=Foundry%20Accelerate&label=Website)](https://foundrydigital.com/accelerate/)
[![Website](https://img.shields.io/website?url=https%3A%2F%2Ftaostats.io%2Fvalidators%2Ffoundry%2F&up_message=Foundry%20Accelerate&label=Validator)](https://taostats.io/validators/5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2)
[![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/FoundryServices)](https://x.com/FoundryServices?s=20) | +| Status |

| +| Activity |

| +| Compatability |
| +| Social | |
From e8138fb9c6d4a54196cbfae57c2eb47a72bc6c66 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Mon, 4 Nov 2024 14:41:34 -0500 Subject: [PATCH 027/201] Make row headers larger --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e701ac81..855f2e28 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ # **Foundry S&P 500 Oracle** -
+
| | | | :-: | :-: | From a89a642496bbbde4ae748fcc81cf46ce0ded7723 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Mon, 4 Nov 2024 14:42:25 -0500 Subject: [PATCH 028/201] Make row headers larger --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 855f2e28..dc656126 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ # **Foundry S&P 500 Oracle** -
+
| | | | :-: | :-: | From ae8e043f27537d4b5952a97f4086867ad9d11217 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Mon, 4 Nov 2024 14:46:11 -0500 Subject: [PATCH 029/201] Make row headers larger yet again, last attempts were not working --- README.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index dc656126..c97050ef 100644 --- a/README.md +++ b/README.md @@ -3,16 +3,13 @@ # **Foundry S&P 500 Oracle** -
- | | | | :-: | :-: | -| Status |

| -| Activity |

| -| Compatability |
| -| Social | | +|
Status
|

| +|
Activity
|

| +|
Compatability
|
| +|
Social
|

| -
--- From bddd5df47cada6fdb6a1ef033c6888a599ac570d Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Mon, 4 Nov 2024 14:47:02 -0500 Subject: [PATCH 030/201] Make row headers larger yet again, last attempts were not working --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c97050ef..8250274b 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,10 @@ | | | | :-: | :-: | -|
Status
|

| -|
Activity
|

| -|
Compatability
|
| -|
Social
|

| +|
Status
|

| +|
Activity
|

| +|
Compatability
|
| +|
Social
|

|
From 9201b5a9905ef1768a3c987856cdfe617fc69bfb Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Mon, 4 Nov 2024 14:59:17 -0500 Subject: [PATCH 031/201] Bold row headers and shrink badges --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8250274b..1c7f0c5c 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,11 @@ | | | | :-: | :-: | -|
Status
|

| -|
Activity
|

| -|
Compatability
|
| -|
Social
|

| +| **Status** |

| +| **Activity** |

| +| **Compatability** |
| +| **Social** |

| +
From 49017a4e9e390e59eeb47dae44ded18099ad50e8 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 7 Nov 2024 15:57:38 -0500 Subject: [PATCH 032/201] Point compatibility badges at dev branch --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1c7f0c5c..ff9c3efb 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ | :-: | :-: | | **Status** |

| | **Activity** |

| -| **Compatability** |
| +| **Compatibility** |
| | **Social** |

| From c26168ca82e5806acf36105c9161ebf7fc4c0733 Mon Sep 17 00:00:00 2001 From: hscott Date: Mon, 2 Dec 2024 13:56:47 -0500 Subject: [PATCH 033/201] added huggingface utils file --- predictionnet/protocol.py | 14 ++++++++++++++ predictionnet/utils/huggingface.py | 23 +++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 predictionnet/utils/huggingface.py diff --git a/predictionnet/protocol.py b/predictionnet/protocol.py index 9a3c318d..f1827103 100644 --- a/predictionnet/protocol.py +++ b/predictionnet/protocol.py @@ -53,6 +53,20 @@ class Challenge(bt.Synapse): - dummy_output: An optional integer value which, when filled, represents the response from the miner. """ + repo_id: str = pydantic.Field( + ..., + title="Storage repository of the model", + description="", + default=None, + ) + + model_id: str = pydantic.Field( + ..., + title="Which model to use", + description="", + default=None, + ) + # Required request input, filled by sending dendrite caller. timestamp: str = pydantic.Field( ..., diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py new file mode 100644 index 00000000..a0029e02 --- /dev/null +++ b/predictionnet/utils/huggingface.py @@ -0,0 +1,23 @@ +from huggingface_hub import HfApi, model_info + +api = HfApi() +models = api.get_collection(collection_slug="foundryservices/oracle-674df1e1ba06279e786a0e37") + + +class HF_interface: + def __init__(self): + self.api = HfApi() + + def get_models(self, collection_slug): + collection = api.get_collection(collection_slug=collection_slug) + return collection + + def check_model_exists(self, repo_id, model_id): + try: + # Combine repo_id and model_id + full_model_id = f"{repo_id}/{model_id}" + # Fetch model information + model_info(full_model_id) + return True + except Exception: + return False From 97788d71c219cfb777a84fd18b8ee2e873003101 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 2 Dec 2024 14:04:02 -0500 Subject: [PATCH 034/201] update title and description --- predictionnet/protocol.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/predictionnet/protocol.py b/predictionnet/protocol.py index f1827103..1bda99cb 100644 --- a/predictionnet/protocol.py +++ b/predictionnet/protocol.py @@ -55,15 +55,15 @@ class Challenge(bt.Synapse): repo_id: str = pydantic.Field( ..., - title="Storage repository of the model", - description="", + title="Repo ID", + description="Storage repository of the model", default=None, ) model_id: str = pydantic.Field( ..., - title="Which model to use", - description="", + title="Model ID", + description="Which model to use", default=None, ) From 89640f7aa5914d7782ca79b6ca5f1792ec1d64fe Mon Sep 17 00:00:00 2001 From: hscott Date: Mon, 2 Dec 2024 14:54:05 -0500 Subject: [PATCH 035/201] changed hf functions to class object --- predictionnet/utils/huggingface.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index a0029e02..aa0ba20f 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -1,15 +1,14 @@ from huggingface_hub import HfApi, model_info -api = HfApi() -models = api.get_collection(collection_slug="foundryservices/oracle-674df1e1ba06279e786a0e37") - class HF_interface: def __init__(self): self.api = HfApi() + self.collection_slug = "foundryservices/oracle-674df1e1ba06279e786a0e37" + self.collection = self.get_models() - def get_models(self, collection_slug): - collection = api.get_collection(collection_slug=collection_slug) + def get_models(self): + collection = self.api.get_collection(collection_slug=self.collection_slug) return collection def check_model_exists(self, repo_id, model_id): @@ -21,3 +20,19 @@ def check_model_exists(self, repo_id, model_id): return True except Exception: return False + + def add_model_to_collection(self, repo_id, model_id): + self.api.add_collection_item( + collection_slug=self.collection_slug, + item_id=f"{repo_id}/{model_id}", + item_type="model", + exists_ok=True, + ) + + def update_collection(self, models): + id_list = [x.item_id for x in self.collection.items] + for model in models: + if model.item_id not in id_list: + self.add_model_to_collection( + collection_slug=self.collection_slug, repo_id=model.repo_id, model_id=model.model_id + ) From 206190710782e218c1aea15b94de4082c014476d Mon Sep 17 00:00:00 2001 From: root Date: Mon, 2 Dec 2024 15:05:37 -0500 Subject: [PATCH 036/201] Created miner_hf, a util file for miner huggingface functions. Created upload model functionality --- predictionnet/utils/miner_hf.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 predictionnet/utils/miner_hf.py diff --git a/predictionnet/utils/miner_hf.py b/predictionnet/utils/miner_hf.py new file mode 100644 index 00000000..f74a1302 --- /dev/null +++ b/predictionnet/utils/miner_hf.py @@ -0,0 +1,32 @@ +from huggingface_hub import HfApi, model_info, metadata_update +from dotenv import load_dotenv +import os +import time + +class Miner_HF_interface: + def __init__(self): + load_dotenv() + self.api = HfApi(token=os.getenv("MINER_HF_ACCESS_TOKEN")) + + def upload_model(self, repo_id, model_path, hotkey): + if not all([repo_id, model_path, hotkey]): + raise ValueError("All parameters (repo_id, model_path, hotkey) must be specified") + + try: + timestamp = str(int(time.time())) + self.api.upload_file( + path_or_fileobj=model_path, + path_in_repo="model.safetensors", + repo_id=repo_id, + repo_type="model" + ) + + metadata = { + "hotkey": hotkey, + "timestamp": timestamp + } + metadata_update(repo_id, metadata) + return True, {"hotkey": hotkey, "timestamp": timestamp} + + except Exception as e: + return False, str(e) From 4e83b6fa429258d3a11fc3fc96a2092502647c4f Mon Sep 17 00:00:00 2001 From: root Date: Mon, 2 Dec 2024 15:45:48 -0500 Subject: [PATCH 037/201] add repo if it doesn't already exist in miner_hf.py --- predictionnet/utils/miner_hf.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/predictionnet/utils/miner_hf.py b/predictionnet/utils/miner_hf.py index f74a1302..1ed5a1fa 100644 --- a/predictionnet/utils/miner_hf.py +++ b/predictionnet/utils/miner_hf.py @@ -11,8 +11,13 @@ def __init__(self): def upload_model(self, repo_id, model_path, hotkey): if not all([repo_id, model_path, hotkey]): raise ValueError("All parameters (repo_id, model_path, hotkey) must be specified") - + try: + try: + model_info(repo_id) + except: + self.api.create_repo(repo_id=repo_id, private=False) + timestamp = str(int(time.time())) self.api.upload_file( path_or_fileobj=model_path, @@ -30,3 +35,14 @@ def upload_model(self, repo_id, model_path, hotkey): except Exception as e: return False, str(e) + + def get_model_metadata(self, repo_id): + try: + model = model_info(repo_id) + metadata = model.cardData + return { + "hotkey": metadata.get("hotkey"), + "timestamp": metadata.get("timestamp") + } + except Exception as e: + return False, str(e) From 2d0820ded47c486eb0c32efebe7d531daf7feec8 Mon Sep 17 00:00:00 2001 From: hscott Date: Tue, 3 Dec 2024 09:07:39 -0500 Subject: [PATCH 038/201] added hotkey comparison code --- predictionnet/utils/huggingface.py | 33 +++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index aa0ba20f..abf54c5e 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -1,9 +1,11 @@ +import os + from huggingface_hub import HfApi, model_info class HF_interface: def __init__(self): - self.api = HfApi() + self.api = HfApi(token=os.getenv("MINER_HF_ACCESS_TOKEN")) self.collection_slug = "foundryservices/oracle-674df1e1ba06279e786a0e37" self.collection = self.get_models() @@ -18,8 +20,8 @@ def check_model_exists(self, repo_id, model_id): # Fetch model information model_info(full_model_id) return True - except Exception: - return False + except Exception as e: + return False, str(e) def add_model_to_collection(self, repo_id, model_id): self.api.add_collection_item( @@ -36,3 +38,28 @@ def update_collection(self, models): self.add_model_to_collection( collection_slug=self.collection_slug, repo_id=model.repo_id, model_id=model.model_id ) + + def hotkeys_match(self, synapse, model_id, repo_id) -> bool: + synapse_hotkey = synapse.TerminalInfo.hotkey + model_metadata = get_model_metadata(repo_id, model_id) + if model_metadata: + model_hotkey = model_metadata.get("hotkey") + if synapse_hotkey == model_hotkey: + return True + else: + return False + else: + return False + + +def get_model_metadata(repo_id, model_id): + try: + model = model_info(f"{repo_id}/{model_id}") + metadata = model.cardData + if metadata is None: + hotkey = None + else: + hotkey = metadata.get("hotkey") + return {"hotkey": hotkey, "timestamp": model.created_at} + except Exception as e: + return False, str(e) From 770746914b4295d124c37cd32483ad6c026d362f Mon Sep 17 00:00:00 2001 From: hscott Date: Tue, 3 Dec 2024 10:27:08 -0500 Subject: [PATCH 039/201] edited validator and forward to check hotkey matches --- neurons/validator.py | 9 +++++++++ predictionnet/utils/huggingface.py | 27 ++++++++++++++++++--------- predictionnet/validator/forward.py | 3 ++- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/neurons/validator.py b/neurons/validator.py index 14810d7e..fc671eee 100644 --- a/neurons/validator.py +++ b/neurons/validator.py @@ -32,6 +32,7 @@ # import base validator class which takes care of most of the boilerplate from predictionnet.base.validator import BaseValidatorNeuron +from predictionnet.utils.huggingface import HF_interface from predictionnet.utils.uids import check_uid_availability # Bittensor Validator Template: @@ -56,6 +57,7 @@ def __init__(self, config=None): self.N_TIMEPOINTS = 6 # number of timepoints to predict self.INTERVAL = self.prediction_interval * self.N_TIMEPOINTS # 30 Minutes self.past_predictions = {} + self.hf_interface = HF_interface() for uid in range(len(self.metagraph.S)): uid_is_available = check_uid_availability(self.metagraph, uid, self.config.neuron.vpermit_tao_limit) if uid_is_available: @@ -137,6 +139,13 @@ async def forward(self): # TODO(developer): Rewrite this function based on your protocol definition. return await forward(self) + def confirm_models(self, responses, miner_uids): + models_confirmed = [] + self.hf_interface.update_collection(responses) + for response in responses: + models_confirmed.append(self.hf_interface.hotkeys_match(response)) + return models_confirmed + def print_info(self): metagraph = self.metagraph self.uid = self.metagraph.hotkeys.index(self.wallet.hotkey.ss58_address) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index abf54c5e..a8f12edf 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -1,11 +1,19 @@ import os +from typing import List from huggingface_hub import HfApi, model_info +from predictionnet.protocol import Challenge + class HF_interface: def __init__(self): - self.api = HfApi(token=os.getenv("MINER_HF_ACCESS_TOKEN")) + token = os.getenv("HF_ACCESS_TOKEN") + if token is None: + raise ValueError( + "Huggingface access token not found in environment variables, set it as 'HF_ACCESS_TOKEN'." + ) + self.api = HfApi(token=token) self.collection_slug = "foundryservices/oracle-674df1e1ba06279e786a0e37" self.collection = self.get_models() @@ -13,7 +21,7 @@ def get_models(self): collection = self.api.get_collection(collection_slug=self.collection_slug) return collection - def check_model_exists(self, repo_id, model_id): + def check_model_exists(self, repo_id, model_id) -> bool: try: # Combine repo_id and model_id full_model_id = f"{repo_id}/{model_id}" @@ -23,7 +31,7 @@ def check_model_exists(self, repo_id, model_id): except Exception as e: return False, str(e) - def add_model_to_collection(self, repo_id, model_id): + def add_model_to_collection(self, repo_id, model_id) -> None: self.api.add_collection_item( collection_slug=self.collection_slug, item_id=f"{repo_id}/{model_id}", @@ -31,17 +39,18 @@ def add_model_to_collection(self, repo_id, model_id): exists_ok=True, ) - def update_collection(self, models): + def update_collection(self, responses: List[Challenge]) -> None: id_list = [x.item_id for x in self.collection.items] - for model in models: - if model.item_id not in id_list: + for response in responses: + if f"{response.repo_id}/{response.model_id}" not in id_list: self.add_model_to_collection( - collection_slug=self.collection_slug, repo_id=model.repo_id, model_id=model.model_id + collection_slug=self.collection_slug, repo_id=response.repo_id, model_id=response.model_id ) + self.collection = self.get_models() - def hotkeys_match(self, synapse, model_id, repo_id) -> bool: + def hotkeys_match(self, synapse) -> bool: synapse_hotkey = synapse.TerminalInfo.hotkey - model_metadata = get_model_metadata(repo_id, model_id) + model_metadata = get_model_metadata(synapse.repo_id, synapse.model_id) if model_metadata: model_hotkey = model_metadata.get("hotkey") if synapse_hotkey == model_hotkey: diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 6199c326..2143c248 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -108,6 +108,7 @@ async def forward(self): # Potentially will need some bt.logging.info(f"Scored responses: {rewards}") # Update the scores based on the rewards. You may want to define your own update_scores function for custom behavior. - + models_confirmed = self.confirm_models(responses, miner_uids) + rewards = [0 if not b else v for v, b in zip(rewards, models_confirmed)] # Check base validator file self.update_scores(rewards, miner_uids) From bb816c0f700588b823220bad47435bd7636d7e67 Mon Sep 17 00:00:00 2001 From: hscott Date: Tue, 3 Dec 2024 10:29:06 -0500 Subject: [PATCH 040/201] removed unused miner_uids from hotkey confirmation --- neurons/validator.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/neurons/validator.py b/neurons/validator.py index fc671eee..348058d3 100644 --- a/neurons/validator.py +++ b/neurons/validator.py @@ -19,6 +19,7 @@ import pathlib import time from datetime import datetime +from typing import List # Bittensor import bittensor as bt @@ -139,7 +140,7 @@ async def forward(self): # TODO(developer): Rewrite this function based on your protocol definition. return await forward(self) - def confirm_models(self, responses, miner_uids): + def confirm_models(self, responses) -> List[bool]: models_confirmed = [] self.hf_interface.update_collection(responses) for response in responses: From 0034438cb1bf87e43c3729561e494a526630d657 Mon Sep 17 00:00:00 2001 From: hscott Date: Tue, 3 Dec 2024 10:41:15 -0500 Subject: [PATCH 041/201] removed unused miner_uids from hotkey confirmation --- predictionnet/validator/forward.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 2143c248..e7294f40 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -108,7 +108,7 @@ async def forward(self): # Potentially will need some bt.logging.info(f"Scored responses: {rewards}") # Update the scores based on the rewards. You may want to define your own update_scores function for custom behavior. - models_confirmed = self.confirm_models(responses, miner_uids) + models_confirmed = self.confirm_models(responses) rewards = [0 if not b else v for v, b in zip(rewards, models_confirmed)] # Check base validator file self.update_scores(rewards, miner_uids) From 17431fe3b81a935ec88c11da0c868ab72311ef57 Mon Sep 17 00:00:00 2001 From: hscott Date: Tue, 3 Dec 2024 11:55:33 -0500 Subject: [PATCH 042/201] added commit timestamp function --- predictionnet/utils/huggingface.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index a8f12edf..b09d731c 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -50,7 +50,7 @@ def update_collection(self, responses: List[Challenge]) -> None: def hotkeys_match(self, synapse) -> bool: synapse_hotkey = synapse.TerminalInfo.hotkey - model_metadata = get_model_metadata(synapse.repo_id, synapse.model_id) + model_metadata = self.get_model_metadata(synapse.repo_id, synapse.model_id) if model_metadata: model_hotkey = model_metadata.get("hotkey") if synapse_hotkey == model_hotkey: @@ -60,15 +60,19 @@ def hotkeys_match(self, synapse) -> bool: else: return False + def get_model_timestamp(self, repo_id, model_id): + commits = self.api.list_repo_commits(repo_id=f"{repo_id}/{model_id}", repo_type="model") + initial_commit = commits[-1] + return initial_commit.created_at -def get_model_metadata(repo_id, model_id): - try: - model = model_info(f"{repo_id}/{model_id}") - metadata = model.cardData - if metadata is None: - hotkey = None - else: - hotkey = metadata.get("hotkey") - return {"hotkey": hotkey, "timestamp": model.created_at} - except Exception as e: - return False, str(e) + def get_model_metadata(self, repo_id, model_id): + try: + model = model_info(f"{repo_id}/{model_id}") + metadata = model.cardData + if metadata is None: + hotkey = None + else: + hotkey = metadata.get("hotkey") + return {"hotkey": hotkey, "timestamp": self.get_model_timestamp(repo_id, model_id)} + except Exception as e: + return False, str(e) From b9b8d9e12424de8e09babbf36edbaa16c8c82a64 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 3 Dec 2024 12:07:19 -0500 Subject: [PATCH 043/201] updated miner_hf to support multiple model uploads to the same repo --- predictionnet/utils/miner_hf.py | 74 ++++++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 14 deletions(-) diff --git a/predictionnet/utils/miner_hf.py b/predictionnet/utils/miner_hf.py index 1ed5a1fa..5944f651 100644 --- a/predictionnet/utils/miner_hf.py +++ b/predictionnet/utils/miner_hf.py @@ -1,48 +1,94 @@ from huggingface_hub import HfApi, model_info, metadata_update from dotenv import load_dotenv import os -import time +import bittensor as bt class Miner_HF_interface: - def __init__(self): + def __init__(self, config: "bt.Config"): load_dotenv() self.api = HfApi(token=os.getenv("MINER_HF_ACCESS_TOKEN")) + self.config = config + + print(f"Initializing with config: model={config.model}, repo_id={config.hf_repo_id}") + + if not hasattr(self.config, 'model') or not hasattr(self.config, 'hf_repo_id'): + raise ValueError("Config must include 'model' and 'hf_repo_id' parameters") + + def upload_model(self, repo_id=None, model_path=None, hotkey=None): + repo_id = repo_id or self.config.hf_repo_id + model_path = model_path or self.config.model + + print(f"Trying to upload model: repo_id={repo_id}, model_path={model_path}, hotkey={hotkey}") - def upload_model(self, repo_id, model_path, hotkey): if not all([repo_id, model_path, hotkey]): - raise ValueError("All parameters (repo_id, model_path, hotkey) must be specified") + raise ValueError("All parameters (repo_id, model_path, hotkey) must be specified either in config or method call") try: + model_name = os.path.basename(model_path) + try: - model_info(repo_id) + print(f"Checking if repo exists: {repo_id}") + model = model_info(repo_id) + + # Check if model file already exists + print("Checking if model already exists...") + files = self.api.list_repo_files(repo_id=repo_id, repo_type="model") + if model_name in files: + print(f"Model {model_name} already exists, skipping upload") + metadata = { + "hotkey": hotkey, + } + return True, metadata + except: + print("Repo doesn't exist, creating new one") self.api.create_repo(repo_id=repo_id, private=False) - - timestamp = str(int(time.time())) + + print(f"Uploading file: {model_name}") self.api.upload_file( path_or_fileobj=model_path, - path_in_repo="model.safetensors", + path_in_repo=model_name, repo_id=repo_id, repo_type="model" ) metadata = { "hotkey": hotkey, - "timestamp": timestamp } + print(f"Updating metadata: {metadata}") metadata_update(repo_id, metadata) - return True, {"hotkey": hotkey, "timestamp": timestamp} + return True, metadata except Exception as e: + print(f"Error in upload_model: {str(e)}") return False, str(e) - def get_model_metadata(self, repo_id): + def get_model_metadata(self, repo_id=None): + repo_id = repo_id or self.config.hf_repo_id + print(f"Getting metadata for repo: {repo_id}") + try: + print("Getting model info...") model = model_info(repo_id) metadata = model.cardData - return { + print(f"Model metadata: {metadata}") + + print("Getting commits...") + commits = self.api.list_repo_commits(repo_id=repo_id, repo_type="model") + if not commits: + raise ValueError("No commits found in repository") + + print(f"Found {len(commits)} commits") + latest_commit = commits[0] + print(f"Latest commit: {latest_commit}") + print(f"Latest commit date: {latest_commit.created_at}") + + result = { "hotkey": metadata.get("hotkey"), - "timestamp": metadata.get("timestamp") + "timestamp": latest_commit.created_at.timestamp(), } + return result + except Exception as e: - return False, str(e) + print(f"Error in get_model_metadata: {str(e)}") + return False, str(e) \ No newline at end of file From c2b1e0dc44db9a31fa348569caebe05365d5734b Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 4 Dec 2024 10:17:21 -0500 Subject: [PATCH 044/201] collection slug to environment variables --- predictionnet/utils/huggingface.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index b09d731c..7adcb61e 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -13,24 +13,19 @@ def __init__(self): raise ValueError( "Huggingface access token not found in environment variables, set it as 'HF_ACCESS_TOKEN'." ) + collection_slug = os.getenv("HF_COLLECTION_SLUG") + if collection_slug is None: + raise ValueError( + "Huggingface collection slug not found in environment variables, set it as 'HF_COLLECTION_SLUG'." + ) self.api = HfApi(token=token) - self.collection_slug = "foundryservices/oracle-674df1e1ba06279e786a0e37" + self.collection_slug = collection_slug self.collection = self.get_models() def get_models(self): collection = self.api.get_collection(collection_slug=self.collection_slug) return collection - def check_model_exists(self, repo_id, model_id) -> bool: - try: - # Combine repo_id and model_id - full_model_id = f"{repo_id}/{model_id}" - # Fetch model information - model_info(full_model_id) - return True - except Exception as e: - return False, str(e) - def add_model_to_collection(self, repo_id, model_id) -> None: self.api.add_collection_item( collection_slug=self.collection_slug, From 8ed158c447a3a6b21458e31466d892477240822f Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 4 Dec 2024 10:24:05 -0500 Subject: [PATCH 045/201] fixed default values in protocol.py --- predictionnet/protocol.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/predictionnet/protocol.py b/predictionnet/protocol.py index 1bda99cb..ddecc7dc 100644 --- a/predictionnet/protocol.py +++ b/predictionnet/protocol.py @@ -54,17 +54,15 @@ class Challenge(bt.Synapse): """ repo_id: str = pydantic.Field( - ..., + default=None, title="Repo ID", description="Storage repository of the model", - default=None, ) model_id: str = pydantic.Field( - ..., + default=None, title="Model ID", description="Which model to use", - default=None, ) # Required request input, filled by sending dendrite caller. From b29c68dc502c90064a60df382415ab4f76b48e41 Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 4 Dec 2024 10:25:17 -0500 Subject: [PATCH 046/201] removed old reference to subnet_links.json --- predictionnet/__init__.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/predictionnet/__init__.py b/predictionnet/__init__.py index cede0dca..c281de37 100644 --- a/predictionnet/__init__.py +++ b/predictionnet/__init__.py @@ -28,8 +28,3 @@ __version__ = "2.2.1" version_split = __version__.split(".") __spec_version__ = (1000 * int(version_split[0])) + (10 * int(version_split[1])) + (1 * int(version_split[2])) - -SUBNET_LINKS = None -with open("subnet_links.json") as f: - links_dict = json.load(f) - SUBNET_LINKS = links_dict.get("subnet_repositories", None) From fba0869a55d83a7ba4e74b300b2650c0bb61e9e8 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 4 Dec 2024 10:26:32 -0500 Subject: [PATCH 047/201] updated neurons/miner.py to include model upload on initialization. also include the repo_id and model_id in the synapse --- neurons/miner.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/neurons/miner.py b/neurons/miner.py index ebe9ab89..8a3dd759 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -37,6 +37,9 @@ # import base miner class which takes care of most of the boilerplate from predictionnet.base.miner import BaseMinerNeuron +# import huggingface upload class +from predictionnet.utils.miner_hf import Miner_HF_interface + load_dotenv() @@ -57,6 +60,20 @@ def __init__(self, config=None): if self.config.neuron.device == "cpu": os.environ["CUDA_VISIBLE_DEVICES"] = "-1" # This will force TensorFlow to use CPU only + + # Initialize HF interface and upload model + hf_interface = Miner_HF_interface(config) + success, metadata = hf_interface.upload_model( + hotkey=self.wallet.hotkey.ss58_address, + model_path=self.config.model, + repo_id=self.config.hf_repo_id + ) + + if success: + bt.logging.success(f"Model {self.config.model} uploaded successfully to {self.config.hf_repo_id}: {metadata}") + else: + bt.logging.error(f"Model {self.config.model} upload failed to {self.config.hf_repo_id}: {metadata}") + async def blacklist(self, synapse: predictionnet.protocol.Challenge) -> typing.Tuple[bool, str]: """ Determines whether an incoming request should be blacklisted and thus ignored. Your implementation should @@ -164,16 +181,18 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction ) timestamp = synapse.timestamp - # Download the file + synapse.repo_id = self.config.hf_repo_id + synapse.model_id = self.config.model + if self.config.hf_repo_id == "LOCAL": model_path = f"./{self.config.model}" bt.logging.info( f"Model weights file from a local folder will be loaded - Local weights file path: {self.config.model}" ) else: - if not os.getenv("HF_ACCESS_TOKEN"): + if not os.getenv("MINER_HF_ACCESS_TOKEN"): print("Cannot find a Huggingface Access Token - model download halted.") - token = os.getenv("HF_ACCESS_TOKEN") + token = os.getenv("MINER_HF_ACCESS_TOKEN") model_path = hf_hub_download( repo_id=self.config.hf_repo_id, filename=self.config.model, From 4a5e8e6cfb05d8566246523514f9843d11d39167 Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 4 Dec 2024 10:40:01 -0500 Subject: [PATCH 048/201] bad function variable --- predictionnet/utils/huggingface.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index 7adcb61e..bae3eab9 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -37,10 +37,9 @@ def add_model_to_collection(self, repo_id, model_id) -> None: def update_collection(self, responses: List[Challenge]) -> None: id_list = [x.item_id for x in self.collection.items] for response in responses: - if f"{response.repo_id}/{response.model_id}" not in id_list: - self.add_model_to_collection( - collection_slug=self.collection_slug, repo_id=response.repo_id, model_id=response.model_id - ) + either_none = response.repo_id is None or response.model_id is None + if f"{response.repo_id}/{response.model_id}" not in id_list and not either_none: + self.add_model_to_collection(repo_id=response.repo_id, model_id=response.model_id) self.collection = self.get_models() def hotkeys_match(self, synapse) -> bool: From a44d72980750d34e1aff4bf5fd112b7315bc625b Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 4 Dec 2024 10:49:31 -0500 Subject: [PATCH 049/201] update gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index ae396e42..6d2dc13c 100644 --- a/.gitignore +++ b/.gitignore @@ -162,3 +162,7 @@ cython_debug/ testing/ timestamp.txt + +# localnet config +miner.config.local.js +validator.config.local.js From 2c1509f844b11cb4766050e6a8ad1d5329a000fa Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 4 Dec 2024 11:01:13 -0500 Subject: [PATCH 050/201] fixed terminal info bug --- predictionnet/utils/huggingface.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index bae3eab9..b6032f4e 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -1,6 +1,7 @@ import os from typing import List +import bittensor as bt from huggingface_hub import HfApi, model_info from predictionnet.protocol import Challenge @@ -43,11 +44,13 @@ def update_collection(self, responses: List[Challenge]) -> None: self.collection = self.get_models() def hotkeys_match(self, synapse) -> bool: - synapse_hotkey = synapse.TerminalInfo.hotkey + axon_hotkey = synapse.axon.hotkey + dendrite_hotkey = synapse.dendrite.hotkey + bt.logging.info(f"axon: {axon_hotkey} | dendrite: {dendrite_hotkey}") model_metadata = self.get_model_metadata(synapse.repo_id, synapse.model_id) if model_metadata: model_hotkey = model_metadata.get("hotkey") - if synapse_hotkey == model_hotkey: + if axon_hotkey == model_hotkey: return True else: return False From 998fdcad7c049cb2d97d6e03765bec4c987f2039 Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 4 Dec 2024 11:15:52 -0500 Subject: [PATCH 051/201] synapse.axon and synapse.dendrite both contain the validators hotkey, had to manually pull from metagraph --- neurons/validator.py | 7 ++++--- predictionnet/utils/huggingface.py | 6 +++--- predictionnet/validator/forward.py | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/neurons/validator.py b/neurons/validator.py index 348058d3..e6cf657d 100644 --- a/neurons/validator.py +++ b/neurons/validator.py @@ -140,11 +140,12 @@ async def forward(self): # TODO(developer): Rewrite this function based on your protocol definition. return await forward(self) - def confirm_models(self, responses) -> List[bool]: + def confirm_models(self, responses, miner_uids) -> List[bool]: models_confirmed = [] self.hf_interface.update_collection(responses) - for response in responses: - models_confirmed.append(self.hf_interface.hotkeys_match(response)) + for response, uid in zip(responses, miner_uids): + + models_confirmed.append(self.hf_interface.hotkeys_match(response, self.metagraph.hotkeys[uid])) return models_confirmed def print_info(self): diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index b6032f4e..fb2e6e40 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -43,7 +43,7 @@ def update_collection(self, responses: List[Challenge]) -> None: self.add_model_to_collection(repo_id=response.repo_id, model_id=response.model_id) self.collection = self.get_models() - def hotkeys_match(self, synapse) -> bool: + def hotkeys_match(self, synapse, hotkey) -> bool: axon_hotkey = synapse.axon.hotkey dendrite_hotkey = synapse.dendrite.hotkey bt.logging.info(f"axon: {axon_hotkey} | dendrite: {dendrite_hotkey}") @@ -71,5 +71,5 @@ def get_model_metadata(self, repo_id, model_id): else: hotkey = metadata.get("hotkey") return {"hotkey": hotkey, "timestamp": self.get_model_timestamp(repo_id, model_id)} - except Exception as e: - return False, str(e) + except Exception: + return False diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index e7294f40..2143c248 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -108,7 +108,7 @@ async def forward(self): # Potentially will need some bt.logging.info(f"Scored responses: {rewards}") # Update the scores based on the rewards. You may want to define your own update_scores function for custom behavior. - models_confirmed = self.confirm_models(responses) + models_confirmed = self.confirm_models(responses, miner_uids) rewards = [0 if not b else v for v, b in zip(rewards, models_confirmed)] # Check base validator file self.update_scores(rewards, miner_uids) From 4ec314f4440d58d3d63950acf331689fd525a34f Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 4 Dec 2024 11:19:51 -0500 Subject: [PATCH 052/201] typo --- predictionnet/utils/huggingface.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index fb2e6e40..bf8f50f9 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -1,7 +1,6 @@ import os from typing import List -import bittensor as bt from huggingface_hub import HfApi, model_info from predictionnet.protocol import Challenge @@ -44,13 +43,10 @@ def update_collection(self, responses: List[Challenge]) -> None: self.collection = self.get_models() def hotkeys_match(self, synapse, hotkey) -> bool: - axon_hotkey = synapse.axon.hotkey - dendrite_hotkey = synapse.dendrite.hotkey - bt.logging.info(f"axon: {axon_hotkey} | dendrite: {dendrite_hotkey}") model_metadata = self.get_model_metadata(synapse.repo_id, synapse.model_id) if model_metadata: model_hotkey = model_metadata.get("hotkey") - if axon_hotkey == model_hotkey: + if hotkey == model_hotkey: return True else: return False From d82c34231f05033ff34bc58ae059dc5f53a65de4 Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 4 Dec 2024 11:45:30 -0500 Subject: [PATCH 053/201] metagraph length error --- predictionnet/base/validator.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/predictionnet/base/validator.py b/predictionnet/base/validator.py index 5575adff..899c356b 100644 --- a/predictionnet/base/validator.py +++ b/predictionnet/base/validator.py @@ -299,9 +299,10 @@ def update_scores(self, rewards: ndarray, uids: List[int]): rewards = nan_to_num(rewards, 0) # Compute forward pass rewards, assumes uids are mutually exclusive. # shape: [ metagraph.n ] + moving_avg_scores = self.scores.copy() for i, value in zip(uids, rewards): - self.moving_avg_scores[i] = (1 - self.alpha) * self.scores[i] + self.alpha * value - self.scores = array(self.moving_avg_scores) + moving_avg_scores[i] = (1 - self.alpha) * self.scores[i] + self.alpha * value + self.scores = array(moving_avg_scores) bt.logging.info(f"New Average Scores: {self.scores}") def save_state(self): From e159eb101f6143177bb500d571fd4367de06c0f0 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 4 Dec 2024 11:46:19 -0500 Subject: [PATCH 054/201] fix how config is passed into miner_hf interface --- neurons/miner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neurons/miner.py b/neurons/miner.py index 8a3dd759..85791e8b 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -62,7 +62,7 @@ def __init__(self, config=None): # Initialize HF interface and upload model - hf_interface = Miner_HF_interface(config) + hf_interface = Miner_HF_interface(self.config) success, metadata = hf_interface.upload_model( hotkey=self.wallet.hotkey.ss58_address, model_path=self.config.model, From 16e6e03430c75c360d3aff8e589975f3d7a44ed8 Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 4 Dec 2024 12:07:42 -0500 Subject: [PATCH 055/201] missalignment of score code from base template --- predictionnet/base/validator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/predictionnet/base/validator.py b/predictionnet/base/validator.py index 899c356b..0e1cb3d5 100644 --- a/predictionnet/base/validator.py +++ b/predictionnet/base/validator.py @@ -299,7 +299,7 @@ def update_scores(self, rewards: ndarray, uids: List[int]): rewards = nan_to_num(rewards, 0) # Compute forward pass rewards, assumes uids are mutually exclusive. # shape: [ metagraph.n ] - moving_avg_scores = self.scores.copy() + moving_avg_scores = full(len(self.metagraph.S), 0.0) for i, value in zip(uids, rewards): moving_avg_scores[i] = (1 - self.alpha) * self.scores[i] + self.alpha * value self.scores = array(moving_avg_scores) From beabc2577182e0efde78f643377c9991578a613a Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 4 Dec 2024 12:45:29 -0500 Subject: [PATCH 056/201] scores were being reset each time --- predictionnet/base/validator.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/predictionnet/base/validator.py b/predictionnet/base/validator.py index 0e1cb3d5..daeee265 100644 --- a/predictionnet/base/validator.py +++ b/predictionnet/base/validator.py @@ -299,10 +299,10 @@ def update_scores(self, rewards: ndarray, uids: List[int]): rewards = nan_to_num(rewards, 0) # Compute forward pass rewards, assumes uids are mutually exclusive. # shape: [ metagraph.n ] - moving_avg_scores = full(len(self.metagraph.S), 0.0) + self.moving_avg_scores = full(len(self.metagraph.S), 0.0) for i, value in zip(uids, rewards): - moving_avg_scores[i] = (1 - self.alpha) * self.scores[i] + self.alpha * value - self.scores = array(moving_avg_scores) + self.moving_avg_scores[i] = (1 - self.alpha) * self.scores[i] + self.alpha * value + self.scores = array(self.moving_avg_scores) bt.logging.info(f"New Average Scores: {self.scores}") def save_state(self): From 655c924d3e6d5040235038453aa4023eccb3f10a Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 4 Dec 2024 12:48:15 -0500 Subject: [PATCH 057/201] scores were being reset each time --- predictionnet/base/validator.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/predictionnet/base/validator.py b/predictionnet/base/validator.py index daeee265..0e81f16c 100644 --- a/predictionnet/base/validator.py +++ b/predictionnet/base/validator.py @@ -50,7 +50,7 @@ def __init__(self, config=None): # Set up initial scoring weights for validation bt.logging.info("Building validation weights.") self.scores = full(len(self.metagraph.S), 0.0) - self.moving_avg_scores = [0.0] * len(self.metagraph.S) + self.moving_avg_scores = full(len(self.metagraph.S), 0.0) self.alpha = self.config.neuron.moving_average_alpha # Load state because self.sync() will overwrite it self.load_state() @@ -299,7 +299,6 @@ def update_scores(self, rewards: ndarray, uids: List[int]): rewards = nan_to_num(rewards, 0) # Compute forward pass rewards, assumes uids are mutually exclusive. # shape: [ metagraph.n ] - self.moving_avg_scores = full(len(self.metagraph.S), 0.0) for i, value in zip(uids, rewards): self.moving_avg_scores[i] = (1 - self.alpha) * self.scores[i] + self.alpha * value self.scores = array(self.moving_avg_scores) From a6078cba6f7598cc593e285d3eeae77f2fc127fa Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 4 Dec 2024 13:01:09 -0500 Subject: [PATCH 058/201] changed moving_avg_scores to dict --- predictionnet/base/validator.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/predictionnet/base/validator.py b/predictionnet/base/validator.py index 0e81f16c..6a031eeb 100644 --- a/predictionnet/base/validator.py +++ b/predictionnet/base/validator.py @@ -50,7 +50,7 @@ def __init__(self, config=None): # Set up initial scoring weights for validation bt.logging.info("Building validation weights.") self.scores = full(len(self.metagraph.S), 0.0) - self.moving_avg_scores = full(len(self.metagraph.S), 0.0) + self.moving_average_scores = {uid: 0 for uid in self.metagraph.uids} self.alpha = self.config.neuron.moving_average_alpha # Load state because self.sync() will overwrite it self.load_state() @@ -291,7 +291,6 @@ def resync_metagraph(self): def update_scores(self, rewards: ndarray, uids: List[int]): """Performs exponential moving average on the scores based on the rewards received from the miners.""" - # Check if rewards contains NaN values. if isnan(rewards).any(): bt.logging.warning(f"NaN values detected in rewards: {rewards}") @@ -301,7 +300,7 @@ def update_scores(self, rewards: ndarray, uids: List[int]): # shape: [ metagraph.n ] for i, value in zip(uids, rewards): self.moving_avg_scores[i] = (1 - self.alpha) * self.scores[i] + self.alpha * value - self.scores = array(self.moving_avg_scores) + self.scores = array(list(self.moving_average_scores.values())) bt.logging.info(f"New Average Scores: {self.scores}") def save_state(self): From 75dd664620fa3d839eb4ace5d2116642ae09feea Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 4 Dec 2024 13:06:21 -0500 Subject: [PATCH 059/201] typo --- predictionnet/base/validator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/predictionnet/base/validator.py b/predictionnet/base/validator.py index 6a031eeb..097ab011 100644 --- a/predictionnet/base/validator.py +++ b/predictionnet/base/validator.py @@ -50,7 +50,7 @@ def __init__(self, config=None): # Set up initial scoring weights for validation bt.logging.info("Building validation weights.") self.scores = full(len(self.metagraph.S), 0.0) - self.moving_average_scores = {uid: 0 for uid in self.metagraph.uids} + self.moving_avg_scores = {uid: 0 for uid in self.metagraph.uids} self.alpha = self.config.neuron.moving_average_alpha # Load state because self.sync() will overwrite it self.load_state() From 87fd7001393d76d2b14d22bb9c39c8aca1ffa504 Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 4 Dec 2024 13:12:15 -0500 Subject: [PATCH 060/201] typo --- predictionnet/base/validator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/predictionnet/base/validator.py b/predictionnet/base/validator.py index 097ab011..0d9f7900 100644 --- a/predictionnet/base/validator.py +++ b/predictionnet/base/validator.py @@ -300,7 +300,7 @@ def update_scores(self, rewards: ndarray, uids: List[int]): # shape: [ metagraph.n ] for i, value in zip(uids, rewards): self.moving_avg_scores[i] = (1 - self.alpha) * self.scores[i] + self.alpha * value - self.scores = array(list(self.moving_average_scores.values())) + self.scores = array(list(self.moving_avg_scores.values())) bt.logging.info(f"New Average Scores: {self.scores}") def save_state(self): From 0d05c9e3542d83326ecdfe249a60bb9a75227a2c Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 5 Dec 2024 09:37:44 -0500 Subject: [PATCH 061/201] models will now be named after the hotkey that is using them in huggingface --- predictionnet/utils/miner_hf.py | 52 ++++++++++++++++----------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/predictionnet/utils/miner_hf.py b/predictionnet/utils/miner_hf.py index 5944f651..b809baa9 100644 --- a/predictionnet/utils/miner_hf.py +++ b/predictionnet/utils/miner_hf.py @@ -24,27 +24,23 @@ def upload_model(self, repo_id=None, model_path=None, hotkey=None): raise ValueError("All parameters (repo_id, model_path, hotkey) must be specified either in config or method call") try: - model_name = os.path.basename(model_path) + # Extract file extension from the model path, handling nested directories + _, extension = os.path.splitext(model_path) + if not extension: + raise ValueError(f"Could not determine file extension from model path: {model_path}") + + # Create new filename using hotkey and original extension + model_name = f"{hotkey}{extension}" + print(f"Generated model name: {model_name} from path: {model_path}") try: print(f"Checking if repo exists: {repo_id}") model = model_info(repo_id) - - # Check if model file already exists - print("Checking if model already exists...") - files = self.api.list_repo_files(repo_id=repo_id, repo_type="model") - if model_name in files: - print(f"Model {model_name} already exists, skipping upload") - metadata = { - "hotkey": hotkey, - } - return True, metadata - except: print("Repo doesn't exist, creating new one") self.api.create_repo(repo_id=repo_id, private=False) - print(f"Uploading file: {model_name}") + print(f"Uploading file as: {model_name}") self.api.upload_file( path_or_fileobj=model_path, path_in_repo=model_name, @@ -52,12 +48,14 @@ def upload_model(self, repo_id=None, model_path=None, hotkey=None): repo_type="model" ) - metadata = { - "hotkey": hotkey, - } - print(f"Updating metadata: {metadata}") - metadata_update(repo_id, metadata) - return True, metadata + # Get timestamp of the upload + commits = self.api.list_repo_commits(repo_id=repo_id, repo_type="model") + if commits: + return True, { + "hotkey": hotkey, + "timestamp": commits[0].created_at.timestamp() + } + return True, {} except Exception as e: print(f"Error in upload_model: {str(e)}") @@ -68,23 +66,25 @@ def get_model_metadata(self, repo_id=None): print(f"Getting metadata for repo: {repo_id}") try: - print("Getting model info...") - model = model_info(repo_id) - metadata = model.cardData - print(f"Model metadata: {metadata}") + print("Getting repo files...") + files = self.api.list_repo_files(repo_id=repo_id, repo_type="model") + if not files: + raise ValueError("No files found in repository") + + # Get the first file and extract hotkey from filename + model_file = files[0] + hotkey = os.path.splitext(model_file)[0] print("Getting commits...") commits = self.api.list_repo_commits(repo_id=repo_id, repo_type="model") if not commits: raise ValueError("No commits found in repository") - print(f"Found {len(commits)} commits") latest_commit = commits[0] - print(f"Latest commit: {latest_commit}") print(f"Latest commit date: {latest_commit.created_at}") result = { - "hotkey": metadata.get("hotkey"), + "hotkey": hotkey, "timestamp": latest_commit.created_at.timestamp(), } return result From 23d81a4eaf9cd0c19c4427bb823804ab16dc6806 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 5 Dec 2024 10:58:22 -0500 Subject: [PATCH 062/201] update miner.py to send the hotkey and the correct file extension as the model id --- neurons/miner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neurons/miner.py b/neurons/miner.py index 85791e8b..ac13ce3a 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -182,7 +182,7 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction timestamp = synapse.timestamp synapse.repo_id = self.config.hf_repo_id - synapse.model_id = self.config.model + synapse.model_id = f"{self.wallet.hotkey.ss58_address}{os.path.splitext(self.config.model)[1]}" if self.config.hf_repo_id == "LOCAL": model_path = f"./{self.config.model}" From a3be638071cf228ac9774e2fb3718bdb6b5f9709 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 5 Dec 2024 12:32:03 -0500 Subject: [PATCH 063/201] add logging for debug --- neurons/miner.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/neurons/miner.py b/neurons/miner.py index ac13ce3a..d2e6b4e8 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -176,6 +176,15 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction The 'forward' function is a placeholder and should be overridden with logic that is appropriate for the miner's intended operation. This method demonstrates a basic transformation of input data. """ + bt.logging.debug(f"Config hf_repo_id: {self.config.hf_repo_id}") + bt.logging.debug(f"Config model: {self.config.model}") + + synapse.repo_id = self.config.hf_repo_id + synapse.model_id = f"{self.wallet.hotkey.ss58_address}{os.path.splitext(self.config.model)[1]}" + + bt.logging.debug(f"Set synapse.repo_id: {synapse.repo_id}") + bt.logging.debug(f"Set synapse.model_id: {synapse.model_id}") + bt.logging.info( f"👈 Received prediction request from: {synapse.dendrite.hotkey} for timestamp: {synapse.timestamp}" ) From 9a190424c9202a4f89cb28ab8429a5f3255b5dc8 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 5 Dec 2024 13:00:03 -0500 Subject: [PATCH 064/201] updated defaults for model_id and repo_id --- predictionnet/protocol.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/predictionnet/protocol.py b/predictionnet/protocol.py index ddecc7dc..7d2e573f 100644 --- a/predictionnet/protocol.py +++ b/predictionnet/protocol.py @@ -54,13 +54,13 @@ class Challenge(bt.Synapse): """ repo_id: str = pydantic.Field( - default=None, + default="", title="Repo ID", description="Storage repository of the model", ) model_id: str = pydantic.Field( - default=None, + default="", title="Model ID", description="Which model to use", ) From 8330a90955534ac847b513d0e68a2291fe340b09 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 5 Dec 2024 13:13:51 -0500 Subject: [PATCH 065/201] update validator synapse to send empty strings for repo_id and model_id --- predictionnet/validator/forward.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 2143c248..31dcb14f 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -73,6 +73,8 @@ async def forward(self): # This can be combined with line 49 synapse = predictionnet.protocol.Challenge( timestamp=timestamp, + repo_id="", + model_id="" ) responses = self.dendrite.query( From 1680c4b049b68e207a052d64fdc0735e4479713f Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 5 Dec 2024 13:18:13 -0500 Subject: [PATCH 066/201] update model_id and repo_id to be optional --- predictionnet/protocol.py | 8 ++++---- predictionnet/validator/forward.py | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/predictionnet/protocol.py b/predictionnet/protocol.py index 7d2e573f..0a9b5ab4 100644 --- a/predictionnet/protocol.py +++ b/predictionnet/protocol.py @@ -53,14 +53,14 @@ class Challenge(bt.Synapse): - dummy_output: An optional integer value which, when filled, represents the response from the miner. """ - repo_id: str = pydantic.Field( - default="", + repo_id: Optional[str] = pydantic.Field( + default=None, title="Repo ID", description="Storage repository of the model", ) - model_id: str = pydantic.Field( - default="", + model_id: Optional[str] = pydantic.Field( + default=None, title="Model ID", description="Which model to use", ) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 31dcb14f..2143c248 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -73,8 +73,6 @@ async def forward(self): # This can be combined with line 49 synapse = predictionnet.protocol.Challenge( timestamp=timestamp, - repo_id="", - model_id="" ) responses = self.dendrite.query( From 2214bda2861dddcf51ff73553eb7cae75007ef8f Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 5 Dec 2024 13:27:03 -0500 Subject: [PATCH 067/201] ensure correct model path and filename in neurons/miner.pf for hf download --- neurons/miner.py | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/neurons/miner.py b/neurons/miner.py index d2e6b4e8..27f8c2d9 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -176,22 +176,15 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction The 'forward' function is a placeholder and should be overridden with logic that is appropriate for the miner's intended operation. This method demonstrates a basic transformation of input data. """ - bt.logging.debug(f"Config hf_repo_id: {self.config.hf_repo_id}") - bt.logging.debug(f"Config model: {self.config.model}") - - synapse.repo_id = self.config.hf_repo_id - synapse.model_id = f"{self.wallet.hotkey.ss58_address}{os.path.splitext(self.config.model)[1]}" - - bt.logging.debug(f"Set synapse.repo_id: {synapse.repo_id}") - bt.logging.debug(f"Set synapse.model_id: {synapse.model_id}") - bt.logging.info( f"👈 Received prediction request from: {synapse.dendrite.hotkey} for timestamp: {synapse.timestamp}" ) + model_filename = f"{self.wallet.hotkey.ss58_address}{os.path.splitext(self.config.model)[1]}" + timestamp = synapse.timestamp synapse.repo_id = self.config.hf_repo_id - synapse.model_id = f"{self.wallet.hotkey.ss58_address}{os.path.splitext(self.config.model)[1]}" + synapse.model_id = model_filename if self.config.hf_repo_id == "LOCAL": model_path = f"./{self.config.model}" @@ -204,7 +197,7 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction token = os.getenv("MINER_HF_ACCESS_TOKEN") model_path = hf_hub_download( repo_id=self.config.hf_repo_id, - filename=self.config.model, + filename=model_filename, use_auth_token=token, ) bt.logging.info(f"Model downloaded from huggingface at {model_path}") From 0d794079d43caa4f0e88efb3bc8ee11d31c9b5b0 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 5 Dec 2024 15:43:08 -0500 Subject: [PATCH 068/201] item_id needs to be the repo_id when adding to a collection --- predictionnet/utils/huggingface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index bf8f50f9..bfff3b2e 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -29,7 +29,7 @@ def get_models(self): def add_model_to_collection(self, repo_id, model_id) -> None: self.api.add_collection_item( collection_slug=self.collection_slug, - item_id=f"{repo_id}/{model_id}", + item_id=repo_id, item_type="model", exists_ok=True, ) From dd137a87600aa7b63e7818f2ffa603d359eebc04 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 6 Dec 2024 09:57:11 -0500 Subject: [PATCH 069/201] update neurons/validator.py to actually confirm models --- neurons/validator.py | 1 - predictionnet/utils/huggingface.py | 107 ++++++++++++++--------------- 2 files changed, 51 insertions(+), 57 deletions(-) diff --git a/neurons/validator.py b/neurons/validator.py index e6cf657d..5db51df6 100644 --- a/neurons/validator.py +++ b/neurons/validator.py @@ -144,7 +144,6 @@ def confirm_models(self, responses, miner_uids) -> List[bool]: models_confirmed = [] self.hf_interface.update_collection(responses) for response, uid in zip(responses, miner_uids): - models_confirmed.append(self.hf_interface.hotkeys_match(response, self.metagraph.hotkeys[uid])) return models_confirmed diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index bfff3b2e..9f4850a7 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -7,65 +7,60 @@ class HF_interface: - def __init__(self): - token = os.getenv("HF_ACCESS_TOKEN") - if token is None: - raise ValueError( - "Huggingface access token not found in environment variables, set it as 'HF_ACCESS_TOKEN'." - ) - collection_slug = os.getenv("HF_COLLECTION_SLUG") - if collection_slug is None: - raise ValueError( - "Huggingface collection slug not found in environment variables, set it as 'HF_COLLECTION_SLUG'." - ) - self.api = HfApi(token=token) - self.collection_slug = collection_slug - self.collection = self.get_models() + def __init__(self): + token = os.getenv("HF_ACCESS_TOKEN") + if token is None: + raise ValueError( + "Huggingface access token not found in environment variables, set it as 'HF_ACCESS_TOKEN'." + ) + collection_slug = os.getenv("HF_COLLECTION_SLUG") + if collection_slug is None: + raise ValueError( + "Huggingface collection slug not found in environment variables, set it as 'HF_COLLECTION_SLUG'." + ) + self.api = HfApi(token=token) + self.collection_slug = collection_slug + self.collection = self.get_models() - def get_models(self): - collection = self.api.get_collection(collection_slug=self.collection_slug) - return collection + def get_models(self): + collection = self.api.get_collection(collection_slug=self.collection_slug) + return collection - def add_model_to_collection(self, repo_id, model_id) -> None: - self.api.add_collection_item( - collection_slug=self.collection_slug, - item_id=repo_id, - item_type="model", - exists_ok=True, - ) + def add_model_to_collection(self, repo_id) -> None: + self.api.add_collection_item( + collection_slug=self.collection_slug, + item_id=repo_id, + item_type="model", + exists_ok=True, + ) - def update_collection(self, responses: List[Challenge]) -> None: - id_list = [x.item_id for x in self.collection.items] - for response in responses: - either_none = response.repo_id is None or response.model_id is None - if f"{response.repo_id}/{response.model_id}" not in id_list and not either_none: - self.add_model_to_collection(repo_id=response.repo_id, model_id=response.model_id) - self.collection = self.get_models() + def update_collection(self, responses: List[Challenge]) -> None: + id_list = [x.item_id for x in self.collection.items] + for response in responses: + if response.repo_id and response.model_id: + repo_path = f"{response.repo_id}/{response.model_id}" + if repo_path not in id_list: + self.add_model_to_collection(repo_id=repo_path) + self.collection = self.get_models() - def hotkeys_match(self, synapse, hotkey) -> bool: - model_metadata = self.get_model_metadata(synapse.repo_id, synapse.model_id) - if model_metadata: - model_hotkey = model_metadata.get("hotkey") - if hotkey == model_hotkey: - return True - else: - return False - else: - return False + def hotkeys_match(self, synapse, hotkey) -> bool: + # Extract hotkey from model_id since it's the filename without extension + model_hotkey = synapse.model_id.split('.')[0] + return hotkey == model_hotkey - def get_model_timestamp(self, repo_id, model_id): - commits = self.api.list_repo_commits(repo_id=f"{repo_id}/{model_id}", repo_type="model") - initial_commit = commits[-1] - return initial_commit.created_at + def get_model_timestamp(self, full_repo_id): + commits = self.api.list_repo_commits(repo_id=full_repo_id, repo_type="model") + initial_commit = commits[-1] + return initial_commit.created_at - def get_model_metadata(self, repo_id, model_id): - try: - model = model_info(f"{repo_id}/{model_id}") - metadata = model.cardData - if metadata is None: - hotkey = None - else: - hotkey = metadata.get("hotkey") - return {"hotkey": hotkey, "timestamp": self.get_model_timestamp(repo_id, model_id)} - except Exception: - return False + def get_model_metadata(self, full_repo_id): + try: + model = model_info(full_repo_id) + # Extract hotkey from the filename part of the path + model_hotkey = full_repo_id.split('/')[-1].split('.')[0] + return { + "hotkey": model_hotkey, + "timestamp": self.get_model_timestamp(full_repo_id) + } + except Exception: + return False \ No newline at end of file From 5cc7ebd745fff77fcdf7bcfdee5c4370e00d6b7f Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 6 Dec 2024 10:03:25 -0500 Subject: [PATCH 070/201] revert back to previous huggingface.py. Still change hotkey comparison --- predictionnet/utils/huggingface.py | 94 +++++++++++++++--------------- 1 file changed, 46 insertions(+), 48 deletions(-) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index 9f4850a7..ae69f58b 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -7,60 +7,58 @@ class HF_interface: - def __init__(self): - token = os.getenv("HF_ACCESS_TOKEN") - if token is None: - raise ValueError( - "Huggingface access token not found in environment variables, set it as 'HF_ACCESS_TOKEN'." - ) - collection_slug = os.getenv("HF_COLLECTION_SLUG") - if collection_slug is None: - raise ValueError( - "Huggingface collection slug not found in environment variables, set it as 'HF_COLLECTION_SLUG'." - ) - self.api = HfApi(token=token) - self.collection_slug = collection_slug - self.collection = self.get_models() + def __init__(self): + token = os.getenv("HF_ACCESS_TOKEN") + if token is None: + raise ValueError( + "Huggingface access token not found in environment variables, set it as 'HF_ACCESS_TOKEN'." + ) + collection_slug = os.getenv("HF_COLLECTION_SLUG") + if collection_slug is None: + raise ValueError( + "Huggingface collection slug not found in environment variables, set it as 'HF_COLLECTION_SLUG'." + ) + self.api = HfApi(token=token) + self.collection_slug = collection_slug + self.collection = self.get_models() - def get_models(self): - collection = self.api.get_collection(collection_slug=self.collection_slug) - return collection + def get_models(self): + collection = self.api.get_collection(collection_slug=self.collection_slug) + return collection - def add_model_to_collection(self, repo_id) -> None: - self.api.add_collection_item( - collection_slug=self.collection_slug, - item_id=repo_id, - item_type="model", - exists_ok=True, - ) + def add_model_to_collection(self, repo_id, model_id) -> None: + self.api.add_collection_item( + collection_slug=self.collection_slug, + item_id=repo_id, + item_type="model", + exists_ok=True, + ) - def update_collection(self, responses: List[Challenge]) -> None: - id_list = [x.item_id for x in self.collection.items] - for response in responses: - if response.repo_id and response.model_id: - repo_path = f"{response.repo_id}/{response.model_id}" - if repo_path not in id_list: - self.add_model_to_collection(repo_id=repo_path) - self.collection = self.get_models() + def update_collection(self, responses: List[Challenge]) -> None: + id_list = [x.item_id for x in self.collection.items] + for response in responses: + either_none = response.repo_id is None or response.model_id is None + if f"{response.repo_id}/{response.model_id}" not in id_list and not either_none: + self.add_model_to_collection(repo_id=response.repo_id, model_id=response.model_id) + self.collection = self.get_models() def hotkeys_match(self, synapse, hotkey) -> bool: - # Extract hotkey from model_id since it's the filename without extension model_hotkey = synapse.model_id.split('.')[0] return hotkey == model_hotkey - def get_model_timestamp(self, full_repo_id): - commits = self.api.list_repo_commits(repo_id=full_repo_id, repo_type="model") - initial_commit = commits[-1] - return initial_commit.created_at + def get_model_timestamp(self, repo_id, model_id): + commits = self.api.list_repo_commits(repo_id=f"{repo_id}/{model_id}", repo_type="model") + initial_commit = commits[-1] + return initial_commit.created_at - def get_model_metadata(self, full_repo_id): - try: - model = model_info(full_repo_id) - # Extract hotkey from the filename part of the path - model_hotkey = full_repo_id.split('/')[-1].split('.')[0] - return { - "hotkey": model_hotkey, - "timestamp": self.get_model_timestamp(full_repo_id) - } - except Exception: - return False \ No newline at end of file + def get_model_metadata(self, repo_id, model_id): + try: + model = model_info(f"{repo_id}/{model_id}") + metadata = model.cardData + if metadata is None: + hotkey = None + else: + hotkey = metadata.get("hotkey") + return {"hotkey": hotkey, "timestamp": self.get_model_timestamp(repo_id, model_id)} + except Exception: + return False From 6ec0877c8b891c71fe8316b2bce40c372019520b Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 6 Dec 2024 10:04:33 -0500 Subject: [PATCH 071/201] fix indentation error --- predictionnet/utils/huggingface.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index ae69f58b..110c1be0 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -42,9 +42,9 @@ def update_collection(self, responses: List[Challenge]) -> None: self.add_model_to_collection(repo_id=response.repo_id, model_id=response.model_id) self.collection = self.get_models() - def hotkeys_match(self, synapse, hotkey) -> bool: - model_hotkey = synapse.model_id.split('.')[0] - return hotkey == model_hotkey + def hotkeys_match(self, synapse, hotkey) -> bool: + model_hotkey = synapse.model_id.split('.')[0] + return hotkey == model_hotkey def get_model_timestamp(self, repo_id, model_id): commits = self.api.list_repo_commits(repo_id=f"{repo_id}/{model_id}", repo_type="model") From 8cd024f7842cf3f2b15e231909a85626aeea833e Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 6 Dec 2024 10:09:24 -0500 Subject: [PATCH 072/201] add logging for models confirmed --- predictionnet/validator/forward.py | 1 + 1 file changed, 1 insertion(+) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 2143c248..79632459 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -109,6 +109,7 @@ async def forward(self): bt.logging.info(f"Scored responses: {rewards}") # Update the scores based on the rewards. You may want to define your own update_scores function for custom behavior. models_confirmed = self.confirm_models(responses, miner_uids) + bt.logging.info(f"Models Confirmed: {models_confirmed}") rewards = [0 if not b else v for v, b in zip(rewards, models_confirmed)] # Check base validator file self.update_scores(rewards, miner_uids) From 51180f57f367872333d2648b5de2521c8fbbc2c4 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 6 Dec 2024 10:19:47 -0500 Subject: [PATCH 073/201] update huggingface.py to ensure that if model_id is not passed into the synapse, the hotkey match function does nto break --- predictionnet/utils/huggingface.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index 110c1be0..27978edd 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -43,6 +43,8 @@ def update_collection(self, responses: List[Challenge]) -> None: self.collection = self.get_models() def hotkeys_match(self, synapse, hotkey) -> bool: + if synapse.model_id is None: + return False model_hotkey = synapse.model_id.split('.')[0] return hotkey == model_hotkey From 05d9abbef12593b2d341a611fc259dfd7f9f9ec4 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 6 Dec 2024 12:49:56 -0500 Subject: [PATCH 074/201] test precommit hooks --- poetry.lock | 4521 ++++++++++++++++++++++++++++ predictionnet/utils/huggingface.py | 1 + 2 files changed, 4522 insertions(+) create mode 100644 poetry.lock diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 00000000..12bcd95f --- /dev/null +++ b/poetry.lock @@ -0,0 +1,4521 @@ +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. + +[[package]] +name = "absl-py" +version = "2.1.0" +description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." +optional = false +python-versions = ">=3.7" +files = [ + {file = "absl-py-2.1.0.tar.gz", hash = "sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff"}, + {file = "absl_py-2.1.0-py3-none-any.whl", hash = "sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308"}, +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.4.4" +description = "Happy Eyeballs for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8"}, + {file = "aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745"}, +] + +[[package]] +name = "aiohttp" +version = "3.11.10" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d"}, + {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f"}, + {file = "aiohttp-3.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d"}, + {file = "aiohttp-3.11.10-cp310-cp310-win32.whl", hash = "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91"}, + {file = "aiohttp-3.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33"}, + {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b"}, + {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1"}, + {file = "aiohttp-3.11.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3"}, + {file = "aiohttp-3.11.10-cp311-cp311-win32.whl", hash = "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4"}, + {file = "aiohttp-3.11.10-cp311-cp311-win_amd64.whl", hash = "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec"}, + {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf"}, + {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138"}, + {file = "aiohttp-3.11.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc"}, + {file = "aiohttp-3.11.10-cp312-cp312-win32.whl", hash = "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985"}, + {file = "aiohttp-3.11.10-cp312-cp312-win_amd64.whl", hash = "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408"}, + {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816"}, + {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf"}, + {file = "aiohttp-3.11.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836"}, + {file = "aiohttp-3.11.10-cp313-cp313-win32.whl", hash = "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c"}, + {file = "aiohttp-3.11.10-cp313-cp313-win_amd64.whl", hash = "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6"}, + {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf"}, + {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f"}, + {file = "aiohttp-3.11.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4"}, + {file = "aiohttp-3.11.10-cp39-cp39-win32.whl", hash = "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be"}, + {file = "aiohttp-3.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74"}, + {file = "aiohttp-3.11.10.tar.gz", hash = "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e"}, +] + +[package.dependencies] +aiohappyeyeballs = ">=2.3.0" +aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +propcache = ">=0.2.0" +yarl = ">=1.17.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 = "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 = "ansible" +version = "8.5.0" +description = "Radically simple IT automation" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ansible-8.5.0-py3-none-any.whl", hash = "sha256:2749032e26b0dbc9a694528b85fd89e7f950b8c7b53606f17dd997f23ac7cc88"}, + {file = "ansible-8.5.0.tar.gz", hash = "sha256:327c509bdaf5cdb2489d85c09d2c107e9432f9874c8bb5c0702a731160915f2d"}, +] + +[package.dependencies] +ansible-core = ">=2.15.5,<2.16.0" + +[[package]] +name = "ansible-core" +version = "2.15.13" +description = "Radically simple IT automation" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ansible_core-2.15.13-py3-none-any.whl", hash = "sha256:e7f50bbb61beae792f5ecb86eff82149d3948d078361d70aedb01d76bc483c30"}, + {file = "ansible_core-2.15.13.tar.gz", hash = "sha256:f542e702ee31fb049732143aeee6b36311ca48b7d13960a0685afffa0d742d7f"}, +] + +[package.dependencies] +cryptography = "*" +importlib-resources = {version = ">=5.0,<5.1", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0.0" +packaging = "*" +PyYAML = ">=5.1" +resolvelib = ">=0.5.3,<1.1.0" + +[[package]] +name = "ansible-vault" +version = "2.1.0" +description = "R/W an ansible-vault yaml file" +optional = false +python-versions = "*" +files = [ + {file = "ansible-vault-2.1.0.tar.gz", hash = "sha256:5ce8fdb5470f1449b76bf07ae2abc56480dad48356ae405c85b686efb64dbd5e"}, +] + +[package.dependencies] +ansible = "*" +setuptools = "*" + +[package.extras] +dev = ["black", "flake8", "isort[pyproject]", "pytest"] +release = ["twine"] + +[[package]] +name = "anyio" +version = "4.7.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.9" +files = [ + {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"}, + {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[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)"] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + +[[package]] +name = "astunparse" +version = "1.6.3" +description = "An AST unparser for Python" +optional = false +python-versions = "*" +files = [ + {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, + {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, +] + +[package.dependencies] +six = ">=1.6.1,<2.0" +wheel = ">=0.23.0,<1.0" + +[[package]] +name = "async-timeout" +version = "5.0.1" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, + {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, +] + +[[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 = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] + +[[package]] +name = "base58" +version = "2.1.1" +description = "Base58 and Base58Check implementation." +optional = false +python-versions = ">=3.5" +files = [ + {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, + {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, +] + +[package.extras] +tests = ["PyHamcrest (>=2.0.2)", "mypy", "pytest (>=4.6)", "pytest-benchmark", "pytest-cov", "pytest-flake8"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bittensor" +version = "7.4.0" +description = "bittensor" +optional = false +python-versions = ">=3.9" +files = [ + {file = "bittensor-7.4.0-py3-none-any.whl", hash = "sha256:fefa7336f2a7f0dc1edea53a5b1296f95503d9e1cc01cb00a445e6c7afc10d1c"}, + {file = "bittensor-7.4.0.tar.gz", hash = "sha256:235b3f5bb3d93f098a41a4f63d7676bd548debb0bb58f02a104704c0beb20ea2"}, +] + +[package.dependencies] +aiohttp = ">=3.9,<4.0" +ansible = ">=8.5.0,<8.6.0" +ansible-vault = ">=2.1,<3.0" +backoff = "*" +certifi = ">=2024.7.4,<2024.8.0" +colorama = ">=0.4.6,<0.5.0" +cryptography = ">=42.0.5,<42.1.0" +ddt = ">=1.6.0,<1.7.0" +eth-utils = "<2.3.0" +fastapi = ">=0.110.1,<0.111.0" +fuzzywuzzy = ">=0.18.0" +msgpack-numpy-opentensor = ">=0.5.0,<0.6.0" +munch = ">=2.5.0,<2.6.0" +nest-asyncio = "*" +netaddr = "*" +numpy = ">=1.26,<2.0" +packaging = "*" +password-strength = "*" +pycryptodome = ">=3.18.0,<4.0.0" +pydantic = ">=2.3,<3" +PyNaCl = ">=1.3,<2.0" +python-Levenshtein = "*" +python-statemachine = ">=2.1,<3.0" +pyyaml = "*" +requests = "*" +retry = "*" +rich = "*" +scalecodec = "1.2.11" +setuptools = ">=70.0.0,<70.1.0" +shtab = ">=1.6.5,<1.7.0" +substrate-interface = ">=1.7.9,<1.8.0" +termcolor = "*" +tqdm = "*" +uvicorn = "*" +wheel = "*" + +[package.extras] +dev = ["aioresponses (==0.7.6)", "black (==24.3.0)", "coveralls (==3.3.1)", "ddt (==1.6.0)", "factory-boy (==3.3.0)", "flake8 (==7.0.0)", "freezegun (==1.5.0)", "httpx (==0.27.0)", "hypothesis (==6.81.1)", "mypy (==1.8.0)", "pytest (==7.2.0)", "pytest-asyncio (==0.23.7)", "pytest-cov (==4.0.0)", "pytest-mock (==3.12.0)", "pytest-rerunfailures (==10.2)", "pytest-split (==0.8.0)", "pytest-xdist (==3.0.2)", "ruff (==0.4.7)", "torch (>=1.13.1)", "types-retry (==0.9.9.4)"] +torch = ["torch (>=1.13.1)"] + +[[package]] +name = "certifi" +version = "2024.7.4" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, +] + +[[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 = "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 = "cryptography" +version = "42.0.8" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "cytoolz" +version = "1.0.0" +description = "Cython implementation of Toolz: High performance functional utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cytoolz-1.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ecf5a887acb8f079ab1b81612b1c889bcbe6611aa7804fd2df46ed310aa5a345"}, + {file = "cytoolz-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0ef30c1e091d4d59d14d8108a16d50bd227be5d52a47da891da5019ac2f8e4"}, + {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7df2dfd679f0517a96ced1cdd22f5c6c6aeeed28d928a82a02bf4c3fd6fd7ac4"}, + {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c51452c938e610f57551aa96e34924169c9100c0448bac88c2fb395cbd3538c"}, + {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6433f03910c5e5345d82d6299457c26bf33821224ebb837c6b09d9cdbc414a6c"}, + {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:389ec328bb535f09e71dfe658bf0041f17194ca4cedaacd39bafe7893497a819"}, + {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c64658e1209517ce4b54c1c9269a508b289d8d55fc742760e4b8579eacf09a33"}, + {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f6039a9bd5bb988762458b9ca82b39e60ca5e5baae2ba93913990dcc5d19fa88"}, + {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85c9c8c4465ed1b2c8d67003809aec9627b129cb531d2f6cf0bbfe39952e7e4d"}, + {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:49375aad431d76650f94877afb92f09f58b6ff9055079ef4f2cd55313f5a1b39"}, + {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:4c45106171c824a61e755355520b646cb35a1987b34bbf5789443823ee137f63"}, + {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3b319a7f0fed5db07d189db4046162ebc183c108df3562a65ba6ebe862d1f634"}, + {file = "cytoolz-1.0.0-cp310-cp310-win32.whl", hash = "sha256:9770e1b09748ad0d751853d994991e2592a9f8c464a87014365f80dac2e83faa"}, + {file = "cytoolz-1.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:20194dd02954c00c1f0755e636be75a20781f91a4ac9270c7f747e82d3c7f5a5"}, + {file = "cytoolz-1.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dffc22fd2c91be64dbdbc462d0786f8e8ac9a275cfa1869a1084d1867d4f67e0"}, + {file = "cytoolz-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a99e7e29274e293f4ffe20e07f76c2ac753a78f1b40c1828dfc54b2981b2f6c4"}, + {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c507a3e0a45c41d66b43f96797290d75d1e7a8549aa03a4a6b8854fdf3f7b8d8"}, + {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:643a593ec272ef7429099e1182a22f64ec2696c00d295d2a5be390db1b7ff176"}, + {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ce38e2e42cbae30446190c59b92a8a9029e1806fd79eaf88f48b0fe33003893"}, + {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810a6a168b8c5ecb412fbae3dd6f7ed6c6253a63caf4174ee9794ebd29b2224f"}, + {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ce8a2a85c0741c1b19b16e6782c4a5abc54c3caecda66793447112ab2fa9884"}, + {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ea4ac72e6b830861035c4c7999af8e55813f57c6d1913a3d93cc4a6babc27bf7"}, + {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a09cdfb21dfb38aa04df43e7546a41f673377eb5485da88ceb784e327ec7603b"}, + {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:658dd85deb375ff7af990a674e5c9058cef1c9d1f5dc89bc87b77be499348144"}, + {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9715d1ff5576919d10b68f17241375f6a1eec8961c25b78a83e6ef1487053f39"}, + {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f370a1f1f1afc5c1c8cc5edc1cfe0ba444263a0772af7ce094be8e734f41769d"}, + {file = "cytoolz-1.0.0-cp311-cp311-win32.whl", hash = "sha256:dbb2ec1177dca700f3db2127e572da20de280c214fc587b2a11c717fc421af56"}, + {file = "cytoolz-1.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:0983eee73df86e54bb4a79fcc4996aa8b8368fdbf43897f02f9c3bf39c4dc4fb"}, + {file = "cytoolz-1.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:10e3986066dc379e30e225b230754d9f5996aa8d84c2accc69c473c21d261e46"}, + {file = "cytoolz-1.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:16576f1bb143ee2cb9f719fcc4b845879fb121f9075c7c5e8a5ff4854bd02fc6"}, + {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3faa25a1840b984315e8b3ae517312375f4273ffc9a2f035f548b7f916884f37"}, + {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:781fce70a277b20fd95dc66811d1a97bb07b611ceea9bda8b7dd3c6a4b05d59a"}, + {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a562c25338eb24d419d1e80a7ae12133844ce6fdeb4ab54459daf250088a1b2"}, + {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f29d8330aaf070304f7cd5cb7e73e198753624eb0aec278557cccd460c699b5b"}, + {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:98a96c54aa55ed9c7cdb23c2f0df39a7b4ee518ac54888480b5bdb5ef69c7ef0"}, + {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:287d6d7f475882c2ddcbedf8da9a9b37d85b77690779a2d1cdceb5ae3998d52e"}, + {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:05a871688df749b982839239fcd3f8ec3b3b4853775d575ff9cd335fa7c75035"}, + {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:28bb88e1e2f7d6d4b8e0890b06d292c568984d717de3e8381f2ca1dd12af6470"}, + {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:576a4f1fc73d8836b10458b583f915849da6e4f7914f4ecb623ad95c2508cad5"}, + {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:509ed3799c47e4ada14f63e41e8f540ac6e2dab97d5d7298934e6abb9d3830ec"}, + {file = "cytoolz-1.0.0-cp312-cp312-win32.whl", hash = "sha256:9ce25f02b910630f6dc2540dd1e26c9326027ddde6c59f8cab07c56acc70714c"}, + {file = "cytoolz-1.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:7e53cfcce87e05b7f0ae2fb2b3e5820048cd0bb7b701e92bd8f75c9fbb7c9ae9"}, + {file = "cytoolz-1.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7d56569dfe67a39ce74ffff0dc12cf0a3d1aae709667a303fe8f2dd5fd004fdf"}, + {file = "cytoolz-1.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:035c8bb4706dcf93a89fb35feadff67e9301935bf6bb864cd2366923b69d9a29"}, + {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27c684799708bdc7ee7acfaf464836e1b4dec0996815c1d5efd6a92a4356a562"}, + {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44ab57cfc922b15d94899f980d76759ef9e0256912dfab70bf2561bea9cd5b19"}, + {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:478af5ecc066da093d7660b23d0b465a7f44179739937afbded8af00af412eb6"}, + {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da1f82a7828a42468ea2820a25b6e56461361390c29dcd4d68beccfa1b71066b"}, + {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c371b3114d38ee717780b239179e88d5d358fe759a00dcf07691b8922bbc762"}, + {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:90b343b2f3b3e77c3832ba19b0b17e95412a5b2e715b05c23a55ba525d1fca49"}, + {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89a554a9ba112403232a54e15e46ff218b33020f3f45c4baf6520ab198b7ad93"}, + {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:0d603f5e2b1072166745ecdd81384a75757a96a704a5642231eb51969f919d5f"}, + {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:122ef2425bd3c0419e6e5260d0b18cd25cf74de589cd0184e4a63b24a4641e2e"}, + {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8819f1f97ebe36efcaf4b550e21677c46ac8a41bed482cf66845f377dd20700d"}, + {file = "cytoolz-1.0.0-cp38-cp38-win32.whl", hash = "sha256:fcddbb853770dd6e270d89ea8742f0aa42c255a274b9e1620eb04e019b79785e"}, + {file = "cytoolz-1.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ca526905a014a38cc23ae78635dc51d0462c5c24425b22c08beed9ff2ee03845"}, + {file = "cytoolz-1.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:05df5ff1cdd198fb57e7368623662578c950be0b14883cadfb9ee4098415e1e5"}, + {file = "cytoolz-1.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04a84778f48ebddb26948971dc60948907c876ba33b13f9cbb014fe65b341fc2"}, + {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f65283b618b4c4df759f57bcf8483865a73f7f268e6d76886c743407c8d26c1c"}, + {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388cd07ee9a9e504c735a0a933e53c98586a1c301a64af81f7aa7ff40c747520"}, + {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06d09e9569cfdfc5c082806d4b4582db8023a3ce034097008622bcbac7236f38"}, + {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9502bd9e37779cc9893cbab515a474c2ab6af61ed22ac2f7e16033db18fcaa85"}, + {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:364c2fda148def38003b2c86e8adde1d2aab12411dd50872c244a815262e2fda"}, + {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9b2e945617325242687189966335e785dc0fae316f4c1825baacf56e5a97e65f"}, + {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0f16907fdc724c55b16776bdb7e629deae81d500fe48cfc3861231753b271355"}, + {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d3206c81ca3ba2d7b8fe78f2e116e3028e721148be753308e88dcbbc370bca52"}, + {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:becce4b13e110b5ac6b23753dcd0c977f4fdccffa31898296e13fd1109e517e3"}, + {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:69a7e5e98fd446079b8b8ec5987aec9a31ec3570a6f494baefa6800b783eaf22"}, + {file = "cytoolz-1.0.0-cp39-cp39-win32.whl", hash = "sha256:b1707b6c3a91676ac83a28a231a14b337dbb4436b937e6b3e4fd44209852a48b"}, + {file = "cytoolz-1.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:11d48b8521ef5fe92e099f4fc00717b5d0789c3c90d5d84031b6d3b17dee1700"}, + {file = "cytoolz-1.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e672712d5dc3094afc6fb346dd4e9c18c1f3c69608ddb8cf3b9f8428f9c26a5c"}, + {file = "cytoolz-1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86fb208bfb7420e1d0d20065d661310e4a8a6884851d4044f47d37ed4cd7410e"}, + {file = "cytoolz-1.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dbe5fe3b835859fc559eb59bf2775b5a108f7f2cfab0966f3202859d787d8fd"}, + {file = "cytoolz-1.0.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cace092dfda174eed09ed871793beb5b65633963bcda5b1632c73a5aceea1ce"}, + {file = "cytoolz-1.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f7a9d816af3be9725c70efe0a6e4352a45d3877751b395014b8eb2f79d7d8d9d"}, + {file = "cytoolz-1.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:caa7ef840847a23b379e6146760e3a22f15f445656af97e55a435c592125cfa5"}, + {file = "cytoolz-1.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:921082fff09ff6e40c12c87b49be044492b2d6bb01d47783995813b76680c7b2"}, + {file = "cytoolz-1.0.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a32f1356f3b64dda883583383966948604ac69ca0b7fbcf5f28856e5f9133b4e"}, + {file = "cytoolz-1.0.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9af793b1738e4191d15a92e1793f1ffea9f6461022c7b2442f3cb1ea0a4f758a"}, + {file = "cytoolz-1.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:51dfda3983fcc59075c534ce54ca041bb3c80e827ada5d4f25ff7b4049777f94"}, + {file = "cytoolz-1.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:acfb8780c04d29423d14aaab74cd1b7b4beaba32f676e7ace02c9acfbf532aba"}, + {file = "cytoolz-1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99f39dcc46416dca3eb23664b73187b77fb52cd8ba2ddd8020a292d8f449db67"}, + {file = "cytoolz-1.0.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0d56b3721977806dcf1a68b0ecd56feb382fdb0f632af1a9fc5ab9b662b32c6"}, + {file = "cytoolz-1.0.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d346620abc8c83ae634136e700432ad6202faffcc24c5ab70b87392dcda8a1"}, + {file = "cytoolz-1.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:df0c81197fc130de94c09fc6f024a6a19c98ba8fe55c17f1e45ebba2e9229079"}, + {file = "cytoolz-1.0.0.tar.gz", hash = "sha256:eb453b30182152f9917a5189b7d99046b6ce90cdf8aeb0feff4b2683e600defd"}, +] + +[package.dependencies] +toolz = ">=0.8.0" + +[package.extras] +cython = ["cython"] + +[[package]] +name = "ddt" +version = "1.6.0" +description = "Data-Driven/Decorated Tests" +optional = false +python-versions = "*" +files = [ + {file = "ddt-1.6.0-py2.py3-none-any.whl", hash = "sha256:e3c93b961a108b4f4d5a6c7f2263513d928baf3bb5b32af8e1c804bfb041141d"}, + {file = "ddt-1.6.0.tar.gz", hash = "sha256:f71b348731b8c78c3100bffbd951a769fbd439088d1fdbb3841eee019af80acd"}, +] + +[[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 = "docker-pycreds" +version = "0.4.0" +description = "Python bindings for the docker credentials store API" +optional = false +python-versions = "*" +files = [ + {file = "docker-pycreds-0.4.0.tar.gz", hash = "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4"}, + {file = "docker_pycreds-0.4.0-py2.py3-none-any.whl", hash = "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49"}, +] + +[package.dependencies] +six = ">=1.4.0" + +[[package]] +name = "ecdsa" +version = "0.19.0" +description = "ECDSA cryptographic signature library (pure python)" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.6" +files = [ + {file = "ecdsa-0.19.0-py2.py3-none-any.whl", hash = "sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a"}, + {file = "ecdsa-0.19.0.tar.gz", hash = "sha256:60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8"}, +] + +[package.dependencies] +six = ">=1.9.0" + +[package.extras] +gmpy = ["gmpy"] +gmpy2 = ["gmpy2"] + +[[package]] +name = "eth-hash" +version = "0.7.0" +description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" +optional = false +python-versions = ">=3.8, <4" +files = [ + {file = "eth-hash-0.7.0.tar.gz", hash = "sha256:bacdc705bfd85dadd055ecd35fd1b4f846b671add101427e089a4ca2e8db310a"}, + {file = "eth_hash-0.7.0-py3-none-any.whl", hash = "sha256:b8d5a230a2b251f4a291e3164a23a14057c4a6de4b0aa4a16fa4dc9161b57e2f"}, +] + +[package.extras] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +pycryptodome = ["pycryptodome (>=3.6.6,<4)"] +pysha3 = ["pysha3 (>=1.0.0,<2.0.0)", "safe-pysha3 (>=1.0.0)"] +test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + +[[package]] +name = "eth-keys" +version = "0.6.0" +description = "eth-keys: Common API for Ethereum key operations" +optional = false +python-versions = "<4,>=3.8" +files = [ + {file = "eth_keys-0.6.0-py3-none-any.whl", hash = "sha256:b396fdfe048a5bba3ef3990739aec64901eb99901c03921caa774be668b1db6e"}, + {file = "eth_keys-0.6.0.tar.gz", hash = "sha256:ba33230f851d02c894e83989185b21d76152c49b37e35b61b1d8a6d9f1d20430"}, +] + +[package.dependencies] +eth-typing = ">=3" +eth-utils = ">=2" + +[package.extras] +coincurve = ["coincurve (>=12.0.0)"] +dev = ["asn1tools (>=0.146.2)", "build (>=0.9.0)", "bumpversion (>=0.5.3)", "coincurve (>=12.0.0)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "hypothesis (>=5.10.3)", "ipython", "pre-commit (>=3.4.0)", "pyasn1 (>=0.4.5)", "pytest (>=7.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["towncrier (>=21,<22)"] +test = ["asn1tools (>=0.146.2)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "hypothesis (>=5.10.3)", "pyasn1 (>=0.4.5)", "pytest (>=7.0.0)"] + +[[package]] +name = "eth-typing" +version = "5.0.1" +description = "eth-typing: Common type annotations for ethereum python packages" +optional = false +python-versions = "<4,>=3.8" +files = [ + {file = "eth_typing-5.0.1-py3-none-any.whl", hash = "sha256:f30d1af16aac598f216748a952eeb64fbcb6e73efa691d2de31148138afe96de"}, + {file = "eth_typing-5.0.1.tar.gz", hash = "sha256:83debf88c9df286db43bb7374974681ebcc9f048fac81be2548dbc549a3203c0"}, +] + +[package.dependencies] +typing-extensions = ">=4.5.0" + +[package.extras] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + +[[package]] +name = "eth-utils" +version = "2.2.2" +description = "eth-utils: Common utility functions for python code that interacts with Ethereum" +optional = false +python-versions = ">=3.7,<4" +files = [ + {file = "eth-utils-2.2.2.tar.gz", hash = "sha256:5ca6265177ce544d9d43cdf2272ae2227e5d6d9529c270bbb707d17339087101"}, + {file = "eth_utils-2.2.2-py3-none-any.whl", hash = "sha256:2580a8065273f62ca1ec4c175228c52e626a5f1007e965d2117e5eca1a93cae8"}, +] + +[package.dependencies] +cytoolz = {version = ">=0.10.1", markers = "implementation_name == \"cpython\""} +eth-hash = ">=0.3.1" +eth-typing = ">=3.0.0" +toolz = {version = ">0.8.2", markers = "implementation_name == \"pypy\""} + +[package.extras] +dev = ["black (>=23)", "build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-hash[pycryptodome]", "flake8 (==3.8.3)", "hypothesis (>=4.43.0)", "ipython", "isort (>=5.11.0)", "mypy (==0.971)", "pydocstyle (>=5.0.0)", "pytest (>=7.0.0)", "pytest-watch (>=4.1.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "types-setuptools", "wheel"] +docs = ["sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +lint = ["black (>=23)", "flake8 (==3.8.3)", "isort (>=5.11.0)", "mypy (==0.971)", "pydocstyle (>=5.0.0)", "types-setuptools"] +test = ["hypothesis (>=4.43.0)", "mypy (==0.971)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "types-setuptools"] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "fastapi" +version = "0.110.3" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi-0.110.3-py3-none-any.whl", hash = "sha256:fd7600612f755e4050beb74001310b5a7e1796d149c2ee363124abdfa0289d32"}, + {file = "fastapi-0.110.3.tar.gz", hash = "sha256:555700b0159379e94fdbfc6bb66a0f1c43f4cf7060f25239af3d84b63a656626"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.37.2,<0.38.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email_validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[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 = "flatbuffers" +version = "24.3.25" +description = "The FlatBuffers serialization format for Python" +optional = false +python-versions = "*" +files = [ + {file = "flatbuffers-24.3.25-py2.py3-none-any.whl", hash = "sha256:8dbdec58f935f3765e4f7f3cf635ac3a77f83568138d6a2311f524ec96364812"}, + {file = "flatbuffers-24.3.25.tar.gz", hash = "sha256:de2ec5b203f21441716617f38443e0a8ebf3d25bf0d9c0bb0ce68fa00ad546a4"}, +] + +[[package]] +name = "frozendict" +version = "2.4.6" +description = "A simple immutable dictionary" +optional = false +python-versions = ">=3.6" +files = [ + {file = "frozendict-2.4.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c3a05c0a50cab96b4bb0ea25aa752efbfceed5ccb24c007612bc63e51299336f"}, + {file = "frozendict-2.4.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f5b94d5b07c00986f9e37a38dd83c13f5fe3bf3f1ccc8e88edea8fe15d6cd88c"}, + {file = "frozendict-2.4.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4c789fd70879ccb6289a603cdebdc4953e7e5dea047d30c1b180529b28257b5"}, + {file = "frozendict-2.4.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da6a10164c8a50b34b9ab508a9420df38f4edf286b9ca7b7df8a91767baecb34"}, + {file = "frozendict-2.4.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9a8a43036754a941601635ea9c788ebd7a7efbed2becba01b54a887b41b175b9"}, + {file = "frozendict-2.4.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9905dcf7aa659e6a11b8051114c9fa76dfde3a6e50e6dc129d5aece75b449a2"}, + {file = "frozendict-2.4.6-cp310-cp310-win_amd64.whl", hash = "sha256:323f1b674a2cc18f86ab81698e22aba8145d7a755e0ac2cccf142ee2db58620d"}, + {file = "frozendict-2.4.6-cp310-cp310-win_arm64.whl", hash = "sha256:eabd21d8e5db0c58b60d26b4bb9839cac13132e88277e1376970172a85ee04b3"}, + {file = "frozendict-2.4.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:eddabeb769fab1e122d3a6872982c78179b5bcc909fdc769f3cf1964f55a6d20"}, + {file = "frozendict-2.4.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:377a65be0a700188fc21e669c07de60f4f6d35fae8071c292b7df04776a1c27b"}, + {file = "frozendict-2.4.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce1e9217b85eec6ba9560d520d5089c82dbb15f977906eb345d81459723dd7e3"}, + {file = "frozendict-2.4.6-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:7291abacf51798d5ffe632771a69c14fb423ab98d63c4ccd1aa382619afe2f89"}, + {file = "frozendict-2.4.6-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:e72fb86e48811957d66ffb3e95580af7b1af1e6fbd760ad63d7bd79b2c9a07f8"}, + {file = "frozendict-2.4.6-cp36-cp36m-win_amd64.whl", hash = "sha256:622301b1c29c4f9bba633667d592a3a2b093cb408ba3ce578b8901ace3931ef3"}, + {file = "frozendict-2.4.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a4e3737cb99ed03200cd303bdcd5514c9f34b29ee48f405c1184141bd68611c9"}, + {file = "frozendict-2.4.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49ffaf09241bc1417daa19362a2241a4aa435f758fd4375c39ce9790443a39cd"}, + {file = "frozendict-2.4.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d69418479bfb834ba75b0e764f058af46ceee3d655deb6a0dd0c0c1a5e82f09"}, + {file = "frozendict-2.4.6-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:c131f10c4d3906866454c4e89b87a7e0027d533cce8f4652aa5255112c4d6677"}, + {file = "frozendict-2.4.6-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:fc67cbb3c96af7a798fab53d52589752c1673027e516b702ab355510ddf6bdff"}, + {file = "frozendict-2.4.6-cp37-cp37m-win_amd64.whl", hash = "sha256:7730f8ebe791d147a1586cbf6a42629351d4597773317002181b66a2da0d509e"}, + {file = "frozendict-2.4.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:807862e14b0e9665042458fde692c4431d660c4219b9bb240817f5b918182222"}, + {file = "frozendict-2.4.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9647c74efe3d845faa666d4853cfeabbaee403b53270cabfc635b321f770e6b8"}, + {file = "frozendict-2.4.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:665fad3f0f815aa41294e561d98dbedba4b483b3968e7e8cab7d728d64b96e33"}, + {file = "frozendict-2.4.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f42e6b75254ea2afe428ad6d095b62f95a7ae6d4f8272f0bd44a25dddd20f67"}, + {file = "frozendict-2.4.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:02331541611f3897f260900a1815b63389654951126e6e65545e529b63c08361"}, + {file = "frozendict-2.4.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:18d50a2598350b89189da9150058191f55057581e40533e470db46c942373acf"}, + {file = "frozendict-2.4.6-cp38-cp38-win_amd64.whl", hash = "sha256:1b4a3f8f6dd51bee74a50995c39b5a606b612847862203dd5483b9cd91b0d36a"}, + {file = "frozendict-2.4.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a76cee5c4be2a5d1ff063188232fffcce05dde6fd5edd6afe7b75b247526490e"}, + {file = "frozendict-2.4.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba5ef7328706db857a2bdb2c2a17b4cd37c32a19c017cff1bb7eeebc86b0f411"}, + {file = "frozendict-2.4.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:669237c571856be575eca28a69e92a3d18f8490511eff184937283dc6093bd67"}, + {file = "frozendict-2.4.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0aaa11e7c472150efe65adbcd6c17ac0f586896096ab3963775e1c5c58ac0098"}, + {file = "frozendict-2.4.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b8f2829048f29fe115da4a60409be2130e69402e29029339663fac39c90e6e2b"}, + {file = "frozendict-2.4.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:94321e646cc39bebc66954a31edd1847d3a2a3483cf52ff051cd0996e7db07db"}, + {file = "frozendict-2.4.6-cp39-cp39-win_amd64.whl", hash = "sha256:74b6b26c15dddfefddeb89813e455b00ebf78d0a3662b89506b4d55c6445a9f4"}, + {file = "frozendict-2.4.6-cp39-cp39-win_arm64.whl", hash = "sha256:7088102345d1606450bd1801a61139bbaa2cb0d805b9b692f8d81918ea835da6"}, + {file = "frozendict-2.4.6-py311-none-any.whl", hash = "sha256:d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea"}, + {file = "frozendict-2.4.6-py312-none-any.whl", hash = "sha256:49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9"}, + {file = "frozendict-2.4.6-py313-none-any.whl", hash = "sha256:7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757"}, + {file = "frozendict-2.4.6.tar.gz", hash = "sha256:df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e"}, +] + +[[package]] +name = "frozenlist" +version = "1.5.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"}, + {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"}, + {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"}, + {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"}, + {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"}, + {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"}, + {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"}, + {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"}, + {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"}, + {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"}, + {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"}, + {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"}, + {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"}, + {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"}, + {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, +] + +[[package]] +name = "fsspec" +version = "2024.10.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2024.10.0-py3-none-any.whl", hash = "sha256:03b9a6785766a4de40368b88906366755e2819e758b83705c88cd7cb5fe81871"}, + {file = "fsspec-2024.10.0.tar.gz", hash = "sha256:eda2d8a4116d4f2429db8550f2457da57279247dd930bb12f821b58391359493"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dev = ["pre-commit", "ruff"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] +tqdm = ["tqdm"] + +[[package]] +name = "fuzzywuzzy" +version = "0.18.0" +description = "Fuzzy string matching in python" +optional = false +python-versions = "*" +files = [ + {file = "fuzzywuzzy-0.18.0-py2.py3-none-any.whl", hash = "sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993"}, + {file = "fuzzywuzzy-0.18.0.tar.gz", hash = "sha256:45016e92264780e58972dca1b3d939ac864b78437422beecebb3095f8efd00e8"}, +] + +[package.extras] +speedup = ["python-levenshtein (>=0.12)"] + +[[package]] +name = "gast" +version = "0.6.0" +description = "Python AST that abstracts the underlying Python version" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "gast-0.6.0-py3-none-any.whl", hash = "sha256:52b182313f7330389f72b069ba00f174cfe2a06411099547288839c6cbafbd54"}, + {file = "gast-0.6.0.tar.gz", hash = "sha256:88fc5300d32c7ac6ca7b515310862f71e6fdf2c029bbec7c66c0f5dd47b6b1fb"}, +] + +[[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 = "google-pasta" +version = "0.2.0" +description = "pasta is an AST-based Python refactoring library" +optional = false +python-versions = "*" +files = [ + {file = "google-pasta-0.2.0.tar.gz", hash = "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e"}, + {file = "google_pasta-0.2.0-py2-none-any.whl", hash = "sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954"}, + {file = "google_pasta-0.2.0-py3-none-any.whl", hash = "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "grpcio" +version = "1.68.1" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.8" +files = [ + {file = "grpcio-1.68.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:d35740e3f45f60f3c37b1e6f2f4702c23867b9ce21c6410254c9c682237da68d"}, + {file = "grpcio-1.68.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:d99abcd61760ebb34bdff37e5a3ba333c5cc09feda8c1ad42547bea0416ada78"}, + {file = "grpcio-1.68.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:f8261fa2a5f679abeb2a0a93ad056d765cdca1c47745eda3f2d87f874ff4b8c9"}, + {file = "grpcio-1.68.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0feb02205a27caca128627bd1df4ee7212db051019a9afa76f4bb6a1a80ca95e"}, + {file = "grpcio-1.68.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:919d7f18f63bcad3a0f81146188e90274fde800a94e35d42ffe9eadf6a9a6330"}, + {file = "grpcio-1.68.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:963cc8d7d79b12c56008aabd8b457f400952dbea8997dd185f155e2f228db079"}, + {file = "grpcio-1.68.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ccf2ebd2de2d6661e2520dae293298a3803a98ebfc099275f113ce1f6c2a80f1"}, + {file = "grpcio-1.68.1-cp310-cp310-win32.whl", hash = "sha256:2cc1fd04af8399971bcd4f43bd98c22d01029ea2e56e69c34daf2bf8470e47f5"}, + {file = "grpcio-1.68.1-cp310-cp310-win_amd64.whl", hash = "sha256:ee2e743e51cb964b4975de572aa8fb95b633f496f9fcb5e257893df3be854746"}, + {file = "grpcio-1.68.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:55857c71641064f01ff0541a1776bfe04a59db5558e82897d35a7793e525774c"}, + {file = "grpcio-1.68.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4b177f5547f1b995826ef529d2eef89cca2f830dd8b2c99ffd5fde4da734ba73"}, + {file = "grpcio-1.68.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:3522c77d7e6606d6665ec8d50e867f13f946a4e00c7df46768f1c85089eae515"}, + {file = "grpcio-1.68.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d1fae6bbf0816415b81db1e82fb3bf56f7857273c84dcbe68cbe046e58e1ccd"}, + {file = "grpcio-1.68.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:298ee7f80e26f9483f0b6f94cc0a046caf54400a11b644713bb5b3d8eb387600"}, + {file = "grpcio-1.68.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cbb5780e2e740b6b4f2d208e90453591036ff80c02cc605fea1af8e6fc6b1bbe"}, + {file = "grpcio-1.68.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ddda1aa22495d8acd9dfbafff2866438d12faec4d024ebc2e656784d96328ad0"}, + {file = "grpcio-1.68.1-cp311-cp311-win32.whl", hash = "sha256:b33bd114fa5a83f03ec6b7b262ef9f5cac549d4126f1dc702078767b10c46ed9"}, + {file = "grpcio-1.68.1-cp311-cp311-win_amd64.whl", hash = "sha256:7f20ebec257af55694d8f993e162ddf0d36bd82d4e57f74b31c67b3c6d63d8b2"}, + {file = "grpcio-1.68.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:8829924fffb25386995a31998ccbbeaa7367223e647e0122043dfc485a87c666"}, + {file = "grpcio-1.68.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3aed6544e4d523cd6b3119b0916cef3d15ef2da51e088211e4d1eb91a6c7f4f1"}, + {file = "grpcio-1.68.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:4efac5481c696d5cb124ff1c119a78bddbfdd13fc499e3bc0ca81e95fc573684"}, + {file = "grpcio-1.68.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ab2d912ca39c51f46baf2a0d92aa265aa96b2443266fc50d234fa88bf877d8e"}, + {file = "grpcio-1.68.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c87ce2a97434dffe7327a4071839ab8e8bffd0054cc74cbe971fba98aedd60"}, + {file = "grpcio-1.68.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e4842e4872ae4ae0f5497bf60a0498fa778c192cc7a9e87877abd2814aca9475"}, + {file = "grpcio-1.68.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:255b1635b0ed81e9f91da4fcc8d43b7ea5520090b9a9ad9340d147066d1d3613"}, + {file = "grpcio-1.68.1-cp312-cp312-win32.whl", hash = "sha256:7dfc914cc31c906297b30463dde0b9be48e36939575eaf2a0a22a8096e69afe5"}, + {file = "grpcio-1.68.1-cp312-cp312-win_amd64.whl", hash = "sha256:a0c8ddabef9c8f41617f213e527254c41e8b96ea9d387c632af878d05db9229c"}, + {file = "grpcio-1.68.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:a47faedc9ea2e7a3b6569795c040aae5895a19dde0c728a48d3c5d7995fda385"}, + {file = "grpcio-1.68.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:390eee4225a661c5cd133c09f5da1ee3c84498dc265fd292a6912b65c421c78c"}, + {file = "grpcio-1.68.1-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:66a24f3d45c33550703f0abb8b656515b0ab777970fa275693a2f6dc8e35f1c1"}, + {file = "grpcio-1.68.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c08079b4934b0bf0a8847f42c197b1d12cba6495a3d43febd7e99ecd1cdc8d54"}, + {file = "grpcio-1.68.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8720c25cd9ac25dd04ee02b69256d0ce35bf8a0f29e20577427355272230965a"}, + {file = "grpcio-1.68.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:04cfd68bf4f38f5bb959ee2361a7546916bd9a50f78617a346b3aeb2b42e2161"}, + {file = "grpcio-1.68.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c28848761a6520c5c6071d2904a18d339a796ebe6b800adc8b3f474c5ce3c3ad"}, + {file = "grpcio-1.68.1-cp313-cp313-win32.whl", hash = "sha256:77d65165fc35cff6e954e7fd4229e05ec76102d4406d4576528d3a3635fc6172"}, + {file = "grpcio-1.68.1-cp313-cp313-win_amd64.whl", hash = "sha256:a8040f85dcb9830d8bbb033ae66d272614cec6faceee88d37a88a9bd1a7a704e"}, + {file = "grpcio-1.68.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:eeb38ff04ab6e5756a2aef6ad8d94e89bb4a51ef96e20f45c44ba190fa0bcaad"}, + {file = "grpcio-1.68.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a3869a6661ec8f81d93f4597da50336718bde9eb13267a699ac7e0a1d6d0bea"}, + {file = "grpcio-1.68.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:2c4cec6177bf325eb6faa6bd834d2ff6aa8bb3b29012cceb4937b86f8b74323c"}, + {file = "grpcio-1.68.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12941d533f3cd45d46f202e3667be8ebf6bcb3573629c7ec12c3e211d99cfccf"}, + {file = "grpcio-1.68.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80af6f1e69c5e68a2be529990684abdd31ed6622e988bf18850075c81bb1ad6e"}, + {file = "grpcio-1.68.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e8dbe3e00771bfe3d04feed8210fc6617006d06d9a2679b74605b9fed3e8362c"}, + {file = "grpcio-1.68.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:83bbf5807dc3ee94ce1de2dfe8a356e1d74101e4b9d7aa8c720cc4818a34aded"}, + {file = "grpcio-1.68.1-cp38-cp38-win32.whl", hash = "sha256:8cb620037a2fd9eeee97b4531880e439ebfcd6d7d78f2e7dcc3726428ab5ef63"}, + {file = "grpcio-1.68.1-cp38-cp38-win_amd64.whl", hash = "sha256:52fbf85aa71263380d330f4fce9f013c0798242e31ede05fcee7fbe40ccfc20d"}, + {file = "grpcio-1.68.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:cb400138e73969eb5e0535d1d06cae6a6f7a15f2cc74add320e2130b8179211a"}, + {file = "grpcio-1.68.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a1b988b40f2fd9de5c820f3a701a43339d8dcf2cb2f1ca137e2c02671cc83ac1"}, + {file = "grpcio-1.68.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:96f473cdacfdd506008a5d7579c9f6a7ff245a9ade92c3c0265eb76cc591914f"}, + {file = "grpcio-1.68.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:37ea3be171f3cf3e7b7e412a98b77685eba9d4fd67421f4a34686a63a65d99f9"}, + {file = "grpcio-1.68.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ceb56c4285754e33bb3c2fa777d055e96e6932351a3082ce3559be47f8024f0"}, + {file = "grpcio-1.68.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:dffd29a2961f3263a16d73945b57cd44a8fd0b235740cb14056f0612329b345e"}, + {file = "grpcio-1.68.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:025f790c056815b3bf53da850dd70ebb849fd755a4b1ac822cb65cd631e37d43"}, + {file = "grpcio-1.68.1-cp39-cp39-win32.whl", hash = "sha256:1098f03dedc3b9810810568060dea4ac0822b4062f537b0f53aa015269be0a76"}, + {file = "grpcio-1.68.1-cp39-cp39-win_amd64.whl", hash = "sha256:334ab917792904245a028f10e803fcd5b6f36a7b2173a820c0b5b076555825e1"}, + {file = "grpcio-1.68.1.tar.gz", hash = "sha256:44a8502dd5de653ae6a73e2de50a401d84184f0331d0ac3daeb044e66d5c5054"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.68.1)"] + +[[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 = "h5py" +version = "3.12.1" +description = "Read and write HDF5 files from Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "h5py-3.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f0f1a382cbf494679c07b4371f90c70391dedb027d517ac94fa2c05299dacda"}, + {file = "h5py-3.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cb65f619dfbdd15e662423e8d257780f9a66677eae5b4b3fc9dca70b5fd2d2a3"}, + {file = "h5py-3.12.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b15d8dbd912c97541312c0e07438864d27dbca857c5ad634de68110c6beb1c2"}, + {file = "h5py-3.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59685fe40d8c1fbbee088c88cd4da415a2f8bee5c270337dc5a1c4aa634e3307"}, + {file = "h5py-3.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:577d618d6b6dea3da07d13cc903ef9634cde5596b13e832476dd861aaf651f3e"}, + {file = "h5py-3.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ccd9006d92232727d23f784795191bfd02294a4f2ba68708825cb1da39511a93"}, + {file = "h5py-3.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad8a76557880aed5234cfe7279805f4ab5ce16b17954606cca90d578d3e713ef"}, + {file = "h5py-3.12.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1473348139b885393125126258ae2d70753ef7e9cec8e7848434f385ae72069e"}, + {file = "h5py-3.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:018a4597f35092ae3fb28ee851fdc756d2b88c96336b8480e124ce1ac6fb9166"}, + {file = "h5py-3.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:3fdf95092d60e8130ba6ae0ef7a9bd4ade8edbe3569c13ebbaf39baefffc5ba4"}, + {file = "h5py-3.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06a903a4e4e9e3ebbc8b548959c3c2552ca2d70dac14fcfa650d9261c66939ed"}, + {file = "h5py-3.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7b3b8f3b48717e46c6a790e3128d39c61ab595ae0a7237f06dfad6a3b51d5351"}, + {file = "h5py-3.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:050a4f2c9126054515169c49cb900949814987f0c7ae74c341b0c9f9b5056834"}, + {file = "h5py-3.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c4b41d1019322a5afc5082864dfd6359f8935ecd37c11ac0029be78c5d112c9"}, + {file = "h5py-3.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4d51919110a030913201422fb07987db4338eba5ec8c5a15d6fab8e03d443fc"}, + {file = "h5py-3.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:513171e90ed92236fc2ca363ce7a2fc6f2827375efcbb0cc7fbdd7fe11fecafc"}, + {file = "h5py-3.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:59400f88343b79655a242068a9c900001a34b63e3afb040bd7cdf717e440f653"}, + {file = "h5py-3.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3e465aee0ec353949f0f46bf6c6f9790a2006af896cee7c178a8c3e5090aa32"}, + {file = "h5py-3.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba51c0c5e029bb5420a343586ff79d56e7455d496d18a30309616fdbeed1068f"}, + {file = "h5py-3.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:52ab036c6c97055b85b2a242cb540ff9590bacfda0c03dd0cf0661b311f522f8"}, + {file = "h5py-3.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d2b8dd64f127d8b324f5d2cd1c0fd6f68af69084e9e47d27efeb9e28e685af3e"}, + {file = "h5py-3.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4532c7e97fbef3d029735db8b6f5bf01222d9ece41e309b20d63cfaae2fb5c4d"}, + {file = "h5py-3.12.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdf6d7936fa824acfa27305fe2d9f39968e539d831c5bae0e0d83ed521ad1ac"}, + {file = "h5py-3.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84342bffd1f82d4f036433e7039e241a243531a1d3acd7341b35ae58cdab05bf"}, + {file = "h5py-3.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:62be1fc0ef195891949b2c627ec06bc8e837ff62d5b911b6e42e38e0f20a897d"}, + {file = "h5py-3.12.1.tar.gz", hash = "sha256:326d70b53d31baa61f00b8aa5f95c2fcb9621a3ee8365d770c551a13dbbcbfdf"}, +] + +[package.dependencies] +numpy = ">=1.19.3" + +[[package]] +name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + +[package.extras] +all = ["chardet (>=2.2)", "genshi", "lxml"] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml"] + +[[package]] +name = "huggingface-hub" +version = "0.22.2" +description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "huggingface_hub-0.22.2-py3-none-any.whl", hash = "sha256:3429e25f38ccb834d310804a3b711e7e4953db5a9e420cc147a5e194ca90fd17"}, + {file = "huggingface_hub-0.22.2.tar.gz", hash = "sha256:32e9a9a6843c92f253ff9ca16b9985def4d80a93fb357af5353f770ef74a81be"}, +] + +[package.dependencies] +filelock = "*" +fsspec = ">=2023.5.0" +packaging = ">=20.9" +pyyaml = ">=5.1" +requests = "*" +tqdm = ">=4.42.1" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +cli = ["InquirerPy (==0.3.4)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] +hf-transfer = ["hf-transfer (>=0.1.4)"] +inference = ["aiohttp", "minijinja (>=1.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.3.0)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +tensorflow-testing = ["keras (<3.0)", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors", "torch"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] + +[[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 = "importlib-metadata" +version = "8.5.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, + {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, +] + +[package.dependencies] +zipp = ">=3.20" + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +perf = ["ipython"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] + +[[package]] +name = "importlib-resources" +version = "5.0.7" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.6" +files = [ + {file = "importlib_resources-5.0.7-py3-none-any.whl", hash = "sha256:2238159eb743bd85304a16e0536048b3e991c531d1cd51c4a834d1ccf2829057"}, + {file = "importlib_resources-5.0.7.tar.gz", hash = "sha256:4df460394562b4581bb4e4087ad9447bd433148fba44241754ec3152499f1d1b"}, +] + +[package.extras] +docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] +testing = ["pytest (>=3.5,!=3.7.3)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler", "pytest-flake8", "pytest-mypy"] + +[[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 = "keras" +version = "3.7.0" +description = "Multi-backend Keras" +optional = false +python-versions = ">=3.9" +files = [ + {file = "keras-3.7.0-py3-none-any.whl", hash = "sha256:546a64f302e4779c129c06d9826fa586de752cdfd43d7dc4010c31b282587969"}, + {file = "keras-3.7.0.tar.gz", hash = "sha256:a4451a5591e75dfb414d0b84a3fd2fb9c0240cc87ebe7e397f547ce10b0e67b7"}, +] + +[package.dependencies] +absl-py = "*" +h5py = "*" +ml-dtypes = "*" +namex = "*" +numpy = "*" +optree = "*" +packaging = "*" +rich = "*" + +[[package]] +name = "levenshtein" +version = "0.26.1" +description = "Python extension for computing string edit distances and similarities." +optional = false +python-versions = ">=3.9" +files = [ + {file = "levenshtein-0.26.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8dc4a4aecad538d944a1264c12769c99e3c0bf8e741fc5e454cc954913befb2e"}, + {file = "levenshtein-0.26.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec108f368c12b25787c8b1a4537a1452bc53861c3ee4abc810cc74098278edcd"}, + {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69229d651c97ed5b55b7ce92481ed00635cdbb80fbfb282a22636e6945dc52d5"}, + {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79dcd157046d62482a7719b08ba9e3ce9ed3fc5b015af8ea989c734c702aedd4"}, + {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f53f9173ae21b650b4ed8aef1d0ad0c37821f367c221a982f4d2922b3044e0d"}, + {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3956f3c5c229257dbeabe0b6aacd2c083ebcc1e335842a6ff2217fe6cc03b6b"}, + {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1e83af732726987d2c4cd736f415dae8b966ba17b7a2239c8b7ffe70bfb5543"}, + {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4f052c55046c2a9c9b5f742f39e02fa6e8db8039048b8c1c9e9fdd27c8a240a1"}, + {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9895b3a98f6709e293615fde0dcd1bb0982364278fa2072361a1a31b3e388b7a"}, + {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a3777de1d8bfca054465229beed23994f926311ce666f5a392c8859bb2722f16"}, + {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:81c57e1135c38c5e6e3675b5e2077d8a8d3be32bf0a46c57276c092b1dffc697"}, + {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:91d5e7d984891df3eff7ea9fec8cf06fdfacc03cd074fd1a410435706f73b079"}, + {file = "levenshtein-0.26.1-cp310-cp310-win32.whl", hash = "sha256:f48abff54054b4142ad03b323e80aa89b1d15cabc48ff49eb7a6ff7621829a56"}, + {file = "levenshtein-0.26.1-cp310-cp310-win_amd64.whl", hash = "sha256:79dd6ad799784ea7b23edd56e3bf94b3ca866c4c6dee845658ee75bb4aefdabf"}, + {file = "levenshtein-0.26.1-cp310-cp310-win_arm64.whl", hash = "sha256:3351ddb105ef010cc2ce474894c5d213c83dddb7abb96400beaa4926b0b745bd"}, + {file = "levenshtein-0.26.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:44c51f5d33b3cfb9db518b36f1288437a509edd82da94c4400f6a681758e0cb6"}, + {file = "levenshtein-0.26.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56b93203e725f9df660e2afe3d26ba07d71871b6d6e05b8b767e688e23dfb076"}, + {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:270d36c5da04a0d89990660aea8542227cbd8f5bc34e9fdfadd34916ff904520"}, + {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:480674c05077eeb0b0f748546d4fcbb386d7c737f9fff0010400da3e8b552942"}, + {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13946e37323728695ba7a22f3345c2e907d23f4600bc700bf9b4352fb0c72a48"}, + {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ceb673f572d1d0dc9b1cd75792bb8bad2ae8eb78a7c6721e23a3867d318cb6f2"}, + {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42d6fa242e3b310ce6bfd5af0c83e65ef10b608b885b3bb69863c01fb2fcff98"}, + {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b8b68295808893a81e0a1dbc2274c30dd90880f14d23078e8eb4325ee615fc68"}, + {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b01061d377d1944eb67bc40bef5d4d2f762c6ab01598efd9297ce5d0047eb1b5"}, + {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9d12c8390f156745e533d01b30773b9753e41d8bbf8bf9dac4b97628cdf16314"}, + {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:48825c9f967f922061329d1481b70e9fee937fc68322d6979bc623f69f75bc91"}, + {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d8ec137170b95736842f99c0e7a9fd8f5641d0c1b63b08ce027198545d983e2b"}, + {file = "levenshtein-0.26.1-cp311-cp311-win32.whl", hash = "sha256:798f2b525a2e90562f1ba9da21010dde0d73730e277acaa5c52d2a6364fd3e2a"}, + {file = "levenshtein-0.26.1-cp311-cp311-win_amd64.whl", hash = "sha256:55b1024516c59df55f1cf1a8651659a568f2c5929d863d3da1ce8893753153bd"}, + {file = "levenshtein-0.26.1-cp311-cp311-win_arm64.whl", hash = "sha256:e52575cbc6b9764ea138a6f82d73d3b1bc685fe62e207ff46a963d4c773799f6"}, + {file = "levenshtein-0.26.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc741ca406d3704dc331a69c04b061fc952509a069b79cab8287413f434684bd"}, + {file = "levenshtein-0.26.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:821ace3b4e1c2e02b43cf5dc61aac2ea43bdb39837ac890919c225a2c3f2fea4"}, + {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92694c9396f55d4c91087efacf81297bef152893806fc54c289fc0254b45384"}, + {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51ba374de7a1797d04a14a4f0ad3602d2d71fef4206bb20a6baaa6b6a502da58"}, + {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7aa5c3327dda4ef952769bacec09c09ff5bf426e07fdc94478c37955681885b"}, + {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e2517e8d3c221de2d1183f400aed64211fcfc77077b291ed9f3bb64f141cdc"}, + {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9092b622765c7649dd1d8af0f43354723dd6f4e570ac079ffd90b41033957438"}, + {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc16796c85d7d8b259881d59cc8b5e22e940901928c2ff6924b2c967924e8a0b"}, + {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4370733967f5994ceeed8dc211089bedd45832ee688cecea17bfd35a9eb22b9"}, + {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3535ecfd88c9b283976b5bc61265855f59bba361881e92ed2b5367b6990c93fe"}, + {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:90236e93d98bdfd708883a6767826fafd976dac8af8fc4a0fb423d4fa08e1bf0"}, + {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:04b7cabb82edf566b1579b3ed60aac0eec116655af75a3c551fee8754ffce2ea"}, + {file = "levenshtein-0.26.1-cp312-cp312-win32.whl", hash = "sha256:ae382af8c76f6d2a040c0d9ca978baf461702ceb3f79a0a3f6da8d596a484c5b"}, + {file = "levenshtein-0.26.1-cp312-cp312-win_amd64.whl", hash = "sha256:fd091209798cfdce53746f5769987b4108fe941c54fb2e058c016ffc47872918"}, + {file = "levenshtein-0.26.1-cp312-cp312-win_arm64.whl", hash = "sha256:7e82f2ea44a81ad6b30d92a110e04cd3c8c7c6034b629aca30a3067fa174ae89"}, + {file = "levenshtein-0.26.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:790374a9f5d2cbdb30ee780403a62e59bef51453ac020668c1564d1e43438f0e"}, + {file = "levenshtein-0.26.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7b05c0415c386d00efda83d48db9db68edd02878d6dbc6df01194f12062be1bb"}, + {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3114586032361722ddededf28401ce5baf1cf617f9f49fb86b8766a45a423ff"}, + {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2532f8a13b68bf09f152d906f118a88da2063da22f44c90e904b142b0a53d534"}, + {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:219c30be6aa734bf927188d1208b7d78d202a3eb017b1c5f01ab2034d2d4ccca"}, + {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397e245e77f87836308bd56305bba630010cd8298c34c4c44bd94990cdb3b7b1"}, + {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeff6ea3576f72e26901544c6c55c72a7b79b9983b6f913cba0e9edbf2f87a97"}, + {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a19862e3539a697df722a08793994e334cd12791e8144851e8a1dee95a17ff63"}, + {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:dc3b5a64f57c3c078d58b1e447f7d68cad7ae1b23abe689215d03fc434f8f176"}, + {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bb6c7347424a91317c5e1b68041677e4c8ed3e7823b5bbaedb95bffb3c3497ea"}, + {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b817376de4195a207cc0e4ca37754c0e1e1078c2a2d35a6ae502afde87212f9e"}, + {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7b50c3620ff47c9887debbb4c154aaaac3e46be7fc2e5789ee8dbe128bce6a17"}, + {file = "levenshtein-0.26.1-cp313-cp313-win32.whl", hash = "sha256:9fb859da90262eb474c190b3ca1e61dee83add022c676520f5c05fdd60df902a"}, + {file = "levenshtein-0.26.1-cp313-cp313-win_amd64.whl", hash = "sha256:8adcc90e3a5bfb0a463581d85e599d950fe3c2938ac6247b29388b64997f6e2d"}, + {file = "levenshtein-0.26.1-cp313-cp313-win_arm64.whl", hash = "sha256:c2599407e029865dc66d210b8804c7768cbdbf60f061d993bb488d5242b0b73e"}, + {file = "levenshtein-0.26.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc54ced948fc3feafce8ad4ba4239d8ffc733a0d70e40c0363ac2a7ab2b7251e"}, + {file = "levenshtein-0.26.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6516f69213ae393a220e904332f1a6bfc299ba22cf27a6520a1663a08eba0fb"}, + {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4cfea4eada1746d0c75a864bc7e9e63d4a6e987c852d6cec8d9cb0c83afe25b"}, + {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a323161dfeeac6800eb13cfe76a8194aec589cd948bcf1cdc03f66cc3ec26b72"}, + {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c23e749b68ebc9a20b9047317b5cd2053b5856315bc8636037a8adcbb98bed1"}, + {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f80dd7432d4b6cf493d012d22148db7af769017deb31273e43406b1fb7f091c"}, + {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ae7cd6e4312c6ef34b2e273836d18f9fff518d84d823feff5ad7c49668256e0"}, + {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dcdad740e841d791b805421c2b20e859b4ed556396d3063b3aa64cd055be648c"}, + {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e07afb1613d6f5fd99abd4e53ad3b446b4efaa0f0d8e9dfb1d6d1b9f3f884d32"}, + {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:f1add8f1d83099a98ae4ac472d896b7e36db48c39d3db25adf12b373823cdeff"}, + {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1010814b1d7a60833a951f2756dfc5c10b61d09976ce96a0edae8fecdfb0ea7c"}, + {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:33fa329d1bb65ce85e83ceda281aea31cee9f2f6e167092cea54f922080bcc66"}, + {file = "levenshtein-0.26.1-cp39-cp39-win32.whl", hash = "sha256:488a945312f2f16460ab61df5b4beb1ea2254c521668fd142ce6298006296c98"}, + {file = "levenshtein-0.26.1-cp39-cp39-win_amd64.whl", hash = "sha256:9f942104adfddd4b336c3997050121328c39479f69de702d7d144abb69ea7ab9"}, + {file = "levenshtein-0.26.1-cp39-cp39-win_arm64.whl", hash = "sha256:c1d8f85b2672939f85086ed75effcf768f6077516a3e299c2ba1f91bc4644c22"}, + {file = "levenshtein-0.26.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6cf8f1efaf90ca585640c5d418c30b7d66d9ac215cee114593957161f63acde0"}, + {file = "levenshtein-0.26.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d5b2953978b8c158dd5cd93af8216a5cfddbf9de66cf5481c2955f44bb20767a"}, + {file = "levenshtein-0.26.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b952b3732c4631c49917d4b15d78cb4a2aa006c1d5c12e2a23ba8e18a307a055"}, + {file = "levenshtein-0.26.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07227281e12071168e6ae59238918a56d2a0682e529f747b5431664f302c0b42"}, + {file = "levenshtein-0.26.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8191241cd8934feaf4d05d0cc0e5e72877cbb17c53bbf8c92af9f1aedaa247e9"}, + {file = "levenshtein-0.26.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9e70d7ee157a9b698c73014f6e2b160830e7d2d64d2e342fefc3079af3c356fc"}, + {file = "levenshtein-0.26.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0eb3059f826f6cb0a5bca4a85928070f01e8202e7ccafcba94453470f83e49d4"}, + {file = "levenshtein-0.26.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:6c389e44da12d6fb1d7ba0a709a32a96c9391e9be4160ccb9269f37e040599ee"}, + {file = "levenshtein-0.26.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e9de292f2c51a7d34a0ae23bec05391b8f61f35781cd3e4c6d0533e06250c55"}, + {file = "levenshtein-0.26.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d87215113259efdca8716e53b6d59ab6d6009e119d95d45eccc083148855f33"}, + {file = "levenshtein-0.26.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f00a3eebf68a82fb651d8d0e810c10bfaa60c555d21dde3ff81350c74fb4c2"}, + {file = "levenshtein-0.26.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b3554c1b59de63d05075577380340c185ff41b028e541c0888fddab3c259a2b4"}, + {file = "levenshtein-0.26.1.tar.gz", hash = "sha256:0d19ba22330d50609b2349021ec3cf7d905c6fe21195a2d0d876a146e7ed2575"}, +] + +[package.dependencies] +rapidfuzz = ">=3.9.0,<4.0.0" + +[[package]] +name = "libclang" +version = "18.1.1" +description = "Clang Python Bindings, mirrored from the official LLVM repo: https://github.com/llvm/llvm-project/tree/main/clang/bindings/python, to make the installation process easier." +optional = false +python-versions = "*" +files = [ + {file = "libclang-18.1.1-1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:0b2e143f0fac830156feb56f9231ff8338c20aecfe72b4ffe96f19e5a1dbb69a"}, + {file = "libclang-18.1.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:6f14c3f194704e5d09769108f03185fce7acaf1d1ae4bbb2f30a72c2400cb7c5"}, + {file = "libclang-18.1.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:83ce5045d101b669ac38e6da8e58765f12da2d3aafb3b9b98d88b286a60964d8"}, + {file = "libclang-18.1.1-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:c533091d8a3bbf7460a00cb6c1a71da93bffe148f172c7d03b1c31fbf8aa2a0b"}, + {file = "libclang-18.1.1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:54dda940a4a0491a9d1532bf071ea3ef26e6dbaf03b5000ed94dd7174e8f9592"}, + {file = "libclang-18.1.1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:cf4a99b05376513717ab5d82a0db832c56ccea4fd61a69dbb7bccf2dfb207dbe"}, + {file = "libclang-18.1.1-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:69f8eb8f65c279e765ffd28aaa7e9e364c776c17618af8bff22a8df58677ff4f"}, + {file = "libclang-18.1.1-py2.py3-none-win_amd64.whl", hash = "sha256:4dd2d3b82fab35e2bf9ca717d7b63ac990a3519c7e312f19fa8e86dcc712f7fb"}, + {file = "libclang-18.1.1-py2.py3-none-win_arm64.whl", hash = "sha256:3f0e1f49f04d3cd198985fea0511576b0aee16f9ff0e0f0cad7f9c57ec3c20e8"}, + {file = "libclang-18.1.1.tar.gz", hash = "sha256:a1214966d08d73d971287fc3ead8dfaf82eb07fb197680d8b3859dbbbbf78250"}, +] + +[[package]] +name = "lxml" +version = "5.3.0" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.6" +files = [ + {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656"}, + {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7"}, + {file = "lxml-5.3.0-cp310-cp310-win32.whl", hash = "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80"}, + {file = "lxml-5.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3"}, + {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b"}, + {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be"}, + {file = "lxml-5.3.0-cp311-cp311-win32.whl", hash = "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9"}, + {file = "lxml-5.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1"}, + {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859"}, + {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d"}, + {file = "lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30"}, + {file = "lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f"}, + {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a"}, + {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b"}, + {file = "lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957"}, + {file = "lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d"}, + {file = "lxml-5.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8f0de2d390af441fe8b2c12626d103540b5d850d585b18fcada58d972b74a74e"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1afe0a8c353746e610bd9031a630a95bcfb1a720684c3f2b36c4710a0a96528f"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56b9861a71575f5795bde89256e7467ece3d339c9b43141dbdd54544566b3b94"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:9fb81d2824dff4f2e297a276297e9031f46d2682cafc484f49de182aa5e5df99"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2c226a06ecb8cdef28845ae976da407917542c5e6e75dcac7cc33eb04aaeb237"}, + {file = "lxml-5.3.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:7d3d1ca42870cdb6d0d29939630dbe48fa511c203724820fc0fd507b2fb46577"}, + {file = "lxml-5.3.0-cp36-cp36m-win32.whl", hash = "sha256:094cb601ba9f55296774c2d57ad68730daa0b13dc260e1f941b4d13678239e70"}, + {file = "lxml-5.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:eafa2c8658f4e560b098fe9fc54539f86528651f61849b22111a9b107d18910c"}, + {file = "lxml-5.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb83f8a875b3d9b458cada4f880fa498646874ba4011dc974e071a0a84a1b033"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25f1b69d41656b05885aa185f5fdf822cb01a586d1b32739633679699f220391"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23e0553b8055600b3bf4a00b255ec5c92e1e4aebf8c2c09334f8368e8bd174d6"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ada35dd21dc6c039259596b358caab6b13f4db4d4a7f8665764d616daf9cc1d"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:81b4e48da4c69313192d8c8d4311e5d818b8be1afe68ee20f6385d0e96fc9512"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:2bc9fd5ca4729af796f9f59cd8ff160fe06a474da40aca03fcc79655ddee1a8b"}, + {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07da23d7ee08577760f0a71d67a861019103e4812c87e2fab26b039054594cc5"}, + {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:ea2e2f6f801696ad7de8aec061044d6c8c0dd4037608c7cab38a9a4d316bfb11"}, + {file = "lxml-5.3.0-cp37-cp37m-win32.whl", hash = "sha256:5c54afdcbb0182d06836cc3d1be921e540be3ebdf8b8a51ee3ef987537455f84"}, + {file = "lxml-5.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f2901429da1e645ce548bf9171784c0f74f0718c3f6150ce166be39e4dd66c3e"}, + {file = "lxml-5.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c56a1d43b2f9ee4786e4658c7903f05da35b923fb53c11025712562d5cc02753"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ee8c39582d2652dcd516d1b879451500f8db3fe3607ce45d7c5957ab2596040"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdf3a3059611f7585a78ee10399a15566356116a4288380921a4b598d807a22"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:146173654d79eb1fc97498b4280c1d3e1e5d58c398fa530905c9ea50ea849b22"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0a7056921edbdd7560746f4221dca89bb7a3fe457d3d74267995253f46343f15"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:9e4b47ac0f5e749cfc618efdf4726269441014ae1d5583e047b452a32e221920"}, + {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f914c03e6a31deb632e2daa881fe198461f4d06e57ac3d0e05bbcab8eae01945"}, + {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:213261f168c5e1d9b7535a67e68b1f59f92398dd17a56d934550837143f79c42"}, + {file = "lxml-5.3.0-cp38-cp38-win32.whl", hash = "sha256:218c1b2e17a710e363855594230f44060e2025b05c80d1f0661258142b2add2e"}, + {file = "lxml-5.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:315f9542011b2c4e1d280e4a20ddcca1761993dda3afc7a73b01235f8641e903"}, + {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1ffc23010330c2ab67fac02781df60998ca8fe759e8efde6f8b756a20599c5de"}, + {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2b3778cb38212f52fac9fe913017deea2fdf4eb1a4f8e4cfc6b009a13a6d3fcc"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b0c7a688944891086ba192e21c5229dea54382f4836a209ff8d0a660fac06be"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:747a3d3e98e24597981ca0be0fd922aebd471fa99d0043a3842d00cdcad7ad6a"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86a6b24b19eaebc448dc56b87c4865527855145d851f9fc3891673ff97950540"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b11a5d918a6216e521c715b02749240fb07ae5a1fefd4b7bf12f833bc8b4fe70"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68b87753c784d6acb8a25b05cb526c3406913c9d988d51f80adecc2b0775d6aa"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:109fa6fede314cc50eed29e6e56c540075e63d922455346f11e4d7a036d2b8cf"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:02ced472497b8362c8e902ade23e3300479f4f43e45f4105c85ef43b8db85229"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:6b038cc86b285e4f9fea2ba5ee76e89f21ed1ea898e287dc277a25884f3a7dfe"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:7437237c6a66b7ca341e868cda48be24b8701862757426852c9b3186de1da8a2"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7f41026c1d64043a36fda21d64c5026762d53a77043e73e94b71f0521939cc71"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:482c2f67761868f0108b1743098640fbb2a28a8e15bf3f47ada9fa59d9fe08c3"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1483fd3358963cc5c1c9b122c80606a3a79ee0875bcac0204149fa09d6ff2727"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dec2d1130a9cda5b904696cec33b2cfb451304ba9081eeda7f90f724097300a"}, + {file = "lxml-5.3.0-cp39-cp39-win32.whl", hash = "sha256:a0eabd0a81625049c5df745209dc7fcef6e2aea7793e5f003ba363610aa0a3ff"}, + {file = "lxml-5.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:89e043f1d9d341c52bf2af6d02e6adde62e0a46e6755d5eb60dc6e4f0b8aeca2"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8dc2c0395bea8254d8daebc76dcf8eb3a95ec2a46fa6fae5eaccee366bfe02ce"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6ba0d3dcac281aad8a0e5b14c7ed6f9fa89c8612b47939fc94f80b16e2e9bc83"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6e91cf736959057f7aac7adfc83481e03615a8e8dd5758aa1d95ea69e8931dba"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:94d6c3782907b5e40e21cadf94b13b0842ac421192f26b84c45f13f3c9d5dc27"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c300306673aa0f3ed5ed9372b21867690a17dba38c68c44b287437c362ce486b"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d9b952e07aed35fe2e1a7ad26e929595412db48535921c5013edc8aa4a35ce"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:01220dca0d066d1349bd6a1726856a78f7929f3878f7e2ee83c296c69495309e"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2d9b8d9177afaef80c53c0a9e30fa252ff3036fb1c6494d427c066a4ce6a282f"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:20094fc3f21ea0a8669dc4c61ed7fa8263bd37d97d93b90f28fc613371e7a875"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ace2c2326a319a0bb8a8b0e5b570c764962e95818de9f259ce814ee666603f19"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92e67a0be1639c251d21e35fe74df6bcc40cba445c2cda7c4a967656733249e2"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd5350b55f9fecddc51385463a4f67a5da829bc741e38cf689f38ec9023f54ab"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c1fefd7e3d00921c44dc9ca80a775af49698bbfd92ea84498e56acffd4c5469"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:71a8dd38fbd2f2319136d4ae855a7078c69c9a38ae06e0c17c73fd70fc6caad8"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:97acf1e1fd66ab53dacd2c35b319d7e548380c2e9e8c54525c6e76d21b1ae3b1"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:68934b242c51eb02907c5b81d138cb977b2129a0a75a8f8b60b01cb8586c7b21"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b710bc2b8292966b23a6a0121f7a6c51d45d2347edcc75f016ac123b8054d3f2"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18feb4b93302091b1541221196a2155aa296c363fd233814fa11e181adebc52f"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3eb44520c4724c2e1a57c0af33a379eee41792595023f367ba3952a2d96c2aab"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:609251a0ca4770e5a8768ff902aa02bf636339c5a93f9349b48eb1f606f7f3e9"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:516f491c834eb320d6c843156440fe7fc0d50b33e44387fcec5b02f0bc118a4c"}, + {file = "lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml-html-clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=3.0.11)"] + +[[package]] +name = "markdown" +version = "3.7" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, + {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + +[[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 = "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 = "ml-dtypes" +version = "0.4.1" +description = "" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ml_dtypes-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1fe8b5b5e70cd67211db94b05cfd58dace592f24489b038dc6f9fe347d2e07d5"}, + {file = "ml_dtypes-0.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c09a6d11d8475c2a9fd2bc0695628aec105f97cab3b3a3fb7c9660348ff7d24"}, + {file = "ml_dtypes-0.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5e8f75fa371020dd30f9196e7d73babae2abd51cf59bdd56cb4f8de7e13354"}, + {file = "ml_dtypes-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:15fdd922fea57e493844e5abb930b9c0bd0af217d9edd3724479fc3d7ce70e3f"}, + {file = "ml_dtypes-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2d55b588116a7085d6e074cf0cdb1d6fa3875c059dddc4d2c94a4cc81c23e975"}, + {file = "ml_dtypes-0.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e138a9b7a48079c900ea969341a5754019a1ad17ae27ee330f7ebf43f23877f9"}, + {file = "ml_dtypes-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74c6cfb5cf78535b103fde9ea3ded8e9f16f75bc07789054edc7776abfb3d752"}, + {file = "ml_dtypes-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:274cc7193dd73b35fb26bef6c5d40ae3eb258359ee71cd82f6e96a8c948bdaa6"}, + {file = "ml_dtypes-0.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:827d3ca2097085cf0355f8fdf092b888890bb1b1455f52801a2d7756f056f54b"}, + {file = "ml_dtypes-0.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:772426b08a6172a891274d581ce58ea2789cc8abc1c002a27223f314aaf894e7"}, + {file = "ml_dtypes-0.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:126e7d679b8676d1a958f2651949fbfa182832c3cd08020d8facd94e4114f3e9"}, + {file = "ml_dtypes-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:df0fb650d5c582a9e72bb5bd96cfebb2cdb889d89daff621c8fbc60295eba66c"}, + {file = "ml_dtypes-0.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e35e486e97aee577d0890bc3bd9e9f9eece50c08c163304008587ec8cfe7575b"}, + {file = "ml_dtypes-0.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:560be16dc1e3bdf7c087eb727e2cf9c0e6a3d87e9f415079d2491cc419b3ebf5"}, + {file = "ml_dtypes-0.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad0b757d445a20df39035c4cdeed457ec8b60d236020d2560dbc25887533cf50"}, + {file = "ml_dtypes-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:ef0d7e3fece227b49b544fa69e50e607ac20948f0043e9f76b44f35f229ea450"}, + {file = "ml_dtypes-0.4.1.tar.gz", hash = "sha256:fad5f2de464fd09127e49b7fd1252b9006fb43d2edc1ff112d390c324af5ca7a"}, +] + +[package.dependencies] +numpy = [ + {version = ">1.20", markers = "python_version < \"3.10\""}, + {version = ">=1.21.2", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, + {version = ">=1.23.3", markers = "python_version >= \"3.11\""}, +] + +[package.extras] +dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] + +[[package]] +name = "more-itertools" +version = "10.5.0" +description = "More routines for operating on iterables, beyond itertools" +optional = false +python-versions = ">=3.8" +files = [ + {file = "more-itertools-10.5.0.tar.gz", hash = "sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6"}, + {file = "more_itertools-10.5.0-py3-none-any.whl", hash = "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef"}, +] + +[[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 = "msgpack-numpy-opentensor" +version = "0.5.0" +description = "Numpy data serialization using msgpack" +optional = false +python-versions = "*" +files = [ + {file = "msgpack-numpy-opentensor-0.5.0.tar.gz", hash = "sha256:213232c20e2efd528ec8a9882b605e8ad87cfc35b57dfcfefe05d33aaaabe574"}, + {file = "msgpack_numpy_opentensor-0.5.0-py2.py3-none-any.whl", hash = "sha256:8a61c597a976425a87094d8e89846aa9528eb1f037e97ff1428fe3cd61a238e7"}, +] + +[package.dependencies] +msgpack = ">=0.5.2" +numpy = ">=1.9.0" + +[[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.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "multitasking" +version = "0.0.11" +description = "Non-blocking Python methods using decorators" +optional = false +python-versions = "*" +files = [ + {file = "multitasking-0.0.11-py3-none-any.whl", hash = "sha256:1e5b37a5f8fc1e6cfaafd1a82b6b1cc6d2ed20037d3b89c25a84f499bd7b3dd4"}, + {file = "multitasking-0.0.11.tar.gz", hash = "sha256:4d6bc3cc65f9b2dca72fb5a787850a88dae8f620c2b36ae9b55248e51bcd6026"}, +] + +[[package]] +name = "munch" +version = "2.5.0" +description = "A dot-accessible dictionary (a la JavaScript objects)" +optional = false +python-versions = "*" +files = [ + {file = "munch-2.5.0-py2.py3-none-any.whl", hash = "sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd"}, + {file = "munch-2.5.0.tar.gz", hash = "sha256:2d735f6f24d4dba3417fa448cae40c6e896ec1fdab6cdb5e6510999758a4dbd2"}, +] + +[package.dependencies] +six = "*" + +[package.extras] +testing = ["astroid (>=1.5.3,<1.6.0)", "astroid (>=2.0)", "coverage", "pylint (>=1.7.2,<1.8.0)", "pylint (>=2.3.1,<2.4.0)", "pytest"] +yaml = ["PyYAML (>=5.1.0)"] + +[[package]] +name = "namex" +version = "0.0.8" +description = "A simple utility to separate the implementation of your Python package and its public API surface." +optional = false +python-versions = "*" +files = [ + {file = "namex-0.0.8-py3-none-any.whl", hash = "sha256:7ddb6c2bb0e753a311b7590f84f6da659dd0c05e65cb89d519d54c0a250c0487"}, + {file = "namex-0.0.8.tar.gz", hash = "sha256:32a50f6c565c0bb10aa76298c959507abdc0e850efe085dc38f3440fcb3aa90b"}, +] + +[[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 = "netaddr" +version = "1.3.0" +description = "A network address manipulation library for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "netaddr-1.3.0-py3-none-any.whl", hash = "sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe"}, + {file = "netaddr-1.3.0.tar.gz", hash = "sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a"}, +] + +[package.extras] +nicer-shell = ["ipython"] + +[[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 = "opt-einsum" +version = "3.4.0" +description = "Path optimization of einsum functions." +optional = false +python-versions = ">=3.8" +files = [ + {file = "opt_einsum-3.4.0-py3-none-any.whl", hash = "sha256:69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd"}, + {file = "opt_einsum-3.4.0.tar.gz", hash = "sha256:96ca72f1b886d148241348783498194c577fa30a8faac108586b14f1ba4473ac"}, +] + +[[package]] +name = "optree" +version = "0.13.1" +description = "Optimized PyTree Utilities." +optional = false +python-versions = ">=3.7" +files = [ + {file = "optree-0.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f8e2a546cecc5077ec7d4fe24ec8aede43ca8555b832d115f1ebbb4f3b35bc78"}, + {file = "optree-0.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a3058e2d6a6a7d6362d40f7826258204d9fc2cc4cc8f72eaa3dbff14b6622025"}, + {file = "optree-0.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34b4dd0f5d73170c7740726cadfca973220ccbed9559beb51fab446d9e584d0a"}, + {file = "optree-0.13.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1844b966bb5c95b64af5c6f92f99e4037452b92b18d060fbd80097b5b773d86"}, + {file = "optree-0.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d74ff3dfe8599935d52b26a2fe5a43242b4d3f47be6fc1c5ce34c25e116d616"}, + {file = "optree-0.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:940c739c9957404a9bbe40ed9289792adaf476cece59eca4fe2f32137fa15a8d"}, + {file = "optree-0.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfdf7f5cfb5f9b1c0188c667a3dc56551e60a52a918cb8600f84e2f0ad882106"}, + {file = "optree-0.13.1-cp310-cp310-win32.whl", hash = "sha256:135e29e0a69149958003443d43f49af0ebb65f03ae52cddf4142e94d5a36b0c8"}, + {file = "optree-0.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:64032b77420410c3d315a4b9bcbece15853432c155613bb4261d87809b3ee357"}, + {file = "optree-0.13.1-cp310-cp310-win_arm64.whl", hash = "sha256:d0c5a389c108367007151bcfef494f8c2674e4aa23d80ac9163876f5b213dfb6"}, + {file = "optree-0.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c84ecb6977ba7f5d4ba24d0312cbffb74c6860237572701c2716bd811ca9b226"}, + {file = "optree-0.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6bc9aae5ee17a38e3657c8c5db1a60923cc10debd177f6781f352362a846feeb"}, + {file = "optree-0.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f94a627c5a2fb776bbfa8f7558db5b918916d37586ba943e74e5f22789c4301"}, + {file = "optree-0.13.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b21ac55473476007e317500fd5851d0a0d695a0c51742bd65fe7347d18530da2"}, + {file = "optree-0.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:360f2e8f7eb22ff131bc7e3e241035908e6b47d41372eb3d68d77bc7036ddb30"}, + {file = "optree-0.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dec0785bc4bbcabecd7e82be3f189b21f3ce8a1244b243009736912a6d8f737"}, + {file = "optree-0.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efbffeec15e4a79ed9921dc2227cbba1b64db353c4b72ce4ce83e62fbce9e652"}, + {file = "optree-0.13.1-cp311-cp311-win32.whl", hash = "sha256:f74fb880472572d550d85d2f1563365b6f194e2157a7703790cbd54d9ab5cf29"}, + {file = "optree-0.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:0adc896018f34b5f37f6c92c35ae639877578725c5281cc9d4a0ac2ab2c46f77"}, + {file = "optree-0.13.1-cp311-cp311-win_arm64.whl", hash = "sha256:cf85ba1a7d80b6dc19ef5ca4c17d2ff0290dc9306c5b8b468d51cede287f3c8d"}, + {file = "optree-0.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0914ba436d6c0781dc9b04e3b95e06fe5c4fc6a87e94893da971805a3790efe8"}, + {file = "optree-0.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:111172446e8a4f0d3be13a853fa28cb46b5679a1c7ca15b2e6db2b43dbbf9efb"}, + {file = "optree-0.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28f083ede9be89503357a6b9e5d304826701596abe13d33e8f6fa2cd85b407fc"}, + {file = "optree-0.13.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aec6da79a6130b4c76073241c0f31c11b96a38e70c7a00f9ed918d7464394ab"}, + {file = "optree-0.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a408a43f16840475612c7058eb80b53791bf8b8266c5b3cd07f69697958fd97d"}, + {file = "optree-0.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da76fc43dcc22fe58d11634a04672ca7cc270aed469ac35fd5c78b7b9bc9125"}, + {file = "optree-0.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d866f707b9f3a9f0e670a73fe8feee4993b2dbdbf9eef598e1cf2e5cb2876413"}, + {file = "optree-0.13.1-cp312-cp312-win32.whl", hash = "sha256:bc9c396f64f9aacdf852713bd75f1b9a83f118660fd82e87c937c081b7ddccd1"}, + {file = "optree-0.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:587fb8de8e75e80fe7c7240e269630876bec3ee2038724893370976207813e4b"}, + {file = "optree-0.13.1-cp312-cp312-win_arm64.whl", hash = "sha256:5da0fd26325a07354915cc4e3a9aee797cb75dff07c60d24b3f309457069abd3"}, + {file = "optree-0.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f788b2ad120deb73b4908a74473cd6de79cfb9f33bbe9dcb59cea2e2477d4e28"}, + {file = "optree-0.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2909cb42add6bb1a5a2b0243bdd8c4b861bf072f3741e26239481907ac8ad4e6"}, + {file = "optree-0.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbc5fa2ff5090389f3a906567446f01d692bd6fe5cfcc5ae2d5861f24e8e0e4d"}, + {file = "optree-0.13.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4711f5cac5a2a49c3d6c9f0eca7b77c22b452170bb33ea01c3214ebb17931db9"}, + {file = "optree-0.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c4ab1d391b89cb88eb3c63383d5eb0930bc21141de9d5acd277feed9e38eb65"}, + {file = "optree-0.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5e5f09c85ae558a6bdaea57e63168082e728e777391393e9e2792f0d15b7b59"}, + {file = "optree-0.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8ee1e988c634a451146b87d9ebdbf650a75dc1f52a9cffcd89fabb7289321c"}, + {file = "optree-0.13.1-cp313-cp313-win32.whl", hash = "sha256:5b6531cd4eb23fadbbf77faf834e1119da06d7af3154f55786b59953cd87bb8a"}, + {file = "optree-0.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:27d81dc43b522ba47ba7d2e7d91dbb486940348b1bf85caeb0afc2815c0aa492"}, + {file = "optree-0.13.1-cp313-cp313-win_arm64.whl", hash = "sha256:f39c7174a3f3cdc3f5fe6fb4b832f608c40ac174d7567ed6734b2ee952094631"}, + {file = "optree-0.13.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:3010ae24e994f6e00071098d34e98e78eb995b7454a2ef629a0bf7df17441b24"}, + {file = "optree-0.13.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5b5626c38d4a18a144063db5c1dbb558431d83ca10682324f74665a12214801f"}, + {file = "optree-0.13.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1935639dd498a42367633e3877797e1330e39d44d48bbca1a136bb4dbe4c1bc9"}, + {file = "optree-0.13.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01819c3df950696f32c91faf8d376ae6b695ffdba18f330f1cab6b8e314e4612"}, + {file = "optree-0.13.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48c29d9c6c64c8dc48c8ee97f7c1d5cdb83e37320f0be0857c06ce4b97994aea"}, + {file = "optree-0.13.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:025d23400b8b579462a251420f0a9ae77d3d3593f84276f3465985731d79d722"}, + {file = "optree-0.13.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55e82426bef151149cfa41d68ac957730fcd420996c0db8324fca81aa6a810ba"}, + {file = "optree-0.13.1-cp313-cp313t-win32.whl", hash = "sha256:e40f018f522fcfd244688d1b3a360518e636ba7f636385aae0566eae3e7d29bc"}, + {file = "optree-0.13.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d580f1bf23bb352c4db6b3544f282f1ac08dcb0d9ab537d25e56220353438cf7"}, + {file = "optree-0.13.1-cp313-cp313t-win_arm64.whl", hash = "sha256:c4d13f55dbd509d27be3af54d53b4ca0751bc518244ced6d0567e518e51452a2"}, + {file = "optree-0.13.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9824a4258b058282eeaee1b388c8dfc704e49beda957b99177db8bd8249a3abe"}, + {file = "optree-0.13.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d21a8b449e47fdbf118ac1938cf6f97d8a60258bc45c6eba3e61f79feeb1ea8"}, + {file = "optree-0.13.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22ce30c9d733c2214fa321c8370e4dfc8c7829970364618b2b5cacffbc9e8949"}, + {file = "optree-0.13.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2521840d6aded4dac62c787f50bcb1cacbfcda86b9319d666b4025fa0ba5545a"}, + {file = "optree-0.13.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c99891c2ea6050738f7e3de5ab4038736cf33555a752b34a06922ebc9bf0488e"}, + {file = "optree-0.13.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1496f29d5b9633fed4b3f1fd4b7e772d77200eb2370c08ef8e14404309c669b9"}, + {file = "optree-0.13.1-cp37-cp37m-win32.whl", hash = "sha256:63b2749504fe0b9ac3892e26bf55a040ae2973bcf8da1476afe9266a4624be9d"}, + {file = "optree-0.13.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7e1c1da6574d59073b6a6b9a13633217f584ec271ddee4e014c7e422f171e9b4"}, + {file = "optree-0.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:50dd6a9c8ccef267ab4941f07eac53faf6a00666dce4d209da20525570ffaca3"}, + {file = "optree-0.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:536ecf0e555432cc939d958590e33e00e75cc254ab0dd269e84fc9de8352db61"}, + {file = "optree-0.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84a6a974aa9dc4119fe502865c8e1755090ac17dbb53a964619a8ece1130831e"}, + {file = "optree-0.13.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1891267f9dc76e9ddfed947ff7b755ad438ad483de0537a6b5bcf38478d5a33c"}, + {file = "optree-0.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de1ae16ea0410497e50fe2b4d48a83c37bfc87da76e1e82f9cc8c800b4fc8be6"}, + {file = "optree-0.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d89891e11a55ad83ab3e2810f8571774b2117a6198b4044fa44e0f37f72855e"}, + {file = "optree-0.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2063234ef4d58f11277e157d1cf066a8bd07be911da226bff84fc9761b8c1a25"}, + {file = "optree-0.13.1-cp38-cp38-win32.whl", hash = "sha256:5c950c85561c47efb3b1a3771ed1b2b2339bd5e28a0ca42bdcedadccc645eeac"}, + {file = "optree-0.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:f2a9eadcab78ccc04114a6916e9decdbc886bbe04c1b7a7bb32e723209162998"}, + {file = "optree-0.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b94f9081cd810a59faae4dbac8f0447e59ce0fb2d70cfb388dc123c33a9fd1a8"}, + {file = "optree-0.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7abf1c6fe42cb112f0fb169f80d7b26476fa44226d2caf3727b49d210bdc3343"}, + {file = "optree-0.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aee696272eece657c2b9e3cf079d8fc7cbbcc8a5c8199dbcd0960ddf7e672fe9"}, + {file = "optree-0.13.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5569b95e214d20a1b7acb7d9477fabbd709d334bc34f3257368ea1418b811a44"}, + {file = "optree-0.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:100d70cc57af5284649f881e6b266fee3a3e86e82024484eaa64ee18d1587e42"}, + {file = "optree-0.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30b02951c48ecca6fbeb6a3cc7a858267c4d82d1c874481a639061e845168da5"}, + {file = "optree-0.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b291aed475ca5992a0c587ca4b72f074724209e01afca9d015c9a5b2089c68d"}, + {file = "optree-0.13.1-cp39-cp39-win32.whl", hash = "sha256:363939b255a9fa0e077d8297a8301857c859592fc581cee19ec9238e0c145c4a"}, + {file = "optree-0.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:2cba7ca4cf991270a9fdd080b091d2cbdbcbf27858acebda6af40ff57312d1ea"}, + {file = "optree-0.13.1-cp39-cp39-win_arm64.whl", hash = "sha256:04252b5f24e5dae716647848b302f5f7849ecb028f8c617666d1b89a42eb988b"}, + {file = "optree-0.13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:0f1bde49e41a158af28d99fae1bd425fbd664907c53cf595106fb5b35e5cbe26"}, + {file = "optree-0.13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fafeda2e35e3270532132e27b471ea3e3aeac18f7966a4d0469137d1f36046ec"}, + {file = "optree-0.13.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce962f0dd387137817dcda600bd6cf2e1b65103411807b6cdbbd9ffddf1061f6"}, + {file = "optree-0.13.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f9707547635cfede8d79e4161c066021ffefc401d98bbf8eba452b1355a42c7"}, + {file = "optree-0.13.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5c6aed6c5eabda59a91376aca08ba508a06f1c68850216a98743b5f8f55af841"}, + {file = "optree-0.13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:95298846c057cce2e7d114c03c645e86a5381b72388c8c390986bdefe69a759c"}, + {file = "optree-0.13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37948e2d796db23d6ccd07105b709b827eba26549d34dd2149e95887c89fe9b4"}, + {file = "optree-0.13.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:395ac2eb69528613fd0f2ee8706890b7921b8ff3159df53b6e9f67eaf519c5cb"}, + {file = "optree-0.13.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:652287e43fcbb29b8d1821144987e3bc558be4e5eec0d42fce7007cc3ee8e574"}, + {file = "optree-0.13.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3d0161012d80e4865017e10298ac55652cc3ad9a3eae9440229d4bf00b140e01"}, + {file = "optree-0.13.1.tar.gz", hash = "sha256:af67856aa8073d237fe67313d84f8aeafac32c1cef7239c628a2768d02679c43"}, +] + +[package.dependencies] +typing-extensions = ">=4.5.0" + +[package.extras] +benchmark = ["dm-tree (>=0.1,<0.2.0a0)", "jax[cpu] (>=0.4.6,<0.5.0a0)", "pandas", "tabulate", "termcolor", "torch (>=2.0,<2.4.0a0)", "torchvision"] +docs = ["docutils", "jax[cpu]", "numpy", "sphinx", "sphinx-autoapi", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx-copybutton", "sphinx-rtd-theme", "sphinxcontrib-bibtex", "torch"] +jax = ["jax"] +lint = ["black", "cpplint", "doc8", "flake8", "flake8-bugbear", "flake8-comprehensions", "flake8-docstrings", "flake8-pyi", "flake8-simplify", "isort", "mypy", "pre-commit", "pydocstyle", "pyenchant", "pylint[spelling]", "ruff", "xdoctest"] +numpy = ["numpy"] +test = ["pytest", "pytest-cov", "pytest-xdist"] +torch = ["torch"] + +[[package]] +name = "packaging" +version = "24.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, +] + +[[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.22.4", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, +] +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 = "password-strength" +version = "0.0.3.post2" +description = "Password strength and validation" +optional = false +python-versions = "*" +files = [ + {file = "password_strength-0.0.3.post2-py2.py3-none-any.whl", hash = "sha256:6739357c2863d707b7c7f247ff7c6882a70904a18d12c9aaf98f8b95da176fb9"}, + {file = "password_strength-0.0.3.post2.tar.gz", hash = "sha256:bf4df10a58fcd3abfa182367307b4fd7b1cec518121dd83bf80c1c42ba796762"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "peewee" +version = "3.17.8" +description = "a little orm" +optional = false +python-versions = "*" +files = [ + {file = "peewee-3.17.8.tar.gz", hash = "sha256:ce1d05db3438830b989a1b9d0d0aa4e7f6134d5f6fd57686eeaa26a3e6485a8c"}, +] + +[[package]] +name = "pre-commit-hooks" +version = "5.0.0" +description = "Some out-of-the-box hooks for pre-commit." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pre_commit_hooks-5.0.0-py2.py3-none-any.whl", hash = "sha256:8d71cfb582c5c314a5498d94e0104b6567a8b93fb35903ea845c491f4e290a7a"}, + {file = "pre_commit_hooks-5.0.0.tar.gz", hash = "sha256:10626959a9eaf602fbfc22bc61b6e75801436f82326bfcee82bb1f2fc4bc646e"}, +] + +[package.dependencies] +"ruamel.yaml" = ">=0.15" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "propcache" +version = "0.2.1" +description = "Accelerated property cache" +optional = false +python-versions = ">=3.9" +files = [ + {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"}, + {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"}, + {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"}, + {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"}, + {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"}, + {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"}, + {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"}, + {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"}, + {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"}, + {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"}, + {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"}, + {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"}, + {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"}, + {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"}, + {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"}, +] + +[[package]] +name = "protobuf" +version = "4.25.5" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-4.25.5-cp310-abi3-win32.whl", hash = "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8"}, + {file = "protobuf-4.25.5-cp310-abi3-win_amd64.whl", hash = "sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea"}, + {file = "protobuf-4.25.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2fde3d805354df675ea4c7c6338c1aecd254dfc9925e88c6d31a2bcb97eb173"}, + {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:919ad92d9b0310070f8356c24b855c98df2b8bd207ebc1c0c6fcc9ab1e007f3d"}, + {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fe14e16c22be926d3abfcb500e60cab068baf10b542b8c858fa27e098123e331"}, + {file = "protobuf-4.25.5-cp38-cp38-win32.whl", hash = "sha256:98d8d8aa50de6a2747efd9cceba361c9034050ecce3e09136f90de37ddba66e1"}, + {file = "protobuf-4.25.5-cp38-cp38-win_amd64.whl", hash = "sha256:b0234dd5a03049e4ddd94b93400b67803c823cfc405689688f59b34e0742381a"}, + {file = "protobuf-4.25.5-cp39-cp39-win32.whl", hash = "sha256:abe32aad8561aa7cc94fc7ba4fdef646e576983edb94a73381b03c53728a626f"}, + {file = "protobuf-4.25.5-cp39-cp39-win_amd64.whl", hash = "sha256:7a183f592dc80aa7c8da7ad9e55091c4ffc9497b3054452d629bb85fa27c2a45"}, + {file = "protobuf-4.25.5-py3-none-any.whl", hash = "sha256:0aebecb809cae990f8129ada5ca273d9d670b76d9bfc9b1809f0a9c02b7dbf41"}, + {file = "protobuf-4.25.5.tar.gz", hash = "sha256:7f8249476b4a9473645db7f8ab42b02fe1488cbe5fb72fddd445e0665afd8584"}, +] + +[[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 = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] + +[[package]] +name = "py-bip39-bindings" +version = "0.1.12" +description = "Python bindings for tiny-bip39 RUST crate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "py_bip39_bindings-0.1.12-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:830a1cd07b46f84d07b9807ea1e378e947d95f9f69a1b4acc5012cf2e9336e47"}, + {file = "py_bip39_bindings-0.1.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ad84b1ca46329f23c808889d97bd79cc8a2c48e0b9fbf0ecefd16ba8c4e54761"}, + {file = "py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3772e233a03a322cd7d6587c393f24a6f98059fbeb723b05c536489671a9ae8a"}, + {file = "py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f28937f25cc9fcae37992460be1281e8d55973f8998c7d72e7b5047d3ead375a"}, + {file = "py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:332d6340201341dd87b1d5764ba40fd3b011b1f152145104d733c378a2af2970"}, + {file = "py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79daf697315084d1f91e865fae042e067c818c790dfdc6d2e65b8f9d119fc703"}, + {file = "py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7764520c8b347ff4f3ead955f2044644ab89dc82e61f3bf5b9baa45ff03b389b"}, + {file = "py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:09ca55cde30aea939c86cdadca13d7b500da414070b95fc5bf93ebdb0ec14cd7"}, + {file = "py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6e4e36c2474b946dab0c1019ac38be797073d9336e4735d574cd38cc506e5857"}, + {file = "py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:534609eef941e401aaba7fc54903e219bbe9bd652d02df1d275f242e28833aa0"}, + {file = "py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:260b61bbbed75afe4f5e2caeaefa0d844650c5bcde02dadbd963d73253554475"}, + {file = "py_bip39_bindings-0.1.12-cp310-none-win32.whl", hash = "sha256:b13e44670e34e2d28d1856bba82a362ed4b84822c73bdd23f57e941da0f7d489"}, + {file = "py_bip39_bindings-0.1.12-cp310-none-win_amd64.whl", hash = "sha256:09a1ed423242dccd5016eec18e74c80236d468ef2e85d3297615ddb4e792cd77"}, + {file = "py_bip39_bindings-0.1.12-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:200ce6173c330af830177944d18402b4861f1dd1b52a410a6c02d95f69f04b92"}, + {file = "py_bip39_bindings-0.1.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:808f1042c31e8373bcd56be45fbebbeae2ab2e90b91178bc4d5cfad13f235f34"}, + {file = "py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da4c11662304beb093dfaa24f5a3b036d4e76c21de7dafd2bd43d0e78325b377"}, + {file = "py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4af354d2e138304c20fffa0820aa79f9b4ee4de3f1db4e4b77cd0fdf72c39fc2"}, + {file = "py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a337fd6eaf16bf8c42752d9a25fd58bb303499da5d6428b466eff7ddb642237"}, + {file = "py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d72041b34d6a7ba5e83009cb96c59c48b356eb3831a0ab627421e1fcdec83c9a"}, + {file = "py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e48ab058ac4cfdcb6bdaefc8bb555a6d36b11673589332d6336495d388a4902"}, + {file = "py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cbd4865d3ef310fbad03197511423376ff8fea162d8d14c4259ee086be249b74"}, + {file = "py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:b7eafc0ab28d5835789abc82d2443aec7154c0bca8b627597ab7b4761bb3d8ac"}, + {file = "py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:97e739430d3b7801a4afd0e767c82554b92ba727b52c8c3a1ed9f9b676c176e3"}, + {file = "py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6c3a446e7cb339f8d58659bf0bbf8b549482c2eefc37c7573b84150de4423d7"}, + {file = "py_bip39_bindings-0.1.12-cp311-none-win32.whl", hash = "sha256:6e9c09a916ac890ea629ad8334b02e43ce7d1887426d74c7c69f82d0820f66db"}, + {file = "py_bip39_bindings-0.1.12-cp311-none-win_amd64.whl", hash = "sha256:f3480cb2e99b7d0ffae676d2d59a844623cee4c73fbed5c9bb3069b9a9845859"}, + {file = "py_bip39_bindings-0.1.12-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a65facd53ff11314a1e2411fced145daa3a07448c40d8aff87b22dec703d631c"}, + {file = "py_bip39_bindings-0.1.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd1490d168409763b846df691e14756c1461b1edf62343ad72c4b1e00918798d"}, + {file = "py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21bc7bfb907ebb4805b83f4e674dbe2745dd505d22472eefb65dec09c679a718"}, + {file = "py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1aa1cf5a76ea8280f2f684593f1456d8f459f200f13e7e1c351e27001310ae1"}, + {file = "py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:950a127bf0a71be0a163bcce16d9cbb227e80da4f12ffcc0effecd9743c806d7"}, + {file = "py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7ad2ed21601f40037e912e87725bb3e3aef1635fdd84eae21d5bbb0034d5727"}, + {file = "py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aed015ca58ae7e9912e7cead85feba9ce7ccabd6605d76c436615fbc035278a5"}, + {file = "py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5f6aab32cd3cc0fd7fb72247bada0cb269c3fc120dbdf12cfa06af1e5d3243"}, + {file = "py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d4f62d125f9cd9a3bf183d1cc3d0ff794e78185098c61c6392221a00e15dc4c7"}, + {file = "py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:25f3f6ab788d14a56691cbef8ad3345040c358fced832338b81fb87e9951ea5e"}, + {file = "py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fdf3c4d3acbb772c5e90da1f24db39b889d9e69b442925ebe56244a89fc24f9"}, + {file = "py_bip39_bindings-0.1.12-cp312-none-win32.whl", hash = "sha256:c7af72b8afcac625d69acd40f714963725d8078bee57c36844ae1b924d6490d2"}, + {file = "py_bip39_bindings-0.1.12-cp312-none-win_amd64.whl", hash = "sha256:1dedf9899cb9cc6000373858ea9d7069ff4d961d4c53f6624496ff31fb4398f8"}, + {file = "py_bip39_bindings-0.1.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fc0b89d9075e7953512d06e02bc8865e7da4cf7061e8454a8b42d6030a06e06"}, + {file = "py_bip39_bindings-0.1.12-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8311c96ecf7924d57170159c984fc638f2a57ae79eef23799d4f3f8fb0ea0be6"}, + {file = "py_bip39_bindings-0.1.12-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ed3ad284923e70ceeb5dc2e75bc8773c0ad52ca41aca34ec92b81d9b370b9a5"}, + {file = "py_bip39_bindings-0.1.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:472af4061746f3df6933271b919c53ef28d7cfa98801888ef4f1a97559153c19"}, + {file = "py_bip39_bindings-0.1.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f6e3a3528a3b00113f491ec63b38a1994e7439372a88419926a5671098e69eb0"}, + {file = "py_bip39_bindings-0.1.12-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:5d9bd8b18ff5ada4890425103fc404021bbf10b4fed9f42cb2f9ccbc7048314f"}, + {file = "py_bip39_bindings-0.1.12-cp37-cp37m-musllinux_1_2_armv7l.whl", hash = "sha256:2a49972d462b0617d478b1b38a44eb6ce6e4752d6f76df79421693ac21a06039"}, + {file = "py_bip39_bindings-0.1.12-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:e15994ac3507a77e86218e286cdacc3b5c3439effcf8b6b9f56be81c889c7654"}, + {file = "py_bip39_bindings-0.1.12-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:44ad459b210b0b3e834878a92e5ab52662c544cfc10ba225db7fd34efb6b40fe"}, + {file = "py_bip39_bindings-0.1.12-cp37-none-win32.whl", hash = "sha256:74b7505ceb5cda18cd2ff3c715b19ce160ae4e303d4d4c1081c93cc11601cd11"}, + {file = "py_bip39_bindings-0.1.12-cp37-none-win_amd64.whl", hash = "sha256:aada0bb86b457d08cd4475f90b8e0ebd05b05a1c67da0507b0a3050a31e39f76"}, + {file = "py_bip39_bindings-0.1.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e37498866fe2cb7dfb2ca1c5fefb45257ed298d3f6d10584497f2851441c975"}, + {file = "py_bip39_bindings-0.1.12-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f9bc513f94a93bff54b8941ca85666fa2e476a6a430ca68bcea0767342225d9"}, + {file = "py_bip39_bindings-0.1.12-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:24ebfd63786707b6be86bb34478e0f14200e2b046722601001552f5e997f12ce"}, + {file = "py_bip39_bindings-0.1.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fedcf19d9a72670400b417173f239a3e455b3ea40e06398a2d9f11970358ceb5"}, + {file = "py_bip39_bindings-0.1.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db374557720ceb6e42a976395d9b4d53f6c91ba7e372d3538c79e2369f7a98bc"}, + {file = "py_bip39_bindings-0.1.12-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:96e8b7035077026fa6c36d09195cc7b65be0a47a8dcc947c8482e4ee6f45cef1"}, + {file = "py_bip39_bindings-0.1.12-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:5f5dbb28b583d324f693d5a3e0e15a995788298e530dfcbd367921a471587698"}, + {file = "py_bip39_bindings-0.1.12-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5d209d95e6d675c7d5d335d96987fe4a9d4b2d7e30ae2266406915a6479bbc2d"}, + {file = "py_bip39_bindings-0.1.12-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:78b2e516449321761314f4490013be21ed1d70a156a742f5875d4d81bc78a36a"}, + {file = "py_bip39_bindings-0.1.12-cp38-none-win32.whl", hash = "sha256:4f5d1fe3e31a98d2563267da9f3c7342187d062e8ba5e47203e62c5afab7b9b2"}, + {file = "py_bip39_bindings-0.1.12-cp38-none-win_amd64.whl", hash = "sha256:5199fc82b703a2e68957ba8e190772cb70cdb11fc0276e9b4a756b572122a137"}, + {file = "py_bip39_bindings-0.1.12-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bf359da1ac1648f851754ddf230ab228986653d87af7ade00e11d7ee59feba14"}, + {file = "py_bip39_bindings-0.1.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:596c266afc617de543153ee95184c1ff54e355194a44bc0be962798a197cf367"}, + {file = "py_bip39_bindings-0.1.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a524054b860730d76b4bf81a3f71ea82e1e74bb0dd5192019b06a31c80393e1"}, + {file = "py_bip39_bindings-0.1.12-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:11c43577a8a5cc55e88b07507fd9bde7885b948d1319c3850945b135a54b4285"}, + {file = "py_bip39_bindings-0.1.12-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ee82d050e97cce6ac8298bb77119e9aaff2a51feec07e6682fd3b8dba405cf7"}, + {file = "py_bip39_bindings-0.1.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ae80c05dbe60d55691ee948927e80bef4e846c652735c639c571578e1686c1"}, + {file = "py_bip39_bindings-0.1.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3999ce6d43cb3ea9d23b41883f2284326647604a91dd23030973d345691838f2"}, + {file = "py_bip39_bindings-0.1.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d0b160e9999e331e574135784136f500924a36d57d0c738a778b09abc36a495"}, + {file = "py_bip39_bindings-0.1.12-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:8c202356183a467307930a8da21c6a1e6a2a4ce4841805dcfec0629229265ac4"}, + {file = "py_bip39_bindings-0.1.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:7b0f6f92da76fec954c3199ff94c6ae080e174ee33b7241fe75d921d5c9954ef"}, + {file = "py_bip39_bindings-0.1.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6fef2cb2525609d2881685e5ea383d93ba1a1aa2e8c2d94fb72d8e005fafe70c"}, + {file = "py_bip39_bindings-0.1.12-cp39-none-win32.whl", hash = "sha256:89b7c4a1194dc2b1edbd05532d6ba193ad5c0ada03d5a0a78744ef723007ceb5"}, + {file = "py_bip39_bindings-0.1.12-cp39-none-win_amd64.whl", hash = "sha256:43d831223bc76cdee33ef5668a736db098a0c20e80f9e10bd2574253ec8a5e5c"}, + {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60e46ecd3bee23f4e458303ace7c86c592cff2d28860808a5e46398f915035a"}, + {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:71afa142cf045b4d7743a96aef66f030342a8f287a83733c6841d3b005954c52"}, + {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c65ba92ec43ef78c5926506437b62d959ac4e343f8bf2cfc8ed799c3a6495f23"}, + {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf3a5ec5095f56dbf0ab8258d722d860746e807c5ace99ea5ab92000268a750b"}, + {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6232b0b8dfecd73bbc4dc4865f1c0b10d00df63dc19ad7448b5e5e45fdd279e7"}, + {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:fd13f3ba45ea56f2db85a66c1d8b03337ec8977b0a00a02448f4f65112638177"}, + {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:bc00a31943d3d6d6a1ab61321d0c14675f4f1452165ab712c90c8368f754648a"}, + {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d9f96bb10320a1ddd354ea639c434cfb1e594d4a1cb9425a476f06fc04aa18d2"}, + {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e106a1d6d1106cf40a49b3e17748c89fd9561a3aeeb98725dca9ce751c780e16"}, + {file = "py_bip39_bindings-0.1.12-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:028efb46d7823347b4a89822debf6a4aec45e32d5e1bc41c9b9e7e3e1262c622"}, + {file = "py_bip39_bindings-0.1.12-pp37-pypy37_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:caa6590d00cfbc48477811aee439254ca702568ca248487e8550a1d9a737efd3"}, + {file = "py_bip39_bindings-0.1.12-pp37-pypy37_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bee3de0777c914ba39f65882a0e2d1ff27377a01d516e81f462c4a0cebe41529"}, + {file = "py_bip39_bindings-0.1.12-pp37-pypy37_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:352b5af9916dd819570a22114f15c69b9a3abbd9fd48f0d8d3ae8a7461becc7d"}, + {file = "py_bip39_bindings-0.1.12-pp37-pypy37_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:ae023404b40c542169acce708047ba2df5f854815b4c26173484f220cb249109"}, + {file = "py_bip39_bindings-0.1.12-pp37-pypy37_pp73-musllinux_1_2_i686.whl", hash = "sha256:12886fc8e517224caef0f574a4cd1e56eb625fca32a1a9544551f7bb85f87739"}, + {file = "py_bip39_bindings-0.1.12-pp37-pypy37_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8b1ecc43e62f75cc2184c4a781cdc991636eb1b9d958fe79b5e2294327418b4b"}, + {file = "py_bip39_bindings-0.1.12-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6dc1803dedebca90327f41c4479dd4bb0ac7f5d75d4ea626737f137569288a8"}, + {file = "py_bip39_bindings-0.1.12-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:027266306c4f72ee3eeb3b4a9114a2b5f05c61b620127ca5e48f55ad0f40c3da"}, + {file = "py_bip39_bindings-0.1.12-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35a7b8324c3f1c1be522484d829433587e08318772998c5b8b0c3c26a6430ae"}, + {file = "py_bip39_bindings-0.1.12-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4e3f31d513f69043648a91a8ab500a12aa1945c60bb7d245ef4891ec8c22f123"}, + {file = "py_bip39_bindings-0.1.12-pp38-pypy38_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:39fde6be4b2dd765359d470d9fbef5f892c87f17b9569d621a4d85970082059c"}, + {file = "py_bip39_bindings-0.1.12-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:cb898867f198ed7e8a446464d275d81f627e32371eb4730d2c916317a3844a08"}, + {file = "py_bip39_bindings-0.1.12-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dea4f82f5e3997b7633c03c5618f41b89d220008dcb9fb067303a796c8aa5726"}, + {file = "py_bip39_bindings-0.1.12-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0222bc5d439151db46a00cba51a4d4b1d4bad453e760f0904b506e296c5d7b5"}, + {file = "py_bip39_bindings-0.1.12-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:451217d29b37c0d168b1dc4e9c29d0960ffc0d1857e9dfe9d90089c8044820b6"}, + {file = "py_bip39_bindings-0.1.12-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c012eb605dd09d2d161438bde8dad7d75c13a8fef7ecaa5f463f0dfd2e1a2a8f"}, + {file = "py_bip39_bindings-0.1.12-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e0f85a2a460a8e7241b42e3caba9a5afc3ea6e4d47c6dd39d3d490583418cfd0"}, + {file = "py_bip39_bindings-0.1.12-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:436bae87732b90eb315845a95a41446dc0e5dbe77ea6c018b28d2b73a489ef04"}, + {file = "py_bip39_bindings-0.1.12-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4d6c13fb07cd7d4068fb2a82f91217d7ea8962ebbeffa88f9aa57e4d24b38f0c"}, + {file = "py_bip39_bindings-0.1.12-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:bbe75eb05d5cadbb32cb6db0d0af53fe2c64ce70121e2704111ada8575778255"}, + {file = "py_bip39_bindings-0.1.12.tar.gz", hash = "sha256:56f446e665a4511e9e7dab807a908ca692247a257e141f76633110e3d30e53af"}, +] + +[[package]] +name = "py-ed25519-zebra-bindings" +version = "1.1.0" +description = "Python bindings for the ed25519-zebra RUST crate" +optional = false +python-versions = ">=3.9" +files = [ + {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f0634c6b56cd81ce8bc10c322c14a7cd2a72f3742572c0dec332979df36e7cf5"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc91befe939088aedd176e46f1316b46b4c5dd8f44a14d309e49a634fd65dbe7"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70cc6b1d460608b23e7a0f91ecb0cd4d8ed54762fc9035cc7d5d6a22358d5679"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:045396583efc93f16ee80df7739040a66cc7f8e048e9aec60d19e4cd2afaafb8"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:838ea2bb3f27907ec7a07aff6b267646b7c0c010f506673cbbc0d911e57cdfb8"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:716f090ab1564c9bf13e790b6f8bdea5ae40b68082def48f91023a8e12e38cf1"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ebf8935bf1a856d9283916cfa62083b5cdfb24f7b772f42276fbf5b5af0f1f6"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a9e5652d3bc2e4e5ef7c12ba6767800b49f9504207e4210ac4bac9c2e31efa9"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:b846ffdfd035206e16e76026bc1f4cb45964068a929b76b2ec3289fef3ee420b"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c97c0d04be12b299581daba0296bd522460a0f7001b9340d1551c0e2daea18a4"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1d8f8b04c2b3372ef33554d62fec44db28517dea1986944fc65ce3b35341800"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp310-none-win32.whl", hash = "sha256:3243cdaad41406c21e3840630ca46a997f30644a7b3c4aa7fe54c930d0ad66af"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp310-none-win_amd64.whl", hash = "sha256:278481a18225dc74e4292980c1859b1774b9e86da2d9a4cd63988717d24d421c"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:048e84121007b6ced32b70086e9bd710a825920f0715d73be4760c45f61847be"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8200479a222da9bab0abbe35d9a60e4f658a4039054c3b9f2e58a102a393a658"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ef039b7a7e4f1653e7f0c467d136a7e135061e53fdc74934d36489a8859f9e4"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d6d035b7bd3dd998ef6030666e69cde95c34225187f53ebb9c2fa7298a65ffde"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f4a7bb72294f7f1f560a464832c0fc32bc0a20cf4d3b638f2428bf3dde6ebda"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89735c2623bcf02177004eaa895250a3115214cd51df2ab561863f565aa06b1b"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4a7cccd8ab3156d1f397c6476583e78427e93cd01fa82173df78b96e15eb9f4d"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:27483aa9262d0952e886d01ec174056503238064ce1f08a3fb17752db18071dd"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:b461baeb4adb5c5d916f8cf31651142744f29b90f010a71bb22beafe0d803f40"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1b79af368be80b5cd32b2a678c775f113c1d76c6f0e1ea5e66586c81c9e0ab5b"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9555ccf645374e5282103416fe5cba60937d7bf12af676980bd4e18cfa2fab48"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp311-none-win32.whl", hash = "sha256:1c55a32c2070aa68e0ed5a2930ba547fbf47617fd279462171d5c0f87b00df6d"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp311-none-win_amd64.whl", hash = "sha256:c4a4dedb1b8edf7f68dd8015f9d8a20f2f0ecca90fac4432e5cbabfcc16ab13d"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3ee9a0b7eb896547e539a27c4286461d58c6a99952ea27fa1b5f5e39e63019dc"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:93e2a12d0bbf58f4d1e5ae2a1c352e43302cadd747a1a5e88fea03ce7a78a562"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33673e6047eba0a0a28e818fa0b36b703986347fc98e6f0f96e36af68756787"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:14399e6e8c5b9c193256a1b9aec16b9de719691de84ab23a690056cfe011d13b"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85ea7a5632a1bf6713518bb56d4c8abe5128aee173a3c498b3a564cfb346ca72"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a01f58a1c980df68c8efd43892562b3224507bab83d880910fbb4a3c84fc965"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:655360cd74718d4efb8fbaf7afb2e4ce459af5f1d399479f577a63bd9177aa3b"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:650081644c6613fdf658456ed4b2a6580ec1b54084f318a31a924ce5cf536bb9"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5d56b81186fc75cbcf80d0549f83e98c62c4359460e512f9fb8d6c7be2a158dd"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:072bf62421ad890c1849aaa19c7b6e6a890d337f0622e9bd09161b180a10496c"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e09830c3672699f5f1f164fe92b102254ef68300ceaddc847d9a35bf4a2ec270"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp312-none-win32.whl", hash = "sha256:33ca2a7ad10846c281a73450316b390c7343e62e40516389fc1b580241f3907f"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp312-none-win_amd64.whl", hash = "sha256:4ba042528ddb81f8f025b1987bf8f19547f188efb7aa4c95d1a4e3e7f968e991"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:d75a61407651174841051d59ebcee5716207371999bef78055193e96b6dec546"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b5afba0bd4ae86f06b278698d24acebe2d4b912e0490c94ee550a859377e5c05"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d977fb8d7f5594278ea3eb8283dac811cc35c925176454ccbb3ddf0110e194fa"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:83aa29a0d0df233591da3118142c818adc3f697143d655378ee076e6f091be7e"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01f2952e5c7082dc9266d668528b27711874d0f5d2aa2e85994a46643b12686e"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0db1e886f65a439fe9641196e05229715701df572a92b41428ad097d4889c5b"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dada974b078204d1591851d0e5958824569900be3ea53676b84165ba16283641"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0f7aa0056c7af9df6c580880948cce42f779951e3e551573acf9b30462d9ca9"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:2176111de560441caaf72f09da77a1d4f8eacbb34245e2531c7243ee4070829f"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6f8686f160c4e7e928c79ad33919817b9eb608e5808154311a933078bad243b4"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:09b089af355cb0815cca4796407f89aaf08aceb5d39c5b7de087533319e3673e"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp39-none-win32.whl", hash = "sha256:12e5f602897c1c95217e406d80f2e7901c90b9345011c147c36989bfb7c3bb49"}, + {file = "py_ed25519_zebra_bindings-1.1.0-cp39-none-win_amd64.whl", hash = "sha256:119c3ca0c23570ead0a3ea9e8b7fb9716bf3675229562a7dadd815009cecf3eb"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ded8debbcffc756214cd55ebefff44fb23640c9f54edf34c0e43b371e2d2b42d"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:db18ef79ea6dc0bc42e28cd46eb442d8e84c0c9c8b2809babd63608efe015ec9"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:875bba860c5ce874e33e6d04c4804c8e4149754720bf47bd66c068a61c2ed3cc"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de987c5c8b3a69504f82adc4d3b70aa322315550f945684111d8bfe40288517b"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9721c029279a6e074d4a69a8ca2ee5da6264efda052fe07afcae6ca04e340805"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:b8843fe090b793449fc8b581ff5d55c03ae9bb18ecd4943ef27c51751df9e5e8"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:b8da29729eb83c1aeeb80f0a60ceb30f6c00ba9c2c208548f6628b8f4764eccd"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a99ab59da361a9834c0019954e72a7687fa19a3380c5acc3274452c26af3b791"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4b40b19b0259412171a36f51778bc9d8e92f21baea469549a03ff99318bc640e"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7c389eee3f99c1ad3b3fa32fc53914dda22876f8e2918b5b564b98f029dd92"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f13dffb7875eea6b2bd8f9b1165e29d9cd3df2c919c2f2db0f164926c99393e8"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a55f043d87e00e7d68fed03d02ac0725acd2dff9a03e61388285d6d920f6850f"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48f09c403c58245cc6712ce34ba3cab91705c901a6c4bb1e865847f46b26ec9"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17694b0afce037860043cf8237a990e8df9c307b4decb73028d794ae56733875"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:c80f339abfc522248c749323b2cd6d555c3095128b01d845eb48a746318553da"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:89222bb4e16d1e222a95c622630f3380fe1896ab7d0cd145da39f3aa8888ed64"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:85904f3b4e11d2fc7358686e15c1e0e3707b4e1846e82d49d764c9c44881f2a3"}, + {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:b4452e9ed752db2c1ed2b7c74e1d589dfa68101b04c3304ba87a3cb843d34306"}, + {file = "py_ed25519_zebra_bindings-1.1.0.tar.gz", hash = "sha256:2977603b59cfc593fb01284465fe41062d6929b0d09edf0e1ade40709977014f"}, +] + +[[package]] +name = "py-sr25519-bindings" +version = "0.2.1" +description = "Python bindings for schnorrkel RUST crate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "py_sr25519_bindings-0.2.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10489c399768dc4ac91c90a6c8da60aeb77a48b21a81944244d41b0d4c4be2f"}, + {file = "py_sr25519_bindings-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8358a7b3048765008a79733447dfdcafdce3f66859c98634055fee6868252e12"}, + {file = "py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:202af5a516614907ddaef073104ae6d0a98ec96743d11cb87faa09d2b235a6b4"}, + {file = "py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0b0d977c9ba6063d7807dda84264f10b1951736ba528b4d4078e5c9989051b1"}, + {file = "py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e6c46cbbb87eb9db3c7deebd71c296d67c0725d9379ee737255e22c15c64bae"}, + {file = "py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9368e9ca0bc1c967db0dd5cfc401f23d364064e99a48d21ea12a068612ccce7e"}, + {file = "py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9f1ade92569b0281ff24476bd93333865370d86746b2d7949545f1ca70ac4e14"}, + {file = "py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7286da1662afc300038441620092a0ae527430f7c50b0768e826d46893dd5095"}, + {file = "py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1afbf451ecb78d5a1fa3be0f1cafb914aa2d4464ce15374bbff495cc384b1947"}, + {file = "py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:873c0ec12fed805f4086e36ebbb673c95af09e4007ea66d5a9bbd2cc29dfa076"}, + {file = "py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5917f8584cf6a81e32f03547d9fbd8c783db2372d49bd9ff8c5c57d969ea1039"}, + {file = "py_sr25519_bindings-0.2.1-cp310-none-win32.whl", hash = "sha256:09f184393e01d0d2b62d3782a6d18dd0824a225444e0171c08e03f8cf3920e7b"}, + {file = "py_sr25519_bindings-0.2.1-cp310-none-win_amd64.whl", hash = "sha256:2d548a8ea057c6f150572059475761101ba8ef15e3b349d2d0cb108652f6aaf8"}, + {file = "py_sr25519_bindings-0.2.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4941e6e0e180f7e72565043ed3ba7190455c9feaa2ab9ee6038904f2b4bb6c5b"}, + {file = "py_sr25519_bindings-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b63d7cf5bb4d9b986d7f7012c80b92be70311dc9b75862f7880e03b71a29543d"}, + {file = "py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6752bf3b109446d99f3a368e3ba805812fc5bc09e52ef1c82f5a47e43b19973"}, + {file = "py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0368dcdf5ec8d2bb9c13273c78c3c5b033211d37a70a2f1d2080f29a7d118340"}, + {file = "py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2618b02b4a3babac07b8bb61fe9550f911f038bb079665682ca76b2e664e5258"}, + {file = "py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab1bc4dc524efefaecf3a85f4a0ff05c1ca9509d4d64056199984550f3c98b3"}, + {file = "py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ccdc89d5e3ae0dd163c8150ec76b6bb3291c1cec9746eb79e9544b3423f35f9"}, + {file = "py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ae6545c414cfa5d7207c9c77aaa576bb374982fb2105a7a9c2764afa5621f6d4"}, + {file = "py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:7046774e39e0166d3c12632969c9d1713e6ad9ca8206bbe82923ba6935b0a01f"}, + {file = "py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cba9a8821176895b080ea761e5ab9cd8727660bf401478a6532a30ae3429573d"}, + {file = "py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c31aba05819e5b6b26746dc1b078cf680bd471f135c55e376e95c7774e22e936"}, + {file = "py_sr25519_bindings-0.2.1-cp311-none-win32.whl", hash = "sha256:d4bfb9c9a5c46563ccf12e74862ee95d2961556ba7aca62c9e4d6e4f7c37b4e0"}, + {file = "py_sr25519_bindings-0.2.1-cp311-none-win_amd64.whl", hash = "sha256:4f0d5c065d5e6122e53e771035aa335534363b451358b408d211df1c46773617"}, + {file = "py_sr25519_bindings-0.2.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:01ef73c0b3d3f703b54ee69c0f5ff4aa54b4233212c466fd497c7a84d170963a"}, + {file = "py_sr25519_bindings-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7ce8ac85e5ea82825a863f3f6f071e5ead610d7675820eb8ffe772267445ec0b"}, + {file = "py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f59ac8c03c8ef819db063627f4a8247aab0db11d88b21562abbe371612cf66ab"}, + {file = "py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d2c11fc77b57308e3ada9a40e7c343027129b582d3091ebd992c99b1832ac8c1"}, + {file = "py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92af2831d6896f0b3fef792d1f2da780fabf6c78dac12535b394cbdb51c0d257"}, + {file = "py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc99f7f310b7641e510810c1d6a6b51792ab2ccefac3ab288445a9fcbc9a8265"}, + {file = "py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1dc4995a352a6e5851a41cb0ea37d8c9083d173515b7fd2f381b014f57dc1cda"}, + {file = "py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f103dc5c420057c4447bd6ebf28b2b68ff3ab8da85a5f7ff39c405293de80c78"}, + {file = "py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:902ee675497b8d356a2abe2abc4278cd76c503f76d06ef2bcd797c1df59e84b7"}, + {file = "py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5dd9748f4bd9a3bc4d5c1245f6edcc723075b1470b4c36add4474df4c53604e8"}, + {file = "py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c24bc55699d12948571969c26e65138a942bdaca062171288c40c44b9a4f266"}, + {file = "py_sr25519_bindings-0.2.1-cp312-none-win32.whl", hash = "sha256:d4799c9a8f280abdfe564d397bad45da380275c8d22604e059bd7b3d5af404b5"}, + {file = "py_sr25519_bindings-0.2.1-cp312-none-win_amd64.whl", hash = "sha256:0746befd71d1766d8747910cfeb2cec2be2c859c3b3618eda1dc3cb4a1b85175"}, + {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfb80d71c010654638873e594e348a0add78dba66d089ef07d02998712744e80"}, + {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:761e48147e3b1e65b9c5ed3f547e600126f02d6b8e99aa99eb8faeb2c69166c2"}, + {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a14ce5fa0759710d45848cc98b49a10f7db3f1002726b61c57b9cdaf91c2f5f"}, + {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d731da6f49ee67dcd90ed25a393f9027e7a0caece837b1a66ffba10e63861356"}, + {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:507ae0d8894307642056f99df4acf2da9fe11153fd6e9d9e255d1d05db1b348e"}, + {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a3dad5382f60696161e91d6dd2d9381e9de61af1bf5699084939780d86115e12"}, + {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-musllinux_1_2_armv7l.whl", hash = "sha256:f913f2ddb478232a7a716603b47d276a4ab29230a4d3e87406523a0f1ae5c191"}, + {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:4844e2999a1d0ac5e9a166a2cc3557aedce6144b886bc9efd7b3f2e081feca97"}, + {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:f81ad03ff65d92c9a6deba451c922204af97dbc9a0d0680a91495ad523944929"}, + {file = "py_sr25519_bindings-0.2.1-cp37-none-win32.whl", hash = "sha256:87ac70b8424b91ba5a446a6e6dcf33d55eb4acadf1cec393294ec740d26aa7c6"}, + {file = "py_sr25519_bindings-0.2.1-cp37-none-win_amd64.whl", hash = "sha256:593b639e25a6d334a25c4b51ab2eeb80f13d510433a42abf5f2302876e637435"}, + {file = "py_sr25519_bindings-0.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5059645a99bcb77a8cadacd1a5b01dc3041b3f684595e47669a484dc6e862bc1"}, + {file = "py_sr25519_bindings-0.2.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3ce9bef8a02542a1f80560137a67e011f74e0cd77b168214d2e564225f73aa01"}, + {file = "py_sr25519_bindings-0.2.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:007e6b548bfbf4bf4d0daa30784c7e03935bf47081cc9a3095cf52712ae64c72"}, + {file = "py_sr25519_bindings-0.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5b65131461d87062c75f2076a2c99aea4072e4886275e87e8616b3433e5c456"}, + {file = "py_sr25519_bindings-0.2.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db721395bb9c7d61392ab3957781450cba281b814c94f1888bb576891d3016d1"}, + {file = "py_sr25519_bindings-0.2.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b590397aaf2f222a5768f0b74bf08315ef105bc70c50f9bf5f3e6b97458d772d"}, + {file = "py_sr25519_bindings-0.2.1-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:a5b43cdf722f40f042ed05607bca7032055df4cdc413f52746e972ec393aa82f"}, + {file = "py_sr25519_bindings-0.2.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:46033ed3fe67ad11fa0f46f19483175a83185a02af6eb93d7391e81b3219c5a8"}, + {file = "py_sr25519_bindings-0.2.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4e3c1d51ae59b1bf295f1c5af21adc1acab60a7a018e081873f124456492db88"}, + {file = "py_sr25519_bindings-0.2.1-cp38-none-win32.whl", hash = "sha256:6b34f32efccb5a26c14f4ec1666f2821760981a709e04a486357bc0a152f5d94"}, + {file = "py_sr25519_bindings-0.2.1-cp38-none-win_amd64.whl", hash = "sha256:9ab1d3c8c3458a74217b849ffed3e03c98e746d488c9cf9b773f55ad8d3031ad"}, + {file = "py_sr25519_bindings-0.2.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:89014247bb398acf99e508a0eff7b1dee8cea4b1d441ceeee8de275b1944812f"}, + {file = "py_sr25519_bindings-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3ce7c463b73864909391bfad078b1c88ebbc1eb84f58336c605cbcaf3cecd2f"}, + {file = "py_sr25519_bindings-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a2c28840138ba0a4e6f8c6953821cbd1d80d2e52404ff9722030a22d26addd"}, + {file = "py_sr25519_bindings-0.2.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b0cea045676c3c482423232d19b6aac2458925416fcceec0a37c938f8bc9c00d"}, + {file = "py_sr25519_bindings-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cedbcc9779630c7cd364a66e686aa5c2ad0dd81fbb95edb689a6f63eb3323d6"}, + {file = "py_sr25519_bindings-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d064e6154554e18f3c40349c7df01297d812da5f6c4bcb825fa9f4fe2dd402d"}, + {file = "py_sr25519_bindings-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6156c50f92b705d89f82b0dcb51eb0eaf0f22fba9fa51648a5e0c8274b0e0502"}, + {file = "py_sr25519_bindings-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a915deadf311592c9d7dc6cf6b0550830aeb08c5029cb06e882c32dcb560125b"}, + {file = "py_sr25519_bindings-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:8b56ceec5f83dd9c4b809f3be3ef4262d1e833d1ed8f16d7d8283fb2c5ae1a75"}, + {file = "py_sr25519_bindings-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:73948c2b022287ff478a276b725a98a3bea34920cfe0edbedc0154f9a6125061"}, + {file = "py_sr25519_bindings-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a8bc937794b947b9da2f20fa0d8f5002d20d2bfc2656a21ef834e1af2d3fdca4"}, + {file = "py_sr25519_bindings-0.2.1-cp39-none-win32.whl", hash = "sha256:d27b882546d5ad78f71c1ec48033267a0dd812fb1583881c39a75b3180a7e80b"}, + {file = "py_sr25519_bindings-0.2.1-cp39-none-win_amd64.whl", hash = "sha256:5ad0d7b14339452072773bae6d4570684895658a046279bebd3410941846ea65"}, + {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50f8b34fed2c98814dcd414379ef43bf63cd4c05d7d90b83c590cca60fe804d6"}, + {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:141b0f8fb99cb249984f7c9ec67dd1768aae4d137d47ea0eca027d669503e132"}, + {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45cfef18bdfde67d445650a388bfafecbd1844a64c19087e9e4267548998c100"}, + {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:639410c0258a543bb84b0518616af724716737054ac5c78daa4d956d17841b17"}, + {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a98e5a395445046f37fc4e365556ce06fa344e3b711de0564ac3fd2b351a1b3e"}, + {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:7935b79a91aa72db42b5015117018554980c320256e63bc930b8bd148a0765a4"}, + {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:cedf5d0669c23ddab8804982f665c7e99b13e8452db78128f231217b8528c31a"}, + {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:9ea24db07992f756409729adad1e3ec9aa0a9d4fece5da90768a56ac1563f0f4"}, + {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e8b7e42cd4a5177dd83bbcdef77591fd72d3da02616545011ebcdd872f8cc39d"}, + {file = "py_sr25519_bindings-0.2.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0db53685c6282b29d118ccac3bdaad257723494c07c38dc9a4f31027dc41885"}, + {file = "py_sr25519_bindings-0.2.1-pp37-pypy37_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6e42e6edca45b9f116c97068416eb96c6606498289c056731dc08b645592b1ec"}, + {file = "py_sr25519_bindings-0.2.1-pp37-pypy37_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:927d773693d41f6fb9644148649d78875ac27d21dcfd3436502d68c5cc6b0f30"}, + {file = "py_sr25519_bindings-0.2.1-pp37-pypy37_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d169fd6a803a80c3554562c38894d942da8a408a43685b723bcd3a79ce884ee4"}, + {file = "py_sr25519_bindings-0.2.1-pp37-pypy37_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:37f48ba05b3306b2aa9b97b6b91361c83467ce8b77348c2ecb28090fae193d6d"}, + {file = "py_sr25519_bindings-0.2.1-pp37-pypy37_pp73-musllinux_1_2_i686.whl", hash = "sha256:9c9385e98e166cb293dda2a0691b511d770a5ffa0d7fe8495fd558387cbe06fe"}, + {file = "py_sr25519_bindings-0.2.1-pp37-pypy37_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:0855eb9ad70f3673d88e25cae4d799aff0e9fcfb6cbd24a8a41e1c7915f5f5a8"}, + {file = "py_sr25519_bindings-0.2.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1662dc8161fbb4e5220a89e8f4fd42a1ce5d71471e5d5a9398ed07ced12d2dc"}, + {file = "py_sr25519_bindings-0.2.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c3bca18a20ea6f12f662f4a38e8132f952f3ec77e4a1e0b4654a5fc0aeb54eb"}, + {file = "py_sr25519_bindings-0.2.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b857902b2c74269ae4fb9d1ac915993bbd55291351f6b8bb2bb6a08b5631bb5"}, + {file = "py_sr25519_bindings-0.2.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:04f44054b3244e13c1f9440b616251ff200fe679ce7d934783f214065a22f78e"}, + {file = "py_sr25519_bindings-0.2.1-pp38-pypy38_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:7f8e2c3e0ecb086648c64274a98d6663bece7aaafbee8b7e229fc3f024d4ffb5"}, + {file = "py_sr25519_bindings-0.2.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:23edd08e0866b5ccf9fdbafa7e6a0646070b37ad6869723252136a2c47b5b5fc"}, + {file = "py_sr25519_bindings-0.2.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5bfd4d91329889109d8d5cbd22fa4138e778cb7522704f45f451b23a5573b1aa"}, + {file = "py_sr25519_bindings-0.2.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:858b80041b18fdde666427ec9843303931ab2184cdf698285e8d34f3f6c4fad0"}, + {file = "py_sr25519_bindings-0.2.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d9a848030227b8099c26c4f38b35fbae55cb78e0d3fab69804bf220e60a85455"}, + {file = "py_sr25519_bindings-0.2.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de7afdcc714fd83fc3636b9cea6c2ef6515e59f97410e73210276c3e0e64a28b"}, + {file = "py_sr25519_bindings-0.2.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:9333d891f1305f686f6ef4b9aef204df3090d037056e9f6e1276165c29ef70c2"}, + {file = "py_sr25519_bindings-0.2.1-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:970e0635104f2d5e771de3b8863eb0f7d04617c164d49d17e02ecc60c3a97182"}, + {file = "py_sr25519_bindings-0.2.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:995e2c49dd0df3adb7907b2dc5a30d4df64160023205d89256b88a956c64637c"}, + {file = "py_sr25519_bindings-0.2.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4177bf68b73080ca0a21cf1231877dbec4f4485ee22bc97b7d447a0e29fe9c30"}, + {file = "py_sr25519_bindings-0.2.1.tar.gz", hash = "sha256:1b96d3dde43adcf86ab427a9fd72b2c6291dca36eb40747df631588c16f01c1a"}, +] + +[[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 = "pycryptodome" +version = "3.21.0" +description = "Cryptographic library for Python" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pycryptodome-3.21.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:dad9bf36eda068e89059d1f07408e397856be9511d7113ea4b586642a429a4fd"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:a1752eca64c60852f38bb29e2c86fca30d7672c024128ef5d70cc15868fa10f4"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3ba4cc304eac4d4d458f508d4955a88ba25026890e8abff9b60404f76a62c55e"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cb087b8612c8a1a14cf37dd754685be9a8d9869bed2ffaaceb04850a8aeef7e"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:26412b21df30b2861424a6c6d5b1d8ca8107612a4cfa4d0183e71c5d200fb34a"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-win32.whl", hash = "sha256:cc2269ab4bce40b027b49663d61d816903a4bd90ad88cb99ed561aadb3888dd3"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-win_amd64.whl", hash = "sha256:0fa0a05a6a697ccbf2a12cec3d6d2650b50881899b845fac6e87416f8cb7e87d"}, + {file = "pycryptodome-3.21.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6cce52e196a5f1d6797ff7946cdff2038d3b5f0aba4a43cb6bf46b575fd1b5bb"}, + {file = "pycryptodome-3.21.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:a915597ffccabe902e7090e199a7bf7a381c5506a747d5e9d27ba55197a2c568"}, + {file = "pycryptodome-3.21.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e74c522d630766b03a836c15bff77cb657c5fdf098abf8b1ada2aebc7d0819"}, + {file = "pycryptodome-3.21.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:a3804675283f4764a02db05f5191eb8fec2bb6ca34d466167fc78a5f05bbe6b3"}, + {file = "pycryptodome-3.21.0-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2480ec2c72438430da9f601ebc12c518c093c13111a5c1644c82cdfc2e50b1e4"}, + {file = "pycryptodome-3.21.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:de18954104667f565e2fbb4783b56667f30fb49c4d79b346f52a29cb198d5b6b"}, + {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de4b7263a33947ff440412339cb72b28a5a4c769b5c1ca19e33dd6cd1dcec6e"}, + {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0714206d467fc911042d01ea3a1847c847bc10884cf674c82e12915cfe1649f8"}, + {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d85c1b613121ed3dbaa5a97369b3b757909531a959d229406a75b912dd51dd1"}, + {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8898a66425a57bcf15e25fc19c12490b87bd939800f39a03ea2de2aea5e3611a"}, + {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_i686.whl", hash = "sha256:932c905b71a56474bff8a9c014030bc3c882cee696b448af920399f730a650c2"}, + {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:18caa8cfbc676eaaf28613637a89980ad2fd96e00c564135bf90bc3f0b34dd93"}, + {file = "pycryptodome-3.21.0-cp36-abi3-win32.whl", hash = "sha256:280b67d20e33bb63171d55b1067f61fbd932e0b1ad976b3a184303a3dad22764"}, + {file = "pycryptodome-3.21.0-cp36-abi3-win_amd64.whl", hash = "sha256:b7aa25fc0baa5b1d95b7633af4f5f1838467f1815442b22487426f94e0d66c53"}, + {file = "pycryptodome-3.21.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2cb635b67011bc147c257e61ce864879ffe6d03342dc74b6045059dfbdedafca"}, + {file = "pycryptodome-3.21.0-pp27-pypy_73-win32.whl", hash = "sha256:4c26a2f0dc15f81ea3afa3b0c87b87e501f235d332b7f27e2225ecb80c0b1cdd"}, + {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d5ebe0763c982f069d3877832254f64974139f4f9655058452603ff559c482e8"}, + {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ee86cbde706be13f2dec5a42b52b1c1d1cbb90c8e405c68d0755134735c8dc6"}, + {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fd54003ec3ce4e0f16c484a10bc5d8b9bd77fa662a12b85779a2d2d85d67ee0"}, + {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5dfafca172933506773482b0e18f0cd766fd3920bd03ec85a283df90d8a17bc6"}, + {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:590ef0898a4b0a15485b05210b4a1c9de8806d3ad3d47f74ab1dc07c67a6827f"}, + {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35e442630bc4bc2e1878482d6f59ea22e280d7121d7adeaedba58c23ab6386b"}, + {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff99f952db3db2fbe98a0b355175f93ec334ba3d01bbde25ad3a5a33abc02b58"}, + {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8acd7d34af70ee63f9a849f957558e49a98f8f1634f86a59d2be62bb8e93f71c"}, + {file = "pycryptodome-3.21.0.tar.gz", hash = "sha256:f7787e0d469bdae763b876174cf2e6c0f7be79808af26b1da96f1a64bcf47297"}, +] + +[[package]] +name = "pydantic" +version = "2.10.3" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.10.3-py3-none-any.whl", hash = "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d"}, + {file = "pydantic-2.10.3.tar.gz", hash = "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.27.1" +typing-extensions = ">=4.12.2" + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] + +[[package]] +name = "pydantic-core" +version = "2.27.1" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a"}, + {file = "pydantic_core-2.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206"}, + {file = "pydantic_core-2.27.1-cp310-none-win32.whl", hash = "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c"}, + {file = "pydantic_core-2.27.1-cp310-none-win_amd64.whl", hash = "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17"}, + {file = "pydantic_core-2.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8"}, + {file = "pydantic_core-2.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc"}, + {file = "pydantic_core-2.27.1-cp311-none-win32.whl", hash = "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9"}, + {file = "pydantic_core-2.27.1-cp311-none-win_amd64.whl", hash = "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5"}, + {file = "pydantic_core-2.27.1-cp311-none-win_arm64.whl", hash = "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89"}, + {file = "pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f"}, + {file = "pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae"}, + {file = "pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c"}, + {file = "pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16"}, + {file = "pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e"}, + {file = "pydantic_core-2.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073"}, + {file = "pydantic_core-2.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23"}, + {file = "pydantic_core-2.27.1-cp313-none-win32.whl", hash = "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05"}, + {file = "pydantic_core-2.27.1-cp313-none-win_amd64.whl", hash = "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337"}, + {file = "pydantic_core-2.27.1-cp313-none-win_arm64.whl", hash = "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5"}, + {file = "pydantic_core-2.27.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62"}, + {file = "pydantic_core-2.27.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b"}, + {file = "pydantic_core-2.27.1-cp38-none-win32.whl", hash = "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618"}, + {file = "pydantic_core-2.27.1-cp38-none-win_amd64.whl", hash = "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4"}, + {file = "pydantic_core-2.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967"}, + {file = "pydantic_core-2.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131"}, + {file = "pydantic_core-2.27.1-cp39-none-win32.whl", hash = "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3"}, + {file = "pydantic_core-2.27.1-cp39-none-win_amd64.whl", hash = "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840"}, + {file = "pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[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 = "pynacl" +version = "1.5.0" +description = "Python binding to the Networking and Cryptography (NaCl) library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, + {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, +] + +[package.dependencies] +cffi = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] + +[[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-levenshtein" +version = "0.26.1" +description = "Python extension for computing string edit distances and similarities." +optional = false +python-versions = ">=3.9" +files = [ + {file = "python_Levenshtein-0.26.1-py3-none-any.whl", hash = "sha256:8ef5e529dd640fb00f05ee62d998d2ee862f19566b641ace775d5ae16167b2ef"}, + {file = "python_levenshtein-0.26.1.tar.gz", hash = "sha256:24ba578e28058ebb4afa2700057e1678d7adf27e43cd1f17700c09a9009d5d3a"}, +] + +[package.dependencies] +Levenshtein = "0.26.1" + +[[package]] +name = "python-statemachine" +version = "2.5.0" +description = "Python Finite State Machines made easy." +optional = false +python-versions = ">=3.7" +files = [ + {file = "python_statemachine-2.5.0-py3-none-any.whl", hash = "sha256:0ed53846802c17037fcb2a92323f4bc0c833290fa9d17a3587c50886c1541e62"}, + {file = "python_statemachine-2.5.0.tar.gz", hash = "sha256:ae88cd22e47930b92b983a2176e61d811e571b69897be2568ec812c2885fb93a"}, +] + +[package.extras] +diagrams = ["pydot (>=2.0.0)"] + +[[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 = "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 = "rapidfuzz" +version = "3.10.1" +description = "rapid fuzzy string matching" +optional = false +python-versions = ">=3.9" +files = [ + {file = "rapidfuzz-3.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f17d9f21bf2f2f785d74f7b0d407805468b4c173fa3e52c86ec94436b338e74a"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b31f358a70efc143909fb3d75ac6cd3c139cd41339aa8f2a3a0ead8315731f2b"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4f43f2204b56a61448ec2dd061e26fd344c404da99fb19f3458200c5874ba2"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d81bf186a453a2757472133b24915768abc7c3964194406ed93e170e16c21cb"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3611c8f45379a12063d70075c75134f2a8bd2e4e9b8a7995112ddae95ca1c982"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c3b537b97ac30da4b73930fa8a4fe2f79c6d1c10ad535c5c09726612cd6bed9"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:231ef1ec9cf7b59809ce3301006500b9d564ddb324635f4ea8f16b3e2a1780da"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed4f3adc1294834955b7e74edd3c6bd1aad5831c007f2d91ea839e76461a5879"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7b6015da2e707bf632a71772a2dbf0703cff6525732c005ad24987fe86e8ec32"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1b35a118d61d6f008e8e3fb3a77674d10806a8972c7b8be433d6598df4d60b01"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bc308d79a7e877226f36bdf4e149e3ed398d8277c140be5c1fd892ec41739e6d"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f017dbfecc172e2d0c37cf9e3d519179d71a7f16094b57430dffc496a098aa17"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-win32.whl", hash = "sha256:36c0e1483e21f918d0f2f26799fe5ac91c7b0c34220b73007301c4f831a9c4c7"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:10746c1d4c8cd8881c28a87fd7ba0c9c102346dfe7ff1b0d021cdf093e9adbff"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-win_arm64.whl", hash = "sha256:dfa64b89dcb906835e275187569e51aa9d546a444489e97aaf2cc84011565fbe"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:92958ae075c87fef393f835ed02d4fe8d5ee2059a0934c6c447ea3417dfbf0e8"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba7521e072c53e33c384e78615d0718e645cab3c366ecd3cc8cb732befd94967"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d02cbd75d283c287471b5b3738b3e05c9096150f93f2d2dfa10b3d700f2db9"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efa1582a397da038e2f2576c9cd49b842f56fde37d84a6b0200ffebc08d82350"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f12912acee1f506f974f58de9fdc2e62eea5667377a7e9156de53241c05fdba8"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666d5d8b17becc3f53447bcb2b6b33ce6c2df78792495d1fa82b2924cd48701a"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26f71582c0d62445067ee338ddad99b655a8f4e4ed517a90dcbfbb7d19310474"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8a2ef08b27167bcff230ffbfeedd4c4fa6353563d6aaa015d725dd3632fc3de7"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:365e4fc1a2b95082c890f5e98489b894e6bf8c338c6ac89bb6523c2ca6e9f086"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1996feb7a61609fa842e6b5e0c549983222ffdedaf29644cc67e479902846dfe"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:cf654702f144beaa093103841a2ea6910d617d0bb3fccb1d1fd63c54dde2cd49"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec108bf25de674781d0a9a935030ba090c78d49def3d60f8724f3fc1e8e75024"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-win32.whl", hash = "sha256:031f8b367e5d92f7a1e27f7322012f3c321c3110137b43cc3bf678505583ef48"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:f98f36c6a1bb9a6c8bbec99ad87c8c0e364f34761739b5ea9adf7b48129ae8cf"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-win_arm64.whl", hash = "sha256:f1da2028cb4e41be55ee797a82d6c1cf589442504244249dfeb32efc608edee7"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1340b56340896bede246f612b6ecf685f661a56aabef3d2512481bfe23ac5835"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2316515169b7b5a453f0ce3adbc46c42aa332cae9f2edb668e24d1fc92b2f2bb"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e06fe6a12241ec1b72c0566c6b28cda714d61965d86569595ad24793d1ab259"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d99c1cd9443b19164ec185a7d752f4b4db19c066c136f028991a480720472e23"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1d9aa156ed52d3446388ba4c2f335e312191d1ca9d1f5762ee983cf23e4ecf6"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54bcf4efaaee8e015822be0c2c28214815f4f6b4f70d8362cfecbd58a71188ac"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0c955e32afdbfdf6e9ee663d24afb25210152d98c26d22d399712d29a9b976b"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:191633722203f5b7717efcb73a14f76f3b124877d0608c070b827c5226d0b972"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:195baad28057ec9609e40385991004e470af9ef87401e24ebe72c064431524ab"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0fff4a6b87c07366662b62ae994ffbeadc472e72f725923f94b72a3db49f4671"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4ffed25f9fdc0b287f30a98467493d1e1ce5b583f6317f70ec0263b3c97dbba6"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d02cf8e5af89a9ac8f53c438ddff6d773f62c25c6619b29db96f4aae248177c0"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-win32.whl", hash = "sha256:f3bb81d4fe6a5d20650f8c0afcc8f6e1941f6fecdb434f11b874c42467baded0"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:aaf83e9170cb1338922ae42d320699dccbbdca8ffed07faeb0b9257822c26e24"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:c5da802a0d085ad81b0f62828fb55557996c497b2d0b551bbdfeafd6d447892f"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fc22d69a1c9cccd560a5c434c0371b2df0f47c309c635a01a913e03bbf183710"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38b0dac2c8e057562b8f0d8ae5b663d2d6a28c5ab624de5b73cef9abb6129a24"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fde3bbb14e92ce8fcb5c2edfff72e474d0080cadda1c97785bf4822f037a309"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9141fb0592e55f98fe9ac0f3ce883199b9c13e262e0bf40c5b18cdf926109d16"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:237bec5dd1bfc9b40bbd786cd27949ef0c0eb5fab5eb491904c6b5df59d39d3c"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18123168cba156ab5794ea6de66db50f21bb3c66ae748d03316e71b27d907b95"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b75fe506c8e02769cc47f5ab21ce3e09b6211d3edaa8f8f27331cb6988779be"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da82aa4b46973aaf9e03bb4c3d6977004648c8638febfc0f9d237e865761270"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c34c022d5ad564f1a5a57a4a89793bd70d7bad428150fb8ff2760b223407cdcf"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e96c84d6c2a0ca94e15acb5399118fff669f4306beb98a6d8ec6f5dccab4412"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e8e154b84a311263e1aca86818c962e1fa9eefdd643d1d5d197fcd2738f88cb9"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:335fee93188f8cd585552bb8057228ce0111bd227fa81bfd40b7df6b75def8ab"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-win32.whl", hash = "sha256:6729b856166a9e95c278410f73683957ea6100c8a9d0a8dbe434c49663689255"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:0e06d99ad1ad97cb2ef7f51ec6b1fedd74a3a700e4949353871cf331d07b382a"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:8d1b7082104d596a3eb012e0549b2634ed15015b569f48879701e9d8db959dbb"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:779027d3307e1a2b1dc0c03c34df87a470a368a1a0840a9d2908baf2d4067956"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:440b5608ab12650d0390128d6858bc839ae77ffe5edf0b33a1551f2fa9860651"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82cac41a411e07a6f3dc80dfbd33f6be70ea0abd72e99c59310819d09f07d945"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:958473c9f0bca250590200fd520b75be0dbdbc4a7327dc87a55b6d7dc8d68552"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ef60dfa73749ef91cb6073be1a3e135f4846ec809cc115f3cbfc6fe283a5584"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7fbac18f2c19fc983838a60611e67e3262e36859994c26f2ee85bb268de2355"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a0d519ff39db887cd73f4e297922786d548f5c05d6b51f4e6754f452a7f4296"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bebb7bc6aeb91cc57e4881b222484c26759ca865794187217c9dcea6c33adae6"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe07f8b9c3bb5c5ad1d2c66884253e03800f4189a60eb6acd6119ebaf3eb9894"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:bfa48a4a2d45a41457f0840c48e579db157a927f4e97acf6e20df8fc521c79de"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2cf44d01bfe8ee605b7eaeecbc2b9ca64fc55765f17b304b40ed8995f69d7716"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e6bbca9246d9eedaa1c84e04a7f555493ba324d52ae4d9f3d9ddd1b740dcd87"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-win32.whl", hash = "sha256:567f88180f2c1423b4fe3f3ad6e6310fc97b85bdba574801548597287fc07028"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:6b2cd7c29d6ecdf0b780deb587198f13213ac01c430ada6913452fd0c40190fc"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-win_arm64.whl", hash = "sha256:9f912d459e46607ce276128f52bea21ebc3e9a5ccf4cccfef30dd5bddcf47be8"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ac4452f182243cfab30ba4668ef2de101effaedc30f9faabb06a095a8c90fd16"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:565c2bd4f7d23c32834652b27b51dd711814ab614b4e12add8476be4e20d1cf5"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:187d9747149321607be4ccd6f9f366730078bed806178ec3eeb31d05545e9e8f"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:616290fb9a8fa87e48cb0326d26f98d4e29f17c3b762c2d586f2b35c1fd2034b"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:073a5b107e17ebd264198b78614c0206fa438cce749692af5bc5f8f484883f50"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39c4983e2e2ccb9732f3ac7d81617088822f4a12291d416b09b8a1eadebb3e29"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ac7adee6bcf0c6fee495d877edad1540a7e0f5fc208da03ccb64734b43522d7a"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:425f4ac80b22153d391ee3f94bc854668a0c6c129f05cf2eaf5ee74474ddb69e"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65a2fa13e8a219f9b5dcb9e74abe3ced5838a7327e629f426d333dfc8c5a6e66"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75561f3df9a906aaa23787e9992b228b1ab69007932dc42070f747103e177ba8"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:edd062490537e97ca125bc6c7f2b7331c2b73d21dc304615afe61ad1691e15d5"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfcc8feccf63245a22dfdd16e222f1a39771a44b870beb748117a0e09cbb4a62"}, + {file = "rapidfuzz-3.10.1.tar.gz", hash = "sha256:5a15546d847a915b3f42dc79ef9b0c78b998b4e2c53b252e7166284066585979"}, +] + +[package.extras] +all = ["numpy"] + +[[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 = "resolvelib" +version = "1.0.1" +description = "Resolve abstract dependencies into concrete ones" +optional = false +python-versions = "*" +files = [ + {file = "resolvelib-1.0.1-py2.py3-none-any.whl", hash = "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf"}, + {file = "resolvelib-1.0.1.tar.gz", hash = "sha256:04ce76cbd63fded2078ce224785da6ecd42b9564b1390793f64ddecbe997b309"}, +] + +[package.extras] +examples = ["html5lib", "packaging", "pygraphviz", "requests"] +lint = ["black", "flake8", "isort", "mypy", "types-requests"] +release = ["build", "towncrier", "twine"] +test = ["commentjson", "packaging", "pytest"] + +[[package]] +name = "retry" +version = "0.9.2" +description = "Easy to use retry decorator." +optional = false +python-versions = "*" +files = [ + {file = "retry-0.9.2-py2.py3-none-any.whl", hash = "sha256:ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606"}, + {file = "retry-0.9.2.tar.gz", hash = "sha256:f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4"}, +] + +[package.dependencies] +decorator = ">=3.4.2" +py = ">=1.4.26,<2.0.0" + +[[package]] +name = "rich" +version = "13.9.4" +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.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, + {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" +typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.11\""} + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "ruamel-yaml" +version = "0.18.6" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruamel.yaml-0.18.6-py3-none-any.whl", hash = "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636"}, + {file = "ruamel.yaml-0.18.6.tar.gz", hash = "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b"}, +] + +[package.dependencies] +"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} + +[package.extras] +docs = ["mercurial (>5.7)", "ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.12" +description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:11f891336688faf5156a36293a9c362bdc7c88f03a8a027c2c1d8e0bcde998e5"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd5415dded15c3822597455bc02bcd66e81ef8b7a48cb71a33628fc9fdde39df"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win32.whl", hash = "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fc4b630cd3fa2cf7fce38afa91d7cfe844a9f75d7f0f36393fa98815e911d987"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bc5f1e1c28e966d61d2519f2a3d451ba989f9ea0f2307de7bc45baa526de9e45"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a0e060aace4c24dcaf71023bbd7d42674e3b230f7e7b97317baf1e953e5b519"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2f1c3765db32be59d18ab3953f43ab62a761327aafc1594a2a1fbe038b8b8a7"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d85252669dc32f98ebcd5d36768f5d4faeaeaa2d655ac0473be490ecdae3c285"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e143ada795c341b56de9418c58d028989093ee611aa27ffb9b7f609c00d813ed"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win32.whl", hash = "sha256:beffaed67936fbbeffd10966a4eb53c402fafd3d6833770516bf7314bc6ffa12"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win_amd64.whl", hash = "sha256:040ae85536960525ea62868b642bdb0c2cc6021c9f9d507810c0c604e66f5a7b"}, + {file = "ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f"}, +] + +[[package]] +name = "scalecodec" +version = "1.2.11" +description = "Python SCALE Codec Library" +optional = false +python-versions = "<4,>=3.6" +files = [ + {file = "scalecodec-1.2.11-py3-none-any.whl", hash = "sha256:d15c94965f617caa25096f83a45f5f73031d05e6ee08d6039969f0a64fc35de1"}, + {file = "scalecodec-1.2.11.tar.gz", hash = "sha256:99a2cdbfccdcaf22bd86b86da55a730a2855514ad2309faef4a4a93ac6cbeb8d"}, +] + +[package.dependencies] +base58 = ">=2.0.1" +more-itertools = "*" +requests = ">=2.24.0" + +[package.extras] +test = ["coverage", "pytest"] + +[[package]] +name = "sentry-sdk" +version = "2.19.2" +description = "Python client for Sentry (https://sentry.io)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sentry_sdk-2.19.2-py2.py3-none-any.whl", hash = "sha256:ebdc08228b4d131128e568d696c210d846e5b9d70aa0327dec6b1272d9d40b84"}, + {file = "sentry_sdk-2.19.2.tar.gz", hash = "sha256:467df6e126ba242d39952375dd816fbee0f217d119bf454a8ce74cf1e7909e8d"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.26.11" + +[package.extras] +aiohttp = ["aiohttp (>=3.5)"] +anthropic = ["anthropic (>=0.16)"] +arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] +beam = ["apache-beam (>=2.12)"] +bottle = ["bottle (>=0.12.13)"] +celery = ["celery (>=3)"] +celery-redbeat = ["celery-redbeat (>=2)"] +chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] +django = ["django (>=1.8)"] +falcon = ["falcon (>=1.4)"] +fastapi = ["fastapi (>=0.79.0)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] +http2 = ["httpcore[http2] (==1.*)"] +httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +huggingface-hub = ["huggingface_hub (>=0.22)"] +langchain = ["langchain (>=0.0.210)"] +launchdarkly = ["launchdarkly-server-sdk (>=9.8.0)"] +litestar = ["litestar (>=2.0.0)"] +loguru = ["loguru (>=0.5)"] +openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] +openfeature = ["openfeature-sdk (>=0.7.1)"] +opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro"] +pure-eval = ["asttokens", "executing", "pure_eval"] +pymongo = ["pymongo (>=3.1)"] +pyspark = ["pyspark (>=2.4.4)"] +quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] +rq = ["rq (>=0.6)"] +sanic = ["sanic (>=0.8)"] +sqlalchemy = ["sqlalchemy (>=1.2)"] +starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] +tornado = ["tornado (>=6)"] + +[[package]] +name = "setproctitle" +version = "1.3.4" +description = "A Python module to customize the process title" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setproctitle-1.3.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0f6661a69c68349172ba7b4d5dd65fec2b0917abc99002425ad78c3e58cf7595"}, + {file = "setproctitle-1.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:754bac5e470adac7f7ec2239c485cd0b75f8197ca8a5b86ffb20eb3a3676cc42"}, + {file = "setproctitle-1.3.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7bc7088c15150745baf66db62a4ced4507d44419eb66207b609f91b64a682af"}, + {file = "setproctitle-1.3.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a46ef3ecf61e4840fbc1145fdd38acf158d0da7543eda7b773ed2b30f75c2830"}, + {file = "setproctitle-1.3.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcb09d5c0ffa043254ec9a734a73f3791fec8bf6333592f906bb2e91ed2af1a"}, + {file = "setproctitle-1.3.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06c16b7a91cdc5d700271899e4383384a61aae83a3d53d0e2e5a266376083342"}, + {file = "setproctitle-1.3.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9f9732e59863eaeedd3feef94b2b216cb86d40dda4fad2d0f0aaec3b31592716"}, + {file = "setproctitle-1.3.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e152f4ab9ea1632b5fecdd87cee354f2b2eb6e2dfc3aceb0eb36a01c1e12f94c"}, + {file = "setproctitle-1.3.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:020ea47a79b2bbd7bd7b94b85ca956ba7cb026e82f41b20d2e1dac4008cead25"}, + {file = "setproctitle-1.3.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8c52b12b10e4057fc302bd09cb3e3f28bb382c30c044eb3396e805179a8260e4"}, + {file = "setproctitle-1.3.4-cp310-cp310-win32.whl", hash = "sha256:a65a147f545f3fac86f11acb2d0b316d3e78139a9372317b7eb50561b2817ba0"}, + {file = "setproctitle-1.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:66821fada6426998762a3650a37fba77e814a249a95b1183011070744aff47f6"}, + {file = "setproctitle-1.3.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0f749f07002c2d6fecf37cedc43207a88e6c651926a470a5f229070cf791879"}, + {file = "setproctitle-1.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:90ea8d302a5d30b948451d146e94674a3c5b020cc0ced9a1c28f8ddb0f203a5d"}, + {file = "setproctitle-1.3.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f859c88193ed466bee4eb9d45fbc29d2253e6aa3ccd9119c9a1d8d95f409a60d"}, + {file = "setproctitle-1.3.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b3afa5a0ed08a477ded239c05db14c19af585975194a00adf594d48533b23701"}, + {file = "setproctitle-1.3.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a78fce9018cc3e9a772b6537bbe3fe92380acf656c9f86db2f45e685af376e"}, + {file = "setproctitle-1.3.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d758e2eed2643afac5f2881542fbb5aa97640b54be20d0a5ed0691d02f0867d"}, + {file = "setproctitle-1.3.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ef133a1a2ee378d549048a12d56f4ef0e2b9113b0b25b6b77821e9af94d50634"}, + {file = "setproctitle-1.3.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1d2a154b79d5fb42d1eff06e05e22f0e8091261d877dd47b37d31352b74ecc37"}, + {file = "setproctitle-1.3.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:202eae632815571297833876a0f407d0d9c7ad9d843b38adbe687fe68c5192ee"}, + {file = "setproctitle-1.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2b0080819859e80a7776ac47cf6accb4b7ad313baf55fabac89c000480dcd103"}, + {file = "setproctitle-1.3.4-cp311-cp311-win32.whl", hash = "sha256:9c9d7d1267dee8c6627963d9376efa068858cfc8f573c083b1b6a2d297a8710f"}, + {file = "setproctitle-1.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:475986ddf6df65d619acd52188336a20f616589403f5a5ceb3fc70cdc137037a"}, + {file = "setproctitle-1.3.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d06990dcfcd41bb3543c18dd25c8476fbfe1f236757f42fef560f6aa03ac8dfc"}, + {file = "setproctitle-1.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:317218c9d8b17a010ab2d2f0851e8ef584077a38b1ba2b7c55c9e44e79a61e73"}, + {file = "setproctitle-1.3.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb5fefb53b9d9f334a5d9ec518a36b92a10b936011ac8a6b6dffd60135f16459"}, + {file = "setproctitle-1.3.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0855006261635e8669646c7c304b494b6df0a194d2626683520103153ad63cc9"}, + {file = "setproctitle-1.3.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a88e466fcaee659679c1d64dcb2eddbcb4bfadffeb68ba834d9c173a25b6184"}, + {file = "setproctitle-1.3.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f963b6ed8ba33eda374a98d979e8a0eaf21f891b6e334701693a2c9510613c4c"}, + {file = "setproctitle-1.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:122c2e05697fa91f5d23f00bbe98a9da1bd457b32529192e934095fadb0853f1"}, + {file = "setproctitle-1.3.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:1bba0a866f5895d5b769d8c36b161271c7fd407e5065862ab80ff91c29fbe554"}, + {file = "setproctitle-1.3.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:97f1f861998e326e640708488c442519ad69046374b2c3fe9bcc9869b387f23c"}, + {file = "setproctitle-1.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:726aee40357d4bdb70115442cb85ccc8e8bc554fc0bbbaa3a57cbe81df42287d"}, + {file = "setproctitle-1.3.4-cp312-cp312-win32.whl", hash = "sha256:04d6ba8b816dbb0bfd62000b0c3e583160893e6e8c4233e1dca1a9ae4d95d924"}, + {file = "setproctitle-1.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:9c76e43cb351ba8887371240b599925cdf3ecececc5dfb7125c71678e7722c55"}, + {file = "setproctitle-1.3.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d6e3b177e634aa6bbbfbf66d097b6d1cdb80fc60e912c7d8bace2e45699c07dd"}, + {file = "setproctitle-1.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6b17655a5f245b416e127e02087ea6347a48821cc4626bc0fd57101bfcd88afc"}, + {file = "setproctitle-1.3.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa5057a86df920faab8ee83960b724bace01a3231eb8e3f2c93d78283504d598"}, + {file = "setproctitle-1.3.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149fdfb8a26a555780c4ce53c92e6d3c990ef7b30f90a675eca02e83c6d5f76d"}, + {file = "setproctitle-1.3.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ded03546938a987f463c68ab98d683af87a83db7ac8093bbc179e77680be5ba2"}, + {file = "setproctitle-1.3.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ab9f5b7f2bbc1754bc6292d9a7312071058e5a891b0391e6d13b226133f36aa"}, + {file = "setproctitle-1.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0b19813c852566fa031902124336fa1f080c51e262fc90266a8c3d65ca47b74c"}, + {file = "setproctitle-1.3.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:db78b645dc63c0ccffca367a498f3b13492fb106a2243a1e998303ba79c996e2"}, + {file = "setproctitle-1.3.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b669aaac70bd9f03c070270b953f78d9ee56c4af6f0ff9f9cd3e6d1878c10b40"}, + {file = "setproctitle-1.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6dc3d656702791565994e64035a208be56b065675a5bc87b644c657d6d9e2232"}, + {file = "setproctitle-1.3.4-cp313-cp313-win32.whl", hash = "sha256:091f682809a4d12291cf0205517619d2e7014986b7b00ebecfde3d76f8ae5a8f"}, + {file = "setproctitle-1.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:adcd6ba863a315702184d92d3d3bbff290514f24a14695d310f02ae5e28bd1f7"}, + {file = "setproctitle-1.3.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:acf41cf91bbc5a36d1fa4455a818bb02bf2a4ccfed2f892ba166ba2fcbb0ec8a"}, + {file = "setproctitle-1.3.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ceb3ce3262b0e8e088e4117175591b7a82b3bdc5e52e33b1e74778b5fb53fd38"}, + {file = "setproctitle-1.3.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b2ef636a6a25fe7f3d5a064bea0116b74a4c8c7df9646b17dc7386c439a26cf"}, + {file = "setproctitle-1.3.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28b8614de08679ae95bc4e8d6daaef6b61afdf027fa0d23bf13d619000286b3c"}, + {file = "setproctitle-1.3.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24f3c8be826a7d44181eac2269b15b748b76d98cd9a539d4c69f09321dcb5c12"}, + {file = "setproctitle-1.3.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc9d79b1bf833af63b7c720a6604eb16453ac1ad4e718eb8b59d1f97d986b98c"}, + {file = "setproctitle-1.3.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fb693000b65842c85356b667d057ae0d0bac6519feca7e1c437cc2cfeb0afc59"}, + {file = "setproctitle-1.3.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a166251b8fbc6f2755e2ce9d3c11e9edb0c0c7d2ed723658ff0161fbce26ac1c"}, + {file = "setproctitle-1.3.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:0361428e6378911a378841509c56ba472d991cbed1a7e3078ec0cacc103da44a"}, + {file = "setproctitle-1.3.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:62d66e0423e3bd520b4c897063506b309843a8d07343fbfad04197e91a4edd28"}, + {file = "setproctitle-1.3.4-cp38-cp38-win32.whl", hash = "sha256:5edd01909348f3b0b2da329836d6b5419cd4869fec2e118e8ff3275b38af6267"}, + {file = "setproctitle-1.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:59e0dda9ad245921af0328035a961767026e1fa94bb65957ab0db0a0491325d6"}, + {file = "setproctitle-1.3.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bdaaa81a6e95a0a19fba0285f10577377f3503ae4e9988b403feba79da3e2f80"}, + {file = "setproctitle-1.3.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ee5b19a2d794463bcc19153dfceede7beec784b4cf7967dec0bc0fc212ab3a3"}, + {file = "setproctitle-1.3.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3058a1bb0c767b3a6ccbb38b27ef870af819923eb732e21e44a3f300370fe159"}, + {file = "setproctitle-1.3.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a97d37ee4fe0d1c6e87d2a97229c27a88787a8f4ebfbdeee95f91b818e52efe"}, + {file = "setproctitle-1.3.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e61dd7d05da11fc69bb86d51f1e0ee08f74dccf3ecf884c94de41135ffdc75d"}, + {file = "setproctitle-1.3.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eb115d53dc2a1299ae72f1119c96a556db36073bacb6da40c47ece5db0d9587"}, + {file = "setproctitle-1.3.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:342570716e2647a51ea859b8a9126da9dc1a96a0153c9c0a3514effd60ab57ad"}, + {file = "setproctitle-1.3.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0ad212ae2b03951367a69584af034579b34e1e4199a75d377ef9f8e08ee299b1"}, + {file = "setproctitle-1.3.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4afcb38e22122465013f4621b7e9ff8d42a7a48ae0ffeb94133a806cb91b4aad"}, + {file = "setproctitle-1.3.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:30bb223e6c3f95ad9e9bb2a113292759e947d1cfd60dbd4adb55851c370006b2"}, + {file = "setproctitle-1.3.4-cp39-cp39-win32.whl", hash = "sha256:5f0521ed3bb9f02e9486573ea95e2062cd6bf036fa44e640bd54a06f22d85f35"}, + {file = "setproctitle-1.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:0baadeb27f9e97e65922b4151f818b19c311d30b9efdb62af0e53b3db4006ce2"}, + {file = "setproctitle-1.3.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:939d364a187b2adfbf6ae488664277e717d56c7951a4ddeb4f23b281bc50bfe5"}, + {file = "setproctitle-1.3.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb8a6a19be0cbf6da6fcbf3698b76c8af03fe83e4bd77c96c3922be3b88bf7da"}, + {file = "setproctitle-1.3.4-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:779006f9e1aade9522a40e8d9635115ab15dd82b7af8e655967162e9c01e2573"}, + {file = "setproctitle-1.3.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5519f2a7b8c535b0f1f77b30441476571373add72008230c81211ee17b423b57"}, + {file = "setproctitle-1.3.4-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:743836d484151334ebba1490d6907ca9e718fe815dcd5756f2a01bc3067d099c"}, + {file = "setproctitle-1.3.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abda20aff8d1751e48d7967fa8945fef38536b82366c49be39b83678d4be3893"}, + {file = "setproctitle-1.3.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a2041b5788ce52f218b5be94af458e04470f997ab46fdebd57cf0b8374cc20e"}, + {file = "setproctitle-1.3.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2c3b1ce68746557aa6e6f4547e76883925cdc7f8d7c7a9f518acd203f1265ca5"}, + {file = "setproctitle-1.3.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0b6a4cbabf024cb263a45bdef425760f14470247ff223f0ec51699ca9046c0fe"}, + {file = "setproctitle-1.3.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e55d7ecc68bdc80de5a553691a3ed260395d5362c19a266cf83cbb4e046551f"}, + {file = "setproctitle-1.3.4-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02ca3802902d91a89957f79da3ec44b25b5804c88026362cb85eea7c1fbdefd1"}, + {file = "setproctitle-1.3.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:47669fc8ed8b27baa2d698104732234b5389f6a59c37c046f6bcbf9150f7a94e"}, + {file = "setproctitle-1.3.4.tar.gz", hash = "sha256:3b40d32a3e1f04e94231ed6dfee0da9e43b4f9c6b5450d53e6dd7754c34e0c50"}, +] + +[package.extras] +test = ["pytest"] + +[[package]] +name = "setuptools" +version = "70.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-70.0.0-py3-none-any.whl", hash = "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4"}, + {file = "setuptools-70.0.0.tar.gz", hash = "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "shtab" +version = "1.6.5" +description = "Automagic shell tab completion for Python CLI applications" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shtab-1.6.5-py3-none-any.whl", hash = "sha256:3c7be25ab65a324ed41e9c2964f2146236a5da6e6a247355cfea56f65050f220"}, + {file = "shtab-1.6.5.tar.gz", hash = "sha256:cf4ab120183e84cce041abeb6f620f9560739741dfc31dd466315550c08be9ec"}, +] + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[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 = "soupsieve" +version = "2.6" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, +] + +[[package]] +name = "starlette" +version = "0.37.2" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.8" +files = [ + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] + +[[package]] +name = "substrate-interface" +version = "1.7.11" +description = "Library for interfacing with a Substrate node" +optional = false +python-versions = "<4,>=3.7" +files = [ + {file = "substrate-interface-1.7.11.tar.gz", hash = "sha256:4caa5eacb9996edbe76ad12249521b3542bbd8d9d69b96734087201db1fef8f6"}, + {file = "substrate_interface-1.7.11-py3-none-any.whl", hash = "sha256:ce19bc97481769238ed23c752db985a3058637918693f2db6aeed2fab3756075"}, +] + +[package.dependencies] +base58 = ">=1.0.3,<3" +certifi = ">=2019.3.9" +ecdsa = ">=0.17.0,<1" +eth-keys = ">=0.2.1,<1" +eth-utils = ">=1.3.0,<6" +idna = ">=2.1.0,<4" +py-bip39-bindings = ">=0.1.9,<1" +py-ed25519-zebra-bindings = ">=1.0,<2" +py-sr25519-bindings = ">=0.2.0,<1" +pycryptodome = ">=3.11.0,<4" +PyNaCl = ">=1.0.1,<2" +requests = ">=2.21.0,<3" +scalecodec = ">=1.2.10,<1.3" +websocket-client = ">=0.57.0,<2" +xxhash = ">=1.3.0,<4" + +[package.extras] +test = ["coverage", "pytest"] + +[[package]] +name = "tensorboard" +version = "2.17.1" +description = "TensorBoard lets you watch Tensors Flow" +optional = false +python-versions = ">=3.9" +files = [ + {file = "tensorboard-2.17.1-py3-none-any.whl", hash = "sha256:253701a224000eeca01eee6f7e978aea7b408f60b91eb0babdb04e78947b773e"}, +] + +[package.dependencies] +absl-py = ">=0.4" +grpcio = ">=1.48.2" +markdown = ">=2.6.8" +numpy = ">=1.12.0" +packaging = "*" +protobuf = ">=3.19.6,<4.24.0 || >4.24.0" +setuptools = ">=41.0.0" +six = ">1.9" +tensorboard-data-server = ">=0.7.0,<0.8.0" +werkzeug = ">=1.0.1" + +[[package]] +name = "tensorboard-data-server" +version = "0.7.2" +description = "Fast data loading for TensorBoard" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb"}, + {file = "tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60"}, + {file = "tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530"}, +] + +[[package]] +name = "tensorflow" +version = "2.17.0" +description = "TensorFlow is an open source machine learning framework for everyone." +optional = false +python-versions = ">=3.9" +files = [ + {file = "tensorflow-2.17.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:515fe5ae8a9bc50312575412b08515f3ca66514c155078e0707bdffbea75d783"}, + {file = "tensorflow-2.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b36683ac28af20abc3a548c72bf4537b00df1b1f3dd39d59df3873fefaf26f15"}, + {file = "tensorflow-2.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:147c93ded4cb7e500a65d3c26d74744ff41660db7a8afe2b00d1d08bf329b4ec"}, + {file = "tensorflow-2.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46090587f69e33637d17d7c3d94a790cac7d4bc5ff5ecbf3e71fdc6982fe96e"}, + {file = "tensorflow-2.17.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e8d26d6c24ccfb139db1306599257ca8f5cfe254ef2d023bfb667f374a17a64d"}, + {file = "tensorflow-2.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca82f98ea38fa6c9e08ccc69eb6c2fab5b35b30a8999115b8b63b6f02fc69d9d"}, + {file = "tensorflow-2.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8339777b1b5ebd8ffadaa8196f786e65fbb081a371d8e87b52f24563392d8552"}, + {file = "tensorflow-2.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:ef615c133cf4d592a073feda634ccbeb521a554be57de74f8c318d38febbeab5"}, + {file = "tensorflow-2.17.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ee18b4fcd627c5e872eabb25092af6c808b6ec77948662c88fc5c89a60eb0211"}, + {file = "tensorflow-2.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72adfef0ee39dd641627906fd7b244fcf21bdd8a87216a998ed74d9c74653aff"}, + {file = "tensorflow-2.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ad7bfea6afb4ded3928ca5b24df9fda876cea4904c103a5163fcc0c3483e7a4"}, + {file = "tensorflow-2.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:278bc80642d799adf08dc4e04f291aab603bba7457d50c1f9bc191ebbca83f43"}, + {file = "tensorflow-2.17.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:97f89e95d68b4b46e1072243b9f315c3b340e27cc07b1e1988e2ca97ad844305"}, + {file = "tensorflow-2.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dde37cff74ed22b8fa2eea944805b001ae38e96adc989666422bdea34f4e2d47"}, + {file = "tensorflow-2.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ae8e6746deb2ec807b902ba26d62fcffb6a6b53555a1a5906ec00416c5e4175"}, + {file = "tensorflow-2.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:8f80d11ad3766570deb6ff47d2bed2d166f51399ca08205e38ef024345571d6f"}, +] + +[package.dependencies] +absl-py = ">=1.0.0" +astunparse = ">=1.6.0" +flatbuffers = ">=24.3.25" +gast = ">=0.2.1,<0.5.0 || >0.5.0,<0.5.1 || >0.5.1,<0.5.2 || >0.5.2" +google-pasta = ">=0.1.1" +grpcio = ">=1.24.3,<2.0" +h5py = ">=3.10.0" +keras = ">=3.2.0" +libclang = ">=13.0.0" +ml-dtypes = ">=0.3.1,<0.5.0" +numpy = {version = ">=1.23.5,<2.0.0", markers = "python_version <= \"3.11\""} +opt-einsum = ">=2.3.2" +packaging = "*" +protobuf = ">=3.20.3,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +requests = ">=2.21.0,<3" +setuptools = "*" +six = ">=1.12.0" +tensorboard = ">=2.17,<2.18" +tensorflow-io-gcs-filesystem = {version = ">=0.23.1", markers = "python_version < \"3.12\""} +termcolor = ">=1.1.0" +typing-extensions = ">=3.6.6" +wrapt = ">=1.11.0" + +[package.extras] +and-cuda = ["nvidia-cublas-cu12 (==12.3.4.1)", "nvidia-cuda-cupti-cu12 (==12.3.101)", "nvidia-cuda-nvcc-cu12 (==12.3.107)", "nvidia-cuda-nvrtc-cu12 (==12.3.107)", "nvidia-cuda-runtime-cu12 (==12.3.101)", "nvidia-cudnn-cu12 (==8.9.7.29)", "nvidia-cufft-cu12 (==11.0.12.1)", "nvidia-curand-cu12 (==10.3.4.107)", "nvidia-cusolver-cu12 (==11.5.4.101)", "nvidia-cusparse-cu12 (==12.2.0.103)", "nvidia-nccl-cu12 (==2.19.3)", "nvidia-nvjitlink-cu12 (==12.3.101)"] + +[[package]] +name = "tensorflow-io-gcs-filesystem" +version = "0.37.1" +description = "TensorFlow IO" +optional = false +python-versions = "<3.13,>=3.7" +files = [ + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:249c12b830165841411ba71e08215d0e94277a49c551e6dd5d72aab54fe5491b"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:257aab23470a0796978efc9c2bcf8b0bc80f22e6298612a4c0a50d3f4e88060c"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8febbfcc67c61e542a5ac1a98c7c20a91a5e1afc2e14b1ef0cb7c28bc3b6aa70"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9679b36e3a80921876f31685ab6f7270f3411a4cc51bc2847e80d0e4b5291e27"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:32c50ab4e29a23c1f91cd0f9ab8c381a0ab10f45ef5c5252e94965916041737c"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b02f9c5f94fd62773954a04f69b68c4d576d076fd0db4ca25d5479f0fbfcdbad"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e1f2796b57e799a8ca1b75bf47c2aaa437c968408cc1a402a9862929e104cda"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee7c8ee5fe2fd8cb6392669ef16e71841133041fee8a330eff519ad9b36e4556"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:ffebb6666a7bfc28005f4fbbb111a455b5e7d6cd3b12752b7050863ecb27d5cc"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fe8dcc6d222258a080ac3dfcaaaa347325ce36a7a046277f6b3e19abc1efb3c5"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fbb33f1745f218464a59cecd9a18e32ca927b0f4d77abd8f8671b645cc1a182f"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:286389a203a5aee1a4fa2e53718c661091aa5fea797ff4fa6715ab8436b02e6c"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:ee5da49019670ed364f3e5fb86b46420841a6c3cb52a300553c63841671b3e6d"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8943036bbf84e7a2be3705cb56f9c9df7c48c9e614bb941f0936c58e3ca89d6f"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:426de1173cb81fbd62becec2012fc00322a295326d90eb6c737fab636f182aed"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df00891669390078a003cedbdd3b8e645c718b111917535fa1d7725e95cdb95"}, +] + +[package.extras] +tensorflow = ["tensorflow (>=2.16.0,<2.17.0)"] +tensorflow-aarch64 = ["tensorflow-aarch64 (>=2.16.0,<2.17.0)"] +tensorflow-cpu = ["tensorflow-cpu (>=2.16.0,<2.17.0)"] +tensorflow-gpu = ["tensorflow-gpu (>=2.16.0,<2.17.0)"] +tensorflow-rocm = ["tensorflow-rocm (>=2.16.0,<2.17.0)"] + +[[package]] +name = "termcolor" +version = "2.5.0" +description = "ANSI color formatting for output in terminal" +optional = false +python-versions = ">=3.9" +files = [ + {file = "termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8"}, + {file = "termcolor-2.5.0.tar.gz", hash = "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "tomli" +version = "2.2.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, +] + +[[package]] +name = "toolz" +version = "1.0.0" +description = "List processing tools and functional utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236"}, + {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[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 = "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 = "uvicorn" +version = "0.32.1" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.32.1-py3-none-any.whl", hash = "sha256:82ad92fd58da0d12af7482ecdb5f2470a04c9c9a53ced65b9bbb4a205377602e"}, + {file = "uvicorn-0.32.1.tar.gz", hash = "sha256:ee9519c246a72b1c084cea8d3b44ed6026e78a4a309cbedae9c37e4cb9fbb175"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "wandb" +version = "0.16.6" +description = "A CLI and library for interacting with the Weights & Biases API." +optional = false +python-versions = ">=3.7" +files = [ + {file = "wandb-0.16.6-py3-none-any.whl", hash = "sha256:5810019a3b981c796e98ea58557a7c380f18834e0c6bdaed15df115522e5616e"}, + {file = "wandb-0.16.6.tar.gz", hash = "sha256:86f491e3012d715e0d7d7421a4d6de41abef643b7403046261f962f3e512fe1c"}, +] + +[package.dependencies] +appdirs = ">=1.4.3" +Click = ">=7.1,<8.0.0 || >8.0.0" +docker-pycreds = ">=0.4.0" +GitPython = ">=1.0.0,<3.1.29 || >3.1.29" +protobuf = [ + {version = ">=3.15.0,<4.21.0 || >4.21.0,<5", markers = "python_version == \"3.9\" and sys_platform == \"linux\""}, + {version = ">=3.19.0,<4.21.0 || >4.21.0,<5", markers = "python_version > \"3.9\" or sys_platform != \"linux\""}, +] +psutil = ">=5.0.0" +PyYAML = "*" +requests = ">=2.0.0,<3" +sentry-sdk = ">=1.0.0" +setproctitle = "*" +setuptools = "*" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +async = ["httpx (>=0.23.0)"] +aws = ["boto3"] +azure = ["azure-identity", "azure-storage-blob"] +gcp = ["google-cloud-storage"] +importers = ["filelock", "mlflow", "polars", "rich", "tenacity"] +kubeflow = ["google-cloud-storage", "kubernetes", "minio", "sh"] +launch = ["PyYAML (>=6.0.0)", "awscli", "azure-containerregistry", "azure-identity", "azure-storage-blob", "boto3", "botocore", "chardet", "google-auth", "google-cloud-aiplatform", "google-cloud-artifact-registry", "google-cloud-compute", "google-cloud-storage", "iso8601", "kubernetes", "kubernetes-asyncio", "nbconvert", "nbformat", "optuna", "pydantic", "tomli", "typing-extensions"] +media = ["bokeh", "moviepy", "numpy", "pillow", "plotly (>=5.18.0)", "rdkit-pypi", "soundfile"] +models = ["cloudpickle"] +perf = ["orjson"] +reports = ["pydantic (>=2.0.0)"] +sweeps = ["sweeps (>=0.2.0)"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websocket-client" +version = "1.8.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "werkzeug" +version = "3.1.3" +description = "The comprehensive WSGI web application library." +optional = false +python-versions = ">=3.9" +files = [ + {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"}, + {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"}, +] + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog (>=2.3)"] + +[[package]] +name = "wheel" +version = "0.45.1" +description = "A built-package format for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248"}, + {file = "wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] + +[[package]] +name = "wrapt" +version = "1.17.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +files = [ + {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301"}, + {file = "wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22"}, + {file = "wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575"}, + {file = "wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b"}, + {file = "wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346"}, + {file = "wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a"}, + {file = "wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4"}, + {file = "wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635"}, + {file = "wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7"}, + {file = "wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a"}, + {file = "wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045"}, + {file = "wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838"}, + {file = "wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab"}, + {file = "wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf"}, + {file = "wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a"}, + {file = "wrapt-1.17.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f"}, + {file = "wrapt-1.17.0-cp38-cp38-win32.whl", hash = "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea"}, + {file = "wrapt-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed"}, + {file = "wrapt-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0"}, + {file = "wrapt-1.17.0-cp39-cp39-win32.whl", hash = "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88"}, + {file = "wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977"}, + {file = "wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371"}, + {file = "wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801"}, +] + +[[package]] +name = "xxhash" +version = "3.5.0" +description = "Python binding for xxHash" +optional = false +python-versions = ">=3.7" +files = [ + {file = "xxhash-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ece616532c499ee9afbb83078b1b952beffef121d989841f7f4b3dc5ac0fd212"}, + {file = "xxhash-3.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3171f693dbc2cef6477054a665dc255d996646b4023fe56cb4db80e26f4cc520"}, + {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5d3e570ef46adaf93fc81b44aca6002b5a4d8ca11bd0580c07eac537f36680"}, + {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7cb29a034301e2982df8b1fe6328a84f4b676106a13e9135a0d7e0c3e9f806da"}, + {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d0d307d27099bb0cbeea7260eb39ed4fdb99c5542e21e94bb6fd29e49c57a23"}, + {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0342aafd421795d740e514bc9858ebddfc705a75a8c5046ac56d85fe97bf196"}, + {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dbbd9892c5ebffeca1ed620cf0ade13eb55a0d8c84e0751a6653adc6ac40d0c"}, + {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4cc2d67fdb4d057730c75a64c5923abfa17775ae234a71b0200346bfb0a7f482"}, + {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ec28adb204b759306a3d64358a5e5c07d7b1dd0ccbce04aa76cb9377b7b70296"}, + {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1328f6d8cca2b86acb14104e381225a3d7b42c92c4b86ceae814e5c400dbb415"}, + {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8d47ebd9f5d9607fd039c1fbf4994e3b071ea23eff42f4ecef246ab2b7334198"}, + {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b96d559e0fcddd3343c510a0fe2b127fbff16bf346dd76280b82292567523442"}, + {file = "xxhash-3.5.0-cp310-cp310-win32.whl", hash = "sha256:61c722ed8d49ac9bc26c7071eeaa1f6ff24053d553146d5df031802deffd03da"}, + {file = "xxhash-3.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:9bed5144c6923cc902cd14bb8963f2d5e034def4486ab0bbe1f58f03f042f9a9"}, + {file = "xxhash-3.5.0-cp310-cp310-win_arm64.whl", hash = "sha256:893074d651cf25c1cc14e3bea4fceefd67f2921b1bb8e40fcfeba56820de80c6"}, + {file = "xxhash-3.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02c2e816896dc6f85922ced60097bcf6f008dedfc5073dcba32f9c8dd786f3c1"}, + {file = "xxhash-3.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6027dcd885e21581e46d3c7f682cfb2b870942feeed58a21c29583512c3f09f8"}, + {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1308fa542bbdbf2fa85e9e66b1077eea3a88bef38ee8a06270b4298a7a62a166"}, + {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28b2fdcee797e1c1961cd3bcd3d545cab22ad202c846235197935e1df2f8ef7"}, + {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:924361811732ddad75ff23e90efd9ccfda4f664132feecb90895bade6a1b4623"}, + {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89997aa1c4b6a5b1e5b588979d1da048a3c6f15e55c11d117a56b75c84531f5a"}, + {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:685c4f4e8c59837de103344eb1c8a3851f670309eb5c361f746805c5471b8c88"}, + {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbd2ecfbfee70bc1a4acb7461fa6af7748ec2ab08ac0fa298f281c51518f982c"}, + {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25b5a51dc3dfb20a10833c8eee25903fd2e14059e9afcd329c9da20609a307b2"}, + {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a8fb786fb754ef6ff8c120cb96629fb518f8eb5a61a16aac3a979a9dbd40a084"}, + {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a905ad00ad1e1c34fe4e9d7c1d949ab09c6fa90c919860c1534ff479f40fd12d"}, + {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:963be41bcd49f53af6d795f65c0da9b4cc518c0dd9c47145c98f61cb464f4839"}, + {file = "xxhash-3.5.0-cp311-cp311-win32.whl", hash = "sha256:109b436096d0a2dd039c355fa3414160ec4d843dfecc64a14077332a00aeb7da"}, + {file = "xxhash-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:b702f806693201ad6c0a05ddbbe4c8f359626d0b3305f766077d51388a6bac58"}, + {file = "xxhash-3.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:c4dcb4120d0cc3cc448624147dba64e9021b278c63e34a38789b688fd0da9bf3"}, + {file = "xxhash-3.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00"}, + {file = "xxhash-3.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59aa1203de1cb96dbeab595ded0ad0c0056bb2245ae11fac11c0ceea861382b9"}, + {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84"}, + {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61a1ff00674879725b194695e17f23d3248998b843eb5e933007ca743310f793"}, + {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f2c61bee5844d41c3eb015ac652a0229e901074951ae48581d58bfb2ba01be"}, + {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d32a592cac88d18cc09a89172e1c32d7f2a6e516c3dfde1b9adb90ab5df54a6"}, + {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70dabf941dede727cca579e8c205e61121afc9b28516752fd65724be1355cc90"}, + {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e5d0ddaca65ecca9c10dcf01730165fd858533d0be84c75c327487c37a906a27"}, + {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e5b5e16c5a480fe5f59f56c30abdeba09ffd75da8d13f6b9b6fd224d0b4d0a2"}, + {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149b7914451eb154b3dfaa721315117ea1dac2cc55a01bfbd4df7c68c5dd683d"}, + {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:eade977f5c96c677035ff39c56ac74d851b1cca7d607ab3d8f23c6b859379cab"}, + {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e"}, + {file = "xxhash-3.5.0-cp312-cp312-win32.whl", hash = "sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8"}, + {file = "xxhash-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e"}, + {file = "xxhash-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:586886c7e89cb9828bcd8a5686b12e161368e0064d040e225e72607b43858ba2"}, + {file = "xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6"}, + {file = "xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5"}, + {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc"}, + {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3"}, + {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c"}, + {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb"}, + {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f"}, + {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7"}, + {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326"}, + {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf"}, + {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7"}, + {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c"}, + {file = "xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637"}, + {file = "xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43"}, + {file = "xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b"}, + {file = "xxhash-3.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6e5f70f6dca1d3b09bccb7daf4e087075ff776e3da9ac870f86ca316736bb4aa"}, + {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e76e83efc7b443052dd1e585a76201e40b3411fe3da7af4fe434ec51b2f163b"}, + {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33eac61d0796ca0591f94548dcfe37bb193671e0c9bcf065789b5792f2eda644"}, + {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ec70a89be933ea49222fafc3999987d7899fc676f688dd12252509434636622"}, + {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86b8e7f703ec6ff4f351cfdb9f428955859537125904aa8c963604f2e9d3e7"}, + {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0adfbd36003d9f86c8c97110039f7539b379f28656a04097e7434d3eaf9aa131"}, + {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:63107013578c8a730419adc05608756c3fa640bdc6abe806c3123a49fb829f43"}, + {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:683b94dbd1ca67557850b86423318a2e323511648f9f3f7b1840408a02b9a48c"}, + {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:5d2a01dcce81789cf4b12d478b5464632204f4c834dc2d064902ee27d2d1f0ee"}, + {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:a9d360a792cbcce2fe7b66b8d51274ec297c53cbc423401480e53b26161a290d"}, + {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:f0b48edbebea1b7421a9c687c304f7b44d0677c46498a046079d445454504737"}, + {file = "xxhash-3.5.0-cp37-cp37m-win32.whl", hash = "sha256:7ccb800c9418e438b44b060a32adeb8393764da7441eb52aa2aa195448935306"}, + {file = "xxhash-3.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c3bc7bf8cb8806f8d1c9bf149c18708cb1c406520097d6b0a73977460ea03602"}, + {file = "xxhash-3.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:74752ecaa544657d88b1d1c94ae68031e364a4d47005a90288f3bab3da3c970f"}, + {file = "xxhash-3.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dee1316133c9b463aa81aca676bc506d3f80d8f65aeb0bba2b78d0b30c51d7bd"}, + {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:602d339548d35a8579c6b013339fb34aee2df9b4e105f985443d2860e4d7ffaa"}, + {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:695735deeddfb35da1677dbc16a083445360e37ff46d8ac5c6fcd64917ff9ade"}, + {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1030a39ba01b0c519b1a82f80e8802630d16ab95dc3f2b2386a0b5c8ed5cbb10"}, + {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5bc08f33c4966f4eb6590d6ff3ceae76151ad744576b5fc6c4ba8edd459fdec"}, + {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160e0c19ee500482ddfb5d5570a0415f565d8ae2b3fd69c5dcfce8a58107b1c3"}, + {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f1abffa122452481a61c3551ab3c89d72238e279e517705b8b03847b1d93d738"}, + {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d5e9db7ef3ecbfc0b4733579cea45713a76852b002cf605420b12ef3ef1ec148"}, + {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:23241ff6423378a731d84864bf923a41649dc67b144debd1077f02e6249a0d54"}, + {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:82b833d5563fefd6fceafb1aed2f3f3ebe19f84760fdd289f8b926731c2e6e91"}, + {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a80ad0ffd78bef9509eee27b4a29e56f5414b87fb01a888353e3d5bda7038bd"}, + {file = "xxhash-3.5.0-cp38-cp38-win32.whl", hash = "sha256:50ac2184ffb1b999e11e27c7e3e70cc1139047e7ebc1aa95ed12f4269abe98d4"}, + {file = "xxhash-3.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:392f52ebbb932db566973693de48f15ce787cabd15cf6334e855ed22ea0be5b3"}, + {file = "xxhash-3.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfc8cdd7f33d57f0468b0614ae634cc38ab9202c6957a60e31d285a71ebe0301"}, + {file = "xxhash-3.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0c48b6300cd0b0106bf49169c3e0536408dfbeb1ccb53180068a18b03c662ab"}, + {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe1a92cfbaa0a1253e339ccec42dbe6db262615e52df591b68726ab10338003f"}, + {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33513d6cc3ed3b559134fb307aae9bdd94d7e7c02907b37896a6c45ff9ce51bd"}, + {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eefc37f6138f522e771ac6db71a6d4838ec7933939676f3753eafd7d3f4c40bc"}, + {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a606c8070ada8aa2a88e181773fa1ef17ba65ce5dd168b9d08038e2a61b33754"}, + {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42eca420c8fa072cc1dd62597635d140e78e384a79bb4944f825fbef8bfeeef6"}, + {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:604253b2143e13218ff1ef0b59ce67f18b8bd1c4205d2ffda22b09b426386898"}, + {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6e93a5ad22f434d7876665444a97e713a8f60b5b1a3521e8df11b98309bff833"}, + {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:7a46e1d6d2817ba8024de44c4fd79913a90e5f7265434cef97026215b7d30df6"}, + {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:30eb2efe6503c379b7ab99c81ba4a779748e3830241f032ab46bd182bf5873af"}, + {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c8aa771ff2c13dd9cda8166d685d7333d389fae30a4d2bb39d63ab5775de8606"}, + {file = "xxhash-3.5.0-cp39-cp39-win32.whl", hash = "sha256:5ed9ebc46f24cf91034544b26b131241b699edbfc99ec5e7f8f3d02d6eb7fba4"}, + {file = "xxhash-3.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:220f3f896c6b8d0316f63f16c077d52c412619e475f9372333474ee15133a558"}, + {file = "xxhash-3.5.0-cp39-cp39-win_arm64.whl", hash = "sha256:a7b1d8315d9b5e9f89eb2933b73afae6ec9597a258d52190944437158b49d38e"}, + {file = "xxhash-3.5.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2014c5b3ff15e64feecb6b713af12093f75b7926049e26a580e94dcad3c73d8c"}, + {file = "xxhash-3.5.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fab81ef75003eda96239a23eda4e4543cedc22e34c373edcaf744e721a163986"}, + {file = "xxhash-3.5.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2febf914ace002132aa09169cc572e0d8959d0f305f93d5828c4836f9bc5a6"}, + {file = "xxhash-3.5.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d3a10609c51da2a1c0ea0293fc3968ca0a18bd73838455b5bca3069d7f8e32b"}, + {file = "xxhash-3.5.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a74f23335b9689b66eb6dbe2a931a88fcd7a4c2cc4b1cb0edba8ce381c7a1da"}, + {file = "xxhash-3.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b4154c00eb22e4d543f472cfca430e7962a0f1d0f3778334f2e08a7ba59363c"}, + {file = "xxhash-3.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d30bbc1644f726b825b3278764240f449d75f1a8bdda892e641d4a688b1494ae"}, + {file = "xxhash-3.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa0b72f2423e2aa53077e54a61c28e181d23effeaafd73fcb9c494e60930c8e"}, + {file = "xxhash-3.5.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13de2b76c1835399b2e419a296d5b38dc4855385d9e96916299170085ef72f57"}, + {file = "xxhash-3.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0691bfcc4f9c656bcb96cc5db94b4d75980b9d5589f2e59de790091028580837"}, + {file = "xxhash-3.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:297595fe6138d4da2c8ce9e72a04d73e58725bb60f3a19048bc96ab2ff31c692"}, + {file = "xxhash-3.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc1276d369452040cbb943300dc8abeedab14245ea44056a2943183822513a18"}, + {file = "xxhash-3.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2061188a1ba352fc699c82bff722f4baacb4b4b8b2f0c745d2001e56d0dfb514"}, + {file = "xxhash-3.5.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38c384c434021e4f62b8d9ba0bc9467e14d394893077e2c66d826243025e1f81"}, + {file = "xxhash-3.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e6a4dd644d72ab316b580a1c120b375890e4c52ec392d4aef3c63361ec4d77d1"}, + {file = "xxhash-3.5.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:531af8845aaadcadf951b7e0c1345c6b9c68a990eeb74ff9acd8501a0ad6a1c9"}, + {file = "xxhash-3.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ce379bcaa9fcc00f19affa7773084dd09f5b59947b3fb47a1ceb0179f91aaa1"}, + {file = "xxhash-3.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd1b2281d01723f076df3c8188f43f2472248a6b63118b036e641243656b1b0f"}, + {file = "xxhash-3.5.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c770750cc80e8694492244bca7251385188bc5597b6a39d98a9f30e8da984e0"}, + {file = "xxhash-3.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b150b8467852e1bd844387459aa6fbe11d7f38b56e901f9f3b3e6aba0d660240"}, + {file = "xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f"}, +] + +[[package]] +name = "yarl" +version = "1.18.3" +description = "Yet another URL library" +optional = false +python-versions = ">=3.9" +files = [ + {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, + {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, + {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"}, + {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"}, + {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"}, + {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"}, + {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"}, + {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"}, + {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"}, + {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"}, + {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"}, + {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"}, + {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"}, + {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"}, + {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" +propcache = ">=0.2.0" + +[[package]] +name = "yfinance" +version = "0.2.37" +description = "Download market data from Yahoo! Finance API" +optional = false +python-versions = "*" +files = [ + {file = "yfinance-0.2.37-py2.py3-none-any.whl", hash = "sha256:3ac75fa1cd3496ee76b6df5d63d29679487ea9447123c5b935d1593240737a8f"}, + {file = "yfinance-0.2.37.tar.gz", hash = "sha256:e5f78c9bd27bae7abfd0af9b7996620eaa9aba759d67f957296634d7d54f0cef"}, +] + +[package.dependencies] +appdirs = ">=1.4.4" +beautifulsoup4 = ">=4.11.1" +frozendict = ">=2.3.4" +html5lib = ">=1.1" +lxml = ">=4.9.1" +multitasking = ">=0.0.7" +numpy = ">=1.16.5" +pandas = ">=1.3.0" +peewee = ">=3.16.2" +pytz = ">=2022.5" +requests = ">=2.31" + +[package.extras] +nospam = ["requests-cache (>=1.0)", "requests-ratelimiter (>=0.3.1)"] +repair = ["scipy (>=1.6.3)"] + +[[package]] +name = "zipp" +version = "3.21.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.9" +files = [ + {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, + {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] + +[metadata] +lock-version = "2.0" +python-versions = ">= 3.9, < 3.12" +content-hash = "38288209b911c23a8aadb82192c05befd224f433ab68fe0e9c20807b2efd0c47" diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index 27978edd..a8c62a73 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -64,3 +64,4 @@ def get_model_metadata(self, repo_id, model_id): return {"hotkey": hotkey, "timestamp": self.get_model_timestamp(repo_id, model_id)} except Exception: return False + From 6bf308dd52307118bf2c67e0d8ad9178cd74596e Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 6 Dec 2024 13:03:50 -0500 Subject: [PATCH 075/201] fix precommit issues --- neurons/miner.py | 11 +++--- predictionnet/protocol.py | 2 +- predictionnet/utils/huggingface.py | 3 +- predictionnet/utils/miner_hf.py | 58 +++++++++++++++--------------- 4 files changed, 36 insertions(+), 38 deletions(-) diff --git a/neurons/miner.py b/neurons/miner.py index 27f8c2d9..84d3783f 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -60,17 +60,16 @@ def __init__(self, config=None): if self.config.neuron.device == "cpu": os.environ["CUDA_VISIBLE_DEVICES"] = "-1" # This will force TensorFlow to use CPU only - # Initialize HF interface and upload model hf_interface = Miner_HF_interface(self.config) success, metadata = hf_interface.upload_model( - hotkey=self.wallet.hotkey.ss58_address, - model_path=self.config.model, - repo_id=self.config.hf_repo_id + hotkey=self.wallet.hotkey.ss58_address, model_path=self.config.model, repo_id=self.config.hf_repo_id ) if success: - bt.logging.success(f"Model {self.config.model} uploaded successfully to {self.config.hf_repo_id}: {metadata}") + bt.logging.success( + f"Model {self.config.model} uploaded successfully to {self.config.hf_repo_id}: {metadata}" + ) else: bt.logging.error(f"Model {self.config.model} upload failed to {self.config.hf_repo_id}: {metadata}") @@ -185,7 +184,7 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction timestamp = synapse.timestamp synapse.repo_id = self.config.hf_repo_id synapse.model_id = model_filename - + if self.config.hf_repo_id == "LOCAL": model_path = f"./{self.config.model}" bt.logging.info( diff --git a/predictionnet/protocol.py b/predictionnet/protocol.py index 0a9b5ab4..2e4b6251 100644 --- a/predictionnet/protocol.py +++ b/predictionnet/protocol.py @@ -60,7 +60,7 @@ class Challenge(bt.Synapse): ) model_id: Optional[str] = pydantic.Field( - default=None, + default=None, title="Model ID", description="Which model to use", ) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index a8c62a73..d92b325a 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -45,7 +45,7 @@ def update_collection(self, responses: List[Challenge]) -> None: def hotkeys_match(self, synapse, hotkey) -> bool: if synapse.model_id is None: return False - model_hotkey = synapse.model_id.split('.')[0] + model_hotkey = synapse.model_id.split(".")[0] return hotkey == model_hotkey def get_model_timestamp(self, repo_id, model_id): @@ -64,4 +64,3 @@ def get_model_metadata(self, repo_id, model_id): return {"hotkey": hotkey, "timestamp": self.get_model_timestamp(repo_id, model_id)} except Exception: return False - diff --git a/predictionnet/utils/miner_hf.py b/predictionnet/utils/miner_hf.py index b809baa9..3ea5d593 100644 --- a/predictionnet/utils/miner_hf.py +++ b/predictionnet/utils/miner_hf.py @@ -1,17 +1,19 @@ -from huggingface_hub import HfApi, model_info, metadata_update -from dotenv import load_dotenv import os + import bittensor as bt +from dotenv import load_dotenv +from huggingface_hub import HfApi + class Miner_HF_interface: def __init__(self, config: "bt.Config"): load_dotenv() self.api = HfApi(token=os.getenv("MINER_HF_ACCESS_TOKEN")) self.config = config - + print(f"Initializing with config: model={config.model}, repo_id={config.hf_repo_id}") - if not hasattr(self.config, 'model') or not hasattr(self.config, 'hf_repo_id'): + if not hasattr(self.config, "model") or not hasattr(self.config, "hf_repo_id"): raise ValueError("Config must include 'model' and 'hf_repo_id' parameters") def upload_model(self, repo_id=None, model_path=None, hotkey=None): @@ -21,42 +23,40 @@ def upload_model(self, repo_id=None, model_path=None, hotkey=None): print(f"Trying to upload model: repo_id={repo_id}, model_path={model_path}, hotkey={hotkey}") if not all([repo_id, model_path, hotkey]): - raise ValueError("All parameters (repo_id, model_path, hotkey) must be specified either in config or method call") + raise ValueError( + "All parameters (repo_id, model_path, hotkey) must be specified either in config or method call" + ) try: # Extract file extension from the model path, handling nested directories _, extension = os.path.splitext(model_path) if not extension: raise ValueError(f"Could not determine file extension from model path: {model_path}") - + # Create new filename using hotkey and original extension model_name = f"{hotkey}{extension}" print(f"Generated model name: {model_name} from path: {model_path}") - + + print(f"Checking if repo exists: {repo_id}") + try: - print(f"Checking if repo exists: {repo_id}") - model = model_info(repo_id) - except: - print("Repo doesn't exist, creating new one") + # Try to create repo (will fail if exists) self.api.create_repo(repo_id=repo_id, private=False) - + print("Created new repo") + except Exception: + print("Repo already exists") + print(f"Uploading file as: {model_name}") self.api.upload_file( - path_or_fileobj=model_path, - path_in_repo=model_name, - repo_id=repo_id, - repo_type="model" + path_or_fileobj=model_path, path_in_repo=model_name, repo_id=repo_id, repo_type="model" ) - + # Get timestamp of the upload commits = self.api.list_repo_commits(repo_id=repo_id, repo_type="model") if commits: - return True, { - "hotkey": hotkey, - "timestamp": commits[0].created_at.timestamp() - } + return True, {"hotkey": hotkey, "timestamp": commits[0].created_at.timestamp()} return True, {} - + except Exception as e: print(f"Error in upload_model: {str(e)}") return False, str(e) @@ -64,31 +64,31 @@ def upload_model(self, repo_id=None, model_path=None, hotkey=None): def get_model_metadata(self, repo_id=None): repo_id = repo_id or self.config.hf_repo_id print(f"Getting metadata for repo: {repo_id}") - + try: print("Getting repo files...") files = self.api.list_repo_files(repo_id=repo_id, repo_type="model") if not files: raise ValueError("No files found in repository") - + # Get the first file and extract hotkey from filename model_file = files[0] hotkey = os.path.splitext(model_file)[0] - + print("Getting commits...") commits = self.api.list_repo_commits(repo_id=repo_id, repo_type="model") if not commits: raise ValueError("No commits found in repository") - + latest_commit = commits[0] print(f"Latest commit date: {latest_commit.created_at}") - + result = { "hotkey": hotkey, "timestamp": latest_commit.created_at.timestamp(), } return result - + except Exception as e: print(f"Error in get_model_metadata: {str(e)}") - return False, str(e) \ No newline at end of file + return False, str(e) From 90ed90dcfd1f36789297c9261728075f96017542 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 10 Dec 2024 09:18:28 -0500 Subject: [PATCH 076/201] rename hf interfaces --- neurons/miner.py | 4 ++-- predictionnet/utils/huggingface.py | 2 +- predictionnet/utils/miner_hf.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/neurons/miner.py b/neurons/miner.py index 84d3783f..7d990ca6 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -38,7 +38,7 @@ from predictionnet.base.miner import BaseMinerNeuron # import huggingface upload class -from predictionnet.utils.miner_hf import Miner_HF_interface +from predictionnet.utils.miner_hf import MinerHfInterface load_dotenv() @@ -61,7 +61,7 @@ def __init__(self, config=None): os.environ["CUDA_VISIBLE_DEVICES"] = "-1" # This will force TensorFlow to use CPU only # Initialize HF interface and upload model - hf_interface = Miner_HF_interface(self.config) + hf_interface = MinerHfInterface(self.config) success, metadata = hf_interface.upload_model( hotkey=self.wallet.hotkey.ss58_address, model_path=self.config.model, repo_id=self.config.hf_repo_id ) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index d92b325a..3c44181e 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -6,7 +6,7 @@ from predictionnet.protocol import Challenge -class HF_interface: +class HfInterface: def __init__(self): token = os.getenv("HF_ACCESS_TOKEN") if token is None: diff --git a/predictionnet/utils/miner_hf.py b/predictionnet/utils/miner_hf.py index 3ea5d593..26d49190 100644 --- a/predictionnet/utils/miner_hf.py +++ b/predictionnet/utils/miner_hf.py @@ -5,7 +5,7 @@ from huggingface_hub import HfApi -class Miner_HF_interface: +class MinerHfInterface: def __init__(self, config: "bt.Config"): load_dotenv() self.api = HfApi(token=os.getenv("MINER_HF_ACCESS_TOKEN")) From d010fb33cbe0cc83f17fa9fbd2314c672fa86a47 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 10 Dec 2024 09:46:07 -0500 Subject: [PATCH 077/201] more pr fixes --- predictionnet/utils/huggingface.py | 14 +---- predictionnet/utils/miner_hf.py | 96 +++++++++++++----------------- 2 files changed, 41 insertions(+), 69 deletions(-) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index 3c44181e..6f6549fe 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -1,7 +1,7 @@ import os from typing import List -from huggingface_hub import HfApi, model_info +from huggingface_hub import HfApi from predictionnet.protocol import Challenge @@ -52,15 +52,3 @@ def get_model_timestamp(self, repo_id, model_id): commits = self.api.list_repo_commits(repo_id=f"{repo_id}/{model_id}", repo_type="model") initial_commit = commits[-1] return initial_commit.created_at - - def get_model_metadata(self, repo_id, model_id): - try: - model = model_info(f"{repo_id}/{model_id}") - metadata = model.cardData - if metadata is None: - hotkey = None - else: - hotkey = metadata.get("hotkey") - return {"hotkey": hotkey, "timestamp": self.get_model_timestamp(repo_id, model_id)} - except Exception: - return False diff --git a/predictionnet/utils/miner_hf.py b/predictionnet/utils/miner_hf.py index 26d49190..a5355d26 100644 --- a/predictionnet/utils/miner_hf.py +++ b/predictionnet/utils/miner_hf.py @@ -6,89 +6,73 @@ class MinerHfInterface: + """Interface for managing model uploads and metadata on HuggingFace Hub. + + Handles authentication, model uploads, and metadata retrieval for miner models + using the HuggingFace Hub API. + + Args: + config (bt.Config): Configuration object containing model and repository information. + Must include 'model' and 'hf_repo_id' attributes. + + Attributes: + api (HfApi): Authenticated HuggingFace API client + config (bt.Config): Stored configuration object + """ + def __init__(self, config: "bt.Config"): + """Initialize the HuggingFace interface with configuration and authentication.""" load_dotenv() self.api = HfApi(token=os.getenv("MINER_HF_ACCESS_TOKEN")) self.config = config - print(f"Initializing with config: model={config.model}, repo_id={config.hf_repo_id}") - - if not hasattr(self.config, "model") or not hasattr(self.config, "hf_repo_id"): - raise ValueError("Config must include 'model' and 'hf_repo_id' parameters") + bt.logging.debug(f"Initializing with config: model={config.model}, repo_id={config.hf_repo_id}") def upload_model(self, repo_id=None, model_path=None, hotkey=None): - repo_id = repo_id or self.config.hf_repo_id - model_path = model_path or self.config.model + """Upload a model file to HuggingFace Hub. - print(f"Trying to upload model: repo_id={repo_id}, model_path={model_path}, hotkey={hotkey}") + Args: + repo_id (str, optional): Target repository ID. Defaults to config value. + model_path (str, optional): Path to model file. Defaults to config value. + hotkey (str, optional): Hotkey for model identification. - if not all([repo_id, model_path, hotkey]): - raise ValueError( - "All parameters (repo_id, model_path, hotkey) must be specified either in config or method call" - ) + Returns: + tuple: (success, result) + - success (bool): Whether upload was successful + - result (dict): Contains 'hotkey' and 'timestamp' if successful, + 'error' if failed + + Raises: + ValueError: If model path extension cannot be determined or required parameters are missing + """ + bt.logging.debug(f"Trying to upload model: repo_id={repo_id}, model_path={model_path}, hotkey={hotkey}") try: - # Extract file extension from the model path, handling nested directories _, extension = os.path.splitext(model_path) if not extension: raise ValueError(f"Could not determine file extension from model path: {model_path}") - # Create new filename using hotkey and original extension model_name = f"{hotkey}{extension}" - print(f"Generated model name: {model_name} from path: {model_path}") + bt.logging.debug(f"Generated model name: {model_name} from path: {model_path}") - print(f"Checking if repo exists: {repo_id}") + bt.logging.debug(f"Checking if repo exists: {repo_id}") - try: - # Try to create repo (will fail if exists) + if not self.api.repo_exists(repo_id=repo_id, repo_type="model"): self.api.create_repo(repo_id=repo_id, private=False) - print("Created new repo") - except Exception: - print("Repo already exists") + bt.logging.debug("Created new repo") + else: + bt.logging.debug("Using existing repo") - print(f"Uploading file as: {model_name}") + bt.logging.debug(f"Uploading file as: {model_name}") self.api.upload_file( path_or_fileobj=model_path, path_in_repo=model_name, repo_id=repo_id, repo_type="model" ) - # Get timestamp of the upload commits = self.api.list_repo_commits(repo_id=repo_id, repo_type="model") if commits: return True, {"hotkey": hotkey, "timestamp": commits[0].created_at.timestamp()} return True, {} except Exception as e: - print(f"Error in upload_model: {str(e)}") - return False, str(e) - - def get_model_metadata(self, repo_id=None): - repo_id = repo_id or self.config.hf_repo_id - print(f"Getting metadata for repo: {repo_id}") - - try: - print("Getting repo files...") - files = self.api.list_repo_files(repo_id=repo_id, repo_type="model") - if not files: - raise ValueError("No files found in repository") - - # Get the first file and extract hotkey from filename - model_file = files[0] - hotkey = os.path.splitext(model_file)[0] - - print("Getting commits...") - commits = self.api.list_repo_commits(repo_id=repo_id, repo_type="model") - if not commits: - raise ValueError("No commits found in repository") - - latest_commit = commits[0] - print(f"Latest commit date: {latest_commit.created_at}") - - result = { - "hotkey": hotkey, - "timestamp": latest_commit.created_at.timestamp(), - } - return result - - except Exception as e: - print(f"Error in get_model_metadata: {str(e)}") - return False, str(e) + bt.logging.debug(f"Error in upload_model: {str(e)}") + return False, {"error": str(e)} From d03067a5e1fdc2be0c98802400178a7fa94fb1b7 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 10 Dec 2024 13:13:15 -0500 Subject: [PATCH 078/201] update config to require model and hf_repo_id. Will throw valueerror otherwise. --- predictionnet/utils/config.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/predictionnet/utils/config.py b/predictionnet/utils/config.py index dd62ead5..5adc990e 100644 --- a/predictionnet/utils/config.py +++ b/predictionnet/utils/config.py @@ -55,6 +55,11 @@ def check_config(cls, config: "bt.Config"): format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}", ) + if not config.model: + raise ValueError("--model argument is required") + if not config.hf_repo_id: + raise ValueError("--hf_repo_id argument is required") + def add_args(cls, parser): """ @@ -171,17 +176,11 @@ def add_args(cls, parser): ) parser.add_argument( - "--model", - type=str, - help="The file name of the model that the miner loads weights from/", - default="mining_models/base_lstm_new.h5", + "--model", type=str, help="The file name of the model that the miner loads weights from", required=True ) parser.add_argument( - "--hf_repo_id", - type=str, - help="The Huggingface repo id where the weights file exists - set as empty string if you want to use weights in local folders.", - default="foundryservices/bittensor-sn28-base-lstm", + "--hf_repo_id", type=str, help="The Huggingface repo id where the weights file exists", required=True ) parser.add_argument( From 10e53f54d46e792a45b827c0e33a95955b1a7d9f Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 10 Dec 2024 13:41:20 -0500 Subject: [PATCH 079/201] Add check for config parameters at neuron.py --- predictionnet/base/neuron.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/predictionnet/base/neuron.py b/predictionnet/base/neuron.py index a5294469..ba17da29 100644 --- a/predictionnet/base/neuron.py +++ b/predictionnet/base/neuron.py @@ -66,6 +66,13 @@ def __init__(self, config=None): # Set up logging with the provided configuration and directory. bt.logging(config=self.config, logging_dir=self.config.full_path) + if not hasattr(self.config, "model") or not self.config.model: + bt.logging.error("--model argument is required") + exit(1) + if not hasattr(self.config, "hf_repo_id") or not self.config.hf_repo_id: + bt.logging.error("--hf_repo_id argument is required") + exit(1) + # If a gpu is required, set the device to cuda:N (e.g. cuda:0) self.device = self.config.neuron.device if self.config.logging.debug: From c24c115e2f13a46e0437c5f6f86180cb9592fc09 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 10 Dec 2024 13:54:43 -0500 Subject: [PATCH 080/201] move config check to base miner class --- predictionnet/base/miner.py | 7 +++++++ predictionnet/base/neuron.py | 7 ------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/predictionnet/base/miner.py b/predictionnet/base/miner.py index b467b6a5..c34d74d3 100644 --- a/predictionnet/base/miner.py +++ b/predictionnet/base/miner.py @@ -38,6 +38,13 @@ class BaseMinerNeuron(BaseNeuron): def __init__(self, config=None): super().__init__(config=config) + if not config.model: + bt.logging.error("--model argument is required") + exit(1) + if not config.hf_repo_id: + bt.logging.error("--hf_repo_id argument is required") + exit(1) + # Warn if allowing incoming requests from anyone. if not self.config.blacklist.force_validator_permit: bt.logging.warning( diff --git a/predictionnet/base/neuron.py b/predictionnet/base/neuron.py index ba17da29..a5294469 100644 --- a/predictionnet/base/neuron.py +++ b/predictionnet/base/neuron.py @@ -66,13 +66,6 @@ def __init__(self, config=None): # Set up logging with the provided configuration and directory. bt.logging(config=self.config, logging_dir=self.config.full_path) - if not hasattr(self.config, "model") or not self.config.model: - bt.logging.error("--model argument is required") - exit(1) - if not hasattr(self.config, "hf_repo_id") or not self.config.hf_repo_id: - bt.logging.error("--hf_repo_id argument is required") - exit(1) - # If a gpu is required, set the device to cuda:N (e.g. cuda:0) self.device = self.config.neuron.device if self.config.logging.debug: From 9e535def7ec5883ebccbfff5a302308bd7acbef6 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 10 Dec 2024 14:23:26 -0500 Subject: [PATCH 081/201] add debugging --- predictionnet/utils/config.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/predictionnet/utils/config.py b/predictionnet/utils/config.py index 5adc990e..d8b575bb 100644 --- a/predictionnet/utils/config.py +++ b/predictionnet/utils/config.py @@ -55,11 +55,6 @@ def check_config(cls, config: "bt.Config"): format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}", ) - if not config.model: - raise ValueError("--model argument is required") - if not config.hf_repo_id: - raise ValueError("--hf_repo_id argument is required") - def add_args(cls, parser): """ @@ -69,6 +64,7 @@ def add_args(cls, parser): parser.add_argument("--netuid", type=int, help="Subnet netuid", default=1) neuron_type = "validator" if "miner" not in cls.__name__.lower() else "miner" + bt.logging.debug(f"Determined neuron_type: {neuron_type}") # MINER AND VALIDATOR CONFIG parser.add_argument( @@ -114,6 +110,7 @@ def add_args(cls, parser): # VALIDATOR ONLY CONFIG if neuron_type == "validator": + bt.logging.debug("Adding validator-specific arguments") parser.add_argument( "--neuron.num_concurrent_forwards", type=int, @@ -161,6 +158,7 @@ def add_args(cls, parser): # MINER ONLY CONFIG else: + bt.logging.debug("Adding miner-specific arguments") parser.add_argument( "--blacklist.force_validator_permit", action="store_true", From 7f4a4ee4c7d331da9444d181c1771ad1a47c4f83 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 10 Dec 2024 15:04:45 -0500 Subject: [PATCH 082/201] remove required from argparse --- predictionnet/utils/config.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/predictionnet/utils/config.py b/predictionnet/utils/config.py index d8b575bb..d814d295 100644 --- a/predictionnet/utils/config.py +++ b/predictionnet/utils/config.py @@ -173,13 +173,9 @@ def add_args(cls, parser): default=False, ) - parser.add_argument( - "--model", type=str, help="The file name of the model that the miner loads weights from", required=True - ) + parser.add_argument("--model", type=str, help="The file name of the model that the miner loads weights from") - parser.add_argument( - "--hf_repo_id", type=str, help="The Huggingface repo id where the weights file exists", required=True - ) + parser.add_argument("--hf_repo_id", type=str, help="The Huggingface repo id where the weights file exists") parser.add_argument( "--validator.min_stake", From 3ce5ff6e7a2e86641762096c98c95415f2b07a8b Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 10 Dec 2024 15:16:11 -0500 Subject: [PATCH 083/201] add more logging --- predictionnet/base/miner.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/predictionnet/base/miner.py b/predictionnet/base/miner.py index c34d74d3..a3fa5def 100644 --- a/predictionnet/base/miner.py +++ b/predictionnet/base/miner.py @@ -38,6 +38,8 @@ class BaseMinerNeuron(BaseNeuron): def __init__(self, config=None): super().__init__(config=config) + print(config) + if not config.model: bt.logging.error("--model argument is required") exit(1) From 11bbef7bc344e70c059b05f36d68e9616b3a3fd4 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 10 Dec 2024 15:19:17 -0500 Subject: [PATCH 084/201] move the check for args --- neurons/miner.py | 7 +++++++ predictionnet/base/miner.py | 9 --------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/neurons/miner.py b/neurons/miner.py index 7d990ca6..b3463c91 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -60,6 +60,13 @@ def __init__(self, config=None): if self.config.neuron.device == "cpu": os.environ["CUDA_VISIBLE_DEVICES"] = "-1" # This will force TensorFlow to use CPU only + if not config.model: + bt.logging.error("--model argument is required") + exit(1) + if not config.hf_repo_id: + bt.logging.error("--hf_repo_id argument is required") + exit(1) + # Initialize HF interface and upload model hf_interface = MinerHfInterface(self.config) success, metadata = hf_interface.upload_model( diff --git a/predictionnet/base/miner.py b/predictionnet/base/miner.py index a3fa5def..b467b6a5 100644 --- a/predictionnet/base/miner.py +++ b/predictionnet/base/miner.py @@ -38,15 +38,6 @@ class BaseMinerNeuron(BaseNeuron): def __init__(self, config=None): super().__init__(config=config) - print(config) - - if not config.model: - bt.logging.error("--model argument is required") - exit(1) - if not config.hf_repo_id: - bt.logging.error("--hf_repo_id argument is required") - exit(1) - # Warn if allowing incoming requests from anyone. if not self.config.blacklist.force_validator_permit: bt.logging.warning( From a15096aaf873d551663b1f06e4be473220345739 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 10 Dec 2024 15:21:56 -0500 Subject: [PATCH 085/201] add self --- neurons/miner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/neurons/miner.py b/neurons/miner.py index b3463c91..cc26ff1a 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -60,10 +60,10 @@ def __init__(self, config=None): if self.config.neuron.device == "cpu": os.environ["CUDA_VISIBLE_DEVICES"] = "-1" # This will force TensorFlow to use CPU only - if not config.model: + if not self.config.model: bt.logging.error("--model argument is required") exit(1) - if not config.hf_repo_id: + if not self.config.hf_repo_id: bt.logging.error("--hf_repo_id argument is required") exit(1) From 12708cc0b6ddde9fe361f70dec7696629795bc63 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 10 Dec 2024 15:27:52 -0500 Subject: [PATCH 086/201] rename model_id to model to avoid conflict with pydantic protected namespace --- predictionnet/protocol.py | 2 +- predictionnet/utils/huggingface.py | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/predictionnet/protocol.py b/predictionnet/protocol.py index 2e4b6251..652460f6 100644 --- a/predictionnet/protocol.py +++ b/predictionnet/protocol.py @@ -59,7 +59,7 @@ class Challenge(bt.Synapse): description="Storage repository of the model", ) - model_id: Optional[str] = pydantic.Field( + model: Optional[str] = pydantic.Field( default=None, title="Model ID", description="Which model to use", diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index 6f6549fe..24f9e6c2 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -26,7 +26,7 @@ def get_models(self): collection = self.api.get_collection(collection_slug=self.collection_slug) return collection - def add_model_to_collection(self, repo_id, model_id) -> None: + def add_model_to_collection(self, repo_id, model) -> None: self.api.add_collection_item( collection_slug=self.collection_slug, item_id=repo_id, @@ -37,18 +37,18 @@ def add_model_to_collection(self, repo_id, model_id) -> None: def update_collection(self, responses: List[Challenge]) -> None: id_list = [x.item_id for x in self.collection.items] for response in responses: - either_none = response.repo_id is None or response.model_id is None - if f"{response.repo_id}/{response.model_id}" not in id_list and not either_none: - self.add_model_to_collection(repo_id=response.repo_id, model_id=response.model_id) + either_none = response.repo_id is None or response.model is None + if f"{response.repo_id}/{response.model}" not in id_list and not either_none: + self.add_model_to_collection(repo_id=response.repo_id, model=response.model) self.collection = self.get_models() def hotkeys_match(self, synapse, hotkey) -> bool: - if synapse.model_id is None: + if synapse.model is None: return False - model_hotkey = synapse.model_id.split(".")[0] + model_hotkey = synapse.model.split(".")[0] return hotkey == model_hotkey - def get_model_timestamp(self, repo_id, model_id): - commits = self.api.list_repo_commits(repo_id=f"{repo_id}/{model_id}", repo_type="model") + def get_model_timestamp(self, repo_id, model): + commits = self.api.list_repo_commits(repo_id=f"{repo_id}/{model}", repo_type="model") initial_commit = commits[-1] return initial_commit.created_at From 528526760dcfbf7548ca40a4bdc2ab081c4f112f Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 10 Dec 2024 15:36:00 -0500 Subject: [PATCH 087/201] missed a few renames --- neurons/validator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/neurons/validator.py b/neurons/validator.py index 5db51df6..a10eca46 100644 --- a/neurons/validator.py +++ b/neurons/validator.py @@ -33,7 +33,7 @@ # import base validator class which takes care of most of the boilerplate from predictionnet.base.validator import BaseValidatorNeuron -from predictionnet.utils.huggingface import HF_interface +from predictionnet.utils.huggingface import HfInterface from predictionnet.utils.uids import check_uid_availability # Bittensor Validator Template: @@ -58,7 +58,7 @@ def __init__(self, config=None): self.N_TIMEPOINTS = 6 # number of timepoints to predict self.INTERVAL = self.prediction_interval * self.N_TIMEPOINTS # 30 Minutes self.past_predictions = {} - self.hf_interface = HF_interface() + self.hf_interface = HfInterface() for uid in range(len(self.metagraph.S)): uid_is_available = check_uid_availability(self.metagraph, uid, self.config.neuron.vpermit_tao_limit) if uid_is_available: From 77689ec5eee4bad79c37005723237d1414cff875 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 10 Dec 2024 15:46:42 -0500 Subject: [PATCH 088/201] change name of straggling variable --- neurons/miner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neurons/miner.py b/neurons/miner.py index cc26ff1a..35aae185 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -190,7 +190,7 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction timestamp = synapse.timestamp synapse.repo_id = self.config.hf_repo_id - synapse.model_id = model_filename + synapse.model = model_filename if self.config.hf_repo_id == "LOCAL": model_path = f"./{self.config.model}" From e853a2cdf83cf3778f120052939bd535a3302576 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 11 Dec 2024 09:21:33 -0500 Subject: [PATCH 089/201] comment out self.load_state() --- predictionnet/base/validator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/predictionnet/base/validator.py b/predictionnet/base/validator.py index 0d9f7900..8fb7fedb 100644 --- a/predictionnet/base/validator.py +++ b/predictionnet/base/validator.py @@ -53,7 +53,7 @@ def __init__(self, config=None): self.moving_avg_scores = {uid: 0 for uid in self.metagraph.uids} self.alpha = self.config.neuron.moving_average_alpha # Load state because self.sync() will overwrite it - self.load_state() + # self.load_state() # Init sync with the network. Updates the metagraph. self.resync_metagraph() # this ensures that the state file is up to date with the metagraph self.sync() From fd6af26b109148ab2f58cea9d24432e341d61b2b Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 11 Dec 2024 10:10:56 -0500 Subject: [PATCH 090/201] changed output of add_model_to_collection from None to bool --- predictionnet/utils/huggingface.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index 24f9e6c2..e8e9e504 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -1,7 +1,7 @@ import os from typing import List -from huggingface_hub import HfApi +from huggingface_hub import HfApi, errors from predictionnet.protocol import Challenge @@ -26,13 +26,17 @@ def get_models(self): collection = self.api.get_collection(collection_slug=self.collection_slug) return collection - def add_model_to_collection(self, repo_id, model) -> None: - self.api.add_collection_item( - collection_slug=self.collection_slug, - item_id=repo_id, - item_type="model", - exists_ok=True, - ) + def add_model_to_collection(self, repo_id) -> bool: + try: + self.api.add_collection_item( + collection_slug=self.collection_slug, + item_id=repo_id, + item_type="model", + exists_ok=True, + ) + return True + except errors.HfHubHTTPError: + return False def update_collection(self, responses: List[Challenge]) -> None: id_list = [x.item_id for x in self.collection.items] From 19cf3057da7e9040610617edcbc6dfeff59e81ab Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 11 Dec 2024 10:13:11 -0500 Subject: [PATCH 091/201] changed iterators from letters to human-intelligible words --- predictionnet/validator/forward.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 79632459..2c4e0b06 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -110,6 +110,6 @@ async def forward(self): # Update the scores based on the rewards. You may want to define your own update_scores function for custom behavior. models_confirmed = self.confirm_models(responses, miner_uids) bt.logging.info(f"Models Confirmed: {models_confirmed}") - rewards = [0 if not b else v for v, b in zip(rewards, models_confirmed)] + rewards = [0 if not model_confirmed else reward for reward, model_confirmed in zip(rewards, models_confirmed)] # Check base validator file self.update_scores(rewards, miner_uids) From 1cb5e59a267081a77d1ebcd78501e005b9c7c495 Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 11 Dec 2024 10:40:21 -0500 Subject: [PATCH 092/201] fixed issue with unused variable removal --- predictionnet/utils/huggingface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/predictionnet/utils/huggingface.py b/predictionnet/utils/huggingface.py index e8e9e504..aedc1bc8 100644 --- a/predictionnet/utils/huggingface.py +++ b/predictionnet/utils/huggingface.py @@ -43,7 +43,7 @@ def update_collection(self, responses: List[Challenge]) -> None: for response in responses: either_none = response.repo_id is None or response.model is None if f"{response.repo_id}/{response.model}" not in id_list and not either_none: - self.add_model_to_collection(repo_id=response.repo_id, model=response.model) + self.add_model_to_collection(repo_id=f"{response.repo_id}/{response.model}") self.collection = self.get_models() def hotkeys_match(self, synapse, hotkey) -> bool: From 1097f256ac86f72de9d7d4336993e97d5aed4e82 Mon Sep 17 00:00:00 2001 From: hscott Date: Wed, 11 Dec 2024 10:47:17 -0500 Subject: [PATCH 093/201] needed to update huggingface-hub requirements to 0.26.5 --- requirements/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 373f2d48..5d71539f 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,5 +1,5 @@ bittensor==7.4.0 -huggingface_hub==0.22.2 +huggingface_hub==0.26.5 joblib loguru numpy From 0eadc3bccfe38066d90d0aff73ce48f8506723fd Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 11 Dec 2024 11:58:41 -0500 Subject: [PATCH 094/201] added upload data to miner hf utils. Add upload data whenever miner recieves a request. --- neurons/miner.py | 12 +++++ predictionnet/utils/miner_hf.py | 82 ++++++++++++++++++++++++++++++--- 2 files changed, 88 insertions(+), 6 deletions(-) diff --git a/neurons/miner.py b/neurons/miner.py index 35aae185..2019ac67 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -210,6 +210,18 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction model = load_model(model_path) data = prep_data() + + hf_interface = MinerHfInterface(self.config) + data_dict_list = data.to_dict("records") + success, metadata = hf_interface.upload_data( + hotkey=self.wallet.hotkey.ss58_address, data=data_dict_list, repo_id=self.config.hf_repo_id + ) + + if success: + bt.logging.success(f"Data uploaded successfully to {metadata['data_path']}") + else: + bt.logging.error(f"Data upload failed: {metadata['error']}") + scaler, _, _ = scale_data(data) # mse = create_and_save_base_model_lstm(scaler, X, y) diff --git a/predictionnet/utils/miner_hf.py b/predictionnet/utils/miner_hf.py index a5355d26..983310e7 100644 --- a/predictionnet/utils/miner_hf.py +++ b/predictionnet/utils/miner_hf.py @@ -1,4 +1,6 @@ +import csv import os +from datetime import datetime import bittensor as bt from dotenv import load_dotenv @@ -52,8 +54,11 @@ def upload_model(self, repo_id=None, model_path=None, hotkey=None): if not extension: raise ValueError(f"Could not determine file extension from model path: {model_path}") - model_name = f"{hotkey}{extension}" - bt.logging.debug(f"Generated model name: {model_name} from path: {model_path}") + model_name = f"model{extension}" + hotkey_path = f"{hotkey}/models" + model_full_path = f"{hotkey_path}/{model_name}" + + bt.logging.debug(f"Generated model path: {model_full_path}") bt.logging.debug(f"Checking if repo exists: {repo_id}") @@ -63,16 +68,81 @@ def upload_model(self, repo_id=None, model_path=None, hotkey=None): else: bt.logging.debug("Using existing repo") - bt.logging.debug(f"Uploading file as: {model_name}") + bt.logging.debug(f"Uploading file as: {model_full_path}") self.api.upload_file( - path_or_fileobj=model_path, path_in_repo=model_name, repo_id=repo_id, repo_type="model" + path_or_fileobj=model_path, path_in_repo=model_full_path, repo_id=repo_id, repo_type="model" ) commits = self.api.list_repo_commits(repo_id=repo_id, repo_type="model") if commits: - return True, {"hotkey": hotkey, "timestamp": commits[0].created_at.timestamp()} - return True, {} + return True, { + "hotkey": hotkey, + "timestamp": commits[0].created_at.timestamp(), + "model_path": model_full_path, + } + return True, {"model_path": model_full_path} except Exception as e: bt.logging.debug(f"Error in upload_model: {str(e)}") return False, {"error": str(e)} + + def upload_data(self, repo_id=None, data=None, hotkey=None): + """Upload training/validation data to HuggingFace Hub. + + Args: + repo_id (str, optional): Target repository ID. Defaults to config value. + data (list): List of dictionaries containing the data rows + hotkey (str, optional): Hotkey for data identification + + Returns: + tuple: (success, result) + - success (bool): Whether upload was successful + - result (dict): Contains 'hotkey', 'timestamp', and 'data_path' if successful, + 'error' if failed + + Raises: + ValueError: If required parameters are missing or data format is invalid + """ + if not repo_id: + repo_id = self.config.hf_repo_id + + if not data or not isinstance(data, list) or not all(isinstance(row, dict) for row in data): + raise ValueError("Data must be provided as a list of dictionaries") + + try: + # Create unique filename using timestamp + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + data_filename = f"data_{timestamp}.csv" + hotkey_path = f"{hotkey}/data" + data_full_path = f"{hotkey_path}/{data_filename}" + + bt.logging.debug(f"Preparing to upload data: {data_full_path}") + + # Create temporary CSV file + temp_data_path = f"/tmp/{data_filename}" + if data: + fieldnames = data[0].keys() + with open(temp_data_path, "w", newline="") as f: + writer = csv.DictWriter(f, fieldnames=fieldnames) + writer.writeheader() + writer.writerows(data) + + # Ensure repository exists + if not self.api.repo_exists(repo_id=repo_id, repo_type="model"): + self.api.create_repo(repo_id=repo_id, private=False) + bt.logging.debug("Created new repo") + + # Upload file + bt.logging.debug(f"Uploading data file: {data_full_path}") + self.api.upload_file( + path_or_fileobj=temp_data_path, path_in_repo=data_full_path, repo_id=repo_id, repo_type="model" + ) + + # Clean up temporary file + os.remove(temp_data_path) + + return True, {"hotkey": hotkey, "timestamp": timestamp, "data_path": data_full_path} + + except Exception as e: + bt.logging.debug(f"Error in upload_data: {str(e)}") + return False, {"error": str(e)} From d1d98ce4fb0514fbf20e5743fdb1178704afb589 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 11 Dec 2024 13:39:13 -0500 Subject: [PATCH 095/201] update challenge to accept a decrytion key. Data should now be encrypted --- neurons/miner.py | 14 +++++- predictionnet/protocol.py | 55 ++++++++++++++------- predictionnet/utils/miner_hf.py | 88 ++++++++++++++++----------------- 3 files changed, 91 insertions(+), 66 deletions(-) diff --git a/neurons/miner.py b/neurons/miner.py index 2019ac67..a986fc28 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -22,6 +22,7 @@ import typing import bittensor as bt +from cryptography.fernet import Fernet # ML imports from dotenv import load_dotenv @@ -211,14 +212,23 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction model = load_model(model_path) data = prep_data() + # Generate encryption key for this request + encryption_key = Fernet.generate_key() + + # Upload encrypted data to HuggingFace hf_interface = MinerHfInterface(self.config) data_dict_list = data.to_dict("records") success, metadata = hf_interface.upload_data( - hotkey=self.wallet.hotkey.ss58_address, data=data_dict_list, repo_id=self.config.hf_repo_id + hotkey=self.wallet.hotkey.ss58_address, + data=data_dict_list, + repo_id=self.config.hf_repo_id, + encryption_key=encryption_key, ) if success: - bt.logging.success(f"Data uploaded successfully to {metadata['data_path']}") + bt.logging.success(f"Encrypted data uploaded successfully to {metadata['data_path']}") + synapse.data = metadata["data_path"] # Store the data path in synapse + synapse.decryption_key = encryption_key.decode() # Provide key to validator else: bt.logging.error(f"Data upload failed: {metadata['error']}") diff --git a/predictionnet/protocol.py b/predictionnet/protocol.py index 652460f6..8b728eb7 100644 --- a/predictionnet/protocol.py +++ b/predictionnet/protocol.py @@ -21,6 +21,7 @@ import bittensor as bt import pydantic +from pydantic import SecretStr # TODO(developer): Rewrite with your protocol definition. @@ -44,13 +45,16 @@ class Challenge(bt.Synapse): """ - A simple dummy protocol representation which uses bt.Synapse as its base. - This protocol helps in handling dummy request and response communication between - the miner and the validator. + Protocol for handling encrypted prediction challenges between miners and validators. + Includes secure handling of decryption keys and manages model/data references. Attributes: - - dummy_input: An integer value representing the input request sent by the validator. - - dummy_output: An optional integer value which, when filled, represents the response from the miner. + repo_id: Repository identifier where the model is stored + model: Identifier for the specific model to use + decryption_key: Securely stored key for decrypting data/models + data: Identifier for the data to be used + timestamp: Time at which the validation is taking place + prediction: List of predicted values for next 6 5m candles """ repo_id: Optional[str] = pydantic.Field( @@ -65,34 +69,47 @@ class Challenge(bt.Synapse): description="Which model to use", ) - # Required request input, filled by sending dendrite caller. + decryption_key: Optional[SecretStr] = pydantic.Field( + default=None, + title="Decryption Key", + description="Secure key for decrypting sensitive data/models", + ) + + data: Optional[str] = pydantic.Field( + default=None, + title="Data ID", + description="Which data to use", + ) + timestamp: str = pydantic.Field( ..., title="Timestamp", description="The time stamp at which the validation is taking place for", allow_mutation=False, ) - # Optional request output, filled by recieving axon. + prediction: Optional[List[float]] = pydantic.Field( default=None, title="Predictions", description="Next 6 5m candles' predictions for closing price of S&P 500", ) - def deserialize(self) -> int: + def deserialize(self) -> List[float]: """ - Deserialize the dummy output. This method retrieves the response from - the miner in the form of dummy_output, deserializes it and returns it - as the output of the dendrite.query() call. + Deserialize the prediction output from the miner. Returns: - - int: The deserialized response, which in this case is the value of dummy_output. - - Example: - Assuming a Dummy instance has a dummy_output value of 5: - >>> dummy_instance = Dummy(dummy_input=4) - >>> dummy_instance.dummy_output = 5 - >>> dummy_instance.deserialize() - 5 + List[float]: The deserialized predictions for the next 6 5m candles. """ return self.prediction + + def get_decryption_key(self) -> Optional[str]: + """ + Safely retrieve the decryption key when needed. + + Returns: + Optional[str]: The decryption key value if set, None otherwise. + """ + if self.decryption_key is not None: + return self.decryption_key.get_secret_value() + return None diff --git a/predictionnet/utils/miner_hf.py b/predictionnet/utils/miner_hf.py index 983310e7..56afaef1 100644 --- a/predictionnet/utils/miner_hf.py +++ b/predictionnet/utils/miner_hf.py @@ -1,26 +1,16 @@ import csv import os from datetime import datetime +from io import StringIO import bittensor as bt +from cryptography.fernet import Fernet from dotenv import load_dotenv from huggingface_hub import HfApi class MinerHfInterface: - """Interface for managing model uploads and metadata on HuggingFace Hub. - - Handles authentication, model uploads, and metadata retrieval for miner models - using the HuggingFace Hub API. - - Args: - config (bt.Config): Configuration object containing model and repository information. - Must include 'model' and 'hf_repo_id' attributes. - - Attributes: - api (HfApi): Authenticated HuggingFace API client - config (bt.Config): Stored configuration object - """ + """Interface for managing model uploads and metadata on HuggingFace Hub.""" def __init__(self, config: "bt.Config"): """Initialize the HuggingFace interface with configuration and authentication.""" @@ -31,22 +21,7 @@ def __init__(self, config: "bt.Config"): bt.logging.debug(f"Initializing with config: model={config.model}, repo_id={config.hf_repo_id}") def upload_model(self, repo_id=None, model_path=None, hotkey=None): - """Upload a model file to HuggingFace Hub. - - Args: - repo_id (str, optional): Target repository ID. Defaults to config value. - model_path (str, optional): Path to model file. Defaults to config value. - hotkey (str, optional): Hotkey for model identification. - - Returns: - tuple: (success, result) - - success (bool): Whether upload was successful - - result (dict): Contains 'hotkey' and 'timestamp' if successful, - 'error' if failed - - Raises: - ValueError: If model path extension cannot be determined or required parameters are missing - """ + """Upload a model file to HuggingFace Hub.""" bt.logging.debug(f"Trying to upload model: repo_id={repo_id}, model_path={model_path}, hotkey={hotkey}") try: @@ -59,7 +34,6 @@ def upload_model(self, repo_id=None, model_path=None, hotkey=None): model_full_path = f"{hotkey_path}/{model_name}" bt.logging.debug(f"Generated model path: {model_full_path}") - bt.logging.debug(f"Checking if repo exists: {repo_id}") if not self.api.repo_exists(repo_id=repo_id, repo_type="model"): @@ -70,7 +44,10 @@ def upload_model(self, repo_id=None, model_path=None, hotkey=None): bt.logging.debug(f"Uploading file as: {model_full_path}") self.api.upload_file( - path_or_fileobj=model_path, path_in_repo=model_full_path, repo_id=repo_id, repo_type="model" + path_or_fileobj=model_path, + path_in_repo=model_full_path, + repo_id=repo_id, + repo_type="model", ) commits = self.api.list_repo_commits(repo_id=repo_id, repo_type="model") @@ -86,13 +63,14 @@ def upload_model(self, repo_id=None, model_path=None, hotkey=None): bt.logging.debug(f"Error in upload_model: {str(e)}") return False, {"error": str(e)} - def upload_data(self, repo_id=None, data=None, hotkey=None): - """Upload training/validation data to HuggingFace Hub. + def upload_data(self, repo_id=None, data=None, hotkey=None, encryption_key=None): + """Upload encrypted training/validation data to HuggingFace Hub. Args: repo_id (str, optional): Target repository ID. Defaults to config value. data (list): List of dictionaries containing the data rows hotkey (str, optional): Hotkey for data identification + encryption_key (str): Base64-encoded key for encrypting the data Returns: tuple: (success, result) @@ -109,39 +87,59 @@ def upload_data(self, repo_id=None, data=None, hotkey=None): if not data or not isinstance(data, list) or not all(isinstance(row, dict) for row in data): raise ValueError("Data must be provided as a list of dictionaries") + if not encryption_key: + raise ValueError("Encryption key must be provided") + try: + fernet = Fernet(encryption_key.encode() if isinstance(encryption_key, str) else encryption_key) + # Create unique filename using timestamp timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - data_filename = f"data_{timestamp}.csv" + data_filename = f"data_{timestamp}.enc" hotkey_path = f"{hotkey}/data" data_full_path = f"{hotkey_path}/{data_filename}" - bt.logging.debug(f"Preparing to upload data: {data_full_path}") + bt.logging.debug(f"Preparing to upload encrypted data: {data_full_path}") - # Create temporary CSV file - temp_data_path = f"/tmp/{data_filename}" + # Convert data to CSV format in memory + csv_buffer = StringIO() if data: fieldnames = data[0].keys() - with open(temp_data_path, "w", newline="") as f: - writer = csv.DictWriter(f, fieldnames=fieldnames) - writer.writeheader() - writer.writerows(data) + writer = csv.DictWriter(csv_buffer, fieldnames=fieldnames) + writer.writeheader() + writer.writerows(data) + + # Encrypt the CSV data + csv_data = csv_buffer.getvalue().encode() + encrypted_data = fernet.encrypt(csv_data) + + # Create temporary encrypted file + temp_data_path = f"/tmp/{data_filename}" + with open(temp_data_path, "wb") as f: + f.write(encrypted_data) # Ensure repository exists if not self.api.repo_exists(repo_id=repo_id, repo_type="model"): self.api.create_repo(repo_id=repo_id, private=False) bt.logging.debug("Created new repo") - # Upload file - bt.logging.debug(f"Uploading data file: {data_full_path}") + # Upload encrypted file + bt.logging.debug(f"Uploading encrypted data file: {data_full_path}") self.api.upload_file( - path_or_fileobj=temp_data_path, path_in_repo=data_full_path, repo_id=repo_id, repo_type="model" + path_or_fileobj=temp_data_path, + path_in_repo=data_full_path, + repo_id=repo_id, + repo_type="model", ) # Clean up temporary file os.remove(temp_data_path) - return True, {"hotkey": hotkey, "timestamp": timestamp, "data_path": data_full_path} + return True, { + "hotkey": hotkey, + "timestamp": timestamp, + "data_path": data_full_path, + } except Exception as e: bt.logging.debug(f"Error in upload_data: {str(e)}") From fe7701af2c11c0cb95a4b2acb7c339fcbc643c10 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 11 Dec 2024 14:56:00 -0500 Subject: [PATCH 096/201] decrypt data and upload to foundryservices dataset --- predictionnet/utils/config.py | 7 + predictionnet/utils/dataset_manager.py | 196 +++++++++++++++++++++++++ predictionnet/validator/forward.py | 125 +++++++++------- 3 files changed, 273 insertions(+), 55 deletions(-) create mode 100644 predictionnet/utils/dataset_manager.py diff --git a/predictionnet/utils/config.py b/predictionnet/utils/config.py index d814d295..2365464a 100644 --- a/predictionnet/utils/config.py +++ b/predictionnet/utils/config.py @@ -156,6 +156,13 @@ def add_args(cls, parser): default=4096, ) + parser.add_argument( + "--neuron.organization", + type=str, + help="HuggingFace organization name for dataset storage", + default="foundryservices", + ) + # MINER ONLY CONFIG else: bt.logging.debug("Adding miner-specific arguments") diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py new file mode 100644 index 00000000..857f3514 --- /dev/null +++ b/predictionnet/utils/dataset_manager.py @@ -0,0 +1,196 @@ +# The MIT License (MIT) +# Copyright © 2024 Foundry Digital + +# 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. + +import asyncio +import json +import os +from concurrent.futures import ThreadPoolExecutor +from datetime import datetime +from typing import Dict, Optional, Tuple + +import bittensor as bt +from cryptography.fernet import Fernet +from huggingface_hub import HfApi, create_repo, repository + + +class DatasetManager: + def __init__(self, organization: str): + """ + Initialize the DatasetManager. + Args: + organization: The HuggingFace organization name + """ + self.token = os.getenv("HF_ACCESS_TOKEN") + if not self.token: + raise ValueError("HF_ACCESS_TOKEN environment variable not set") + + self.api = HfApi(token=self.token) + self.organization = organization + self.MAX_REPO_SIZE = 300 * 1024 * 1024 * 1024 # 300GB + self.executor = ThreadPoolExecutor(max_workers=1) + + def _get_current_repo_name(self) -> str: + """Generate repository name based on current date.""" + return f"dataset-{datetime.now().strftime('%Y-%m')}" + + def _get_repo_size(self, repo_id: str) -> int: + """ + Calculate total size of repository in bytes. + + Args: + repo_id: Full repository ID (org/name) + + Returns: + Total size in bytes + """ + try: + files = self.api.list_repo_files(repo_id) + total_size = 0 + + for file_info in files: + try: + file_metadata = self.api.get_file_metadata(repo_id=repo_id, filename=file_info) + total_size += file_metadata.size + except Exception as e: + bt.logging.error(f"Error getting metadata for {file_info}: {e}") + continue + + return total_size + except Exception: + return 0 + + def _create_new_repo(self, repo_name: str) -> str: + """ + Create a new dataset repository. + + Args: + repo_name: Name of the repository + + Returns: + Full repository ID + """ + repo_id = f"{self.organization}/{repo_name}" + try: + create_repo(repo_id=repo_id, repo_type="dataset", private=False, token=self.token) + bt.logging.success(f"Created new repository: {repo_id}") + except Exception as e: + bt.logging.error(f"Error creating repository {repo_id}: {e}") + raise + + return repo_id + + def decrypt_data(self, data_path: str, decryption_key: str) -> Tuple[bool, Dict]: + """ + Decrypt data from a file using the provided key. + + Args: + data_path: Path to the encrypted data file + decryption_key: Key to decrypt the data + + Returns: + Tuple of (success, result) + where result is either the decrypted data or an error message + """ + try: + fernet = Fernet(decryption_key.encode()) + + with open(data_path, "rb") as file: + encrypted_data = file.read() + + decrypted_data = fernet.decrypt(encrypted_data) + return True, json.loads(decrypted_data.decode()) + + except Exception as e: + return False, {"error": str(e)} + + def store_data( + self, timestamp: str, miner_data: Dict, predictions: Dict, metadata: Optional[Dict] = None + ) -> Tuple[bool, Dict]: + """ + Store data in the appropriate dataset repository. + + Args: + timestamp: Current timestamp + miner_data: Dictionary containing decrypted miner data + predictions: Dictionary containing prediction results + metadata: Optional metadata about the collection + + Returns: + Tuple of (success, result) + where result contains repository info or error message + """ + try: + # Get or create repository + repo_name = self._get_current_repo_name() + repo_id = f"{self.organization}/{repo_name}" + + # Check repository size + current_size = self._get_repo_size(repo_id) + + # Create new repo if would exceed size limit + data_size = len(json.dumps(miner_data).encode("utf-8")) + if current_size + data_size > self.MAX_REPO_SIZE: + repo_name = f"dataset-{datetime.now().strftime('%Y-%m-%d')}" + repo_id = self._create_new_repo(repo_name) + + # Prepare data entry + dataset_entry = {"timestamp": timestamp, "market_data": miner_data, "predictions": predictions} + if metadata: + dataset_entry["metadata"] = metadata + + # Upload to repository + with repository.Repository(local_dir=".", clone_from=repo_id, token=self.token) as repo: + filename = f"market_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json" + file_path = os.path.join(repo.local_dir, filename) + + with open(file_path, "w") as f: + json.dump(dataset_entry, f) + + commit_url = repo.push_to_hub() + + return True, {"repo_id": repo_id, "filename": filename, "commit_url": commit_url} + + except Exception as e: + return False, {"error": str(e)} + + async def store_data_async( + self, timestamp: str, miner_data: Dict, predictions: Dict, metadata: Optional[Dict] = None + ) -> None: + """ + Asynchronously store data in the appropriate dataset repository. + Does not block or return results. + """ + loop = asyncio.get_event_loop() + + async def _store(): + try: + # Run the blocking HuggingFace operations in a thread pool + result = await loop.run_in_executor( + self.executor, lambda: self.store_data(timestamp, miner_data, predictions, metadata) + ) + + success, upload_result = result + if success: + bt.logging.success(f"Stored market data in dataset: {upload_result['repo_id']}") + else: + bt.logging.error(f"Failed to store market data: {upload_result['error']}") + + except Exception as e: + bt.logging.error(f"Error in async data storage: {str(e)}") + + # Fire and forget - don't await the result + asyncio.create_task(_store()) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 2c4e0b06..abc159fd 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -1,18 +1,6 @@ # The MIT License (MIT) -# Copyright © 2023 Yuma Rao -# TODO(developer): Set your name -# Copyright © 2023 -# 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. +# Copyright © 2024 Foundry Digital + import time from datetime import datetime, timedelta @@ -21,95 +9,122 @@ from numpy import full, nan from pytz import timezone -# Import Validator Template import predictionnet +from predictionnet.utils.dataset_manager import DatasetManager from predictionnet.utils.uids import check_uid_availability from predictionnet.validator.reward import get_rewards +async def get_available_miner_uids(self): + """Get list of available miner UIDs.""" + miner_uids = [] + for uid in range(len(self.metagraph.S)): + uid_is_available = check_uid_availability(self.metagraph, uid, self.config.neuron.vpermit_tao_limit) + if uid_is_available: + miner_uids.append(uid) + return miner_uids + + +async def process_miner_response(self, uid, response, timestamp): + """Process and decrypt data from a single miner response.""" + bt.logging.info(f"Processing response from UID {uid}") + + processed_data = None + if response.data and response.decryption_key: + success, data = self.dataset_manager.decrypt_data( + data_path=response.data, decryption_key=response.decryption_key + ) + + if success: + processed_data = {"data": data, "hotkey": self.metagraph.hotkeys[uid], "timestamp": timestamp} + bt.logging.success(f"Successfully decrypted data from UID {uid}") + else: + bt.logging.error(f"Failed to decrypt data from UID {uid}: {data['error']}") + else: + bt.logging.warning(f"Missing data or decryption key from UID {uid}") + + predictions_data = { + "prediction": response.prediction if response.prediction else None, + "hotkey": self.metagraph.hotkeys[uid], + } + + return processed_data, predictions_data + + async def forward(self): """ The forward function is called by the validator every time step. It is responsible for querying the network and scoring the responses. - Args: - self (:obj:`bittensor.neuron.Neuron`): The neuron object which contains all the necessary state for the validator. """ - # TODO(developer): Define how the validator selects a miner to query, how often, etc. - # get_random_uids is an example method, but you can replace it with your own. + # Initialize dataset manager if not already done + if not hasattr(self, "dataset_manager"): + self.dataset_manager = DatasetManager(organization=self.config.neuron.organization) - # wait for market to be open ny_timezone = timezone("America/New_York") current_time_ny = datetime.now(ny_timezone) bt.logging.info("Current time: ", current_time_ny) - # block forward from running if market is closed + while True: if await self.is_valid_time(): bt.logging.info("Market is open. Begin processes requests") break else: bt.logging.info("Market is closed. Sleeping for 2 minutes...") - time.sleep(120) # Sleep for 5 minutes before checking again + time.sleep(120) if datetime.now(ny_timezone) - current_time_ny >= timedelta(hours=1): self.resync_metagraph() self.set_weights() self.past_predictions = [full((self.N_TIMEPOINTS, self.N_TIMEPOINTS), nan)] * len(self.hotkeys) current_time_ny = datetime.now(ny_timezone) - # miner_uids = get_random_uids(self, k=min(self.config.neuron.sample_size, self.metagraph.n.item())) - # get all uids - miner_uids = [] - for uid in range(len(self.metagraph.S)): - uid_is_available = check_uid_availability(self.metagraph, uid, self.config.neuron.vpermit_tao_limit) - if uid_is_available: - miner_uids.append(uid) - - # Here input data should be gathered to send to the miners - # TODO(create get_input_data()) - current_time_ny = datetime.now(ny_timezone) - timestamp = current_time_ny.isoformat() - - # Build synapse for request - # Replace dummy_input with actually defined variables in protocol.py - # This can be combined with line 49 - synapse = predictionnet.protocol.Challenge( - timestamp=timestamp, - ) + miner_uids = await get_available_miner_uids(self) + timestamp = datetime.now(ny_timezone).isoformat() + synapse = predictionnet.protocol.Challenge(timestamp=timestamp) responses = self.dendrite.query( - # Send the query to selected miner axons in the network. axons=[self.metagraph.axons[uid] for uid in miner_uids], - # Construct a dummy query. This simply contains a single integer. - # This can be simplified later to all build from here synapse=synapse, - # synapse=Dummy(dummy_input=self.step), - # All responses have the deserialize function called on them before returning. - # You are encouraged to define your own deserialization function. - # Other subnets have this turned to false, I am unsure of whether this should be set to true deserialize=False, ) - # Log the results for monitoring purposes. + + processed_data = {} + predictions_data = {} + for uid, response in zip(miner_uids, responses): - bt.logging.info(f"UID: {uid} | Predictions: {response.prediction}") + proc_data, pred_data = await process_miner_response(self, uid, response, timestamp) + if proc_data: + processed_data[str(uid)] = proc_data + predictions_data[str(uid)] = pred_data rewards = get_rewards(self, responses=responses, miner_uids=miner_uids) + for uid, reward in zip(miner_uids, rewards.tolist()): + predictions_data[str(uid)]["reward"] = float(reward) + + metadata = { + "total_miners": len(miner_uids), + "successful_decryptions": sum( + 1 for uid_data in processed_data.values() if "error" not in uid_data.get("data", {}) + ), + "market_conditions": {"timezone": ny_timezone.zone, "is_market_open": True}, + } + + await self.dataset_manager.store_data_async( + timestamp=timestamp, miner_data=processed_data, predictions=predictions_data, metadata=metadata + ) wandb_val_log = { "miners_info": { miner_uid: { "miner_response": response.prediction, "miner_reward": reward, + "data_decrypted": str(miner_uid) in processed_data, } for miner_uid, response, reward in zip(miner_uids, responses, rewards.tolist()) } } - wandb.log(wandb_val_log) - # Potentially will need some - bt.logging.info(f"Scored responses: {rewards}") - # Update the scores based on the rewards. You may want to define your own update_scores function for custom behavior. models_confirmed = self.confirm_models(responses, miner_uids) bt.logging.info(f"Models Confirmed: {models_confirmed}") rewards = [0 if not model_confirmed else reward for reward, model_confirmed in zip(rewards, models_confirmed)] - # Check base validator file self.update_scores(rewards, miner_uids) From 8e6cdcd0a8d794ab4b2150d858b6e0daf57059ed Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 11 Dec 2024 15:05:08 -0500 Subject: [PATCH 097/201] update decrypt_data --- predictionnet/utils/dataset_manager.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py index 857f3514..dbbfff7d 100644 --- a/predictionnet/utils/dataset_manager.py +++ b/predictionnet/utils/dataset_manager.py @@ -99,14 +99,20 @@ def decrypt_data(self, data_path: str, decryption_key: str) -> Tuple[bool, Dict] Args: data_path: Path to the encrypted data file - decryption_key: Key to decrypt the data + decryption_key: Key to decrypt the data (can be str or SecretStr) Returns: Tuple of (success, result) where result is either the decrypted data or an error message """ try: - fernet = Fernet(decryption_key.encode()) + # Handle both SecretStr and regular string types + if hasattr(decryption_key, "get_secret_value"): + key = decryption_key.get_secret_value().encode() + else: + key = decryption_key.encode() + + fernet = Fernet(key) with open(data_path, "rb") as file: encrypted_data = file.read() From 3fcae57d3a14b6139e1ea322e96c7748281f70c6 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 11 Dec 2024 15:14:20 -0500 Subject: [PATCH 098/201] update decryption_key to be bytes --- neurons/miner.py | 2 +- predictionnet/protocol.py | 3 +-- predictionnet/utils/dataset_manager.py | 12 +++--------- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/neurons/miner.py b/neurons/miner.py index a986fc28..7db5a9dd 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -228,7 +228,7 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction if success: bt.logging.success(f"Encrypted data uploaded successfully to {metadata['data_path']}") synapse.data = metadata["data_path"] # Store the data path in synapse - synapse.decryption_key = encryption_key.decode() # Provide key to validator + synapse.decryption_key = encryption_key # Provide key to validator else: bt.logging.error(f"Data upload failed: {metadata['error']}") diff --git a/predictionnet/protocol.py b/predictionnet/protocol.py index 8b728eb7..9e3806aa 100644 --- a/predictionnet/protocol.py +++ b/predictionnet/protocol.py @@ -21,7 +21,6 @@ import bittensor as bt import pydantic -from pydantic import SecretStr # TODO(developer): Rewrite with your protocol definition. @@ -69,7 +68,7 @@ class Challenge(bt.Synapse): description="Which model to use", ) - decryption_key: Optional[SecretStr] = pydantic.Field( + decryption_key: Optional[bytes] = pydantic.Field( default=None, title="Decryption Key", description="Secure key for decrypting sensitive data/models", diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py index dbbfff7d..88c5cea3 100644 --- a/predictionnet/utils/dataset_manager.py +++ b/predictionnet/utils/dataset_manager.py @@ -93,26 +93,20 @@ def _create_new_repo(self, repo_name: str) -> str: return repo_id - def decrypt_data(self, data_path: str, decryption_key: str) -> Tuple[bool, Dict]: + def decrypt_data(self, data_path: str, decryption_key: bytes) -> Tuple[bool, Dict]: """ Decrypt data from a file using the provided key. Args: data_path: Path to the encrypted data file - decryption_key: Key to decrypt the data (can be str or SecretStr) + decryption_key: Raw Fernet key in bytes format Returns: Tuple of (success, result) where result is either the decrypted data or an error message """ try: - # Handle both SecretStr and regular string types - if hasattr(decryption_key, "get_secret_value"): - key = decryption_key.get_secret_value().encode() - else: - key = decryption_key.encode() - - fernet = Fernet(key) + fernet = Fernet(decryption_key) with open(data_path, "rb") as file: encrypted_data = file.read() From 06dfca4a09d4b93bd95099649fc27887f7ea247f Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 11 Dec 2024 15:18:50 -0500 Subject: [PATCH 099/201] fix deserialization of decription key --- predictionnet/protocol.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/predictionnet/protocol.py b/predictionnet/protocol.py index 9e3806aa..0d15d904 100644 --- a/predictionnet/protocol.py +++ b/predictionnet/protocol.py @@ -102,13 +102,11 @@ def deserialize(self) -> List[float]: """ return self.prediction - def get_decryption_key(self) -> Optional[str]: + def get_decryption_key(self) -> Optional[bytes]: """ Safely retrieve the decryption key when needed. Returns: - Optional[str]: The decryption key value if set, None otherwise. + Optional[bytes]: The raw Fernet key bytes if set, None otherwise. """ - if self.decryption_key is not None: - return self.decryption_key.get_secret_value() - return None + return self.decryption_key From 17b7af8cc8af2439dcefceaf894cc6b4c4ef819d Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 11 Dec 2024 15:35:31 -0500 Subject: [PATCH 100/201] updated path for decryption to be the full path to the miners encrypted hf data --- predictionnet/validator/forward.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index abc159fd..70144031 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -27,12 +27,13 @@ async def get_available_miner_uids(self): async def process_miner_response(self, uid, response, timestamp): """Process and decrypt data from a single miner response.""" - bt.logging.info(f"Processing response from UID {uid}") - processed_data = None - if response.data and response.decryption_key: + if response.data and response.decryption_key and response.repo_id: + # Construct full data path using repo_id + full_data_path = f"{response.repo_id}/{response.data}" + success, data = self.dataset_manager.decrypt_data( - data_path=response.data, decryption_key=response.decryption_key + data_path=full_data_path, decryption_key=response.decryption_key ) if success: @@ -40,8 +41,6 @@ async def process_miner_response(self, uid, response, timestamp): bt.logging.success(f"Successfully decrypted data from UID {uid}") else: bt.logging.error(f"Failed to decrypt data from UID {uid}: {data['error']}") - else: - bt.logging.warning(f"Missing data or decryption key from UID {uid}") predictions_data = { "prediction": response.prediction if response.prediction else None, From 418294dfd6680fbe7563b2a25fa229d1f419540c Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 11 Dec 2024 15:42:52 -0500 Subject: [PATCH 101/201] ensure that decryption works from hf path --- predictionnet/utils/dataset_manager.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py index 88c5cea3..8e94e2c2 100644 --- a/predictionnet/utils/dataset_manager.py +++ b/predictionnet/utils/dataset_manager.py @@ -24,7 +24,7 @@ import bittensor as bt from cryptography.fernet import Fernet -from huggingface_hub import HfApi, create_repo, repository +from huggingface_hub import HfApi, create_repo, hf_hub_download, repository class DatasetManager: @@ -95,10 +95,10 @@ def _create_new_repo(self, repo_name: str) -> str: def decrypt_data(self, data_path: str, decryption_key: bytes) -> Tuple[bool, Dict]: """ - Decrypt data from a file using the provided key. + Decrypt data from a public HuggingFace repository file using the provided key. Args: - data_path: Path to the encrypted data file + data_path: Full repository path (repo_id/filename) to the encrypted data file decryption_key: Raw Fernet key in bytes format Returns: @@ -106,9 +106,15 @@ def decrypt_data(self, data_path: str, decryption_key: bytes) -> Tuple[bool, Dic where result is either the decrypted data or an error message """ try: - fernet = Fernet(decryption_key) + # Split the data_path into repo_id and filename + repo_id, filename = data_path.split("/", 1) + + # Download the file from HuggingFace (no token needed for public datasets) + local_path = hf_hub_download(repo_id=repo_id, filename=filename) - with open(data_path, "rb") as file: + # Decrypt the downloaded file + fernet = Fernet(decryption_key) + with open(local_path, "rb") as file: encrypted_data = file.read() decrypted_data = fernet.decrypt(encrypted_data) From b1f10fe6544872c86dda4cf85ca9f051b2aa2bdb Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 11 Dec 2024 15:50:32 -0500 Subject: [PATCH 102/201] add logging --- predictionnet/utils/dataset_manager.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py index 8e94e2c2..d964cd17 100644 --- a/predictionnet/utils/dataset_manager.py +++ b/predictionnet/utils/dataset_manager.py @@ -106,21 +106,34 @@ def decrypt_data(self, data_path: str, decryption_key: bytes) -> Tuple[bool, Dic where result is either the decrypted data or an error message """ try: + bt.logging.info(f"Attempting to decrypt data from path: {data_path}") + # Split the data_path into repo_id and filename repo_id, filename = data_path.split("/", 1) + bt.logging.info(f"Split path - repo_id: {repo_id}, filename: {filename}") # Download the file from HuggingFace (no token needed for public datasets) + bt.logging.info(f"Downloading file from HuggingFace - repo_id: {repo_id}, filename: {filename}") local_path = hf_hub_download(repo_id=repo_id, filename=filename) + bt.logging.info(f"File downloaded to local path: {local_path}") # Decrypt the downloaded file + bt.logging.info("Initializing Fernet with provided key") fernet = Fernet(decryption_key) + with open(local_path, "rb") as file: + bt.logging.info("Reading encrypted data from file") encrypted_data = file.read() + bt.logging.info("Attempting to decrypt data") decrypted_data = fernet.decrypt(encrypted_data) + bt.logging.info("Successfully decrypted data") + return True, json.loads(decrypted_data.decode()) except Exception as e: + bt.logging.error(f"Error in decrypt_data: {str(e)}") + bt.logging.error(f"Error type: {type(e).__name__}") return False, {"error": str(e)} def store_data( From 246de6ecaf3e299ec73b328f4a3b18bac327e136 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 11 Dec 2024 16:08:00 -0500 Subject: [PATCH 103/201] ensure proper format for repo_id when downloading from huggingface --- predictionnet/utils/dataset_manager.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py index d964cd17..48f8b68a 100644 --- a/predictionnet/utils/dataset_manager.py +++ b/predictionnet/utils/dataset_manager.py @@ -98,7 +98,7 @@ def decrypt_data(self, data_path: str, decryption_key: bytes) -> Tuple[bool, Dic Decrypt data from a public HuggingFace repository file using the provided key. Args: - data_path: Full repository path (repo_id/filename) to the encrypted data file + data_path: Full repository path (org/repo_type/hotkey/data/filename format) decryption_key: Raw Fernet key in bytes format Returns: @@ -108,13 +108,15 @@ def decrypt_data(self, data_path: str, decryption_key: bytes) -> Tuple[bool, Dic try: bt.logging.info(f"Attempting to decrypt data from path: {data_path}") - # Split the data_path into repo_id and filename - repo_id, filename = data_path.split("/", 1) - bt.logging.info(f"Split path - repo_id: {repo_id}, filename: {filename}") + # Split path into components based on known structure + parts = data_path.split("/") + repo_id = f"{parts[0]}/{parts[1]}" # org/repo_type (e.g., pcarlson-foundry-digital/mining_models) + subfolder = f"{parts[2]}/data" # hotkey/data + filename = parts[-1] # actual filename - # Download the file from HuggingFace (no token needed for public datasets) - bt.logging.info(f"Downloading file from HuggingFace - repo_id: {repo_id}, filename: {filename}") - local_path = hf_hub_download(repo_id=repo_id, filename=filename) + bt.logging.info(f"Downloading - repo_id: {repo_id}, subfolder: {subfolder}, filename: {filename}") + + local_path = hf_hub_download(repo_id=repo_id, filename=filename, subfolder=subfolder) bt.logging.info(f"File downloaded to local path: {local_path}") # Decrypt the downloaded file From 5203abd6d2a4d85458f856d042df132ad7c0b124 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 12 Dec 2024 12:27:33 -0500 Subject: [PATCH 104/201] Update forward.py to decrypt data properly --- neurons/miner.py | 3 +- predictionnet/utils/dataset_manager.py | 201 ++++++++++++++++++------- predictionnet/utils/miner_hf.py | 20 +-- predictionnet/validator/forward.py | 86 ++++++++--- 4 files changed, 220 insertions(+), 90 deletions(-) diff --git a/neurons/miner.py b/neurons/miner.py index 7db5a9dd..252ce87e 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -217,10 +217,9 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction # Upload encrypted data to HuggingFace hf_interface = MinerHfInterface(self.config) - data_dict_list = data.to_dict("records") success, metadata = hf_interface.upload_data( hotkey=self.wallet.hotkey.ss58_address, - data=data_dict_list, + data=data, repo_id=self.config.hf_repo_id, encryption_key=encryption_key, ) diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py index 48f8b68a..795e4d71 100644 --- a/predictionnet/utils/dataset_manager.py +++ b/predictionnet/utils/dataset_manager.py @@ -20,9 +20,11 @@ import os from concurrent.futures import ThreadPoolExecutor from datetime import datetime +from io import StringIO from typing import Dict, Optional, Tuple import bittensor as bt +import pandas as pd from cryptography.fernet import Fernet from huggingface_hub import HfApi, create_repo, hf_hub_download, repository @@ -93,61 +95,50 @@ def _create_new_repo(self, repo_name: str) -> str: return repo_id - def decrypt_data(self, data_path: str, decryption_key: bytes) -> Tuple[bool, Dict]: + def verify_encryption_key(self, key: bytes) -> bool: """ - Decrypt data from a public HuggingFace repository file using the provided key. + Verify that an encryption key is valid for Fernet. Args: - data_path: Full repository path (org/repo_type/hotkey/data/filename format) - decryption_key: Raw Fernet key in bytes format + key: The key to verify Returns: - Tuple of (success, result) - where result is either the decrypted data or an error message + bool: True if key is valid """ try: - bt.logging.info(f"Attempting to decrypt data from path: {data_path}") - - # Split path into components based on known structure - parts = data_path.split("/") - repo_id = f"{parts[0]}/{parts[1]}" # org/repo_type (e.g., pcarlson-foundry-digital/mining_models) - subfolder = f"{parts[2]}/data" # hotkey/data - filename = parts[-1] # actual filename - - bt.logging.info(f"Downloading - repo_id: {repo_id}, subfolder: {subfolder}, filename: {filename}") - - local_path = hf_hub_download(repo_id=repo_id, filename=filename, subfolder=subfolder) - bt.logging.info(f"File downloaded to local path: {local_path}") - - # Decrypt the downloaded file - bt.logging.info("Initializing Fernet with provided key") - fernet = Fernet(decryption_key) - - with open(local_path, "rb") as file: - bt.logging.info("Reading encrypted data from file") - encrypted_data = file.read() - - bt.logging.info("Attempting to decrypt data") - decrypted_data = fernet.decrypt(encrypted_data) - bt.logging.info("Successfully decrypted data") - - return True, json.loads(decrypted_data.decode()) - + # Check if key is valid base64 + import base64 + + decoded = base64.b64decode(key) + # Check if key length is correct (32 bytes) + if len(decoded) != 32: + bt.logging.error(f"Invalid key length: {len(decoded)} bytes (expected 32)") + return False + # Try to initialize Fernet + Fernet(key) + return True except Exception as e: - bt.logging.error(f"Error in decrypt_data: {str(e)}") - bt.logging.error(f"Error type: {type(e).__name__}") - return False, {"error": str(e)} + bt.logging.error(f"Invalid encryption key: {str(e)}") + return False def store_data( - self, timestamp: str, miner_data: Dict, predictions: Dict, metadata: Optional[Dict] = None + self, + timestamp: str, + miner_data: pd.DataFrame, + predictions: Dict, + encryption_key: bytes, + metadata: Optional[Dict] = None, ) -> Tuple[bool, Dict]: """ - Store data in the appropriate dataset repository. + Store encrypted market data in the appropriate dataset repository. Args: timestamp: Current timestamp - miner_data: Dictionary containing decrypted miner data + miner_data: DataFrame containing market data with OHLCV and technical indicators + Expected columns: ['Open', 'High', 'Low', 'Close', 'Volume', + 'SMA_50', 'SMA_200', 'RSI', 'CCI', 'Momentum', 'NextClose1'...] predictions: Dictionary containing prediction results + encryption_key: Raw Fernet key in bytes format metadata: Optional metadata about the collection Returns: @@ -155,41 +146,141 @@ def store_data( where result contains repository info or error message """ try: + if not isinstance(miner_data, pd.DataFrame) or miner_data.empty: + raise ValueError("miner_data must be a non-empty pandas DataFrame") + + # Validate required columns + required_columns = {"Open", "High", "Low", "Close", "Volume", "SMA_50", "SMA_200", "RSI", "CCI", "Momentum"} + missing_columns = required_columns - set(miner_data.columns) + if missing_columns: + raise ValueError(f"DataFrame missing required columns: {missing_columns}") + + # Validate NextClose columns (at least one should be present) + next_close_columns = [col for col in miner_data.columns if col.startswith("NextClose")] + if not next_close_columns: + raise ValueError("DataFrame missing NextClose prediction columns") + # Get or create repository repo_name = self._get_current_repo_name() repo_id = f"{self.organization}/{repo_name}" + # Convert DataFrame to CSV and check size + csv_buffer = StringIO() + miner_data.to_csv(csv_buffer, index=True) # Include datetime index + csv_data = csv_buffer.getvalue().encode() + + # Add metadata as comments at the end of CSV + metadata_buffer = StringIO() + metadata_buffer.write("\n# Metadata:\n") + metadata_buffer.write(f"# timestamp: {timestamp}\n") + metadata_buffer.write(f"# columns: {','.join(miner_data.columns)}\n") # Store column order + metadata_buffer.write(f"# shape: {miner_data.shape[0]},{miner_data.shape[1]}\n") + if metadata: + for key, value in metadata.items(): + metadata_buffer.write(f"# {key}: {value}\n") + if predictions: + metadata_buffer.write(f"# predictions: {json.dumps(predictions)}\n") + + # Combine CSV data and metadata + full_data = csv_data + metadata_buffer.getvalue().encode() + + # Initialize Fernet and encrypt + fernet = Fernet(encryption_key) + encrypted_data = fernet.encrypt(full_data) + # Check repository size current_size = self._get_repo_size(repo_id) - - # Create new repo if would exceed size limit - data_size = len(json.dumps(miner_data).encode("utf-8")) - if current_size + data_size > self.MAX_REPO_SIZE: + if current_size + len(encrypted_data) > self.MAX_REPO_SIZE: repo_name = f"dataset-{datetime.now().strftime('%Y-%m-%d')}" repo_id = self._create_new_repo(repo_name) - # Prepare data entry - dataset_entry = {"timestamp": timestamp, "market_data": miner_data, "predictions": predictions} - if metadata: - dataset_entry["metadata"] = metadata - # Upload to repository with repository.Repository(local_dir=".", clone_from=repo_id, token=self.token) as repo: - filename = f"market_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json" + filename = f"market_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.enc" file_path = os.path.join(repo.local_dir, filename) - with open(file_path, "w") as f: - json.dump(dataset_entry, f) + with open(file_path, "wb") as f: + f.write(encrypted_data) commit_url = repo.push_to_hub() - return True, {"repo_id": repo_id, "filename": filename, "commit_url": commit_url} + return True, { + "repo_id": repo_id, + "filename": filename, + "commit_url": commit_url, + "rows": miner_data.shape[0], + "columns": miner_data.shape[1], + } except Exception as e: + bt.logging.error(f"Error in store_data: {str(e)}") + return False, {"error": str(e)} + + def decrypt_data(self, data_path: str, decryption_key: bytes) -> Tuple[bool, Dict]: + """ + Decrypt data from a HuggingFace repository file using the provided key. + + Args: + data_path: Full repository path (org/repo_type/hotkey/data/filename format) + decryption_key: Raw Fernet key in bytes format + + Returns: + Tuple of (success, result) where result contains: + - data: pandas DataFrame of the CSV data + - metadata: Dictionary of metadata from CSV comments + - predictions: Dictionary of predictions if present + """ + try: + bt.logging.info(f"Attempting to decrypt data from path: {data_path}") + + # Split path into components + parts = data_path.split("/") + repo_id = f"{parts[0]}/{parts[1]}" + subfolder = f"{parts[2]}/data" + filename = parts[-1] + + local_path = hf_hub_download(repo_id=repo_id, filename=filename, subfolder=subfolder) + fernet = Fernet(decryption_key) + + with open(local_path, "rb") as file: + encrypted_data = file.read() + + decrypted_data = fernet.decrypt(encrypted_data).decode() + + # Split data into CSV and metadata sections + parts = decrypted_data.split("\n# Metadata:") + + # Parse CSV data into DataFrame + df = pd.read_csv(StringIO(parts[0])) + + # Parse metadata + metadata = {} + predictions = None + if len(parts) > 1: + for line in parts[1].split("\n"): + if line.startswith("# "): + try: + key, value = line[2:].split(": ", 1) + if key == "predictions": + predictions = json.loads(value) + else: + metadata[key] = value + except ValueError: + continue + + return True, {"data": df, "metadata": metadata, "predictions": predictions} + + except Exception as e: + bt.logging.error(f"Error in decrypt_data: {str(e)}") return False, {"error": str(e)} async def store_data_async( - self, timestamp: str, miner_data: Dict, predictions: Dict, metadata: Optional[Dict] = None + self, + timestamp: str, + miner_data: pd.DataFrame, + predictions: Dict, + encryption_key: bytes, + metadata: Optional[Dict] = None, ) -> None: """ Asynchronously store data in the appropriate dataset repository. @@ -199,9 +290,8 @@ async def store_data_async( async def _store(): try: - # Run the blocking HuggingFace operations in a thread pool result = await loop.run_in_executor( - self.executor, lambda: self.store_data(timestamp, miner_data, predictions, metadata) + self.executor, lambda: self.store_data(timestamp, miner_data, predictions, encryption_key, metadata) ) success, upload_result = result @@ -213,5 +303,4 @@ async def _store(): except Exception as e: bt.logging.error(f"Error in async data storage: {str(e)}") - # Fire and forget - don't await the result asyncio.create_task(_store()) diff --git a/predictionnet/utils/miner_hf.py b/predictionnet/utils/miner_hf.py index 56afaef1..bec3552f 100644 --- a/predictionnet/utils/miner_hf.py +++ b/predictionnet/utils/miner_hf.py @@ -1,9 +1,9 @@ -import csv import os from datetime import datetime from io import StringIO import bittensor as bt +import pandas as pd from cryptography.fernet import Fernet from dotenv import load_dotenv from huggingface_hub import HfApi @@ -63,12 +63,12 @@ def upload_model(self, repo_id=None, model_path=None, hotkey=None): bt.logging.debug(f"Error in upload_model: {str(e)}") return False, {"error": str(e)} - def upload_data(self, repo_id=None, data=None, hotkey=None, encryption_key=None): + def upload_data(self, repo_id=None, data: pd.DataFrame = None, hotkey=None, encryption_key=None): """Upload encrypted training/validation data to HuggingFace Hub. Args: repo_id (str, optional): Target repository ID. Defaults to config value. - data (list): List of dictionaries containing the data rows + data (pd.DataFrame): DataFrame containing the data hotkey (str, optional): Hotkey for data identification encryption_key (str): Base64-encoded key for encrypting the data @@ -76,7 +76,7 @@ def upload_data(self, repo_id=None, data=None, hotkey=None, encryption_key=None) tuple: (success, result) - success (bool): Whether upload was successful - result (dict): Contains 'hotkey', 'timestamp', and 'data_path' if successful, - 'error' if failed + 'error' if failed Raises: ValueError: If required parameters are missing or data format is invalid @@ -84,8 +84,8 @@ def upload_data(self, repo_id=None, data=None, hotkey=None, encryption_key=None) if not repo_id: repo_id = self.config.hf_repo_id - if not data or not isinstance(data, list) or not all(isinstance(row, dict) for row in data): - raise ValueError("Data must be provided as a list of dictionaries") + if not isinstance(data, pd.DataFrame) or data.empty: + raise ValueError("Data must be provided as a non-empty pandas DataFrame") if not encryption_key: raise ValueError("Encryption key must be provided") @@ -101,13 +101,9 @@ def upload_data(self, repo_id=None, data=None, hotkey=None, encryption_key=None) bt.logging.debug(f"Preparing to upload encrypted data: {data_full_path}") - # Convert data to CSV format in memory + # Convert DataFrame to CSV in memory csv_buffer = StringIO() - if data: - fieldnames = data[0].keys() - writer = csv.DictWriter(csv_buffer, fieldnames=fieldnames) - writer.writeheader() - writer.writerows(data) + data.to_csv(csv_buffer, index=False) # Encrypt the CSV data csv_data = csv_buffer.getvalue().encode() diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 70144031..cef65201 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -1,10 +1,24 @@ # The MIT License (MIT) -# Copyright © 2024 Foundry Digital +# Copyright © 2023 Yuma Rao +# TODO(developer): Set your name +# Copyright © 2023 +# 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. import time from datetime import datetime, timedelta import bittensor as bt +import pandas as pd import wandb from numpy import full, nan from pytz import timezone @@ -26,28 +40,39 @@ async def get_available_miner_uids(self): async def process_miner_response(self, uid, response, timestamp): - """Process and decrypt data from a single miner response.""" + """ + Process and decrypt data from a single miner response. + + Returns: + Tuple[Optional[pd.DataFrame], Dict]: (processed DataFrame or None, predictions data) + """ processed_data = None if response.data and response.decryption_key and response.repo_id: # Construct full data path using repo_id full_data_path = f"{response.repo_id}/{response.data}" - success, data = self.dataset_manager.decrypt_data( + success, result = self.dataset_manager.decrypt_data( data_path=full_data_path, decryption_key=response.decryption_key ) - if success: - processed_data = {"data": data, "hotkey": self.metagraph.hotkeys[uid], "timestamp": timestamp} + if success and isinstance(result.get("data"), pd.DataFrame): + df = result["data"] + # Add miner identification columns + df["miner_uid"] = uid + df["miner_hotkey"] = self.metagraph.hotkeys[uid] + df["timestamp"] = timestamp + processed_data = df bt.logging.success(f"Successfully decrypted data from UID {uid}") else: - bt.logging.error(f"Failed to decrypt data from UID {uid}: {data['error']}") + error_msg = result.get("error", "Unknown error") if isinstance(result, dict) else "Invalid data format" + bt.logging.error(f"Failed to decrypt data from UID {uid}: {error_msg}") predictions_data = { "prediction": response.prediction if response.prediction else None, "hotkey": self.metagraph.hotkeys[uid], } - return processed_data, predictions_data + return processed_data, predictions_data, response.decryption_key async def forward(self): @@ -86,44 +111,65 @@ async def forward(self): deserialize=False, ) - processed_data = {} + # Collect DataFrames and predictions + df_list = [] predictions_data = {} + encryption_keys = [] for uid, response in zip(miner_uids, responses): - proc_data, pred_data = await process_miner_response(self, uid, response, timestamp) - if proc_data: - processed_data[str(uid)] = proc_data + proc_data, pred_data, encryption_key = await process_miner_response(self, uid, response, timestamp) + if isinstance(proc_data, pd.DataFrame) and not proc_data.empty: + df_list.append(proc_data) + encryption_keys.append(encryption_key) predictions_data[str(uid)] = pred_data + # Combine all valid DataFrame data + if df_list: + combined_df = pd.concat(df_list, ignore_index=True) + + # Validate required columns + required_columns = {"Open", "High", "Low", "Close", "Volume", "SMA_50", "SMA_200", "RSI", "CCI", "Momentum"} + missing_columns = required_columns - set(combined_df.columns) + if missing_columns: + bt.logging.error(f"Combined data missing required columns: {missing_columns}") + combined_df = pd.DataFrame() # Reset to empty if validation fails + else: + bt.logging.warning("No valid data received from miners") + combined_df = pd.DataFrame() + + # Add rewards to predictions data rewards = get_rewards(self, responses=responses, miner_uids=miner_uids) for uid, reward in zip(miner_uids, rewards.tolist()): predictions_data[str(uid)]["reward"] = float(reward) metadata = { "total_miners": len(miner_uids), - "successful_decryptions": sum( - 1 for uid_data in processed_data.values() if "error" not in uid_data.get("data", {}) - ), + "successful_decryptions": len(df_list), "market_conditions": {"timezone": ny_timezone.zone, "is_market_open": True}, + "encryption_keys": encryption_keys, # Store the keys used for reference } await self.dataset_manager.store_data_async( - timestamp=timestamp, miner_data=processed_data, predictions=predictions_data, metadata=metadata + timestamp=timestamp, + miner_data=combined_df, + predictions=predictions_data, + encryption_key=encryption_keys[0] if encryption_keys else None, # Use first valid key + metadata=metadata, ) + models_confirmed = self.confirm_models(responses, miner_uids) + bt.logging.info(f"Models Confirmed: {models_confirmed}") + rewards = [0 if not model_confirmed else reward for reward, model_confirmed in zip(rewards, models_confirmed)] + wandb_val_log = { "miners_info": { miner_uid: { "miner_response": response.prediction, "miner_reward": reward, - "data_decrypted": str(miner_uid) in processed_data, } for miner_uid, response, reward in zip(miner_uids, responses, rewards.tolist()) } } - wandb.log(wandb_val_log) - models_confirmed = self.confirm_models(responses, miner_uids) - bt.logging.info(f"Models Confirmed: {models_confirmed}") - rewards = [0 if not model_confirmed else reward for reward, model_confirmed in zip(rewards, models_confirmed)] + wandb.log(wandb_val_log) self.update_scores(rewards, miner_uids) From ac72f53347ba5f548b073c2b856ec47502bf8920 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 12 Dec 2024 15:41:49 -0500 Subject: [PATCH 105/201] add logging for key --- neurons/miner.py | 1 + predictionnet/validator/forward.py | 149 +++++++++-------------------- 2 files changed, 47 insertions(+), 103 deletions(-) diff --git a/neurons/miner.py b/neurons/miner.py index 252ce87e..07c2ed58 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -228,6 +228,7 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction bt.logging.success(f"Encrypted data uploaded successfully to {metadata['data_path']}") synapse.data = metadata["data_path"] # Store the data path in synapse synapse.decryption_key = encryption_key # Provide key to validator + bt.logging.info(f"Decryption_key: {synapse.decryption_key}") else: bt.logging.error(f"Data upload failed: {metadata['error']}") diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index cef65201..1cde941e 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -13,153 +13,90 @@ # 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. - import time from datetime import datetime, timedelta import bittensor as bt -import pandas as pd import wandb from numpy import full, nan from pytz import timezone +# Import Validator Template import predictionnet -from predictionnet.utils.dataset_manager import DatasetManager from predictionnet.utils.uids import check_uid_availability from predictionnet.validator.reward import get_rewards -async def get_available_miner_uids(self): - """Get list of available miner UIDs.""" - miner_uids = [] - for uid in range(len(self.metagraph.S)): - uid_is_available = check_uid_availability(self.metagraph, uid, self.config.neuron.vpermit_tao_limit) - if uid_is_available: - miner_uids.append(uid) - return miner_uids - - -async def process_miner_response(self, uid, response, timestamp): - """ - Process and decrypt data from a single miner response. - - Returns: - Tuple[Optional[pd.DataFrame], Dict]: (processed DataFrame or None, predictions data) - """ - processed_data = None - if response.data and response.decryption_key and response.repo_id: - # Construct full data path using repo_id - full_data_path = f"{response.repo_id}/{response.data}" - - success, result = self.dataset_manager.decrypt_data( - data_path=full_data_path, decryption_key=response.decryption_key - ) - - if success and isinstance(result.get("data"), pd.DataFrame): - df = result["data"] - # Add miner identification columns - df["miner_uid"] = uid - df["miner_hotkey"] = self.metagraph.hotkeys[uid] - df["timestamp"] = timestamp - processed_data = df - bt.logging.success(f"Successfully decrypted data from UID {uid}") - else: - error_msg = result.get("error", "Unknown error") if isinstance(result, dict) else "Invalid data format" - bt.logging.error(f"Failed to decrypt data from UID {uid}: {error_msg}") - - predictions_data = { - "prediction": response.prediction if response.prediction else None, - "hotkey": self.metagraph.hotkeys[uid], - } - - return processed_data, predictions_data, response.decryption_key - - async def forward(self): """ The forward function is called by the validator every time step. It is responsible for querying the network and scoring the responses. + Args: + self (:obj:`bittensor.neuron.Neuron`): The neuron object which contains all the necessary state for the validator. """ - # Initialize dataset manager if not already done - if not hasattr(self, "dataset_manager"): - self.dataset_manager = DatasetManager(organization=self.config.neuron.organization) + # TODO(developer): Define how the validator selects a miner to query, how often, etc. + # get_random_uids is an example method, but you can replace it with your own. + # wait for market to be open ny_timezone = timezone("America/New_York") current_time_ny = datetime.now(ny_timezone) bt.logging.info("Current time: ", current_time_ny) - + # block forward from running if market is closed while True: if await self.is_valid_time(): bt.logging.info("Market is open. Begin processes requests") break else: bt.logging.info("Market is closed. Sleeping for 2 minutes...") - time.sleep(120) + time.sleep(120) # Sleep for 5 minutes before checking again if datetime.now(ny_timezone) - current_time_ny >= timedelta(hours=1): self.resync_metagraph() self.set_weights() self.past_predictions = [full((self.N_TIMEPOINTS, self.N_TIMEPOINTS), nan)] * len(self.hotkeys) current_time_ny = datetime.now(ny_timezone) - miner_uids = await get_available_miner_uids(self) - timestamp = datetime.now(ny_timezone).isoformat() + # miner_uids = get_random_uids(self, k=min(self.config.neuron.sample_size, self.metagraph.n.item())) + # get all uids + miner_uids = [] + for uid in range(len(self.metagraph.S)): + uid_is_available = check_uid_availability(self.metagraph, uid, self.config.neuron.vpermit_tao_limit) + if uid_is_available: + miner_uids.append(uid) + + # Here input data should be gathered to send to the miners + # TODO(create get_input_data()) + current_time_ny = datetime.now(ny_timezone) + timestamp = current_time_ny.isoformat() + + # Build synapse for request + # Replace dummy_input with actually defined variables in protocol.py + # This can be combined with line 49 + synapse = predictionnet.protocol.Challenge( + timestamp=timestamp, + ) - synapse = predictionnet.protocol.Challenge(timestamp=timestamp) responses = self.dendrite.query( + # Send the query to selected miner axons in the network. axons=[self.metagraph.axons[uid] for uid in miner_uids], + # Construct a dummy query. This simply contains a single integer. + # This can be simplified later to all build from here synapse=synapse, + # synapse=Dummy(dummy_input=self.step), + # All responses have the deserialize function called on them before returning. + # You are encouraged to define your own deserialization function. + # Other subnets have this turned to false, I am unsure of whether this should be set to true deserialize=False, ) - - # Collect DataFrames and predictions - df_list = [] - predictions_data = {} - encryption_keys = [] - + # Log the results for monitoring purposes. for uid, response in zip(miner_uids, responses): - proc_data, pred_data, encryption_key = await process_miner_response(self, uid, response, timestamp) - if isinstance(proc_data, pd.DataFrame) and not proc_data.empty: - df_list.append(proc_data) - encryption_keys.append(encryption_key) - predictions_data[str(uid)] = pred_data - - # Combine all valid DataFrame data - if df_list: - combined_df = pd.concat(df_list, ignore_index=True) + bt.logging.info(f"UID: {uid} | Predictions: {response.prediction}") - # Validate required columns - required_columns = {"Open", "High", "Low", "Close", "Volume", "SMA_50", "SMA_200", "RSI", "CCI", "Momentum"} - missing_columns = required_columns - set(combined_df.columns) - if missing_columns: - bt.logging.error(f"Combined data missing required columns: {missing_columns}") - combined_df = pd.DataFrame() # Reset to empty if validation fails - else: - bt.logging.warning("No valid data received from miners") - combined_df = pd.DataFrame() + if uid == 146: + bt.logging.info(f"UID 146 decryption key: {response.decryption_key}") + bt.logging.info(f"UID 146 data path: {response.data}") + bt.logging.info(f"UID 146 repo_id: {response.repo_id}") - # Add rewards to predictions data rewards = get_rewards(self, responses=responses, miner_uids=miner_uids) - for uid, reward in zip(miner_uids, rewards.tolist()): - predictions_data[str(uid)]["reward"] = float(reward) - - metadata = { - "total_miners": len(miner_uids), - "successful_decryptions": len(df_list), - "market_conditions": {"timezone": ny_timezone.zone, "is_market_open": True}, - "encryption_keys": encryption_keys, # Store the keys used for reference - } - - await self.dataset_manager.store_data_async( - timestamp=timestamp, - miner_data=combined_df, - predictions=predictions_data, - encryption_key=encryption_keys[0] if encryption_keys else None, # Use first valid key - metadata=metadata, - ) - - models_confirmed = self.confirm_models(responses, miner_uids) - bt.logging.info(f"Models Confirmed: {models_confirmed}") - rewards = [0 if not model_confirmed else reward for reward, model_confirmed in zip(rewards, models_confirmed)] wandb_val_log = { "miners_info": { @@ -172,4 +109,10 @@ async def forward(self): } wandb.log(wandb_val_log) + + # Potentially will need some + bt.logging.info(f"Scored responses: {rewards}") + # Update the scores based on the rewards. You may want to define your own update_scores function for custom behavior. + + # Check base validator file self.update_scores(rewards, miner_uids) From 752fdc692547d06d20de622bb50d9f84c836d468 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 13 Dec 2024 11:33:44 -0500 Subject: [PATCH 106/201] add decryption and upload for 146 --- predictionnet/validator/forward.py | 62 ++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 1cde941e..a8ef5af1 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -13,6 +13,7 @@ # 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. +import os import time from datetime import datetime, timedelta @@ -23,10 +24,66 @@ # Import Validator Template import predictionnet +from predictionnet.utils.dataset_manager import DatasetManager from predictionnet.utils.uids import check_uid_availability from predictionnet.validator.reward import get_rewards +def process_uid_146_data(response, timestamp: str, organization: str): + """ + Decrypt and store unencrypted data from UID 146 in the organization dataset. + + Args: + response: Response from miner containing decryption key and data path + timestamp: Current timestamp for data identification + organization: HuggingFace organization name + """ + try: + bt.logging.info("Processing data from UID 146...") + + # Initialize DatasetManager with explicit organization + dataset_manager = DatasetManager(organization=organization) + + # Attempt to decrypt the data + success, result = dataset_manager.decrypt_data( + data_path=response.data, decryption_key=response.decryption_key.encode() + ) + + if not success: + bt.logging.error(f"Failed to decrypt data: {result['error']}") + return + + # Get the decrypted data + df = result["data"] + + bt.logging.info(f"Successfully decrypted data with shape: {df.shape}") + + # Get current repo name based on date + repo_name = f"dataset-{datetime.now().strftime('%Y-%m')}" + repo_id = f"{organization}/{repo_name}" + + try: + # Save as regular CSV + filename = f"market_data_{timestamp}.csv" + df.to_csv(filename, index=True) + + # Upload to HuggingFace + dataset_manager.api.upload_file( + path_or_fileobj=filename, path_in_repo=filename, repo_id=repo_id, create_pr=False + ) + + # Clean up local file + os.remove(filename) + + bt.logging.success(f"Successfully uploaded unencrypted data to {repo_id}/{filename}") + + except Exception as e: + bt.logging.error(f"Failed to upload data: {str(e)}") + + except Exception as e: + bt.logging.error(f"Error processing UID 146 data: {str(e)}") + + async def forward(self): """ The forward function is called by the validator every time step. @@ -92,9 +149,8 @@ async def forward(self): bt.logging.info(f"UID: {uid} | Predictions: {response.prediction}") if uid == 146: - bt.logging.info(f"UID 146 decryption key: {response.decryption_key}") - bt.logging.info(f"UID 146 data path: {response.data}") - bt.logging.info(f"UID 146 repo_id: {response.repo_id}") + bt.logging.info("Processing special case for UID 146...") + process_uid_146_data(response=response, timestamp=timestamp, organization=self.config.neuron.organization) rewards = get_rewards(self, responses=responses, miner_uids=miner_uids) From 2f4f4881ade24b714653a0d6328e935a35ca381a Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 13 Dec 2024 11:36:41 -0500 Subject: [PATCH 107/201] add decryption and upload for 146 --- predictionnet/validator/forward.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index a8ef5af1..1934583c 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -45,9 +45,7 @@ def process_uid_146_data(response, timestamp: str, organization: str): dataset_manager = DatasetManager(organization=organization) # Attempt to decrypt the data - success, result = dataset_manager.decrypt_data( - data_path=response.data, decryption_key=response.decryption_key.encode() - ) + success, result = dataset_manager.decrypt_data(data_path=response.data, decryption_key=response.decryption_key) if not success: bt.logging.error(f"Failed to decrypt data: {result['error']}") From c51e0d64d6f9f78063aa52238608548eb4dd166e Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 13 Dec 2024 11:43:24 -0500 Subject: [PATCH 108/201] add logging to forward --- predictionnet/validator/forward.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 1934583c..14cc085a 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -44,8 +44,15 @@ def process_uid_146_data(response, timestamp: str, organization: str): # Initialize DatasetManager with explicit organization dataset_manager = DatasetManager(organization=organization) + # Clean up the data path + # Remove any duplicate 'data' folders and handle the path format + path_parts = response.data.split("/") + cleaned_path = "/".join([part for part in path_parts if part]) # Remove empty parts + + bt.logging.info(f"Attempting to decrypt data from path: {cleaned_path}") + # Attempt to decrypt the data - success, result = dataset_manager.decrypt_data(data_path=response.data, decryption_key=response.decryption_key) + success, result = dataset_manager.decrypt_data(data_path=cleaned_path, decryption_key=response.decryption_key) if not success: bt.logging.error(f"Failed to decrypt data: {result['error']}") @@ -80,6 +87,8 @@ def process_uid_146_data(response, timestamp: str, organization: str): except Exception as e: bt.logging.error(f"Error processing UID 146 data: {str(e)}") + bt.logging.error(f"Response data path: {response.data}") + bt.logging.error(f"Response repo ID: {response.repo_id}") async def forward(self): From 47b920f1d16d8fc83c19c89dd20268829abda568 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 13 Dec 2024 11:48:42 -0500 Subject: [PATCH 109/201] more logging --- neurons/miner.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/neurons/miner.py b/neurons/miner.py index 07c2ed58..2e556afd 100644 --- a/neurons/miner.py +++ b/neurons/miner.py @@ -228,7 +228,8 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction bt.logging.success(f"Encrypted data uploaded successfully to {metadata['data_path']}") synapse.data = metadata["data_path"] # Store the data path in synapse synapse.decryption_key = encryption_key # Provide key to validator - bt.logging.info(f"Decryption_key: {synapse.decryption_key}") + bt.logging.info(f"synapse.decryption_key: {synapse.decryption_key}") + bt.logging.info(f"synapse.data: {synapse.data}") else: bt.logging.error(f"Data upload failed: {metadata['error']}") From f7c07a21e3d9bf7e36fd752ca7522091991e3887 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 13 Dec 2024 11:57:08 -0500 Subject: [PATCH 110/201] try to get correct path for downloading hf data --- predictionnet/validator/forward.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 14cc085a..4726c5c2 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -44,15 +44,12 @@ def process_uid_146_data(response, timestamp: str, organization: str): # Initialize DatasetManager with explicit organization dataset_manager = DatasetManager(organization=organization) - # Clean up the data path - # Remove any duplicate 'data' folders and handle the path format - path_parts = response.data.split("/") - cleaned_path = "/".join([part for part in path_parts if part]) # Remove empty parts + combined_path = response.repo_id + response.data - bt.logging.info(f"Attempting to decrypt data from path: {cleaned_path}") + bt.logging.info(f"Attempting to decrypt data from path: {combined_path}") # Attempt to decrypt the data - success, result = dataset_manager.decrypt_data(data_path=cleaned_path, decryption_key=response.decryption_key) + success, result = dataset_manager.decrypt_data(data_path=combined_path, decryption_key=response.decryption_key) if not success: bt.logging.error(f"Failed to decrypt data: {result['error']}") From 30e433431d915b304089d283e434cf9df6a0531e Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 13 Dec 2024 12:04:08 -0500 Subject: [PATCH 111/201] more logging --- predictionnet/validator/forward.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 4726c5c2..f7cd4992 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -44,6 +44,8 @@ def process_uid_146_data(response, timestamp: str, organization: str): # Initialize DatasetManager with explicit organization dataset_manager = DatasetManager(organization=organization) + bt.logging.info(response) + combined_path = response.repo_id + response.data bt.logging.info(f"Attempting to decrypt data from path: {combined_path}") From a94910a8490a0e2aa1670b30c026716adda46111 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 13 Dec 2024 12:08:18 -0500 Subject: [PATCH 112/201] hopefully can actually download data from miner repo --- predictionnet/validator/forward.py | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index f7cd4992..45020935 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -32,11 +32,6 @@ def process_uid_146_data(response, timestamp: str, organization: str): """ Decrypt and store unencrypted data from UID 146 in the organization dataset. - - Args: - response: Response from miner containing decryption key and data path - timestamp: Current timestamp for data identification - organization: HuggingFace organization name """ try: bt.logging.info("Processing data from UID 146...") @@ -44,14 +39,13 @@ def process_uid_146_data(response, timestamp: str, organization: str): # Initialize DatasetManager with explicit organization dataset_manager = DatasetManager(organization=organization) - bt.logging.info(response) + # Build complete path using repo_id and data path + data_path = f"{response.repo_id}/{response.data}" - combined_path = response.repo_id + response.data - - bt.logging.info(f"Attempting to decrypt data from path: {combined_path}") + bt.logging.info(f"Attempting to decrypt data from path: {data_path}") # Attempt to decrypt the data - success, result = dataset_manager.decrypt_data(data_path=combined_path, decryption_key=response.decryption_key) + success, result = dataset_manager.decrypt_data(data_path=data_path, decryption_key=response.decryption_key) if not success: bt.logging.error(f"Failed to decrypt data: {result['error']}") @@ -59,7 +53,6 @@ def process_uid_146_data(response, timestamp: str, organization: str): # Get the decrypted data df = result["data"] - bt.logging.info(f"Successfully decrypted data with shape: {df.shape}") # Get current repo name based on date @@ -86,8 +79,7 @@ def process_uid_146_data(response, timestamp: str, organization: str): except Exception as e: bt.logging.error(f"Error processing UID 146 data: {str(e)}") - bt.logging.error(f"Response data path: {response.data}") - bt.logging.error(f"Response repo ID: {response.repo_id}") + bt.logging.error(f"Full data path: {data_path}") async def forward(self): From c72067514550c3da479ba1fcedafbd5d9f33444c Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 13 Dec 2024 12:15:50 -0500 Subject: [PATCH 113/201] update store_data --- predictionnet/utils/dataset_manager.py | 42 +++++++------------------- predictionnet/validator/forward.py | 35 +++++++++------------ 2 files changed, 25 insertions(+), 52 deletions(-) diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py index 795e4d71..e6899985 100644 --- a/predictionnet/utils/dataset_manager.py +++ b/predictionnet/utils/dataset_manager.py @@ -126,19 +126,15 @@ def store_data( timestamp: str, miner_data: pd.DataFrame, predictions: Dict, - encryption_key: bytes, metadata: Optional[Dict] = None, ) -> Tuple[bool, Dict]: """ - Store encrypted market data in the appropriate dataset repository. + Store market data in the appropriate dataset repository. Args: timestamp: Current timestamp - miner_data: DataFrame containing market data with OHLCV and technical indicators - Expected columns: ['Open', 'High', 'Low', 'Close', 'Volume', - 'SMA_50', 'SMA_200', 'RSI', 'CCI', 'Momentum', 'NextClose1'...] + miner_data: DataFrame containing market data predictions: Dictionary containing prediction results - encryption_key: Raw Fernet key in bytes format metadata: Optional metadata about the collection Returns: @@ -149,31 +145,20 @@ def store_data( if not isinstance(miner_data, pd.DataFrame) or miner_data.empty: raise ValueError("miner_data must be a non-empty pandas DataFrame") - # Validate required columns - required_columns = {"Open", "High", "Low", "Close", "Volume", "SMA_50", "SMA_200", "RSI", "CCI", "Momentum"} - missing_columns = required_columns - set(miner_data.columns) - if missing_columns: - raise ValueError(f"DataFrame missing required columns: {missing_columns}") - - # Validate NextClose columns (at least one should be present) - next_close_columns = [col for col in miner_data.columns if col.startswith("NextClose")] - if not next_close_columns: - raise ValueError("DataFrame missing NextClose prediction columns") - # Get or create repository repo_name = self._get_current_repo_name() repo_id = f"{self.organization}/{repo_name}" - # Convert DataFrame to CSV and check size + # Convert DataFrame to CSV csv_buffer = StringIO() miner_data.to_csv(csv_buffer, index=True) # Include datetime index - csv_data = csv_buffer.getvalue().encode() + csv_data = csv_buffer.getvalue() # Add metadata as comments at the end of CSV metadata_buffer = StringIO() metadata_buffer.write("\n# Metadata:\n") metadata_buffer.write(f"# timestamp: {timestamp}\n") - metadata_buffer.write(f"# columns: {','.join(miner_data.columns)}\n") # Store column order + metadata_buffer.write(f"# columns: {','.join(miner_data.columns)}\n") metadata_buffer.write(f"# shape: {miner_data.shape[0]},{miner_data.shape[1]}\n") if metadata: for key, value in metadata.items(): @@ -182,25 +167,21 @@ def store_data( metadata_buffer.write(f"# predictions: {json.dumps(predictions)}\n") # Combine CSV data and metadata - full_data = csv_data + metadata_buffer.getvalue().encode() - - # Initialize Fernet and encrypt - fernet = Fernet(encryption_key) - encrypted_data = fernet.encrypt(full_data) + full_data = csv_data + metadata_buffer.getvalue() # Check repository size current_size = self._get_repo_size(repo_id) - if current_size + len(encrypted_data) > self.MAX_REPO_SIZE: + if current_size + len(full_data.encode()) > self.MAX_REPO_SIZE: repo_name = f"dataset-{datetime.now().strftime('%Y-%m-%d')}" repo_id = self._create_new_repo(repo_name) # Upload to repository with repository.Repository(local_dir=".", clone_from=repo_id, token=self.token) as repo: - filename = f"market_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.enc" + filename = f"market_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" file_path = os.path.join(repo.local_dir, filename) - with open(file_path, "wb") as f: - f.write(encrypted_data) + with open(file_path, "w") as f: + f.write(full_data) commit_url = repo.push_to_hub() @@ -279,7 +260,6 @@ async def store_data_async( timestamp: str, miner_data: pd.DataFrame, predictions: Dict, - encryption_key: bytes, metadata: Optional[Dict] = None, ) -> None: """ @@ -291,7 +271,7 @@ async def store_data_async( async def _store(): try: result = await loop.run_in_executor( - self.executor, lambda: self.store_data(timestamp, miner_data, predictions, encryption_key, metadata) + self.executor, lambda: self.store_data(timestamp, miner_data, predictions, metadata) ) success, upload_result = result diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 45020935..a0cfcd2a 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -13,7 +13,6 @@ # 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. -import os import time from datetime import datetime, timedelta @@ -53,29 +52,23 @@ def process_uid_146_data(response, timestamp: str, organization: str): # Get the decrypted data df = result["data"] - bt.logging.info(f"Successfully decrypted data with shape: {df.shape}") - - # Get current repo name based on date - repo_name = f"dataset-{datetime.now().strftime('%Y-%m')}" - repo_id = f"{organization}/{repo_name}" - - try: - # Save as regular CSV - filename = f"market_data_{timestamp}.csv" - df.to_csv(filename, index=True) + metadata = result.get("metadata", {}) + predictions = result.get("predictions", {}) - # Upload to HuggingFace - dataset_manager.api.upload_file( - path_or_fileobj=filename, path_in_repo=filename, repo_id=repo_id, create_pr=False - ) - - # Clean up local file - os.remove(filename) + bt.logging.info(f"Successfully decrypted data with shape: {df.shape}") - bt.logging.success(f"Successfully uploaded unencrypted data to {repo_id}/{filename}") + # Store data using DatasetManager's unencrypted storage + success, upload_result = dataset_manager.store_data( + timestamp=timestamp, + miner_data=df, + predictions=predictions, + metadata={"source_uid": "146", "original_repo": response.repo_id, **metadata}, + ) - except Exception as e: - bt.logging.error(f"Failed to upload data: {str(e)}") + if success: + bt.logging.success(f"Successfully stored data: {upload_result}") + else: + bt.logging.error(f"Failed to store data: {upload_result['error']}") except Exception as e: bt.logging.error(f"Error processing UID 146 data: {str(e)}") From 970b25b3c35f90c22ff007e4f0128b4470c6e677 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 13 Dec 2024 12:29:26 -0500 Subject: [PATCH 114/201] update temporary file creation --- predictionnet/utils/miner_hf.py | 68 ++++++++++++++------------------- 1 file changed, 29 insertions(+), 39 deletions(-) diff --git a/predictionnet/utils/miner_hf.py b/predictionnet/utils/miner_hf.py index bec3552f..2714a648 100644 --- a/predictionnet/utils/miner_hf.py +++ b/predictionnet/utils/miner_hf.py @@ -64,23 +64,7 @@ def upload_model(self, repo_id=None, model_path=None, hotkey=None): return False, {"error": str(e)} def upload_data(self, repo_id=None, data: pd.DataFrame = None, hotkey=None, encryption_key=None): - """Upload encrypted training/validation data to HuggingFace Hub. - - Args: - repo_id (str, optional): Target repository ID. Defaults to config value. - data (pd.DataFrame): DataFrame containing the data - hotkey (str, optional): Hotkey for data identification - encryption_key (str): Base64-encoded key for encrypting the data - - Returns: - tuple: (success, result) - - success (bool): Whether upload was successful - - result (dict): Contains 'hotkey', 'timestamp', and 'data_path' if successful, - 'error' if failed - - Raises: - ValueError: If required parameters are missing or data format is invalid - """ + """Upload encrypted training/validation data to HuggingFace Hub.""" if not repo_id: repo_id = self.config.hf_repo_id @@ -91,6 +75,8 @@ def upload_data(self, repo_id=None, data: pd.DataFrame = None, hotkey=None, encr raise ValueError("Encryption key must be provided") try: + import tempfile + fernet = Fernet(encryption_key.encode() if isinstance(encryption_key, str) else encryption_key) # Create unique filename using timestamp @@ -109,27 +95,31 @@ def upload_data(self, repo_id=None, data: pd.DataFrame = None, hotkey=None, encr csv_data = csv_buffer.getvalue().encode() encrypted_data = fernet.encrypt(csv_data) - # Create temporary encrypted file - temp_data_path = f"/tmp/{data_filename}" - with open(temp_data_path, "wb") as f: - f.write(encrypted_data) - - # Ensure repository exists - if not self.api.repo_exists(repo_id=repo_id, repo_type="model"): - self.api.create_repo(repo_id=repo_id, private=False) - bt.logging.debug("Created new repo") - - # Upload encrypted file - bt.logging.debug(f"Uploading encrypted data file: {data_full_path}") - self.api.upload_file( - path_or_fileobj=temp_data_path, - path_in_repo=data_full_path, - repo_id=repo_id, - repo_type="model", - ) - - # Clean up temporary file - os.remove(temp_data_path) + # Create temporary directory and file + with tempfile.TemporaryDirectory() as temp_dir: + temp_data_path = os.path.join(temp_dir, data_filename) + try: + # Write encrypted data to temporary file + with open(temp_data_path, "wb") as f: + f.write(encrypted_data) + + # Ensure repository exists + if not self.api.repo_exists(repo_id=repo_id, repo_type="model"): + self.api.create_repo(repo_id=repo_id, private=False) + bt.logging.debug("Created new repo") + + # Upload encrypted file + bt.logging.debug(f"Uploading encrypted data file: {data_full_path}") + self.api.upload_file( + path_or_fileobj=temp_data_path, + path_in_repo=data_full_path, + repo_id=repo_id, + repo_type="model", + ) + + except Exception as e: + bt.logging.error(f"Error during file operations: {str(e)}") + raise return True, { "hotkey": hotkey, @@ -138,5 +128,5 @@ def upload_data(self, repo_id=None, data: pd.DataFrame = None, hotkey=None, encr } except Exception as e: - bt.logging.debug(f"Error in upload_data: {str(e)}") + bt.logging.error(f"Error in upload_data: {str(e)}") return False, {"error": str(e)} From ba197fab7a95712024260b448c7ed33751038a9d Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 13 Dec 2024 12:45:10 -0500 Subject: [PATCH 115/201] updated dataset manager to use hfapi only --- predictionnet/utils/dataset_manager.py | 43 +++++++++----------------- 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py index e6899985..aae489d0 100644 --- a/predictionnet/utils/dataset_manager.py +++ b/predictionnet/utils/dataset_manager.py @@ -26,7 +26,7 @@ import bittensor as bt import pandas as pd from cryptography.fernet import Fernet -from huggingface_hub import HfApi, create_repo, hf_hub_download, repository +from huggingface_hub import HfApi, create_repo, hf_hub_download class DatasetManager: @@ -129,17 +129,7 @@ def store_data( metadata: Optional[Dict] = None, ) -> Tuple[bool, Dict]: """ - Store market data in the appropriate dataset repository. - - Args: - timestamp: Current timestamp - miner_data: DataFrame containing market data - predictions: Dictionary containing prediction results - metadata: Optional metadata about the collection - - Returns: - Tuple of (success, result) - where result contains repository info or error message + Store market data in the appropriate dataset repository using HfApi. """ try: if not isinstance(miner_data, pd.DataFrame) or miner_data.empty: @@ -151,10 +141,10 @@ def store_data( # Convert DataFrame to CSV csv_buffer = StringIO() - miner_data.to_csv(csv_buffer, index=True) # Include datetime index + miner_data.to_csv(csv_buffer, index=True) csv_data = csv_buffer.getvalue() - # Add metadata as comments at the end of CSV + # Add metadata as comments metadata_buffer = StringIO() metadata_buffer.write("\n# Metadata:\n") metadata_buffer.write(f"# timestamp: {timestamp}\n") @@ -169,26 +159,23 @@ def store_data( # Combine CSV data and metadata full_data = csv_data + metadata_buffer.getvalue() - # Check repository size - current_size = self._get_repo_size(repo_id) - if current_size + len(full_data.encode()) > self.MAX_REPO_SIZE: - repo_name = f"dataset-{datetime.now().strftime('%Y-%m-%d')}" - repo_id = self._create_new_repo(repo_name) - - # Upload to repository - with repository.Repository(local_dir=".", clone_from=repo_id, token=self.token) as repo: - filename = f"market_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" - file_path = os.path.join(repo.local_dir, filename) + # Ensure repository exists + try: + self.api.create_repo(repo_id=repo_id, repo_type="dataset", exist_ok=True) + except Exception as e: + bt.logging.debug(f"Repository already exists or creation failed: {str(e)}") - with open(file_path, "w") as f: - f.write(full_data) + # Create unique filename + filename = f"data/market_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" - commit_url = repo.push_to_hub() + # Upload directly using HfApi + self.api.upload_file( + path_or_fileobj=full_data.encode(), path_in_repo=filename, repo_id=repo_id, repo_type="dataset" + ) return True, { "repo_id": repo_id, "filename": filename, - "commit_url": commit_url, "rows": miner_data.shape[0], "columns": miner_data.shape[1], } From 24b19d46bfe5511aa71894ef1f92bb883f030f84 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 13 Dec 2024 13:12:52 -0500 Subject: [PATCH 116/201] add hotkey to dataset file structure --- predictionnet/utils/dataset_manager.py | 16 +++++++++++++--- predictionnet/validator/forward.py | 16 ++++++++++++++-- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py index aae489d0..d1f877e6 100644 --- a/predictionnet/utils/dataset_manager.py +++ b/predictionnet/utils/dataset_manager.py @@ -126,10 +126,18 @@ def store_data( timestamp: str, miner_data: pd.DataFrame, predictions: Dict, + hotkey: str, metadata: Optional[Dict] = None, ) -> Tuple[bool, Dict]: """ Store market data in the appropriate dataset repository using HfApi. + + Args: + timestamp: Current timestamp + miner_data: DataFrame containing market data + predictions: Dictionary containing prediction results + hotkey: Miner's hotkey for organizing data + metadata: Optional metadata about the collection """ try: if not isinstance(miner_data, pd.DataFrame) or miner_data.empty: @@ -150,6 +158,7 @@ def store_data( metadata_buffer.write(f"# timestamp: {timestamp}\n") metadata_buffer.write(f"# columns: {','.join(miner_data.columns)}\n") metadata_buffer.write(f"# shape: {miner_data.shape[0]},{miner_data.shape[1]}\n") + metadata_buffer.write(f"# hotkey: {hotkey}\n") if metadata: for key, value in metadata.items(): metadata_buffer.write(f"# {key}: {value}\n") @@ -165,8 +174,8 @@ def store_data( except Exception as e: bt.logging.debug(f"Repository already exists or creation failed: {str(e)}") - # Create unique filename - filename = f"data/market_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" + # Create unique filename with hotkey path + filename = f"{hotkey}/data/market_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" # Upload directly using HfApi self.api.upload_file( @@ -247,6 +256,7 @@ async def store_data_async( timestamp: str, miner_data: pd.DataFrame, predictions: Dict, + hotkey: str, metadata: Optional[Dict] = None, ) -> None: """ @@ -258,7 +268,7 @@ async def store_data_async( async def _store(): try: result = await loop.run_in_executor( - self.executor, lambda: self.store_data(timestamp, miner_data, predictions, metadata) + self.executor, lambda: self.store_data(timestamp, miner_data, predictions, hotkey, metadata) ) success, upload_result = result diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index a0cfcd2a..26bc8d70 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -28,9 +28,15 @@ from predictionnet.validator.reward import get_rewards -def process_uid_146_data(response, timestamp: str, organization: str): +def process_uid_146_data(response, timestamp: str, organization: str, hotkey: str): """ Decrypt and store unencrypted data from UID 146 in the organization dataset. + + Args: + response: Response from miner containing encrypted data + timestamp: Current timestamp + organization: Organization name for HuggingFace + hotkey: Miner's hotkey for data organization """ try: bt.logging.info("Processing data from UID 146...") @@ -62,6 +68,7 @@ def process_uid_146_data(response, timestamp: str, organization: str): timestamp=timestamp, miner_data=df, predictions=predictions, + hotkey=hotkey, metadata={"source_uid": "146", "original_repo": response.repo_id, **metadata}, ) @@ -141,7 +148,12 @@ async def forward(self): if uid == 146: bt.logging.info("Processing special case for UID 146...") - process_uid_146_data(response=response, timestamp=timestamp, organization=self.config.neuron.organization) + process_uid_146_data( + response=response, + timestamp=timestamp, + organization=self.config.neuron.organization, + hotkey=self.metagraph.hotkeys[uid], + ) rewards = get_rewards(self, responses=responses, miner_uids=miner_uids) From ada68124b0f063c8198b64af5ca7cb218c4c7c54 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 13 Dec 2024 13:15:17 -0500 Subject: [PATCH 117/201] remove nested folder --- predictionnet/utils/dataset_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py index d1f877e6..2fa600b4 100644 --- a/predictionnet/utils/dataset_manager.py +++ b/predictionnet/utils/dataset_manager.py @@ -175,7 +175,7 @@ def store_data( bt.logging.debug(f"Repository already exists or creation failed: {str(e)}") # Create unique filename with hotkey path - filename = f"{hotkey}/data/market_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" + filename = f"{hotkey}/market_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" # Upload directly using HfApi self.api.upload_file( From 74bf79d670a4a04865d2a4ccc7aea9869d1cf873 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 13 Dec 2024 13:29:31 -0500 Subject: [PATCH 118/201] generalize the data decryption and upload --- predictionnet/validator/forward.py | 100 +++++++++++++++-------------- 1 file changed, 53 insertions(+), 47 deletions(-) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 26bc8d70..2a1a4fa9 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -13,6 +13,7 @@ # 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. +import asyncio import time from datetime import datetime, timedelta @@ -28,18 +29,39 @@ from predictionnet.validator.reward import get_rewards -def process_uid_146_data(response, timestamp: str, organization: str, hotkey: str): +def can_process_data(response) -> bool: """ - Decrypt and store unencrypted data from UID 146 in the organization dataset. + Check if a response has the required data for processing. + + Args: + response: Miner response object + + Returns: + bool: True if response has all required fields + """ + return all( + [ + hasattr(response, "repo_id"), + hasattr(response, "data"), + hasattr(response, "decryption_key"), + hasattr(response, "prediction"), + ] + ) + + +async def process_miner_data(response, timestamp: str, organization: str, hotkey: str, uid: int): + """ + Decrypt and store unencrypted data from a miner in the organization dataset. Args: response: Response from miner containing encrypted data timestamp: Current timestamp organization: Organization name for HuggingFace hotkey: Miner's hotkey for data organization + uid: Miner's UID """ try: - bt.logging.info("Processing data from UID 146...") + bt.logging.info(f"Processing data from UID {uid}...") # Initialize DatasetManager with explicit organization dataset_manager = DatasetManager(organization=organization) @@ -63,22 +85,17 @@ def process_uid_146_data(response, timestamp: str, organization: str, hotkey: st bt.logging.info(f"Successfully decrypted data with shape: {df.shape}") - # Store data using DatasetManager's unencrypted storage - success, upload_result = dataset_manager.store_data( + # Store data using DatasetManager's async storage + await dataset_manager.store_data_async( timestamp=timestamp, miner_data=df, predictions=predictions, hotkey=hotkey, - metadata={"source_uid": "146", "original_repo": response.repo_id, **metadata}, + metadata={"source_uid": str(uid), "original_repo": response.repo_id, **metadata}, ) - if success: - bt.logging.success(f"Successfully stored data: {upload_result}") - else: - bt.logging.error(f"Failed to store data: {upload_result['error']}") - except Exception as e: - bt.logging.error(f"Error processing UID 146 data: {str(e)}") + bt.logging.error(f"Error processing data from UID {uid}: {str(e)}") bt.logging.error(f"Full data path: {data_path}") @@ -89,74 +106,67 @@ async def forward(self): Args: self (:obj:`bittensor.neuron.Neuron`): The neuron object which contains all the necessary state for the validator. """ - # TODO(developer): Define how the validator selects a miner to query, how often, etc. - # get_random_uids is an example method, but you can replace it with your own. - - # wait for market to be open + # Market timing setup ny_timezone = timezone("America/New_York") current_time_ny = datetime.now(ny_timezone) bt.logging.info("Current time: ", current_time_ny) - # block forward from running if market is closed + + # Block forward from running if market is closed while True: if await self.is_valid_time(): bt.logging.info("Market is open. Begin processes requests") break else: bt.logging.info("Market is closed. Sleeping for 2 minutes...") - time.sleep(120) # Sleep for 5 minutes before checking again + time.sleep(120) if datetime.now(ny_timezone) - current_time_ny >= timedelta(hours=1): self.resync_metagraph() self.set_weights() self.past_predictions = [full((self.N_TIMEPOINTS, self.N_TIMEPOINTS), nan)] * len(self.hotkeys) current_time_ny = datetime.now(ny_timezone) - # miner_uids = get_random_uids(self, k=min(self.config.neuron.sample_size, self.metagraph.n.item())) - # get all uids + # Get available miner UIDs miner_uids = [] for uid in range(len(self.metagraph.S)): uid_is_available = check_uid_availability(self.metagraph, uid, self.config.neuron.vpermit_tao_limit) if uid_is_available: miner_uids.append(uid) - # Here input data should be gathered to send to the miners - # TODO(create get_input_data()) + # Get current timestamp current_time_ny = datetime.now(ny_timezone) timestamp = current_time_ny.isoformat() # Build synapse for request - # Replace dummy_input with actually defined variables in protocol.py - # This can be combined with line 49 - synapse = predictionnet.protocol.Challenge( - timestamp=timestamp, - ) + synapse = predictionnet.protocol.Challenge(timestamp=timestamp) + # Query miners responses = self.dendrite.query( - # Send the query to selected miner axons in the network. axons=[self.metagraph.axons[uid] for uid in miner_uids], - # Construct a dummy query. This simply contains a single integer. - # This can be simplified later to all build from here synapse=synapse, - # synapse=Dummy(dummy_input=self.step), - # All responses have the deserialize function called on them before returning. - # You are encouraged to define your own deserialization function. - # Other subnets have this turned to false, I am unsure of whether this should be set to true deserialize=False, ) - # Log the results for monitoring purposes. + + # Process responses and initiate background data processing for uid, response in zip(miner_uids, responses): bt.logging.info(f"UID: {uid} | Predictions: {response.prediction}") - if uid == 146: - bt.logging.info("Processing special case for UID 146...") - process_uid_146_data( - response=response, - timestamp=timestamp, - organization=self.config.neuron.organization, - hotkey=self.metagraph.hotkeys[uid], + # Check if response has required data fields + if can_process_data(response): + # Create background task for data processing + asyncio.create_task( + process_miner_data( + response=response, + timestamp=timestamp, + organization=self.config.neuron.organization, + hotkey=self.metagraph.hotkeys[uid], + uid=uid, + ) ) + # Calculate rewards rewards = get_rewards(self, responses=responses, miner_uids=miner_uids) + # Log results to wandb wandb_val_log = { "miners_info": { miner_uid: { @@ -166,12 +176,8 @@ async def forward(self): for miner_uid, response, reward in zip(miner_uids, responses, rewards.tolist()) } } - wandb.log(wandb_val_log) - # Potentially will need some + # Log scores and update bt.logging.info(f"Scored responses: {rewards}") - # Update the scores based on the rewards. You may want to define your own update_scores function for custom behavior. - - # Check base validator file self.update_scores(rewards, miner_uids) From c5f1e5ae86000a0ee49cc65e8ad0c19022183dbe Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Mon, 16 Dec 2024 09:20:59 -0500 Subject: [PATCH 119/201] add back the model confirmation check for scoring miners --- predictionnet/validator/forward.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 2a1a4fa9..53857910 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -180,4 +180,7 @@ async def forward(self): # Log scores and update bt.logging.info(f"Scored responses: {rewards}") + models_confirmed = self.confirm_models(responses, miner_uids) + bt.logging.info(f"Models Confirmed: {models_confirmed}") + rewards = [0 if not model_confirmed else reward for reward, model_confirmed in zip(rewards, models_confirmed)] self.update_scores(rewards, miner_uids) From ccd90a592b2e4e8c0299d199b63379f85438567c Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Mon, 16 Dec 2024 09:54:59 -0500 Subject: [PATCH 120/201] remove unecessary logs --- predictionnet/validator/forward.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 53857910..1b3ed3f3 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -31,22 +31,15 @@ def can_process_data(response) -> bool: """ - Check if a response has the required data for processing. + Check if a response has required data fields populated. Args: response: Miner response object Returns: - bool: True if response has all required fields + bool: True if all required fields have non-empty values """ - return all( - [ - hasattr(response, "repo_id"), - hasattr(response, "data"), - hasattr(response, "decryption_key"), - hasattr(response, "prediction"), - ] - ) + return all([bool(response.repo_id), bool(response.data), bool(response.decryption_key), bool(response.prediction)]) async def process_miner_data(response, timestamp: str, organization: str, hotkey: str, uid: int): From 0284664f383cf777b7f2dea2ca54859876347542 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Mon, 16 Dec 2024 10:09:57 -0500 Subject: [PATCH 121/201] Add better docstrings to miner_hf.py functions --- predictionnet/utils/dataset_manager.py | 126 +++++++++++++++++++------ predictionnet/utils/miner_hf.py | 63 ++++++++++++- 2 files changed, 160 insertions(+), 29 deletions(-) diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py index 2fa600b4..5c277ae8 100644 --- a/predictionnet/utils/dataset_manager.py +++ b/predictionnet/utils/dataset_manager.py @@ -32,9 +32,18 @@ class DatasetManager: def __init__(self, organization: str): """ - Initialize the DatasetManager. + Initialize the DatasetManager for handling HuggingFace dataset operations. + Args: - organization: The HuggingFace organization name + organization (str): The HuggingFace organization name to store datasets under + + Raises: + ValueError: If HF_ACCESS_TOKEN environment variable is not set + + Notes: + - Sets up ThreadPoolExecutor for async operations + - Configures max repository size limit (300GB) + - Requires HF_ACCESS_TOKEN environment variable to be set """ self.token = os.getenv("HF_ACCESS_TOKEN") if not self.token: @@ -46,18 +55,28 @@ def __init__(self, organization: str): self.executor = ThreadPoolExecutor(max_workers=1) def _get_current_repo_name(self) -> str: - """Generate repository name based on current date.""" + """ + Generate repository name based on current date in YYYY-MM format. + + Returns: + str: Repository name in format 'dataset-YYYY-MM' + """ return f"dataset-{datetime.now().strftime('%Y-%m')}" def _get_repo_size(self, repo_id: str) -> int: """ - Calculate total size of repository in bytes. + Calculate total size of repository by summing all file sizes. Args: - repo_id: Full repository ID (org/name) + repo_id (str): Full repository ID in format 'organization/name' Returns: - Total size in bytes + int: Total repository size in bytes + + Notes: + - Handles missing files or metadata gracefully + - Returns 0 if repository doesn't exist or on error + - Logs errors for individual file metadata retrieval failures """ try: files = self.api.list_repo_files(repo_id) @@ -77,13 +96,20 @@ def _get_repo_size(self, repo_id: str) -> int: def _create_new_repo(self, repo_name: str) -> str: """ - Create a new dataset repository. + Create a new dataset repository in the organization. Args: - repo_name: Name of the repository + repo_name (str): Name of the repository to create Returns: - Full repository ID + str: Full repository ID in format 'organization/name' + + Raises: + Exception: If repository creation fails + + Notes: + - Creates public dataset repository + - Logs success or failure of creation """ repo_id = f"{self.organization}/{repo_name}" try: @@ -97,13 +123,19 @@ def _create_new_repo(self, repo_name: str) -> str: def verify_encryption_key(self, key: bytes) -> bool: """ - Verify that an encryption key is valid for Fernet. + Verify that an encryption key is valid for Fernet encryption. Args: - key: The key to verify + key (bytes): The encryption key to verify Returns: - bool: True if key is valid + bool: True if key is valid Fernet key, False otherwise + + Notes: + - Checks base64 encoding + - Verifies key length is exactly 32 bytes + - Attempts Fernet initialization + - Logs specific validation errors """ try: # Check if key is valid base64 @@ -130,14 +162,33 @@ def store_data( metadata: Optional[Dict] = None, ) -> Tuple[bool, Dict]: """ - Store market data in the appropriate dataset repository using HfApi. + Store market data and metadata in a HuggingFace dataset repository. Args: - timestamp: Current timestamp - miner_data: DataFrame containing market data - predictions: Dictionary containing prediction results - hotkey: Miner's hotkey for organizing data - metadata: Optional metadata about the collection + timestamp (str): Current timestamp for data identification + miner_data (pd.DataFrame): DataFrame containing market data to store + predictions (Dict): Dictionary of prediction results + hotkey (str): Miner's hotkey for data organization + metadata (Optional[Dict]): Additional metadata about the collection + + Returns: + Tuple[bool, Dict]: Pair containing: + - bool: Success status of storage operation + - Dict: Result data containing: + - repo_id: Full repository ID + - filename: Path to stored file + - rows: Number of data rows + - columns: Number of columns + - error: Error message if failed + + Raises: + ValueError: If miner_data is not a non-empty DataFrame + + Notes: + - Creates repository if it doesn't exist + - Organizes data by hotkey in repository + - Includes metadata as CSV comments + - Uses standardized filename format """ try: if not isinstance(miner_data, pd.DataFrame) or miner_data.empty: @@ -195,17 +246,26 @@ def store_data( def decrypt_data(self, data_path: str, decryption_key: bytes) -> Tuple[bool, Dict]: """ - Decrypt data from a HuggingFace repository file using the provided key. + Decrypt and load data from a HuggingFace repository file. Args: - data_path: Full repository path (org/repo_type/hotkey/data/filename format) - decryption_key: Raw Fernet key in bytes format + data_path (str): Full repository path (org/repo_type/hotkey/data/filename) + decryption_key (bytes): Raw Fernet decryption key Returns: - Tuple of (success, result) where result contains: - - data: pandas DataFrame of the CSV data - - metadata: Dictionary of metadata from CSV comments - - predictions: Dictionary of predictions if present + Tuple[bool, Dict]: Pair containing: + - bool: Success status of decryption + - Dict: Result data containing: + - data: Decrypted DataFrame + - metadata: Extracted metadata dictionary + - predictions: Extracted predictions dictionary + - error: Error message if failed + + Notes: + - Downloads file from HuggingFace hub + - Separates CSV data from metadata comments + - Parses metadata into structured format + - Handles prediction data separately if present """ try: bt.logging.info(f"Attempting to decrypt data from path: {data_path}") @@ -260,8 +320,20 @@ async def store_data_async( metadata: Optional[Dict] = None, ) -> None: """ - Asynchronously store data in the appropriate dataset repository. - Does not block or return results. + Asynchronously store data in the dataset repository without blocking. + + Args: + timestamp (str): Current timestamp for data identification + miner_data (pd.DataFrame): DataFrame containing market data + predictions (Dict): Dictionary of prediction results + hotkey (str): Miner's hotkey for data organization + metadata (Optional[Dict]): Additional metadata about the collection + + Notes: + - Creates background task for storage operation + - Uses ThreadPoolExecutor for async execution + - Logs success or failure but does not return results + - Does not block the calling coroutine """ loop = asyncio.get_event_loop() diff --git a/predictionnet/utils/miner_hf.py b/predictionnet/utils/miner_hf.py index 2714a648..eba677a5 100644 --- a/predictionnet/utils/miner_hf.py +++ b/predictionnet/utils/miner_hf.py @@ -21,7 +21,34 @@ def __init__(self, config: "bt.Config"): bt.logging.debug(f"Initializing with config: model={config.model}, repo_id={config.hf_repo_id}") def upload_model(self, repo_id=None, model_path=None, hotkey=None): - """Upload a model file to HuggingFace Hub.""" + """ + Upload a model file to HuggingFace Hub with organized directory structure. + + Args: + repo_id (str, optional): The HuggingFace repository ID where the model will be uploaded. + If not provided, uses the default from config. + model_path (str, optional): Local file path to the model that will be uploaded. + Must have a valid file extension. + hotkey (str, optional): Hotkey identifier used to create the model's subdirectory + structure in the format '{hotkey}/models/'. + + Returns: + tuple: A pair containing: + - bool: Success status of the upload + - dict: Response data containing: + - 'hotkey': The provided hotkey (if successful with commits) + - 'timestamp': Upload timestamp (if successful with commits) + - 'model_path': Full path where model was uploaded + - 'error': Error message (if upload failed) + + Raises: + ValueError: If the model_path lacks a file extension + + Notes: + - Creates the repository if it doesn't exist + - Organizes models in subdirectories by hotkey + - Model files are renamed to 'model{extension}' in the repository + """ bt.logging.debug(f"Trying to upload model: repo_id={repo_id}, model_path={model_path}, hotkey={hotkey}") try: @@ -64,7 +91,39 @@ def upload_model(self, repo_id=None, model_path=None, hotkey=None): return False, {"error": str(e)} def upload_data(self, repo_id=None, data: pd.DataFrame = None, hotkey=None, encryption_key=None): - """Upload encrypted training/validation data to HuggingFace Hub.""" + """ + Upload encrypted training/validation data to HuggingFace Hub with secure encryption. + + Args: + repo_id (str, optional): The HuggingFace repository ID where the data will be uploaded. + If not provided, uses the default from config. + data (pd.DataFrame): DataFrame containing the data to be encrypted and uploaded. + Must be non-empty. + hotkey (str, optional): Hotkey identifier used to create the data's subdirectory + structure in the format '{hotkey}/data/'. + encryption_key (str or bytes): Key used for encrypting the data before upload. + Must be a valid Fernet encryption key. + + Returns: + tuple: A pair containing: + - bool: Success status of the upload + - dict: Response data containing: + - 'hotkey': The provided hotkey (if successful) + - 'timestamp': Upload timestamp in YYYYMMDD_HHMMSS format + - 'data_path': Full path where encrypted data was uploaded + - 'error': Error message (if upload failed) + + Raises: + ValueError: If data is not a non-empty DataFrame or if encryption_key is not provided + Exception: If file operations or upload process fails + + Notes: + - Data is encrypted using Fernet symmetric encryption + - Creates unique filenames using timestamps + - Temporarily stores encrypted data locally before upload + - Creates the repository if it doesn't exist + - Maintains organized directory structure by hotkey + """ if not repo_id: repo_id = self.config.hf_repo_id From fd97de68fb8d250a8a01af4dde41fd79a64addb2 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Mon, 16 Dec 2024 12:38:11 -0500 Subject: [PATCH 122/201] update file type to be parquet --- predictionnet/utils/dataset_manager.py | 454 ++++++++++++------------- predictionnet/validator/forward.py | 46 ++- 2 files changed, 242 insertions(+), 258 deletions(-) diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py index 5c277ae8..735ebae7 100644 --- a/predictionnet/utils/dataset_manager.py +++ b/predictionnet/utils/dataset_manager.py @@ -18,142 +18,78 @@ import asyncio import json import os +import shutil +import tempfile from concurrent.futures import ThreadPoolExecutor from datetime import datetime -from io import StringIO +from pathlib import Path from typing import Dict, Optional, Tuple import bittensor as bt +import git import pandas as pd +import pyarrow as pa +import pyarrow.parquet as pq from cryptography.fernet import Fernet -from huggingface_hub import HfApi, create_repo, hf_hub_download +from dotenv import load_dotenv +from git import Repo +from huggingface_hub import HfApi, hf_hub_download + +load_dotenv() class DatasetManager: - def __init__(self, organization: str): + def __init__(self, organization: str, local_storage_path: str = "./local_data"): """ - Initialize the DatasetManager for handling HuggingFace dataset operations. + Initialize DatasetManager for handling dataset operations. Args: - organization (str): The HuggingFace organization name to store datasets under + organization (str): The HuggingFace organization name + local_storage_path (str): Path to store local data before batch upload Raises: - ValueError: If HF_ACCESS_TOKEN environment variable is not set - - Notes: - - Sets up ThreadPoolExecutor for async operations - - Configures max repository size limit (300GB) - - Requires HF_ACCESS_TOKEN environment variable to be set + ValueError: If required environment variables are not set """ - self.token = os.getenv("HF_ACCESS_TOKEN") - if not self.token: - raise ValueError("HF_ACCESS_TOKEN environment variable not set") + # Load required tokens and credentials + self.hf_token = os.getenv("HF_ACCESS_TOKEN") + self.git_username = os.getenv("GIT_USERNAME", "") + self.git_token = os.getenv("GIT_TOKEN") + + if not self.git_token: + raise ValueError("GIT_TOKEN environment variable not set") - self.api = HfApi(token=self.token) + self.api = HfApi(token=self.hf_token) self.organization = organization - self.MAX_REPO_SIZE = 300 * 1024 * 1024 * 1024 # 300GB self.executor = ThreadPoolExecutor(max_workers=1) - def _get_current_repo_name(self) -> str: - """ - Generate repository name based on current date in YYYY-MM format. + # Local storage setup + self.local_storage = Path(local_storage_path) + self.local_storage.mkdir(parents=True, exist_ok=True) + + # Track current day's data + self.current_day = datetime.now().strftime("%Y-%m-%d") + self.day_storage = self.local_storage / self.current_day + self.day_storage.mkdir(parents=True, exist_ok=True) + + # Git configuration + if self.git_username: + self.git_url_template = f"https://{self.git_username}:{self.git_token}@huggingface.co/datasets/{self.organization}/{{repo_name}}" + else: + self.git_url_template = ( + f"https://{self.git_token}@huggingface.co/datasets/{self.organization}/{{repo_name}}" + ) - Returns: - str: Repository name in format 'dataset-YYYY-MM' - """ + def _get_current_repo_name(self) -> str: + """Generate repository name based on current date""" return f"dataset-{datetime.now().strftime('%Y-%m')}" - def _get_repo_size(self, repo_id: str) -> int: - """ - Calculate total size of repository by summing all file sizes. - - Args: - repo_id (str): Full repository ID in format 'organization/name' - - Returns: - int: Total repository size in bytes - - Notes: - - Handles missing files or metadata gracefully - - Returns 0 if repository doesn't exist or on error - - Logs errors for individual file metadata retrieval failures - """ - try: - files = self.api.list_repo_files(repo_id) - total_size = 0 - - for file_info in files: - try: - file_metadata = self.api.get_file_metadata(repo_id=repo_id, filename=file_info) - total_size += file_metadata.size - except Exception as e: - bt.logging.error(f"Error getting metadata for {file_info}: {e}") - continue - - return total_size - except Exception: - return 0 - - def _create_new_repo(self, repo_name: str) -> str: - """ - Create a new dataset repository in the organization. - - Args: - repo_name (str): Name of the repository to create - - Returns: - str: Full repository ID in format 'organization/name' - - Raises: - Exception: If repository creation fails - - Notes: - - Creates public dataset repository - - Logs success or failure of creation - """ - repo_id = f"{self.organization}/{repo_name}" - try: - create_repo(repo_id=repo_id, repo_type="dataset", private=False, token=self.token) - bt.logging.success(f"Created new repository: {repo_id}") - except Exception as e: - bt.logging.error(f"Error creating repository {repo_id}: {e}") - raise - - return repo_id - - def verify_encryption_key(self, key: bytes) -> bool: - """ - Verify that an encryption key is valid for Fernet encryption. - - Args: - key (bytes): The encryption key to verify - - Returns: - bool: True if key is valid Fernet key, False otherwise + def _get_local_path(self, hotkey: str) -> Path: + """Get local storage path for a specific hotkey""" + path = self.day_storage / hotkey + path.mkdir(parents=True, exist_ok=True) + return path - Notes: - - Checks base64 encoding - - Verifies key length is exactly 32 bytes - - Attempts Fernet initialization - - Logs specific validation errors - """ - try: - # Check if key is valid base64 - import base64 - - decoded = base64.b64decode(key) - # Check if key length is correct (32 bytes) - if len(decoded) != 32: - bt.logging.error(f"Invalid key length: {len(decoded)} bytes (expected 32)") - return False - # Try to initialize Fernet - Fernet(key) - return True - except Exception as e: - bt.logging.error(f"Invalid encryption key: {str(e)}") - return False - - def store_data( + def store_local_data( self, timestamp: str, miner_data: pd.DataFrame, @@ -162,110 +98,174 @@ def store_data( metadata: Optional[Dict] = None, ) -> Tuple[bool, Dict]: """ - Store market data and metadata in a HuggingFace dataset repository. + Store data locally in Parquet format. Args: - timestamp (str): Current timestamp for data identification - miner_data (pd.DataFrame): DataFrame containing market data to store + timestamp (str): Current timestamp + miner_data (pd.DataFrame): DataFrame containing market data predictions (Dict): Dictionary of prediction results - hotkey (str): Miner's hotkey for data organization - metadata (Optional[Dict]): Additional metadata about the collection + hotkey (str): Miner's hotkey + metadata (Optional[Dict]): Additional metadata Returns: - Tuple[bool, Dict]: Pair containing: - - bool: Success status of storage operation - - Dict: Result data containing: - - repo_id: Full repository ID - - filename: Path to stored file - - rows: Number of data rows - - columns: Number of columns - - error: Error message if failed - - Raises: - ValueError: If miner_data is not a non-empty DataFrame - - Notes: - - Creates repository if it doesn't exist - - Organizes data by hotkey in repository - - Includes metadata as CSV comments - - Uses standardized filename format + Tuple[bool, Dict]: Success status and result data """ try: if not isinstance(miner_data, pd.DataFrame) or miner_data.empty: raise ValueError("miner_data must be a non-empty pandas DataFrame") - # Get or create repository - repo_name = self._get_current_repo_name() - repo_id = f"{self.organization}/{repo_name}" - - # Convert DataFrame to CSV - csv_buffer = StringIO() - miner_data.to_csv(csv_buffer, index=True) - csv_data = csv_buffer.getvalue() - - # Add metadata as comments - metadata_buffer = StringIO() - metadata_buffer.write("\n# Metadata:\n") - metadata_buffer.write(f"# timestamp: {timestamp}\n") - metadata_buffer.write(f"# columns: {','.join(miner_data.columns)}\n") - metadata_buffer.write(f"# shape: {miner_data.shape[0]},{miner_data.shape[1]}\n") - metadata_buffer.write(f"# hotkey: {hotkey}\n") - if metadata: - for key, value in metadata.items(): - metadata_buffer.write(f"# {key}: {value}\n") - if predictions: - metadata_buffer.write(f"# predictions: {json.dumps(predictions)}\n") + # Get local storage path for this hotkey + local_path = self._get_local_path(hotkey) - # Combine CSV data and metadata - full_data = csv_data + metadata_buffer.getvalue() + # Create filename + filename = f"market_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.parquet" + file_path = local_path / filename - # Ensure repository exists - try: - self.api.create_repo(repo_id=repo_id, repo_type="dataset", exist_ok=True) - except Exception as e: - bt.logging.debug(f"Repository already exists or creation failed: {str(e)}") + # Prepare metadata + full_metadata = { + "timestamp": timestamp, + "columns": ",".join(miner_data.columns), + "shape": f"{miner_data.shape[0]},{miner_data.shape[1]}", + "hotkey": hotkey, + "predictions": json.dumps(predictions) if predictions else "", + } + if metadata: + full_metadata.update(metadata) - # Create unique filename with hotkey path - filename = f"{hotkey}/market_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" + # Convert to PyArrow Table with metadata + table = pa.Table.from_pandas(miner_data) + for key, value in full_metadata.items(): + table = table.replace_schema_metadata({**table.schema.metadata, key.encode(): str(value).encode()}) - # Upload directly using HfApi - self.api.upload_file( - path_or_fileobj=full_data.encode(), path_in_repo=filename, repo_id=repo_id, repo_type="dataset" - ) + # Write Parquet file with compression + pq.write_table(table, file_path, compression="snappy", use_dictionary=True, use_byte_stream_split=True) return True, { - "repo_id": repo_id, - "filename": filename, + "local_path": str(file_path), "rows": miner_data.shape[0], "columns": miner_data.shape[1], } except Exception as e: - bt.logging.error(f"Error in store_data: {str(e)}") + bt.logging.error(f"Error in store_local_data: {str(e)}") + return False, {"error": str(e)} + + def _configure_git_repo(self, repo: Repo): + """Configure Git repository with user information""" + git_name = os.getenv("GIT_NAME", "DatasetManager") + git_email = os.getenv("GIT_EMAIL", "noreply@example.com") + + with repo.config_writer() as git_config: + git_config.set_value("user", "name", git_name) + git_config.set_value("user", "email", git_email) + + def _setup_git_repo(self, repo_name: str) -> Tuple[Repo, Path]: + """Set up Git repository for batch upload""" + temp_dir = Path(tempfile.mkdtemp()) + repo_url = self.git_url_template.format(repo_name=repo_name) + + try: + # Try to clone existing repo + repo = Repo.clone_from(repo_url, temp_dir) + bt.logging.success(f"Cloned existing repository: {repo_name}") + except git.exc.GitCommandError: + # Repository doesn't exist, create new + bt.logging.info(f"Creating new repository: {repo_name}") + repo = Repo.init(temp_dir) + + # Configure Git + self._configure_git_repo(repo) + + # Set up remote + repo.create_remote("origin", repo_url) + + # Create initial commit + readme_path = temp_dir / "README.md" + readme_path.write_text(f"# {repo_name}\nDataset repository managed by DatasetManager") + repo.index.add(["README.md"]) + repo.index.commit("Initial commit") + + # Push to create repository + origin = repo.remote("origin") + origin.push(refspec="master:master") + + return repo, temp_dir + + async def batch_upload_daily_data(self) -> Tuple[bool, Dict]: + """Upload all locally stored data using Git""" + try: + repo_name = self._get_current_repo_name() + repo, temp_dir = self._setup_git_repo(repo_name) + + uploaded_files = [] + total_rows = 0 + + try: + # Copy all files from day storage to Git repo + for hotkey_dir in self.day_storage.iterdir(): + if hotkey_dir.is_dir(): + hotkey = hotkey_dir.name + repo_hotkey_dir = temp_dir / hotkey + repo_hotkey_dir.mkdir(exist_ok=True) + + for file_path in hotkey_dir.glob("*.parquet"): + try: + # Copy file + target_path = repo_hotkey_dir / file_path.name + shutil.copy2(file_path, target_path) + + # Track file + rel_path = str(target_path.relative_to(temp_dir)) + uploaded_files.append(rel_path) + + # Count rows + table = pq.read_table(file_path) + total_rows += table.num_rows + + # Stage file + repo.index.add([rel_path]) + + except Exception as e: + bt.logging.error(f"Error processing {file_path}: {str(e)}") + continue + + # Commit and push if there are changes + if repo.is_dirty() or len(repo.untracked_files) > 0: + commit_message = f"Batch upload for {self.current_day}" + repo.index.commit(commit_message) + + origin = repo.remote("origin") + origin.push() + + bt.logging.success(f"Successfully pushed {len(uploaded_files)} files to {repo_name}") + else: + bt.logging.info("No changes to upload") + + return True, { + "repo_id": f"{self.organization}/{repo_name}", + "files_uploaded": len(uploaded_files), + "total_rows": total_rows, + "paths": uploaded_files, + } + + finally: + # Clean up temporary directory + shutil.rmtree(temp_dir) + + except Exception as e: + bt.logging.error(f"Error in batch_upload_daily_data: {str(e)}") return False, {"error": str(e)} def decrypt_data(self, data_path: str, decryption_key: bytes) -> Tuple[bool, Dict]: """ - Decrypt and load data from a HuggingFace repository file. + Decrypt and load data from a HuggingFace repository file in Parquet format. Args: data_path (str): Full repository path (org/repo_type/hotkey/data/filename) decryption_key (bytes): Raw Fernet decryption key Returns: - Tuple[bool, Dict]: Pair containing: - - bool: Success status of decryption - - Dict: Result data containing: - - data: Decrypted DataFrame - - metadata: Extracted metadata dictionary - - predictions: Extracted predictions dictionary - - error: Error message if failed - - Notes: - - Downloads file from HuggingFace hub - - Separates CSV data from metadata comments - - Parses metadata into structured format - - Handles prediction data separately if present + Tuple[bool, Dict]: Success status and decrypted data with metadata """ try: bt.logging.info(f"Attempting to decrypt data from path: {data_path}") @@ -282,27 +282,33 @@ def decrypt_data(self, data_path: str, decryption_key: bytes) -> Tuple[bool, Dic with open(local_path, "rb") as file: encrypted_data = file.read() - decrypted_data = fernet.decrypt(encrypted_data).decode() + decrypted_data = fernet.decrypt(encrypted_data) - # Split data into CSV and metadata sections - parts = decrypted_data.split("\n# Metadata:") + # Read Parquet from decrypted data + with tempfile.NamedTemporaryFile(suffix=".parquet") as temp_file: + temp_file.write(decrypted_data) + temp_file.flush() - # Parse CSV data into DataFrame - df = pd.read_csv(StringIO(parts[0])) + # Read Parquet file + table = pq.read_table(temp_file.name) + df = table.to_pandas() - # Parse metadata - metadata = {} - predictions = None - if len(parts) > 1: - for line in parts[1].split("\n"): - if line.startswith("# "): + # Extract metadata from Parquet schema + metadata = {} + predictions = None + + if table.schema.metadata: + for key, value in table.schema.metadata.items(): try: - key, value = line[2:].split(": ", 1) - if key == "predictions": - predictions = json.loads(value) + key_str = key.decode() if isinstance(key, bytes) else key + value_str = value.decode() if isinstance(value, bytes) else value + + if key_str == "predictions": + predictions = json.loads(value_str) else: - metadata[key] = value - except ValueError: + metadata[key_str] = value_str + except Exception as e: + bt.logging.error(f"Error while extracting metadata: {str(e)}") continue return True, {"data": df, "metadata": metadata, "predictions": predictions} @@ -318,38 +324,22 @@ async def store_data_async( predictions: Dict, hotkey: str, metadata: Optional[Dict] = None, - ) -> None: - """ - Asynchronously store data in the dataset repository without blocking. - - Args: - timestamp (str): Current timestamp for data identification - miner_data (pd.DataFrame): DataFrame containing market data - predictions (Dict): Dictionary of prediction results - hotkey (str): Miner's hotkey for data organization - metadata (Optional[Dict]): Additional metadata about the collection - - Notes: - - Creates background task for storage operation - - Uses ThreadPoolExecutor for async execution - - Logs success or failure but does not return results - - Does not block the calling coroutine - """ + ) -> Tuple[bool, Dict]: + """Async wrapper for store_local_data""" loop = asyncio.get_event_loop() + return await loop.run_in_executor( + self.executor, lambda: self.store_local_data(timestamp, miner_data, predictions, hotkey, metadata) + ) - async def _store(): - try: - result = await loop.run_in_executor( - self.executor, lambda: self.store_data(timestamp, miner_data, predictions, hotkey, metadata) - ) - - success, upload_result = result - if success: - bt.logging.success(f"Stored market data in dataset: {upload_result['repo_id']}") - else: - bt.logging.error(f"Failed to store market data: {upload_result['error']}") + def cleanup_local_storage(self, days_to_keep: int = 7): + """Clean up old local storage directories""" + try: + dirs = sorted([d for d in self.local_storage.iterdir() if d.is_dir()]) - except Exception as e: - bt.logging.error(f"Error in async data storage: {str(e)}") + if len(dirs) > days_to_keep: + for old_dir in dirs[:-days_to_keep]: + shutil.rmtree(old_dir) + bt.logging.success(f"Cleaned up {len(dirs) - days_to_keep} old data directories") - asyncio.create_task(_store()) + except Exception as e: + bt.logging.error(f"Error cleaning up local storage: {str(e)}") diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 1b3ed3f3..d414a623 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -42,9 +42,9 @@ def can_process_data(response) -> bool: return all([bool(response.repo_id), bool(response.data), bool(response.decryption_key), bool(response.prediction)]) -async def process_miner_data(response, timestamp: str, organization: str, hotkey: str, uid: int): +async def process_miner_data(response, timestamp: str, organization: str, hotkey: str, uid: int) -> bool: """ - Decrypt and store unencrypted data from a miner in the organization dataset. + Verify that miner's data can be decrypted and attempt to store it. Args: response: Response from miner containing encrypted data @@ -52,44 +52,38 @@ async def process_miner_data(response, timestamp: str, organization: str, hotkey organization: Organization name for HuggingFace hotkey: Miner's hotkey for data organization uid: Miner's UID + + Returns: + bool: True if data was successfully decrypted, False otherwise """ try: bt.logging.info(f"Processing data from UID {uid}...") - - # Initialize DatasetManager with explicit organization dataset_manager = DatasetManager(organization=organization) - - # Build complete path using repo_id and data path data_path = f"{response.repo_id}/{response.data}" - bt.logging.info(f"Attempting to decrypt data from path: {data_path}") - - # Attempt to decrypt the data + # Verify decryption works success, result = dataset_manager.decrypt_data(data_path=data_path, decryption_key=response.decryption_key) if not success: bt.logging.error(f"Failed to decrypt data: {result['error']}") - return - - # Get the decrypted data - df = result["data"] - metadata = result.get("metadata", {}) - predictions = result.get("predictions", {}) - - bt.logging.info(f"Successfully decrypted data with shape: {df.shape}") - - # Store data using DatasetManager's async storage - await dataset_manager.store_data_async( - timestamp=timestamp, - miner_data=df, - predictions=predictions, - hotkey=hotkey, - metadata={"source_uid": str(uid), "original_repo": response.repo_id, **metadata}, + return False + + # Attempt to store data in background without affecting reward + asyncio.create_task( + dataset_manager.store_data_async( + timestamp=timestamp, + miner_data=result["data"], + predictions=result.get("predictions", {}), + hotkey=hotkey, + metadata={"source_uid": str(uid), "original_repo": response.repo_id, **result.get("metadata", {})}, + ) ) + return True + except Exception as e: bt.logging.error(f"Error processing data from UID {uid}: {str(e)}") - bt.logging.error(f"Full data path: {data_path}") + return False async def forward(self): From 45a3c24440160d1ccb0aa9637c1bc5a2151b5c95 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Mon, 16 Dec 2024 12:40:31 -0500 Subject: [PATCH 123/201] update file type to be parquet --- predictionnet/utils/miner_hf.py | 55 +++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/predictionnet/utils/miner_hf.py b/predictionnet/utils/miner_hf.py index eba677a5..79e193cc 100644 --- a/predictionnet/utils/miner_hf.py +++ b/predictionnet/utils/miner_hf.py @@ -1,9 +1,11 @@ import os +import tempfile from datetime import datetime -from io import StringIO import bittensor as bt import pandas as pd +import pyarrow as pa +import pyarrow.parquet as pq from cryptography.fernet import Fernet from dotenv import load_dotenv from huggingface_hub import HfApi @@ -92,7 +94,7 @@ def upload_model(self, repo_id=None, model_path=None, hotkey=None): def upload_data(self, repo_id=None, data: pd.DataFrame = None, hotkey=None, encryption_key=None): """ - Upload encrypted training/validation data to HuggingFace Hub with secure encryption. + Upload encrypted training/validation data to HuggingFace Hub using Parquet format. Args: repo_id (str, optional): The HuggingFace repository ID where the data will be uploaded. @@ -116,13 +118,6 @@ def upload_data(self, repo_id=None, data: pd.DataFrame = None, hotkey=None, encr Raises: ValueError: If data is not a non-empty DataFrame or if encryption_key is not provided Exception: If file operations or upload process fails - - Notes: - - Data is encrypted using Fernet symmetric encryption - - Creates unique filenames using timestamps - - Temporarily stores encrypted data locally before upload - - Creates the repository if it doesn't exist - - Maintains organized directory structure by hotkey """ if not repo_id: repo_id = self.config.hf_repo_id @@ -134,32 +129,44 @@ def upload_data(self, repo_id=None, data: pd.DataFrame = None, hotkey=None, encr raise ValueError("Encryption key must be provided") try: - import tempfile - fernet = Fernet(encryption_key.encode() if isinstance(encryption_key, str) else encryption_key) # Create unique filename using timestamp timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - data_filename = f"data_{timestamp}.enc" + data_filename = f"data_{timestamp}.parquet.enc" hotkey_path = f"{hotkey}/data" data_full_path = f"{hotkey_path}/{data_filename}" bt.logging.debug(f"Preparing to upload encrypted data: {data_full_path}") - # Convert DataFrame to CSV in memory - csv_buffer = StringIO() - data.to_csv(csv_buffer, index=False) - - # Encrypt the CSV data - csv_data = csv_buffer.getvalue().encode() - encrypted_data = fernet.encrypt(csv_data) - - # Create temporary directory and file with tempfile.TemporaryDirectory() as temp_dir: - temp_data_path = os.path.join(temp_dir, data_filename) + # First create temporary Parquet file + temp_parquet = os.path.join(temp_dir, "temp.parquet") + temp_encrypted = os.path.join(temp_dir, data_filename) + try: + # Convert to PyArrow Table with metadata + table = pa.Table.from_pandas(data) + table = table.replace_schema_metadata( + { + **table.schema.metadata, + b"timestamp": timestamp.encode(), + b"hotkey": hotkey.encode() if hotkey else b"", + } + ) + + # Write Parquet file with compression + pq.write_table( + table, temp_parquet, compression="snappy", use_dictionary=True, use_byte_stream_split=True + ) + + # Read and encrypt the Parquet file + with open(temp_parquet, "rb") as f: + parquet_data = f.read() + encrypted_data = fernet.encrypt(parquet_data) + # Write encrypted data to temporary file - with open(temp_data_path, "wb") as f: + with open(temp_encrypted, "wb") as f: f.write(encrypted_data) # Ensure repository exists @@ -170,7 +177,7 @@ def upload_data(self, repo_id=None, data: pd.DataFrame = None, hotkey=None, encr # Upload encrypted file bt.logging.debug(f"Uploading encrypted data file: {data_full_path}") self.api.upload_file( - path_or_fileobj=temp_data_path, + path_or_fileobj=temp_encrypted, path_in_repo=data_full_path, repo_id=repo_id, repo_type="model", From 3c6efca4d11cd49ad1c235173e3f511567e29358 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Mon, 16 Dec 2024 14:25:16 -0500 Subject: [PATCH 124/201] update dataset_manager to properly instantiate hf git repo --- predictionnet/utils/dataset_manager.py | 78 +++++++++++++++----------- 1 file changed, 45 insertions(+), 33 deletions(-) diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py index 735ebae7..e48ae7b3 100644 --- a/predictionnet/utils/dataset_manager.py +++ b/predictionnet/utils/dataset_manager.py @@ -26,7 +26,6 @@ from typing import Dict, Optional, Tuple import bittensor as bt -import git import pandas as pd import pyarrow as pa import pyarrow.parquet as pq @@ -81,7 +80,7 @@ def __init__(self, organization: str, local_storage_path: str = "./local_data"): def _get_current_repo_name(self) -> str: """Generate repository name based on current date""" - return f"dataset-{datetime.now().strftime('%Y-%m')}" + return f"dataset-{datetime.now().strftime('%Y-%m-%d')}" def _get_local_path(self, hotkey: str) -> Path: """Get local storage path for a specific hotkey""" @@ -163,83 +162,95 @@ def _setup_git_repo(self, repo_name: str) -> Tuple[Repo, Path]: """Set up Git repository for batch upload""" temp_dir = Path(tempfile.mkdtemp()) repo_url = self.git_url_template.format(repo_name=repo_name) + repo_id = f"{self.organization}/{repo_name}" try: - # Try to clone existing repo + # First check if repo exists + try: + self.api.repo_info(repo_id=repo_id, repo_type="dataset") + except Exception: + # Repository doesn't exist, create it via API + self.api.create_repo(repo_id=repo_id, repo_type="dataset", private=False) + bt.logging.info(f"Created new repository: {repo_name}") + + # Now clone the repository (it should exist) repo = Repo.clone_from(repo_url, temp_dir) - bt.logging.success(f"Cloned existing repository: {repo_name}") - except git.exc.GitCommandError: - # Repository doesn't exist, create new - bt.logging.info(f"Creating new repository: {repo_name}") - repo = Repo.init(temp_dir) + bt.logging.success(f"Cloned repository: {repo_name}") - # Configure Git + # Configure Git if needed self._configure_git_repo(repo) - # Set up remote - repo.create_remote("origin", repo_url) - - # Create initial commit - readme_path = temp_dir / "README.md" - readme_path.write_text(f"# {repo_name}\nDataset repository managed by DatasetManager") - repo.index.add(["README.md"]) - repo.index.commit("Initial commit") - - # Push to create repository - origin = repo.remote("origin") - origin.push(refspec="master:master") + return repo, temp_dir - return repo, temp_dir + except Exception as e: + # Clean up temp dir if anything fails + if temp_dir.exists(): + shutil.rmtree(temp_dir) + raise Exception(f"Failed to setup repository: {str(e)}") async def batch_upload_daily_data(self) -> Tuple[bool, Dict]: """Upload all locally stored data using Git""" try: - repo_name = self._get_current_repo_name() + print("Starting batch upload process...") + repo_name = self._get_current_repo_name() # Use daily repo name + print(f"Generated repo name: {repo_name}") + + # Setup the Git repo (clone or create new) repo, temp_dir = self._setup_git_repo(repo_name) + print(f"Repo setup completed. Temporary directory: {temp_dir}") uploaded_files = [] total_rows = 0 try: - # Copy all files from day storage to Git repo + # Iterate through hotkey directories in the day storage for hotkey_dir in self.day_storage.iterdir(): + print(f"Processing directory: {hotkey_dir}") if hotkey_dir.is_dir(): hotkey = hotkey_dir.name repo_hotkey_dir = temp_dir / hotkey repo_hotkey_dir.mkdir(exist_ok=True) + print(f"Created directory for hotkey: {repo_hotkey_dir}") + # Iterate through Parquet files in the hotkey directory for file_path in hotkey_dir.glob("*.parquet"): try: - # Copy file + print(f"Processing file: {file_path}") + # Copy file to repo hotkey directory target_path = repo_hotkey_dir / file_path.name shutil.copy2(file_path, target_path) + print(f"Copied file to {target_path}") - # Track file + # Track the file and calculate the total rows rel_path = str(target_path.relative_to(temp_dir)) uploaded_files.append(rel_path) - # Count rows + # Count rows in the Parquet file table = pq.read_table(file_path) total_rows += table.num_rows + print(f"File has {table.num_rows} rows. Total rows so far: {total_rows}") - # Stage file + # Stage the file in the Git repository repo.index.add([rel_path]) + print(f"Staged file for commit: {rel_path}") except Exception as e: - bt.logging.error(f"Error processing {file_path}: {str(e)}") + print(f"Error processing {file_path}: {str(e)}") continue # Commit and push if there are changes if repo.is_dirty() or len(repo.untracked_files) > 0: + print("Changes detected, committing and pushing...") commit_message = f"Batch upload for {self.current_day}" repo.index.commit(commit_message) + print(f"Commit created: {commit_message}") origin = repo.remote("origin") + print("Pushing changes to remote repository...") origin.push() - - bt.logging.success(f"Successfully pushed {len(uploaded_files)} files to {repo_name}") + print(f"Successfully pushed {len(uploaded_files)} files to {repo_name}") else: - bt.logging.info("No changes to upload") + print("No changes to upload") return True, { "repo_id": f"{self.organization}/{repo_name}", @@ -251,9 +262,10 @@ async def batch_upload_daily_data(self) -> Tuple[bool, Dict]: finally: # Clean up temporary directory shutil.rmtree(temp_dir) + print(f"Temporary directory cleaned up: {temp_dir}") except Exception as e: - bt.logging.error(f"Error in batch_upload_daily_data: {str(e)}") + print(f"Error in batch_upload_daily_data: {str(e)}") return False, {"error": str(e)} def decrypt_data(self, data_path: str, decryption_key: bytes) -> Tuple[bool, Dict]: From 6e2a23b25a86b26bbde5d372777ec42f6ddfc00d Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Mon, 16 Dec 2024 14:35:06 -0500 Subject: [PATCH 125/201] update forward to check daily for files to upload after market close --- predictionnet/validator/forward.py | 59 ++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 15 deletions(-) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index d414a623..a917b3e8 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -86,31 +86,60 @@ async def process_miner_data(response, timestamp: str, organization: str, hotkey return False +async def handle_market_close(self, dataset_manager: DatasetManager) -> None: + """Handle data management operations when market is closed.""" + try: + # Clean up old data + dataset_manager.cleanup_local_storage(days_to_keep=7) + + # Upload today's data + success, result = await dataset_manager.batch_upload_daily_data() + if success: + bt.logging.success( + f"Daily batch upload completed. Uploaded {result.get('files_uploaded', 0)} files " + f"with {result.get('total_rows', 0)} rows to {result.get('repo_id')}" + ) + else: + bt.logging.error(f"Daily batch upload failed: {result.get('error')}") + + except Exception as e: + bt.logging.error(f"Error during market close operations: {str(e)}") + + async def forward(self): """ The forward function is called by the validator every time step. - It is responsible for querying the network and scoring the responses. - Args: - self (:obj:`bittensor.neuron.Neuron`): The neuron object which contains all the necessary state for the validator. + It queries the network and scores responses when market is open, + and handles data management when market is closed. """ - # Market timing setup ny_timezone = timezone("America/New_York") current_time_ny = datetime.now(ny_timezone) - bt.logging.info("Current time: ", current_time_ny) + dataset_manager = DatasetManager(organization=self.config.neuron.organization) + daily_ops_done = False - # Block forward from running if market is closed while True: if await self.is_valid_time(): - bt.logging.info("Market is open. Begin processes requests") + daily_ops_done = False # Reset flag when market opens break - else: - bt.logging.info("Market is closed. Sleeping for 2 minutes...") - time.sleep(120) - if datetime.now(ny_timezone) - current_time_ny >= timedelta(hours=1): - self.resync_metagraph() - self.set_weights() - self.past_predictions = [full((self.N_TIMEPOINTS, self.N_TIMEPOINTS), nan)] * len(self.hotkeys) - current_time_ny = datetime.now(ny_timezone) + + if not daily_ops_done: + await handle_market_close(self, dataset_manager) + daily_ops_done = True + + # Check metagraph every hour + if datetime.now(ny_timezone) - current_time_ny >= timedelta(hours=1): + self.resync_metagraph() + self.set_weights() + self.past_predictions = [full((self.N_TIMEPOINTS, self.N_TIMEPOINTS), nan)] * len(self.hotkeys) + current_time_ny = datetime.now(ny_timezone) + + time.sleep(120) # Sleep for 2 minutes + + if datetime.now(ny_timezone) - current_time_ny >= timedelta(hours=1): + self.resync_metagraph() + self.set_weights() + self.past_predictions = [full((self.N_TIMEPOINTS, self.N_TIMEPOINTS), nan)] * len(self.hotkeys) + current_time_ny = datetime.now(ny_timezone) # Get available miner UIDs miner_uids = [] From 74f064a2fd0ffc0903fd2f536460282511b580c8 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Mon, 16 Dec 2024 14:43:57 -0500 Subject: [PATCH 126/201] replace print statemtents with bittensor logging in dataset_manager.py --- predictionnet/utils/dataset_manager.py | 34 +++++++++++++------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py index e48ae7b3..75390725 100644 --- a/predictionnet/utils/dataset_manager.py +++ b/predictionnet/utils/dataset_manager.py @@ -191,13 +191,13 @@ def _setup_git_repo(self, repo_name: str) -> Tuple[Repo, Path]: async def batch_upload_daily_data(self) -> Tuple[bool, Dict]: """Upload all locally stored data using Git""" try: - print("Starting batch upload process...") + bt.logging.info("Starting batch upload process...") repo_name = self._get_current_repo_name() # Use daily repo name - print(f"Generated repo name: {repo_name}") + bt.logging.info(f"Generated repo name: {repo_name}") # Setup the Git repo (clone or create new) repo, temp_dir = self._setup_git_repo(repo_name) - print(f"Repo setup completed. Temporary directory: {temp_dir}") + bt.logging.info(f"Repo setup completed. Temporary directory: {temp_dir}") uploaded_files = [] total_rows = 0 @@ -205,21 +205,21 @@ async def batch_upload_daily_data(self) -> Tuple[bool, Dict]: try: # Iterate through hotkey directories in the day storage for hotkey_dir in self.day_storage.iterdir(): - print(f"Processing directory: {hotkey_dir}") + bt.logging.debug(f"Processing directory: {hotkey_dir}") if hotkey_dir.is_dir(): hotkey = hotkey_dir.name repo_hotkey_dir = temp_dir / hotkey repo_hotkey_dir.mkdir(exist_ok=True) - print(f"Created directory for hotkey: {repo_hotkey_dir}") + bt.logging.debug(f"Created directory for hotkey: {repo_hotkey_dir}") # Iterate through Parquet files in the hotkey directory for file_path in hotkey_dir.glob("*.parquet"): try: - print(f"Processing file: {file_path}") + bt.logging.debug(f"Processing file: {file_path}") # Copy file to repo hotkey directory target_path = repo_hotkey_dir / file_path.name shutil.copy2(file_path, target_path) - print(f"Copied file to {target_path}") + bt.logging.debug(f"Copied file to {target_path}") # Track the file and calculate the total rows rel_path = str(target_path.relative_to(temp_dir)) @@ -228,29 +228,29 @@ async def batch_upload_daily_data(self) -> Tuple[bool, Dict]: # Count rows in the Parquet file table = pq.read_table(file_path) total_rows += table.num_rows - print(f"File has {table.num_rows} rows. Total rows so far: {total_rows}") + bt.logging.debug(f"File has {table.num_rows} rows. Total rows so far: {total_rows}") # Stage the file in the Git repository repo.index.add([rel_path]) - print(f"Staged file for commit: {rel_path}") + bt.logging.debug(f"Staged file for commit: {rel_path}") except Exception as e: - print(f"Error processing {file_path}: {str(e)}") + bt.logging.error(f"Error processing {file_path}: {str(e)}") continue # Commit and push if there are changes if repo.is_dirty() or len(repo.untracked_files) > 0: - print("Changes detected, committing and pushing...") + bt.logging.info("Changes detected, committing and pushing...") commit_message = f"Batch upload for {self.current_day}" repo.index.commit(commit_message) - print(f"Commit created: {commit_message}") + bt.logging.info(f"Commit created: {commit_message}") origin = repo.remote("origin") - print("Pushing changes to remote repository...") + bt.logging.info("Pushing changes to remote repository...") origin.push() - print(f"Successfully pushed {len(uploaded_files)} files to {repo_name}") + bt.logging.success(f"Successfully pushed {len(uploaded_files)} files to {repo_name}") else: - print("No changes to upload") + bt.logging.info("No changes to upload") return True, { "repo_id": f"{self.organization}/{repo_name}", @@ -262,10 +262,10 @@ async def batch_upload_daily_data(self) -> Tuple[bool, Dict]: finally: # Clean up temporary directory shutil.rmtree(temp_dir) - print(f"Temporary directory cleaned up: {temp_dir}") + bt.logging.debug(f"Temporary directory cleaned up: {temp_dir}") except Exception as e: - print(f"Error in batch_upload_daily_data: {str(e)}") + bt.logging.error(f"Error in batch_upload_daily_data: {str(e)}") return False, {"error": str(e)} def decrypt_data(self, data_path: str, decryption_key: bytes) -> Tuple[bool, Dict]: From d5af89738cc301bd6c5fd3527f57ffbf86a679b5 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Mon, 16 Dec 2024 15:57:10 -0500 Subject: [PATCH 127/201] add unit test for dataset_manager --- tests/unit/test_dataset_manager.py | 126 +++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 tests/unit/test_dataset_manager.py diff --git a/tests/unit/test_dataset_manager.py b/tests/unit/test_dataset_manager.py new file mode 100644 index 00000000..0adbe662 --- /dev/null +++ b/tests/unit/test_dataset_manager.py @@ -0,0 +1,126 @@ +import shutil +import tempfile +from datetime import datetime +from pathlib import Path + +import pandas as pd +import pytest + +from predictionnet.utils.dataset_manager import DatasetManager + + +@pytest.fixture +def mock_env_vars(monkeypatch): + """Setup environment variables for testing""" + monkeypatch.setenv("HF_ACCESS_TOKEN", "mock_hf_token") + monkeypatch.setenv("GIT_TOKEN", "mock_git_token") + monkeypatch.setenv("GIT_NAME", "mock_git_name") + monkeypatch.setenv("GIT_EMAIL", "mock_git_email") + + +@pytest.fixture +def temp_storage_dir(): + """Create temporary directory for test storage""" + temp_dir = tempfile.mkdtemp() + yield temp_dir + shutil.rmtree(temp_dir) + + +@pytest.fixture +def dataset_manager(mock_env_vars, temp_storage_dir): + """Create DatasetManager instance for testing""" + return DatasetManager("test_org", temp_storage_dir) + + +@pytest.fixture +def sample_dataframe(): + """Create sample DataFrame for testing""" + return pd.DataFrame({"price": [100.0, 101.0], "volume": [1000, 1100]}) + + +class TestDatasetManagerInit: + def test_initialization(self, dataset_manager): + """Test basic initialization""" + assert dataset_manager.organization == "test_org" + assert dataset_manager.git_token == "mock_git_token" + assert dataset_manager.hf_token == "mock_hf_token" + + def test_directory_creation(self, dataset_manager): + """Test storage directory creation""" + current_day = datetime.now().strftime("%Y-%m-%d") + assert dataset_manager.day_storage.exists() + assert dataset_manager.day_storage.name == current_day + + def test_missing_git_token(self, monkeypatch): + """Test handling of missing Git token""" + monkeypatch.delenv("GIT_TOKEN", raising=False) + with pytest.raises(ValueError, match="GIT_TOKEN environment variable not set"): + DatasetManager("test_org") + + +class TestLocalStorage: + def test_store_local_data(self, dataset_manager, sample_dataframe): + """Test storing data locally""" + timestamp = datetime.now().isoformat() + predictions = {"next_price": 102.0} + hotkey = "test_hotkey" + + success, result = dataset_manager.store_local_data( + timestamp=timestamp, miner_data=sample_dataframe, predictions=predictions, hotkey=hotkey + ) + + assert success + assert "local_path" in result + assert result["rows"] == 2 + assert result["columns"] == 2 + + def test_store_invalid_data(self, dataset_manager): + """Test handling invalid data""" + success, result = dataset_manager.store_local_data( + timestamp="2024-01-01", miner_data=pd.DataFrame(), predictions={}, hotkey="test_hotkey" # Empty DataFrame + ) + + assert not success + assert "error" in result + + @pytest.mark.asyncio + async def test_store_data_async(self, dataset_manager, sample_dataframe): + """Test async storage wrapper""" + success, result = await dataset_manager.store_data_async( + timestamp=datetime.now().isoformat(), + miner_data=sample_dataframe, + predictions={"next_price": 102.0}, + hotkey="test_hotkey", + ) + + assert success + assert "local_path" in result + + +class TestCleanup: + def test_cleanup_local_storage(self, dataset_manager, temp_storage_dir): + """Test storage cleanup""" + # Create some test directories + for i in range(10): + test_dir = Path(temp_storage_dir) / f"2024-01-{i:02d}" + test_dir.mkdir(parents=True) + + dataset_manager.cleanup_local_storage(days_to_keep=5) + + remaining_dirs = list(Path(temp_storage_dir).iterdir()) + assert len(remaining_dirs) == 5 + + +def test_get_current_repo_name(dataset_manager): + """Test repository name generation""" + repo_name = dataset_manager._get_current_repo_name() + expected_name = f"dataset-{datetime.now().strftime('%Y-%m-%d')}" + assert repo_name == expected_name + + +def test_get_local_path(dataset_manager): + """Test local path generation""" + hotkey = "test_hotkey" + path = dataset_manager._get_local_path(hotkey) + assert path.exists() + assert path.name == hotkey From 850561271efc12d3bb53d2321d29fdc7481b634e Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 17 Dec 2024 13:23:32 -0500 Subject: [PATCH 128/201] ensure that data upload can scale to 200 plus miners --- poetry.lock | 280 ++++++++++++++++++++++++- predictionnet/utils/dataset_manager.py | 123 +++++------ predictionnet/validator/forward.py | 2 +- pyproject.toml | 8 + tests/helpers.py | 161 -------------- tests/test_template_validator.py | 110 ---------- 6 files changed, 340 insertions(+), 344 deletions(-) delete mode 100644 tests/helpers.py delete mode 100644 tests/test_template_validator.py diff --git a/poetry.lock b/poetry.lock index 12bcd95f..2bd06a8a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -601,6 +601,83 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "coverage" +version = "7.6.9" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"}, + {file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"}, + {file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"}, + {file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"}, + {file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"}, + {file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"}, + {file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"}, + {file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"}, + {file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"}, + {file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"}, + {file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"}, + {file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"}, + {file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"}, + {file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"}, + {file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"}, + {file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"}, + {file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"}, + {file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"}, + {file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"}, + {file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"}, + {file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"}, + {file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"}, + {file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"}, + {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"}, + {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"}, + {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + [[package]] name = "cryptography" version = "42.0.8" @@ -1434,6 +1511,17 @@ files = [ docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] testing = ["pytest (>=3.5,!=3.7.3)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler", "pytest-flake8", "pytest-mypy"] +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + [[package]] name = "jinja2" version = "3.1.4" @@ -1591,6 +1679,24 @@ files = [ {file = "libclang-18.1.1.tar.gz", hash = "sha256:a1214966d08d73d971287fc3ead8dfaf82eb07fb197680d8b3859dbbbbf78250"}, ] +[[package]] +name = "loguru" +version = "0.7.3" +description = "Python logging made (stupidly) simple" +optional = false +python-versions = "<4.0,>=3.5" +files = [ + {file = "loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c"}, + {file = "loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6"}, +] + +[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 (==8.1.3)", "build (==1.2.2)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.5.0)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.13.0)", "mypy (==v1.4.1)", "myst-parser (==4.0.0)", "pre-commit (==4.0.1)", "pytest (==6.1.2)", "pytest (==8.3.2)", "pytest-cov (==2.12.1)", "pytest-cov (==5.0.0)", "pytest-cov (==6.0.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.1.0)", "sphinx-rtd-theme (==3.0.2)", "tox (==3.27.1)", "tox (==4.23.2)", "twine (==6.0.1)"] + [[package]] name = "lxml" version = "5.3.0" @@ -2457,6 +2563,21 @@ files = [ {file = "peewee-3.17.8.tar.gz", hash = "sha256:ce1d05db3438830b989a1b9d0d0aa4e7f6134d5f6fd57686eeaa26a3e6485a8c"}, ] +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + [[package]] name = "pre-commit-hooks" version = "5.0.0" @@ -2932,6 +3053,60 @@ files = [ {file = "py_sr25519_bindings-0.2.1.tar.gz", hash = "sha256:1b96d3dde43adcf86ab427a9fd72b2c6291dca36eb40747df631588c16f01c1a"}, ] +[[package]] +name = "pyarrow" +version = "18.1.0" +description = "Python library for Apache Arrow" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pyarrow-18.1.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e21488d5cfd3d8b500b3238a6c4b075efabc18f0f6d80b29239737ebd69caa6c"}, + {file = "pyarrow-18.1.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:b516dad76f258a702f7ca0250885fc93d1fa5ac13ad51258e39d402bd9e2e1e4"}, + {file = "pyarrow-18.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f443122c8e31f4c9199cb23dca29ab9427cef990f283f80fe15b8e124bcc49b"}, + {file = "pyarrow-18.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a03da7f2758645d17b7b4f83c8bffeae5bbb7f974523fe901f36288d2eab71"}, + {file = "pyarrow-18.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ba17845efe3aa358ec266cf9cc2800fa73038211fb27968bfa88acd09261a470"}, + {file = "pyarrow-18.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:3c35813c11a059056a22a3bef520461310f2f7eea5c8a11ef9de7062a23f8d56"}, + {file = "pyarrow-18.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9736ba3c85129d72aefa21b4f3bd715bc4190fe4426715abfff90481e7d00812"}, + {file = "pyarrow-18.1.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:eaeabf638408de2772ce3d7793b2668d4bb93807deed1725413b70e3156a7854"}, + {file = "pyarrow-18.1.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:3b2e2239339c538f3464308fd345113f886ad031ef8266c6f004d49769bb074c"}, + {file = "pyarrow-18.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f39a2e0ed32a0970e4e46c262753417a60c43a3246972cfc2d3eb85aedd01b21"}, + {file = "pyarrow-18.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e31e9417ba9c42627574bdbfeada7217ad8a4cbbe45b9d6bdd4b62abbca4c6f6"}, + {file = "pyarrow-18.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:01c034b576ce0eef554f7c3d8c341714954be9b3f5d5bc7117006b85fcf302fe"}, + {file = "pyarrow-18.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:f266a2c0fc31995a06ebd30bcfdb7f615d7278035ec5b1cd71c48d56daaf30b0"}, + {file = "pyarrow-18.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:d4f13eee18433f99adefaeb7e01d83b59f73360c231d4782d9ddfaf1c3fbde0a"}, + {file = "pyarrow-18.1.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:9f3a76670b263dc41d0ae877f09124ab96ce10e4e48f3e3e4257273cee61ad0d"}, + {file = "pyarrow-18.1.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:da31fbca07c435be88a0c321402c4e31a2ba61593ec7473630769de8346b54ee"}, + {file = "pyarrow-18.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:543ad8459bc438efc46d29a759e1079436290bd583141384c6f7a1068ed6f992"}, + {file = "pyarrow-18.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0743e503c55be0fdb5c08e7d44853da27f19dc854531c0570f9f394ec9671d54"}, + {file = "pyarrow-18.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d4b3d2a34780645bed6414e22dda55a92e0fcd1b8a637fba86800ad737057e33"}, + {file = "pyarrow-18.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c52f81aa6f6575058d8e2c782bf79d4f9fdc89887f16825ec3a66607a5dd8e30"}, + {file = "pyarrow-18.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ad4892617e1a6c7a551cfc827e072a633eaff758fa09f21c4ee548c30bcaf99"}, + {file = "pyarrow-18.1.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:84e314d22231357d473eabec709d0ba285fa706a72377f9cc8e1cb3c8013813b"}, + {file = "pyarrow-18.1.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:f591704ac05dfd0477bb8f8e0bd4b5dc52c1cadf50503858dce3a15db6e46ff2"}, + {file = "pyarrow-18.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acb7564204d3c40babf93a05624fc6a8ec1ab1def295c363afc40b0c9e66c191"}, + {file = "pyarrow-18.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74de649d1d2ccb778f7c3afff6085bd5092aed4c23df9feeb45dd6b16f3811aa"}, + {file = "pyarrow-18.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f96bd502cb11abb08efea6dab09c003305161cb6c9eafd432e35e76e7fa9b90c"}, + {file = "pyarrow-18.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:36ac22d7782554754a3b50201b607d553a8d71b78cdf03b33c1125be4b52397c"}, + {file = "pyarrow-18.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:25dbacab8c5952df0ca6ca0af28f50d45bd31c1ff6fcf79e2d120b4a65ee7181"}, + {file = "pyarrow-18.1.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6a276190309aba7bc9d5bd2933230458b3521a4317acfefe69a354f2fe59f2bc"}, + {file = "pyarrow-18.1.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:ad514dbfcffe30124ce655d72771ae070f30bf850b48bc4d9d3b25993ee0e386"}, + {file = "pyarrow-18.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aebc13a11ed3032d8dd6e7171eb6e86d40d67a5639d96c35142bd568b9299324"}, + {file = "pyarrow-18.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6cf5c05f3cee251d80e98726b5c7cc9f21bab9e9783673bac58e6dfab57ecc8"}, + {file = "pyarrow-18.1.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:11b676cd410cf162d3f6a70b43fb9e1e40affbc542a1e9ed3681895f2962d3d9"}, + {file = "pyarrow-18.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:b76130d835261b38f14fc41fdfb39ad8d672afb84c447126b84d5472244cfaba"}, + {file = "pyarrow-18.1.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:0b331e477e40f07238adc7ba7469c36b908f07c89b95dd4bd3a0ec84a3d1e21e"}, + {file = "pyarrow-18.1.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:2c4dd0c9010a25ba03e198fe743b1cc03cd33c08190afff371749c52ccbbaf76"}, + {file = "pyarrow-18.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f97b31b4c4e21ff58c6f330235ff893cc81e23da081b1a4b1c982075e0ed4e9"}, + {file = "pyarrow-18.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a4813cb8ecf1809871fd2d64a8eff740a1bd3691bbe55f01a3cf6c5ec869754"}, + {file = "pyarrow-18.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:05a5636ec3eb5cc2a36c6edb534a38ef57b2ab127292a716d00eabb887835f1e"}, + {file = "pyarrow-18.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:73eeed32e724ea3568bb06161cad5fa7751e45bc2228e33dcb10c614044165c7"}, + {file = "pyarrow-18.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:a1880dd6772b685e803011a6b43a230c23b566859a6e0c9a276c1e0faf4f4052"}, + {file = "pyarrow-18.1.0.tar.gz", hash = "sha256:9386d3ca9c145b5539a1cfc75df07757dff870168c959b473a0bccbc3abc8c73"}, +] + +[package.extras] +test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] + [[package]] name = "pycparser" version = "2.22" @@ -3156,6 +3331,81 @@ cffi = ">=1.4.1" docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] +[[package]] +name = "pytest" +version = "8.3.4" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, + {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.25.0" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pytest_asyncio-0.25.0-py3-none-any.whl", hash = "sha256:db5432d18eac6b7e28b46dcd9b69921b55c3b1086e85febfe04e70b18d9e81b3"}, + {file = "pytest_asyncio-0.25.0.tar.gz", hash = "sha256:8c0610303c9e0442a5db8604505fc0f545456ba1528824842b37b4a626cbf609"}, +] + +[package.dependencies] +pytest = ">=8.2,<9" + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)"] +testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] + +[[package]] +name = "pytest-cov" +version = "6.0.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.9" +files = [ + {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, + {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, +] + +[package.dependencies] +coverage = {version = ">=7.5", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] + +[[package]] +name = "pytest-mock" +version = "3.14.0" +description = "Thin-wrapper around the mock package for easier use with pytest" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, +] + +[package.dependencies] +pytest = ">=6.2.5" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -3170,6 +3420,20 @@ files = [ [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-levenshtein" version = "0.26.1" @@ -4166,6 +4430,20 @@ files = [ [package.extras] test = ["pytest (>=6.0.0)", "setuptools (>=65)"] +[[package]] +name = "win32-setctime" +version = "1.2.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" +files = [ + {file = "win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390"}, + {file = "win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0"}, +] + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + [[package]] name = "wrapt" version = "1.17.0" @@ -4518,4 +4796,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">= 3.9, < 3.12" -content-hash = "38288209b911c23a8aadb82192c05befd224f433ab68fe0e9c20807b2efd0c47" +content-hash = "415a3c829653bbbaf938791bf1dfda129c8a35b7c64ba5ed8dd30e296aff6535" diff --git a/predictionnet/utils/dataset_manager.py b/predictionnet/utils/dataset_manager.py index 75390725..304b4f33 100644 --- a/predictionnet/utils/dataset_manager.py +++ b/predictionnet/utils/dataset_manager.py @@ -117,7 +117,8 @@ def store_local_data( local_path = self._get_local_path(hotkey) # Create filename - filename = f"market_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.parquet" + timestamp_dt = datetime.fromisoformat(timestamp) + filename = f"market_data_{timestamp_dt.strftime('%Y%m%d_%H%M%S')}.parquet" file_path = local_path / filename # Prepare metadata @@ -161,6 +162,7 @@ def _configure_git_repo(self, repo: Repo): def _setup_git_repo(self, repo_name: str) -> Tuple[Repo, Path]: """Set up Git repository for batch upload""" temp_dir = Path(tempfile.mkdtemp()) + bt.logging.info(f"Created temporary directory: {temp_dir}") repo_url = self.git_url_template.format(repo_name=repo_name) repo_id = f"{self.organization}/{repo_name}" @@ -186,83 +188,62 @@ def _setup_git_repo(self, repo_name: str) -> Tuple[Repo, Path]: # Clean up temp dir if anything fails if temp_dir.exists(): shutil.rmtree(temp_dir) + bt.logging.info(f"Deleted temporary directory: {temp_dir}") raise Exception(f"Failed to setup repository: {str(e)}") - async def batch_upload_daily_data(self) -> Tuple[bool, Dict]: - """Upload all locally stored data using Git""" + def batch_upload_daily_data(self) -> Tuple[bool, Dict]: + """Optimized version to upload data using Git LFS (for large files) in chunks based on file number.""" try: + # Set up the Git repo and the temporary directory bt.logging.info("Starting batch upload process...") - repo_name = self._get_current_repo_name() # Use daily repo name + repo_name = self._get_current_repo_name() bt.logging.info(f"Generated repo name: {repo_name}") - # Setup the Git repo (clone or create new) repo, temp_dir = self._setup_git_repo(repo_name) - bt.logging.info(f"Repo setup completed. Temporary directory: {temp_dir}") - - uploaded_files = [] - total_rows = 0 - - try: - # Iterate through hotkey directories in the day storage - for hotkey_dir in self.day_storage.iterdir(): - bt.logging.debug(f"Processing directory: {hotkey_dir}") - if hotkey_dir.is_dir(): - hotkey = hotkey_dir.name - repo_hotkey_dir = temp_dir / hotkey - repo_hotkey_dir.mkdir(exist_ok=True) - bt.logging.debug(f"Created directory for hotkey: {repo_hotkey_dir}") - - # Iterate through Parquet files in the hotkey directory - for file_path in hotkey_dir.glob("*.parquet"): - try: - bt.logging.debug(f"Processing file: {file_path}") - # Copy file to repo hotkey directory - target_path = repo_hotkey_dir / file_path.name - shutil.copy2(file_path, target_path) - bt.logging.debug(f"Copied file to {target_path}") - - # Track the file and calculate the total rows - rel_path = str(target_path.relative_to(temp_dir)) - uploaded_files.append(rel_path) - - # Count rows in the Parquet file - table = pq.read_table(file_path) - total_rows += table.num_rows - bt.logging.debug(f"File has {table.num_rows} rows. Total rows so far: {total_rows}") - - # Stage the file in the Git repository - repo.index.add([rel_path]) - bt.logging.debug(f"Staged file for commit: {rel_path}") - - except Exception as e: - bt.logging.error(f"Error processing {file_path}: {str(e)}") - continue - - # Commit and push if there are changes - if repo.is_dirty() or len(repo.untracked_files) > 0: - bt.logging.info("Changes detected, committing and pushing...") - commit_message = f"Batch upload for {self.current_day}" - repo.index.commit(commit_message) - bt.logging.info(f"Commit created: {commit_message}") - - origin = repo.remote("origin") - bt.logging.info("Pushing changes to remote repository...") - origin.push() - bt.logging.success(f"Successfully pushed {len(uploaded_files)} files to {repo_name}") - else: - bt.logging.info("No changes to upload") - - return True, { - "repo_id": f"{self.organization}/{repo_name}", - "files_uploaded": len(uploaded_files), - "total_rows": total_rows, - "paths": uploaded_files, - } - - finally: - # Clean up temporary directory - shutil.rmtree(temp_dir) - bt.logging.debug(f"Temporary directory cleaned up: {temp_dir}") + bt.logging.info(f"Cloned repository to temporary directory: {temp_dir}") + + # Copy the entire parent folder to the temporary directory + bt.logging.info(f"Copying data from {self.day_storage} to {temp_dir}...") + shutil.copytree(self.day_storage, temp_dir, dirs_exist_ok=True) + bt.logging.info(f"Data successfully copied to {temp_dir}") + + # Track all Parquet files with Git LFS (ensure they are tracked before adding them) + bt.logging.info("Tracking all Parquet files with Git LFS...") + repo.git.lfs("track", "*.parquet") # Ensure LFS tracking is enabled + bt.logging.info("Successfully tracked Parquet files with Git LFS") + + # Collect all files to be added to Git + bt.logging.info("Collecting all Parquet files to be added to Git...") + files_to_commit = [] + for file_path in temp_dir.rglob("*.parquet"): + rel_path = str(file_path.relative_to(temp_dir)) + files_to_commit.append(rel_path) + bt.logging.info(f"Found {len(files_to_commit)} Parquet files to commit") + + # Define the chunk size (number of files per commit) + chunk_size = 1000 + chunks = [files_to_commit[i : i + chunk_size] for i in range(0, len(files_to_commit), chunk_size)] + bt.logging.info(f"Created {len(chunks)} chunks, each containing up to {chunk_size} files") + + # Commit and push in chunks + files_uploaded = 0 + for chunk in chunks: + bt.logging.info( + f"Committing chunk {files_uploaded // chunk_size + 1} of {len(chunks)} with {len(chunk)} files..." + ) + repo.index.add(chunk) + commit_message = f"Batch upload for {self.current_day} (Chunk {files_uploaded // chunk_size + 1})" + repo.index.commit(commit_message) + origin = repo.remote("origin") + origin.push() + files_uploaded += len(chunk) + bt.logging.success(f"Successfully pushed {len(chunk)} files in this chunk to {repo_name}") + + # Return success with the number of files uploaded + return True, { + "repo_id": f"{self.organization}/{repo_name}", + "files_uploaded": files_uploaded, + } except Exception as e: bt.logging.error(f"Error in batch_upload_daily_data: {str(e)}") diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index a917b3e8..62227a41 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -93,7 +93,7 @@ async def handle_market_close(self, dataset_manager: DatasetManager) -> None: dataset_manager.cleanup_local_storage(days_to_keep=7) # Upload today's data - success, result = await dataset_manager.batch_upload_daily_data() + success, result = dataset_manager.batch_upload_daily_data() if success: bt.logging.success( f"Daily batch upload completed. Uploaded {result.get('files_uploaded', 0)} files " diff --git a/pyproject.toml b/pyproject.toml index f67b1900..5f03a482 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,9 +15,17 @@ huggingface_hub = "0.22.2" tensorflow = "2.17.0" wandb = "0.16.6" yfinance = "0.2.37" +loguru = "^0.7.3" +pyarrow = "^18.1.0" +python-dotenv = "^1.0.1" [tool.poetry.group.dev.dependencies] pre-commit-hooks = "5.0.0" +pytest = "^8.3.4" +pytest-asyncio = "^0.25.0" +pytest-cov = "^6.0.0" +pytest-mock = "^3.14.0" +loguru = "^0.7.3" [tool.black] line-length = 120 diff --git a/tests/helpers.py b/tests/helpers.py deleted file mode 100644 index 40f72250..00000000 --- a/tests/helpers.py +++ /dev/null @@ -1,161 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2023 Opentensor Foundation - -# 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. - -from typing import Union - -from bittensor import AxonInfo, Balance, NeuronInfo, PrometheusInfo -from bittensor.mock.wallet_mock import MockWallet as _MockWallet -from bittensor.mock.wallet_mock import get_mock_coldkey as _get_mock_coldkey -from bittensor.mock.wallet_mock import get_mock_hotkey as _get_mock_hotkey -from bittensor.mock.wallet_mock import get_mock_wallet as _get_mock_wallet -from rich.console import Console -from rich.text import Text - - -def __mock_wallet_factory__(*args, **kwargs) -> _MockWallet: - """Returns a mock wallet object.""" - - mock_wallet = _get_mock_wallet() - - return mock_wallet - - -class CLOSE_IN_VALUE: - value: Union[float, int, Balance] - tolerance: Union[float, int, Balance] - - def __init__( - self, - value: Union[float, int, Balance], - tolerance: Union[float, int, Balance] = 0.0, - ) -> None: - self.value = value - self.tolerance = tolerance - - def __eq__(self, __o: Union[float, int, Balance]) -> bool: - # True if __o \in [value - tolerance, value + tolerance] - # or if value \in [__o - tolerance, __o + tolerance] - return ((self.value - self.tolerance) <= __o and __o <= (self.value + self.tolerance)) or ( - (__o - self.tolerance) <= self.value and self.value <= (__o + self.tolerance) - ) - - -def get_mock_neuron(**kwargs) -> NeuronInfo: - """ - Returns a mock neuron with the given kwargs overriding the default values. - """ - - mock_neuron_d = dict( - { - "netuid": -1, # mock netuid - "axon_info": AxonInfo( - block=0, - version=1, - ip=0, - port=0, - ip_type=0, - protocol=0, - placeholder1=0, - placeholder2=0, - ), - "prometheus_info": PrometheusInfo(block=0, version=1, ip=0, port=0, ip_type=0), - "validator_permit": True, - "uid": 1, - "hotkey": "some_hotkey", - "coldkey": "some_coldkey", - "active": 0, - "last_update": 0, - "stake": {"some_coldkey": 1e12}, - "total_stake": 1e12, - "rank": 0.0, - "trust": 0.0, - "consensus": 0.0, - "validator_trust": 0.0, - "incentive": 0.0, - "dividends": 0.0, - "emission": 0.0, - "bonds": [], - "weights": [], - "stake_dict": {}, - "pruning_score": 0.0, - "is_null": False, - } - ) - - mock_neuron_d.update(kwargs) # update with kwargs - - if kwargs.get("stake") is None and kwargs.get("coldkey") is not None: - mock_neuron_d["stake"] = {kwargs.get("coldkey"): 1e12} - - if kwargs.get("total_stake") is None: - mock_neuron_d["total_stake"] = sum(mock_neuron_d["stake"].values()) - - mock_neuron = NeuronInfo._neuron_dict_to_namespace(mock_neuron_d) - - return mock_neuron - - -def get_mock_neuron_by_uid(uid: int, **kwargs) -> NeuronInfo: - return get_mock_neuron(uid=uid, hotkey=_get_mock_hotkey(uid), coldkey=_get_mock_coldkey(uid), **kwargs) - - -class MockStatus: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - pass - - def start(self): - pass - - def stop(self): - pass - - def update(self, *args, **kwargs): - MockConsole().print(*args, **kwargs) - - -class MockConsole: - """ - Mocks the console object for status and print. - Captures the last print output as a string. - """ - - captured_print = None - - def status(self, *args, **kwargs): - return MockStatus() - - def print(self, *args, **kwargs): - console = Console(width=1000, no_color=True, markup=False) # set width to 1000 to avoid truncation - console.begin_capture() - console.print(*args, **kwargs) - self.captured_print = console.end_capture() - - def clear(self, *args, **kwargs): - pass - - @staticmethod - def remove_rich_syntax(text: str) -> str: - """ - Removes rich syntax from the given text. - Removes markup and ansi syntax. - """ - output_no_syntax = Text.from_ansi(Text.from_markup(text).plain).plain - - return output_no_syntax diff --git a/tests/test_template_validator.py b/tests/test_template_validator.py deleted file mode 100644 index 14492e5e..00000000 --- a/tests/test_template_validator.py +++ /dev/null @@ -1,110 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2023 Yuma Rao -# Copyright © 2023 Opentensor Foundation - -# 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. - -import sys -import unittest - -import bittensor as bt -from numpy import array -from template.base.validator import BaseValidatorNeuron -from template.protocol import Dummy -from template.utils.uids import get_random_uids -from template.validator.reward import get_rewards - -from neurons.validator import Neuron as Validator - - -class TemplateValidatorNeuronTestCase(unittest.TestCase): - """ - This class contains unit tests for the RewardEvent classes. - - The tests cover different scenarios where completions may or may not be successful and the reward events are checked that they don't contain missing values. - The `reward` attribute of all RewardEvents is expected to be a float, and the `is_filter_model` attribute is expected to be a boolean. - """ - - def setUp(self): - sys.argv = sys.argv[0] + ["--config", "tests/configs/validator.json"] - - config = BaseValidatorNeuron.config() - config.wallet._mock = True - config.metagraph._mock = True - config.subtensor._mock = True - self.neuron = Validator(config) - self.miner_uids = get_random_uids(self, k=10) - - def test_run_single_step(self): - # TODO: Test a single step - pass - - def test_sync_error_if_not_registered(self): - # TODO: Test that the validator throws an error if it is not registered on metagraph - pass - - def test_forward(self): - # TODO: Test that the forward function returns the correct value - pass - - def test_dummy_responses(self): - # TODO: Test that the dummy responses are correctly constructed - - responses = self.neuron.dendrite.query( - # Send the query to miners in the network. - axons=[self.neuron.metagraph.axons[uid] for uid in self.miner_uids], - # Construct a dummy query. - synapse=Dummy(dummy_input=self.neuron.step), - # All responses have the deserialize function called on them before returning. - deserialize=True, - ) - - for i, response in enumerate(responses): - self.assertEqual(response, self.neuron.step * 2) - - def test_reward(self): - # TODO: Test that the reward function returns the correct value - responses = self.dendrite.query( - # Send the query to miners in the network. - axons=[self.metagraph.axons[uid] for uid in self.miner_uids], - # Construct a dummy query. - synapse=Dummy(dummy_input=self.neuron.step), - # All responses have the deserialize function called on them before returning. - deserialize=True, - ) - - rewards = get_rewards(self.neuron, responses) - expected_rewards = array([1.0] * len(responses)) - self.assertEqual(rewards, expected_rewards) - - def test_reward_with_nan(self): - # TODO: Test that NaN rewards are correctly sanitized - # TODO: Test that a bt.logging.warning is thrown when a NaN reward is sanitized - responses = self.dendrite.query( - # Send the query to miners in the network. - axons=[self.metagraph.axons[uid] for uid in self.miner_uids], - # Construct a dummy query. - synapse=Dummy(dummy_input=self.neuron.step), - # All responses have the deserialize function called on them before returning. - deserialize=True, - ) - - rewards = get_rewards(self.neuron, responses) - _ = rewards.clone() # expected rewards - # Add NaN values to rewards - rewards[0] = float("nan") - - with self.assertLogs(bt.logging, level="WARNING") as _: - self.neuron.update_scores(rewards, self.miner_uids) From 7ec96d311fce88cf3ff59256841291437da53d4e Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 17 Dec 2024 14:34:30 -0500 Subject: [PATCH 129/201] incorporate data decryption into the reward structure --- predictionnet/validator/forward.py | 44 ++++++++++++++++-------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 62227a41..233e7d8c 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -3,12 +3,12 @@ # TODO(developer): Set your name # Copyright © 2023 # 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 +# 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 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 @@ -68,7 +68,7 @@ async def process_miner_data(response, timestamp: str, organization: str, hotkey bt.logging.error(f"Failed to decrypt data: {result['error']}") return False - # Attempt to store data in background without affecting reward + # Store data in background without waiting for completion asyncio.create_task( dataset_manager.store_data_async( timestamp=timestamp, @@ -162,34 +162,38 @@ async def forward(self): deserialize=False, ) - # Process responses and initiate background data processing + # Process responses and track decryption success + # Create tasks for all miners and wait for all decryption results + decryption_tasks = [] for uid, response in zip(miner_uids, responses): bt.logging.info(f"UID: {uid} | Predictions: {response.prediction}") - # Check if response has required data fields if can_process_data(response): - # Create background task for data processing - asyncio.create_task( - process_miner_data( - response=response, - timestamp=timestamp, - organization=self.config.neuron.organization, - hotkey=self.metagraph.hotkeys[uid], - uid=uid, - ) + task = process_miner_data( + response=response, + timestamp=timestamp, + organization=self.config.neuron.organization, + hotkey=self.metagraph.hotkeys[uid], + uid=uid, ) + decryption_tasks.append(task) + else: + decryption_tasks.append(asyncio.create_task(asyncio.sleep(0))) # Dummy task that returns immediately - # Calculate rewards + # Wait for all decryption results + decryption_success = await asyncio.gather(*decryption_tasks) + + # Calculate initial rewards rewards = get_rewards(self, responses=responses, miner_uids=miner_uids) + # Zero out rewards for failed decryption + rewards = [reward if success else 0 for reward, success in zip(rewards, decryption_success)] + # Log results to wandb wandb_val_log = { "miners_info": { - miner_uid: { - "miner_response": response.prediction, - "miner_reward": reward, - } - for miner_uid, response, reward in zip(miner_uids, responses, rewards.tolist()) + miner_uid: {"miner_response": response.prediction, "miner_reward": reward, "decryption_success": success} + for miner_uid, response, reward, success in zip(miner_uids, responses, rewards.tolist(), decryption_success) } } wandb.log(wandb_val_log) From 17f417ded5aec5e13a8907b843b35cd5de61d1f6 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 17 Dec 2024 14:36:19 -0500 Subject: [PATCH 130/201] silly mistake --- predictionnet/validator/forward.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 233e7d8c..67874bc0 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -193,7 +193,7 @@ async def forward(self): wandb_val_log = { "miners_info": { miner_uid: {"miner_response": response.prediction, "miner_reward": reward, "decryption_success": success} - for miner_uid, response, reward, success in zip(miner_uids, responses, rewards.tolist(), decryption_success) + for miner_uid, response, reward, success in zip(miner_uids, responses, rewards, decryption_success) } } wandb.log(wandb_val_log) From 9f432697f1eff07fb4655c9702fb0a930d98f4d7 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 17 Dec 2024 14:39:55 -0500 Subject: [PATCH 131/201] improve logging --- predictionnet/validator/forward.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/predictionnet/validator/forward.py b/predictionnet/validator/forward.py index 67874bc0..152fa85a 100644 --- a/predictionnet/validator/forward.py +++ b/predictionnet/validator/forward.py @@ -67,6 +67,8 @@ async def process_miner_data(response, timestamp: str, organization: str, hotkey if not success: bt.logging.error(f"Failed to decrypt data: {result['error']}") return False + else: + bt.logging.success(f"Successfully decrypted data for UID {uid} from {data_path}") # Store data in background without waiting for completion asyncio.create_task( From b5bbb05063f6b47c962655ca469b9f5a8e96ed53 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Tue, 17 Dec 2024 15:11:03 -0500 Subject: [PATCH 132/201] Simplify top level README file --- README.md | 230 ++++++++++-------------------------------------------- 1 file changed, 40 insertions(+), 190 deletions(-) diff --git a/README.md b/README.md index ff9c3efb..24f95ae3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@
-# **Foundry S&P 500 Oracle** +# **Bittensor SN28 - S&P 500 Oracle** | | | | :-: | :-: | @@ -10,204 +10,54 @@ | **Compatibility** |
| | **Social** |

| -
--- -- [Introduction](#introduction) -- [Design Decisions](#design-decisions) -- [Installation](#installation) - - [Install PM2](#install-pm2) - - [Compute Requirements](#compute-requirements) - - [Install-Repo](#install-repo) - - [Running a Miner](#running-a-miner) - - [Running a Validator](#running-a-validator) - - [Obtain \& Setup WandB API Key](#obtain--setup-wandb-api-key) - - [Running Miner/Validator in Docker](#running-minervalidator-in-docker) -- [About the Rewards Mechanism](#about-the-rewards-mechanism) - - [Miner Ranking](#miner-ranking) - - [$\\Delta$ Calculation for ranking miners](#delta-calculation-for-ranking-miners) - - [Exponential Decay Weighting](#exponential-decay-weighting) -- [Roadmap](#roadmap) -- [License](#license) +
+This repository is the official codebase for Bittensor Subnet 28 (SN28) v1.0.0+, which was released on February 20th 2024. + +| | UID | +| :-: | :-: | +| TestNet | 93 | +| MainNet | 28 | ---- ## Introduction -Foundry is launching Foundry S&P 500 Oracle to incentivize miners to make predictions on the S&P 500 price frequently throughout trading hours. Validators send miners a timestamp (a future time), which the miners need to use to make predictions on the close price of the S&P 500 for the next six 5m intervals. Miners need to respond with their prediction for the price of the S&P 500 at the given time. Validators store the miner predictions, and then calculate the scores of the miners after the predictions mature. Miners are ranked against eachother, naturally incentivizing competition between the miners. +Foundry Digital is launching the Foundry S&P 500 Oracle. This subnet incentivizes accurate short term price forecasts of the S&P 500 during market trading hours. + +Miners use Neural Network model architectures to perform short term price predictions on the S&P 500. + +Validators store price forecasts for the S&P 500 and compare these predictions against the true price of the S&P 500 as the predictions mature. + +## Usage + +
+ +| Miners | Validators | +| :----: | :--------: | +| [TestNet Docs]() | [TestNet Docs]() | +| [MainNet Docs]() | [MainNet Docs]() | + +
+ +## Incentive Mechanism +Please read the [incentive mechanism white paper]() to understand exactly how miners are scored and ranked. + +For transparency, there are two key metrics detailed in the white paper that will be calculated to score each miner: +1. **Directional Accuracy** - was the prediction in the same direction of the true price? +2. **Mean Absolute Error** - how far was the prediction from the true price? ---- ## Design Decisions +Integration into financial markets will expose Bittensor to the largest system in the world; the global economy. The S&P 500 serves as a perfect starting place for financial predictions given its utility and name recognition. Financial market predictions were chosen for three main reasons: -A Bittensor integration into financial markets will expose Bittensor to the largest system in the world; the global economy. The S&P 500 serves as a perfect starting place for financial predictions given its utility and name recognition. Financial market predictions were chosen for three main reasons: -1) __Utility:__ financial markets provide a massive userbase of professional traders, wealth managers, and individuals alike -2) __Objective Rewards Mechanism:__ by tying the rewards mechanism to an external source of truth (yahoo finance's S&P Price), the defensibility of the subnet regarding gamification is quite strong. -3) __Adversarial Environment:__ the adversarial environment, especially given the rewards mechanism, will allow for significant diversity of models. Miners will be driven to acquire different datasets, implement different training methods, and utilize different model architectures in order to develop the most performant models. ---- -## Installation -### Install PM2 -First, install PM2: -``` -sudo apt update -sudo apt install nodejs npm -sudo npm install pm2@latest -g -``` -Verify installation: -``` -pm2 --version -``` -### Compute Requirements - -| Validator | Miner | -|---------- |-----------| -| 8gb RAM | 8gb RAM | -| 2 vCPUs | 2 vCPUs | - -### Install-Repo - -Begin by creating and sourcing a python virtual environment: -``` -python3 -m venv .sn28 -source .sn28/bin/activate -``` -Clone the Foundry S&P 500 Oracle repo: -``` -git clone https://github.com/foundryservices/snpOracle.git -``` -Install Requirements: -``` -pip3 install -e snpOracle -``` - -### Running a Miner -ecosystem.config.js files have been created to make deployment of miners and validators easier for the node operator. These files are the default configuration files for PM2, and allow the user to define the environment & application in a cleaner way. IMPORTANT: Make sure your have activated your virtual environment before running your validator/miner. -First copy the .env.template file to .env -``` -cp .env.template .env -``` -Update the .env file with your Huggingface access token. A huggingface access token can be procured from the huggingface platform. Follow the steps mentioned here to get your huggingface access token. If you're model weights are uploaded to a repository of your own or if you're reading a custom model weights file from huggingface, make sure to also make changes to the miner.config.js file's --hf_repo_id and --model args. - -To run your miner: -``` -pm2 start miner.config.js -``` -The miner.config.js has few flags added. Any standard flags can be passed, for example, wallet name and hotkey name will default to "default"; if you have a different configuration, edit your "args" in miner.config.js. Below shows a miner.config.js with extra configuration flags. -- The hf_repo_id flag will be used to define which huggingface model repository the weights file needs to be downloaded from. You need not necessarily load your model weights from huggingface. If you would like to load weights from a local folder like `mining_models/`, then store the weights in the `mining_models/` folder and make sure to define the --hf_repo_id arg to `LOCAL` like `--hf_repo_id LOCAL`. -- The model flag is used to reference a new model you save to the mining_models directory or to your huggingface hf_repo_id. The example below uses the default which is the new base lstm on Foundry's Huggingface repository. -``` -module.exports = { - apps: [ - { - name: 'miner', - script: 'python3', - args: './neurons/miner.py --netuid 28 --logging.debug --logging.trace --subtensor.network local --wallet.name walletName --wallet.hotkey hotkeyName --axon.port 8091 --hf_repo_id foundryservices/bittensor-sn28-base-lstm --model mining_models/base_lstm_new.h5' - }, - ], -}; -``` -### Running a Validator -ecosystem.config.js files have been created to make deployment of miners and validators easier for the node operator. These files are the default configuration files for PM2, and allow the user to define the environment & application in a cleaner way. IMPORTANT: Make sure your have activated your virtual environment before running your validator/miner. - -#### Obtain & Setup WandB API Key -Before starting the process, validators would be required to procure a WANDB API Key. Please follow the instructions mentioned below:
- -- Log in to Weights & Biases and generate an API key in your account settings. -- Copy the .env.template file's contents to a .env file - `cp .env.template .env` -- Set the variable WANDB_API_KEY in the .env file. You can leave the `HUGGINGFACE_ACCESS_TOKEN` variable as is. Just make sure to update the `WANDB_API_KEY` variable. -- Finally, run `wandb login` and paste your API key. Now you're all set with weights & biases. - -Once you've setup wandb, you can now run your validator by running the command below. Make sure to set your respective hotkey, coldkey, and other configuration variables accurately. - -To run your validator: -``` -pm2 start validator.config.js -``` - -The validator.config.js has few flags added. Any standard flags can be passed, for example, wallet name and hotkey name will default to "default"; if you have a different configuration, edit your "args" in validator.config.js. Below shows a validator.config.js with extra configuration flags. -``` -module.exports = { - apps: [ - { - name: 'validator', - script: 'python3', - args: './neurons/validator.py --netuid 28 --logging.debug --logging.trace --subtensor.network local --wallet.name walletName --wallet.hotkey hotkeyName' - }, - ], -}; -``` - -### Running Miner/Validator in Docker -As an alternative to using pm2, a docker image has been pushed to docker hub that can be used in accordance with docker-compose.yml, or the image can be built locally using the Dockerfile in this repo. To prepare the docker compose file, make the following changes to the compose script: -``` -version: '3.7' - -services: - my_container: - image: zrross11/snporacle:1.0.4 - container_name: subnet28- - network_mode: host - volumes: - - /home/ubuntu/.bittensor:/root/.bittensor - restart: always - command: "python ./neurons/.py --wallet.name --wallet.hotkey --netuid 28 --axon.port --subtensor.network local --subtensor.chain_endpoint 127.0.0.1:9944 --logging.debug" -``` - -Once this is ready, run ```docker compose up -d``` in the base directory - -## About the Rewards Mechanism - -### Miner Ranking -We implement a tiered ranking system to calculate miner rewards. For each prediction timepoint t, we sort miners into two buckets: one for miners with correct direction predictions and a second for miners with incorrect direction predictions. For any t, it is considered correctly predicting direction if, relative to the stock price just before the prediction was requested, the predicted price moves in the same direction as the actual stock price. This means that, for example, a prediction that was requested 10min ago, will use the S&P 500 stock price from 15min go to calculate directional accuracy. Once miner outputs are separated, we rank the miners within each bucket according to their $\Delta$ (calculated as shown below). Therefore, if a miner incorrectly predicts the direction of the S&P 500 price, the maximum rank they can acheive is limited to one plus the number of miners that predicted correctly during that timepoint. We then calculate these rankings for each timepoint (t − 1, t − 2, ...t − 6) in the relevant prediction epoch. Therefore each timepoint t has 6 predictions (the prediction from 5 minutes ago, 10 minutes, etc. Up to 30 minutes). Then, the final ranks for this epoch is given by the average of their rankings across timepoints. - -### $\Delta$ Calculation for ranking miners - -```math - \Delta_m = | \rho_{m,t} - P_{t} | - ``` -where $\rho_{m,t}$ is the prediction of the miner $m$ at timepoint $t$ and $P_{t}$ is the true S&P 500 price at timepoint $t$. - -### Exponential Decay Weighting -Once the miners have all been ranked, we convert these ranks to validator weights using: - -```math -W_{m} = e^{-0.05 * rank_m} -``` -The constant shown in this equation, −0.05, is a hyperparameter which controls the steepness of the curve (i.e. what proportion of the emissions are allocated to rank 1, 2, 3,... etc.). We chose this value to fairly distribute across miners to mitigate the effect of rank volatility. This ranking system ensures that machine learning or statistical models will inherently perform better than any method of gamification. By effectively performing a commit-reveal on a future S&P Price Prediction, S&P Oracle ensures that only well-tuned models will survive. +#### Utility +Financial markets provide a massive userbase of professional traders, wealth managers, and individuals alike. + +#### Objective Rewards Mechanism +By tying the rewards mechanism to an external source of truth, the defensibility of the subnet regarding gamification is quite strong. + +#### Adversarial Environment +The adversarial environment, especially given the rewards mechanism, will allow for significant diversity of models. Miners will be driven to acquire different datasets, implement different training methods, and utilize different Neural Network architectures in order to develop the most performant models. ---- -## Roadmap - -Foundry will constantly work to make this subnet more robust, with the north star of creating end-user utility in mind. Some key features we are focused on rolling out to improve the S&P 500 Oracle are listed here: -- [X] Huggingface Integration -- [X] Add Features to Rewards Mechanism -- [X] Query all miners instead of a random subset -- [X] Automate holiday detection and market close logic -- [ ] (Ongoing) Wandb Integration -- [ ] (Ongoing) Altering Synapse to hold short term history of predictions -- [ ] (Ongoing) Front end for end-user access -- [ ] Add new Synapse type for Inference Requests - -We happily accept community feedback and features suggestions. Please reach out to @0xthebom on discord :-) - -## License -This repository is licensed under the MIT License. -```text -# The MIT License (MIT) -# Copyright © 2024 Foundry Digital LLC - -# 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. -``` From 8e4178f79a0fec9f2dd61b514e36d2554f84378f Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Tue, 17 Dec 2024 15:30:13 -0500 Subject: [PATCH 133/201] Add testnet UID to top level README --- README.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 24f95ae3..31c659f0 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,17 @@ # **Bittensor SN28 - S&P 500 Oracle** +
+ +
+ +| This repository is the official codebase
for Bittensor Subnet 28 (SN28) v1.0.0+,
which was released on February 20th 2024. | **TestNet UID:** 93
**MainNet UID:** 28 | +| - | - | + +
+ +
+ | | | | :-: | :-: | | **Status** |

| @@ -12,16 +23,6 @@
---- - -
-This repository is the official codebase for Bittensor Subnet 28 (SN28) v1.0.0+, which was released on February 20th 2024. - -| | UID | -| :-: | :-: | -| TestNet | 93 | -| MainNet | 28 | - ## Introduction Foundry Digital is launching the Foundry S&P 500 Oracle. This subnet incentivizes accurate short term price forecasts of the S&P 500 during market trading hours. @@ -59,5 +60,3 @@ By tying the rewards mechanism to an external source of truth, the defensibility #### Adversarial Environment The adversarial environment, especially given the rewards mechanism, will allow for significant diversity of models. Miners will be driven to acquire different datasets, implement different training methods, and utilize different Neural Network architectures in order to develop the most performant models. - - From bd3f29af72605544c61dd3c16fee32cde597b707 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 18 Dec 2024 14:52:54 -0500 Subject: [PATCH 134/201] Update env template --- .env.template | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.env.template b/.env.template index 5c361f7b..7bf9ea67 100644 --- a/.env.template +++ b/.env.template @@ -1,4 +1,10 @@ # Copy the contents on this file to a new file called .env +WANDB_API_KEY='REPLACE_WITH_WANDB_API_KEY' +MINER_HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' +HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' -HF_ACCESS_TOKEN = 'REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' -WANDB_API_KEY = 'REPLACE_WITH_WANDB_API_KEY' +# Git credentials +GIT_TOKEN='REPLACE_WITH_GIT_TOKEN' +GIT_USERNAME='REPLACE_WITH_GIT_USERNAME' +GIT_NAME="REPLACE_WITH_GIT_NAME" +GIT_EMAIL="REPLACE_WITH_GIT_EMAIL" From afbb601de26b46023d36eedd6f8558939211e62d Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Wed, 18 Dec 2024 15:42:45 -0500 Subject: [PATCH 135/201] Deleted unused shell scripts --- scripts/check_compatibility.sh | 76 -------------- scripts/check_requirements_changes.sh | 10 -- scripts/install_staging.sh | 145 -------------------------- 3 files changed, 231 deletions(-) delete mode 100755 scripts/check_compatibility.sh delete mode 100755 scripts/check_requirements_changes.sh delete mode 100644 scripts/install_staging.sh diff --git a/scripts/check_compatibility.sh b/scripts/check_compatibility.sh deleted file mode 100755 index b0bd6b43..00000000 --- a/scripts/check_compatibility.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash - -if [ -z "$1" ]; then - echo "Please provide a Python version as an argument." - exit 1 -fi - -python_version="$1" -all_passed=true - -GREEN='\033[0;32m' -YELLOW='\033[0;33m' -RED='\033[0;31m' -NC='\033[0m' # No Color - -check_compatibility() { - all_supported=0 - - while read -r requirement; do - # Skip lines starting with git+ - if [[ "$requirement" == git+* ]]; then - continue - fi - - package_name=$(echo "$requirement" | awk -F'[!=<>]' '{print $1}' | awk -F'[' '{print $1}') # Strip off brackets - echo -n "Checking $package_name... " - - url="https://pypi.org/pypi/$package_name/json" - response=$(curl -s $url) - status_code=$(curl -s -o /dev/null -w "%{http_code}" $url) - - if [ "$status_code" != "200" ]; then - echo -e "${RED}Information not available for $package_name. Failure.${NC}" - all_supported=1 - continue - fi - - classifiers=$(echo "$response" | jq -r '.info.classifiers[]') - requires_python=$(echo "$response" | jq -r '.info.requires_python') - - base_version="Programming Language :: Python :: ${python_version%%.*}" - specific_version="Programming Language :: Python :: $python_version" - - if echo "$classifiers" | grep -q "$specific_version" || echo "$classifiers" | grep -q "$base_version"; then - echo -e "${GREEN}Supported${NC}" - elif [ "$requires_python" != "null" ]; then - if echo "$requires_python" | grep -Eq "==$python_version|>=$python_version|<=$python_version"; then - echo -e "${GREEN}Supported${NC}" - else - echo -e "${RED}Not compatible with Python $python_version due to constraint $requires_python.${NC}" - all_supported=1 - fi - else - echo -e "${YELLOW}Warning: Specific version not listed, assuming compatibility${NC}" - fi - done < requirements.txt - - return $all_supported -} - -echo "Checking compatibility for Python $python_version..." -check_compatibility -if [ $? -eq 0 ]; then - echo -e "${GREEN}All requirements are compatible with Python $python_version.${NC}" -else - echo -e "${RED}All requirements are NOT compatible with Python $python_version.${NC}" - all_passed=false -fi - -echo "" -if $all_passed; then - echo -e "${GREEN}All tests passed.${NC}" -else - echo -e "${RED}All tests did not pass.${NC}" - exit 1 -fi diff --git a/scripts/check_requirements_changes.sh b/scripts/check_requirements_changes.sh deleted file mode 100755 index a06d050f..00000000 --- a/scripts/check_requirements_changes.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -# Check if requirements files have changed in the last commit -if git diff --name-only HEAD~1 | grep -E 'requirements.txt|requirements.txt'; then - echo "Requirements files have changed. Running compatibility checks..." - echo 'export REQUIREMENTS_CHANGED="true"' >> $BASH_ENV -else - echo "Requirements files have not changed. Skipping compatibility checks..." - echo 'export REQUIREMENTS_CHANGED="false"' >> $BASH_ENV -fi diff --git a/scripts/install_staging.sh b/scripts/install_staging.sh deleted file mode 100644 index 0805d512..00000000 --- a/scripts/install_staging.sh +++ /dev/null @@ -1,145 +0,0 @@ -#!/bin/bash - -# Section 1: Build/Install -# This section is for first-time setup and installations. - -install_dependencies() { - # Function to install packages on macOS - install_mac() { - which brew > /dev/null - if [ $? -ne 0 ]; then - echo "Installing Homebrew..." - /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - fi - echo "Updating Homebrew packages..." - brew update - echo "Installing required packages..." - brew install make llvm curl libssl protobuf tmux - } - - # Function to install packages on Ubuntu/Debian - install_ubuntu() { - echo "Updating system packages..." - sudo apt update - echo "Installing required packages..." - sudo apt install --assume-yes make build-essential git clang curl libssl-dev llvm libudev-dev protobuf-compiler tmux - } - - # Detect OS and call the appropriate function - if [[ "$OSTYPE" == "darwin"* ]]; then - install_mac - elif [[ "$OSTYPE" == "linux-gnu"* ]]; then - install_ubuntu - else - echo "Unsupported operating system." - exit 1 - fi - - # Install rust and cargo - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - - # Update your shell's source to include Cargo's path - source "$HOME/.cargo/env" -} - -# Call install_dependencies only if it's the first time running the script -if [ ! -f ".dependencies_installed" ]; then - install_dependencies - touch .dependencies_installed -fi - - -# Section 2: Test/Run -# This section is for running and testing the setup. - -# Create a coldkey for the owner role -wallet=${1:-owner} - -# Logic for setting up and running the environment -setup_environment() { - # Clone subtensor and enter the directory - if [ ! -d "subtensor" ]; then - git clone https://github.com/opentensor/subtensor.git - fi - cd subtensor - git pull - - # Update to the nightly version of rust - ./scripts/init.sh - - cd ../bittensor-subnet-template - - # Install the bittensor-subnet-template python package - python -m pip install -e . - - # Create and set up wallets - # This section can be skipped if wallets are already set up - if [ ! -f ".wallets_setup" ]; then - btcli wallet new_coldkey --wallet.name $wallet --no_password --no_prompt - btcli wallet new_coldkey --wallet.name miner --no_password --no_prompt - btcli wallet new_hotkey --wallet.name miner --wallet.hotkey default --no_prompt - btcli wallet new_coldkey --wallet.name validator --no_password --no_prompt - btcli wallet new_hotkey --wallet.name validator --wallet.hotkey default --no_prompt - touch .wallets_setup - fi - -} - -# Call setup_environment every time -setup_environment - -## Setup localnet -# assumes we are in the bittensor-subnet-template/ directory -# Initialize your local subtensor chain in development mode. This command will set up and run a local subtensor network. -cd ../subtensor - -# Start a new tmux session and create a new pane, but do not switch to it -echo "FEATURES='pow-faucet runtime-benchmarks' BT_DEFAULT_TOKEN_WALLET=$(cat ~/.bittensor/wallets/$wallet/coldkeypub.txt | grep -oP '"ss58Address": "\K[^"]+') bash scripts/localnet.sh" >> setup_and_run.sh -chmod +x setup_and_run.sh -tmux new-session -d -s localnet -n 'localnet' -tmux send-keys -t localnet 'bash ../subtensor/setup_and_run.sh' C-m - -# Notify the user -echo ">> localnet.sh is running in a detached tmux session named 'localnet'" -echo ">> You can attach to this session with: tmux attach-session -t localnet" - -# Register a subnet (this needs to be run each time we start a new local chain) -btcli subnet create --wallet.name $wallet --wallet.hotkey default --subtensor.chain_endpoint ws://127.0.0.1:9946 --no_prompt - -# Transfer tokens to miner and validator coldkeys -export BT_MINER_TOKEN_WALLET=$(cat ~/.bittensor/wallets/miner/coldkeypub.txt | grep -oP '"ss58Address": "\K[^"]+') -export BT_VALIDATOR_TOKEN_WALLET=$(cat ~/.bittensor/wallets/validator/coldkeypub.txt | grep -oP '"ss58Address": "\K[^"]+') - -btcli wallet transfer --subtensor.network ws://127.0.0.1:9946 --wallet.name $wallet --dest $BT_MINER_TOKEN_WALLET --amount 1000 --no_prompt -btcli wallet transfer --subtensor.network ws://127.0.0.1:9946 --wallet.name $wallet --dest $BT_VALIDATOR_TOKEN_WALLET --amount 10000 --no_prompt - -# Register wallet hotkeys to subnet -btcli subnet register --wallet.name miner --netuid 1 --wallet.hotkey default --subtensor.chain_endpoint ws://127.0.0.1:9946 --no_prompt -btcli subnet register --wallet.name validator --netuid 1 --wallet.hotkey default --subtensor.chain_endpoint ws://127.0.0.1:9946 --no_prompt - -# Add stake to the validator -btcli stake add --wallet.name validator --wallet.hotkey default --subtensor.chain_endpoint ws://127.0.0.1:9946 --amount 10000 --no_prompt - -# Ensure both the miner and validator keys are successfully registered. -btcli subnet list --subtensor.chain_endpoint ws://127.0.0.1:9946 -btcli wallet overview --wallet.name validator --subtensor.chain_endpoint ws://127.0.0.1:9946 --no_prompt -btcli wallet overview --wallet.name miner --subtensor.chain_endpoint ws://127.0.0.1:9946 --no_prompt - -cd ../bittensor-subnet-template - - -# Check if inside a tmux session -if [ -z "$TMUX" ]; then - # Start a new tmux session and run the miner in the first pane - tmux new-session -d -s bittensor -n 'miner' 'python neurons/miner.py --netuid 1 --subtensor.chain_endpoint ws://127.0.0.1:9946 --wallet.name miner --wallet.hotkey default --logging.debug' - - # Split the window and run the validator in the new pane - tmux split-window -h -t bittensor:miner 'python neurons/validator.py --netuid 1 --subtensor.chain_endpoint ws://127.0.0.1:9946 --wallet.name validator --wallet.hotkey default --logging.debug' - - # Attach to the new tmux session - tmux attach-session -t bittensor -else - # If already in a tmux session, create two panes in the current window - tmux split-window -h 'python neurons/miner.py --netuid 1 --subtensor.chain_endpoint ws://127.0.0.1:9946 --wallet.name miner --wallet.hotkey default --logging.debug' - tmux split-window -v -t 0 'python neurons/validator.py --netuid 1 --subtensor.chain_endpoint ws://127.0.0.1:9946 --wallet.name3 validator --wallet.hotkey default --logging.debug' -fi From 1ba4c9e540ee2106423a398787ac5a58bbf42899 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Wed, 18 Dec 2024 16:07:01 -0500 Subject: [PATCH 136/201] Move all python files into a top level package folder --- predictionnet/.DS_Store | Bin 6148 -> 0 bytes predictionnet/__init__.py | 30 ------------ predictionnet/api/prediction.py | 45 ------------------ predictionnet/utils/__init__.py | 1 - predictionnet/validator/__init__.py | 2 - snp_oracle/__init__.py | 5 ++ .../base_miner}/__init__.py | 0 .../base_miner}/get_data.py | 4 -- .../base_miner}/model.py | 4 -- .../base_miner}/predict.py | 9 +--- {neurons => snp_oracle/neurons}/__init__.py | 0 {neurons => snp_oracle/neurons}/miner.py | 34 ++----------- {neurons => snp_oracle/neurons}/validator.py | 30 ++---------- snp_oracle/predictionnet/__init__.py | 5 ++ .../predictionnet}/api/__init__.py | 20 -------- .../predictionnet}/api/example.py | 0 .../predictionnet}/api/get_query_axons.py | 19 -------- .../predictionnet}/api/metagraph.py | 0 snp_oracle/predictionnet/api/prediction.py | 26 ++++++++++ .../predictionnet}/base/__init__.py | 0 .../predictionnet}/base/miner.py | 21 +------- .../predictionnet}/base/neuron.py | 24 ++-------- .../predictionnet}/base/validator.py | 22 +-------- .../predictionnet}/protocol.py | 38 --------------- snp_oracle/predictionnet/utils/__init__.py | 1 + .../predictionnet}/utils/config.py | 18 ------- .../predictionnet}/utils/huggingface.py | 2 +- .../predictionnet}/utils/miner_hf.py | 0 .../predictionnet}/utils/misc.py | 18 ------- .../predictionnet}/utils/uids.py | 0 .../predictionnet/validator/__init__.py | 2 + .../predictionnet}/validator/forward.py | 22 ++------- .../predictionnet}/validator/reward.py | 21 +------- 33 files changed, 62 insertions(+), 361 deletions(-) delete mode 100644 predictionnet/.DS_Store delete mode 100644 predictionnet/__init__.py delete mode 100644 predictionnet/api/prediction.py delete mode 100644 predictionnet/utils/__init__.py delete mode 100644 predictionnet/validator/__init__.py create mode 100644 snp_oracle/__init__.py rename {base_miner => snp_oracle/base_miner}/__init__.py (100%) rename {base_miner => snp_oracle/base_miner}/get_data.py (98%) rename {base_miner => snp_oracle/base_miner}/model.py (97%) rename {base_miner => snp_oracle/base_miner}/predict.py (92%) rename {neurons => snp_oracle/neurons}/__init__.py (100%) rename {neurons => snp_oracle/neurons}/miner.py (87%) rename {neurons => snp_oracle/neurons}/validator.py (79%) create mode 100644 snp_oracle/predictionnet/__init__.py rename {predictionnet => snp_oracle/predictionnet}/api/__init__.py (62%) rename {predictionnet => snp_oracle/predictionnet}/api/example.py (100%) rename {predictionnet => snp_oracle/predictionnet}/api/get_query_axons.py (76%) rename {predictionnet => snp_oracle/predictionnet}/api/metagraph.py (100%) create mode 100644 snp_oracle/predictionnet/api/prediction.py rename {predictionnet => snp_oracle/predictionnet}/base/__init__.py (100%) rename {predictionnet => snp_oracle/predictionnet}/base/miner.py (89%) rename {predictionnet => snp_oracle/predictionnet}/base/neuron.py (79%) rename {predictionnet => snp_oracle/predictionnet}/base/validator.py (91%) rename {predictionnet => snp_oracle/predictionnet}/protocol.py (52%) create mode 100644 snp_oracle/predictionnet/utils/__init__.py rename {predictionnet => snp_oracle/predictionnet}/utils/config.py (83%) rename {predictionnet => snp_oracle/predictionnet}/utils/huggingface.py (97%) rename {predictionnet => snp_oracle/predictionnet}/utils/miner_hf.py (100%) rename {predictionnet => snp_oracle/predictionnet}/utils/misc.py (76%) rename {predictionnet => snp_oracle/predictionnet}/utils/uids.py (100%) create mode 100644 snp_oracle/predictionnet/validator/__init__.py rename {predictionnet => snp_oracle/predictionnet}/validator/forward.py (75%) rename {predictionnet => snp_oracle/predictionnet}/validator/reward.py (91%) diff --git a/predictionnet/.DS_Store b/predictionnet/.DS_Store deleted file mode 100644 index ac4e31186004cd36cf452ecc45cf5ae10189c1b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK&uiN-6n;wF)oB>yut6^aL$9UFnlKoUn& zj;6!Ti;pU=VwsN$ogmW@LcV>Gd8(!ZHObRb=SHT%Z~3iZXL~m5_j&oth)sb!O0k^L;5T0E z8&xMymI3>v`|T&ofSb5uz%lR;1H3;3P{z<=ZBTC=DD)Ko=)tW8HvcSePGB*#SQ|tO zM3_{dNfq{rAxt{_fsG3-)&@;F348evc4T31C_;~p{sSFOA~fhq$ADvCnSrLMcKH1N z^zi+EImy)=1CD|JiUHvrL - -# 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. - -# TODO(developer): Change this value when updating your code base. -# Define the version of the template module. - -import json - -# Import all submodules. -from . import base, protocol, validator - -__version__ = "2.2.1" -version_split = __version__.split(".") -__spec_version__ = (1000 * int(version_split[0])) + (10 * int(version_split[1])) + (1 * int(version_split[2])) diff --git a/predictionnet/api/prediction.py b/predictionnet/api/prediction.py deleted file mode 100644 index 369dee39..00000000 --- a/predictionnet/api/prediction.py +++ /dev/null @@ -1,45 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2021 Yuma Rao -# Copyright © 2023 Opentensor Foundation -# Copyright © 2023 Opentensor Technologies Inc - -# 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. - -from typing import Any, List, Union - -import bittensor as bt - -from predictionnet.api import SubnetsAPI -from predictionnet.protocol import Challenge - - -class PredictionAPI(SubnetsAPI): - def __init__(self, wallet: "bt.wallet"): - super().__init__(wallet) - self.netuid = 28 - self.name = "prediction" - - def prepare_synapse(self, timestamp: str) -> Challenge: - synapse = Challenge(timestamp=timestamp) - return synapse - - def process_responses(self, responses: List[Union["bt.Synapse", Any]]) -> List[int]: - outputs = [] - for response in responses: - if response.dendrite.status_code != 200: - outputs.append(None) - else: - outputs.append(response.prediction) - return outputs diff --git a/predictionnet/utils/__init__.py b/predictionnet/utils/__init__.py deleted file mode 100644 index 2f569c74..00000000 --- a/predictionnet/utils/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import config, misc, uids diff --git a/predictionnet/validator/__init__.py b/predictionnet/validator/__init__.py deleted file mode 100644 index 0b7ddf1a..00000000 --- a/predictionnet/validator/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .forward import forward -from .reward import get_rewards diff --git a/snp_oracle/__init__.py b/snp_oracle/__init__.py new file mode 100644 index 00000000..93623516 --- /dev/null +++ b/snp_oracle/__init__.py @@ -0,0 +1,5 @@ +import importlib.metadata + +__version__ = importlib.metadata.version(__name__ or __package__) +version_split = __version__.split(".") +__spec_version__ = (1000 * int(version_split[0])) + (10 * int(version_split[1])) + (1 * int(version_split[2])) \ No newline at end of file diff --git a/base_miner/__init__.py b/snp_oracle/base_miner/__init__.py similarity index 100% rename from base_miner/__init__.py rename to snp_oracle/base_miner/__init__.py diff --git a/base_miner/get_data.py b/snp_oracle/base_miner/get_data.py similarity index 98% rename from base_miner/get_data.py rename to snp_oracle/base_miner/get_data.py index cfb46176..76b5d1db 100644 --- a/base_miner/get_data.py +++ b/snp_oracle/base_miner/get_data.py @@ -1,7 +1,3 @@ -# developer: Foundry Digital -# Copyright © 2023 Foundry Digital - -# Import required models from datetime import datetime, timedelta from typing import Tuple diff --git a/base_miner/model.py b/snp_oracle/base_miner/model.py similarity index 97% rename from base_miner/model.py rename to snp_oracle/base_miner/model.py index f92b33b7..0483fa1f 100644 --- a/base_miner/model.py +++ b/snp_oracle/base_miner/model.py @@ -1,9 +1,5 @@ -# developer: Foundry Digital -# Copyright © 2023 Foundry Digital - import os -# Import necessary modules to use for model creation - can be downloaded using pip import joblib import numpy as np from dotenv import load_dotenv diff --git a/base_miner/predict.py b/snp_oracle/base_miner/predict.py similarity index 92% rename from base_miner/predict.py rename to snp_oracle/base_miner/predict.py index 816c2b6f..049443d4 100644 --- a/base_miner/predict.py +++ b/snp_oracle/base_miner/predict.py @@ -1,7 +1,3 @@ -# developer: Foundry Digital -# Copyright © 2023 Foundry Digital - -# Import modules that already exist or can be installed using pip from datetime import datetime import numpy as np @@ -10,9 +6,8 @@ from sklearn.preprocessing import MinMaxScaler from tensorflow.keras.models import load_model -# import custom defined files -from base_miner.get_data import prep_data, round_down_time, scale_data -from base_miner.model import create_and_save_base_model_lstm +from snp_oracle.base_miner.get_data import prep_data, round_down_time, scale_data +from snp_oracle.base_miner.model import create_and_save_base_model_lstm def predict(timestamp: datetime, scaler: MinMaxScaler, model, type) -> float: diff --git a/neurons/__init__.py b/snp_oracle/neurons/__init__.py similarity index 100% rename from neurons/__init__.py rename to snp_oracle/neurons/__init__.py diff --git a/neurons/miner.py b/snp_oracle/neurons/miner.py similarity index 87% rename from neurons/miner.py rename to snp_oracle/neurons/miner.py index 35aae185..08d35625 100644 --- a/neurons/miner.py +++ b/snp_oracle/neurons/miner.py @@ -1,44 +1,20 @@ -# The MIT License (MIT) -# Copyright © 2023 Yuma Rao -# developer: Foundry Digital -# Copyright © 2023 Foundry Digital - -# 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. - import os import time import typing import bittensor as bt -# ML imports from dotenv import load_dotenv from huggingface_hub import hf_hub_download from tensorflow.keras.models import load_model -# import predictionnet -# Bittensor Miner Template: -import predictionnet -from base_miner.get_data import prep_data, scale_data -from base_miner.predict import predict +import snp_oracle.predictionnet +from snp_oracle.base_miner.get_data import prep_data, scale_data +from snp_oracle.base_miner.predict import predict -# import base miner class which takes care of most of the boilerplate -from predictionnet.base.miner import BaseMinerNeuron +from snp_oracle.predictionnet.base.miner import BaseMinerNeuron -# import huggingface upload class -from predictionnet.utils.miner_hf import MinerHfInterface +from snp_oracle.predictionnet.utils.miner_hf import MinerHfInterface load_dotenv() diff --git a/neurons/validator.py b/snp_oracle/neurons/validator.py similarity index 79% rename from neurons/validator.py rename to snp_oracle/neurons/validator.py index a10eca46..8494e77b 100644 --- a/neurons/validator.py +++ b/snp_oracle/neurons/validator.py @@ -1,27 +1,9 @@ -# The MIT License (MIT) - -# 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. - - import os import pathlib import time from datetime import datetime from typing import List -# Bittensor import bittensor as bt import pandas_market_calendars as mcal import pytz @@ -29,15 +11,13 @@ from dotenv import load_dotenv from numpy import full, nan -from predictionnet import __version__ +from snp_oracle import __version__ -# import base validator class which takes care of most of the boilerplate -from predictionnet.base.validator import BaseValidatorNeuron -from predictionnet.utils.huggingface import HfInterface -from predictionnet.utils.uids import check_uid_availability +from snp_oracle.predictionnet.base.validator import BaseValidatorNeuron +from snp_oracle.predictionnet.utils.huggingface import HfInterface +from snp_oracle.predictionnet.utils.uids import check_uid_availability -# Bittensor Validator Template: -from predictionnet.validator import forward +from snp_oracle.predictionnet.validator import forward load_dotenv() diff --git a/snp_oracle/predictionnet/__init__.py b/snp_oracle/predictionnet/__init__.py new file mode 100644 index 00000000..12830a0e --- /dev/null +++ b/snp_oracle/predictionnet/__init__.py @@ -0,0 +1,5 @@ +import json + +# Import all submodules. +from snp_oracle.predictionnet import base, protocol, validator + diff --git a/predictionnet/api/__init__.py b/snp_oracle/predictionnet/api/__init__.py similarity index 62% rename from predictionnet/api/__init__.py rename to snp_oracle/predictionnet/api/__init__.py index 98479af7..57c93b36 100644 --- a/predictionnet/api/__init__.py +++ b/snp_oracle/predictionnet/api/__init__.py @@ -1,23 +1,3 @@ -# The MIT License (MIT) -# Copyright © 2021 Yuma Rao -# Copyright © 2023 Opentensor Foundation -# Copyright © 2023 Opentensor Technologies Inc -# Copyright © 2024 Philanthrope - -# 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. - from abc import ABC, abstractmethod from typing import Any, List, Optional, Union diff --git a/predictionnet/api/example.py b/snp_oracle/predictionnet/api/example.py similarity index 100% rename from predictionnet/api/example.py rename to snp_oracle/predictionnet/api/example.py diff --git a/predictionnet/api/get_query_axons.py b/snp_oracle/predictionnet/api/get_query_axons.py similarity index 76% rename from predictionnet/api/get_query_axons.py rename to snp_oracle/predictionnet/api/get_query_axons.py index aa02150d..73411054 100644 --- a/predictionnet/api/get_query_axons.py +++ b/snp_oracle/predictionnet/api/get_query_axons.py @@ -1,22 +1,3 @@ -# The MIT License (MIT) -# Copyright © 2021 Yuma Rao -# Copyright © 2023 Opentensor Foundation -# Copyright © 2023 Opentensor Technologies Inc - -# 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. - import random import bittensor as bt diff --git a/predictionnet/api/metagraph.py b/snp_oracle/predictionnet/api/metagraph.py similarity index 100% rename from predictionnet/api/metagraph.py rename to snp_oracle/predictionnet/api/metagraph.py diff --git a/snp_oracle/predictionnet/api/prediction.py b/snp_oracle/predictionnet/api/prediction.py new file mode 100644 index 00000000..8f5402d1 --- /dev/null +++ b/snp_oracle/predictionnet/api/prediction.py @@ -0,0 +1,26 @@ +from typing import Any, List, Union + +import bittensor as bt + +from snp_oracle.predictionnet.api import SubnetsAPI +from snp_oracle.predictionnet.protocol import Challenge + + +class PredictionAPI(SubnetsAPI): + def __init__(self, wallet: "bt.wallet"): + super().__init__(wallet) + self.netuid = 28 + self.name = "prediction" + + def prepare_synapse(self, timestamp: str) -> Challenge: + synapse = Challenge(timestamp=timestamp) + return synapse + + def process_responses(self, responses: List[Union["bt.Synapse", Any]]) -> List[int]: + outputs = [] + for response in responses: + if response.dendrite.status_code != 200: + outputs.append(None) + else: + outputs.append(response.prediction) + return outputs diff --git a/predictionnet/base/__init__.py b/snp_oracle/predictionnet/base/__init__.py similarity index 100% rename from predictionnet/base/__init__.py rename to snp_oracle/predictionnet/base/__init__.py diff --git a/predictionnet/base/miner.py b/snp_oracle/predictionnet/base/miner.py similarity index 89% rename from predictionnet/base/miner.py rename to snp_oracle/predictionnet/base/miner.py index b467b6a5..ea506b33 100644 --- a/predictionnet/base/miner.py +++ b/snp_oracle/predictionnet/base/miner.py @@ -1,20 +1,3 @@ -# The MIT License (MIT) -# Copyright © 2023 Yuma Rao - -# 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. - import asyncio import threading import time @@ -24,8 +7,8 @@ from bittensor.constants import V_7_2_0 from substrateinterface import Keypair -from predictionnet.base.neuron import BaseNeuron -from predictionnet.protocol import Challenge +from snp_oracle.predictionnet.base.neuron import BaseNeuron +from snp_oracle.predictionnet.protocol import Challenge class BaseMinerNeuron(BaseNeuron): diff --git a/predictionnet/base/neuron.py b/snp_oracle/predictionnet/base/neuron.py similarity index 79% rename from predictionnet/base/neuron.py rename to snp_oracle/predictionnet/base/neuron.py index a5294469..607f6872 100644 --- a/predictionnet/base/neuron.py +++ b/snp_oracle/predictionnet/base/neuron.py @@ -1,30 +1,12 @@ -# The MIT License (MIT) -# Copyright © 2023 Yuma Rao - -# 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. - import copy from abc import ABC, abstractmethod import bittensor as bt -from predictionnet import __spec_version__ as spec_version +from snp_oracle import __spec_version__ as spec_version -# Sync calls set weights and also resyncs the metagraph. -from predictionnet.utils.config import add_args, check_config, config -from predictionnet.utils.misc import ttl_get_block +from snp_oracle.predictionnet.utils.config import add_args, check_config, config +from snp_oracle.predictionnet.utils.misc import ttl_get_block class BaseNeuron(ABC): diff --git a/predictionnet/base/validator.py b/snp_oracle/predictionnet/base/validator.py similarity index 91% rename from predictionnet/base/validator.py rename to snp_oracle/predictionnet/base/validator.py index 8fb7fedb..f9c6dd5c 100644 --- a/predictionnet/base/validator.py +++ b/snp_oracle/predictionnet/base/validator.py @@ -1,23 +1,3 @@ -# The MIT License (MIT) -# Copyright © 2023 Yuma Rao -# TODO(developer): Set your name -# Copyright © 2023 - -# 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. - - import asyncio import copy import os @@ -29,7 +9,7 @@ import bittensor as bt from numpy import array, full, isnan, nan, nan_to_num, ndarray -from predictionnet.base.neuron import BaseNeuron +from snp_oracle.predictionnet.base.neuron import BaseNeuron class BaseValidatorNeuron(BaseNeuron): diff --git a/predictionnet/protocol.py b/snp_oracle/predictionnet/protocol.py similarity index 52% rename from predictionnet/protocol.py rename to snp_oracle/predictionnet/protocol.py index 652460f6..62f8fbf8 100644 --- a/predictionnet/protocol.py +++ b/snp_oracle/predictionnet/protocol.py @@ -1,46 +1,8 @@ -# The MIT License (MIT) -# Copyright © 2023 Yuma Rao -# TODO(developer): Set your name -# Copyright © 2023 - -# 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. - from typing import List, Optional import bittensor as bt import pydantic -# TODO(developer): Rewrite with your protocol definition. - -# This is the protocol for the dummy miner and validator. -# It is a simple request-response protocol where the validator sends a request -# to the miner, and the miner responds with a dummy response. - -# ---- miner ---- -# Example usage: -# def dummy( synapse: Dummy ) -> Dummy: -# synapse.dummy_output = synapse.dummy_input + 1 -# return synapse -# axon = bt.axon().attach( dummy ).serve(netuid=...).start() - -# ---- validator --- -# Example usage: -# dendrite = bt.dendrite() -# dummy_output = dendrite.query( Dummy( dummy_input = 1 ) ) -# assert dummy_output == 2 - class Challenge(bt.Synapse): """ diff --git a/snp_oracle/predictionnet/utils/__init__.py b/snp_oracle/predictionnet/utils/__init__.py new file mode 100644 index 00000000..4fee521a --- /dev/null +++ b/snp_oracle/predictionnet/utils/__init__.py @@ -0,0 +1 @@ +from snp_oracle.predictionnet.utils import config, misc, uids diff --git a/predictionnet/utils/config.py b/snp_oracle/predictionnet/utils/config.py similarity index 83% rename from predictionnet/utils/config.py rename to snp_oracle/predictionnet/utils/config.py index d814d295..b3f97d00 100644 --- a/predictionnet/utils/config.py +++ b/snp_oracle/predictionnet/utils/config.py @@ -1,21 +1,3 @@ -# The MIT License (MIT) -# Copyright © 2023 Yuma Rao -# Copyright © 2023 Opentensor Foundation - -# 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. - import argparse import os diff --git a/predictionnet/utils/huggingface.py b/snp_oracle/predictionnet/utils/huggingface.py similarity index 97% rename from predictionnet/utils/huggingface.py rename to snp_oracle/predictionnet/utils/huggingface.py index aedc1bc8..d4df5607 100644 --- a/predictionnet/utils/huggingface.py +++ b/snp_oracle/predictionnet/utils/huggingface.py @@ -3,7 +3,7 @@ from huggingface_hub import HfApi, errors -from predictionnet.protocol import Challenge +from snp_oracle.predictionnet.protocol import Challenge class HfInterface: diff --git a/predictionnet/utils/miner_hf.py b/snp_oracle/predictionnet/utils/miner_hf.py similarity index 100% rename from predictionnet/utils/miner_hf.py rename to snp_oracle/predictionnet/utils/miner_hf.py diff --git a/predictionnet/utils/misc.py b/snp_oracle/predictionnet/utils/misc.py similarity index 76% rename from predictionnet/utils/misc.py rename to snp_oracle/predictionnet/utils/misc.py index 94d2aeb6..a555d5b8 100644 --- a/predictionnet/utils/misc.py +++ b/snp_oracle/predictionnet/utils/misc.py @@ -1,21 +1,3 @@ -# The MIT License (MIT) -# Copyright © 2023 Yuma Rao -# Copyright © 2023 Opentensor Foundation - -# 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. - import time from functools import lru_cache, update_wrapper from math import floor diff --git a/predictionnet/utils/uids.py b/snp_oracle/predictionnet/utils/uids.py similarity index 100% rename from predictionnet/utils/uids.py rename to snp_oracle/predictionnet/utils/uids.py diff --git a/snp_oracle/predictionnet/validator/__init__.py b/snp_oracle/predictionnet/validator/__init__.py new file mode 100644 index 00000000..535b2046 --- /dev/null +++ b/snp_oracle/predictionnet/validator/__init__.py @@ -0,0 +1,2 @@ +from snp_oracle.predictionnet.validator.forward import forward +from snp_oracle.predictionnet.validator.reward import get_rewards diff --git a/predictionnet/validator/forward.py b/snp_oracle/predictionnet/validator/forward.py similarity index 75% rename from predictionnet/validator/forward.py rename to snp_oracle/predictionnet/validator/forward.py index 2c4e0b06..5d9223b5 100644 --- a/predictionnet/validator/forward.py +++ b/snp_oracle/predictionnet/validator/forward.py @@ -1,18 +1,3 @@ -# The MIT License (MIT) -# Copyright © 2023 Yuma Rao -# TODO(developer): Set your name -# Copyright © 2023 -# 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. import time from datetime import datetime, timedelta @@ -21,10 +6,9 @@ from numpy import full, nan from pytz import timezone -# Import Validator Template -import predictionnet -from predictionnet.utils.uids import check_uid_availability -from predictionnet.validator.reward import get_rewards +import snp_oracle.predictionnet as predictionnet +from snp_oracle.predictionnet.utils.uids import check_uid_availability +from snp_oracle.predictionnet.validator.reward import get_rewards async def forward(self): diff --git a/predictionnet/validator/reward.py b/snp_oracle/predictionnet/validator/reward.py similarity index 91% rename from predictionnet/validator/reward.py rename to snp_oracle/predictionnet/validator/reward.py index 23725a3c..3038e5c4 100644 --- a/predictionnet/validator/reward.py +++ b/snp_oracle/predictionnet/validator/reward.py @@ -1,22 +1,3 @@ -# The MIT License (MIT) -# Copyright © 2023 Yuma Rao -# TODO(developer): Set your name -# Copyright © 2023 - -# 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. - import time from datetime import datetime, timedelta from typing import List @@ -26,7 +7,7 @@ import yfinance as yf from pytz import timezone -from predictionnet.protocol import Challenge +from snp_oracle.predictionnet.protocol import Challenge ################################################################################ From 8cd8235839efe4175b827bd441eec04944f6782c Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Wed, 18 Dec 2024 16:09:02 -0500 Subject: [PATCH 137/201] Remove existing tests and add package version test --- tests/helpers.py | 305 +++++++++++++++---------------- tests/test_package.py | 14 ++ tests/test_template_validator.py | 202 ++++++++++---------- 3 files changed, 250 insertions(+), 271 deletions(-) create mode 100644 tests/test_package.py diff --git a/tests/helpers.py b/tests/helpers.py index 40f72250..7fcf148e 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -1,161 +1,144 @@ -# The MIT License (MIT) -# Copyright © 2023 Opentensor Foundation - -# 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. - -from typing import Union - -from bittensor import AxonInfo, Balance, NeuronInfo, PrometheusInfo -from bittensor.mock.wallet_mock import MockWallet as _MockWallet -from bittensor.mock.wallet_mock import get_mock_coldkey as _get_mock_coldkey -from bittensor.mock.wallet_mock import get_mock_hotkey as _get_mock_hotkey -from bittensor.mock.wallet_mock import get_mock_wallet as _get_mock_wallet -from rich.console import Console -from rich.text import Text - - -def __mock_wallet_factory__(*args, **kwargs) -> _MockWallet: - """Returns a mock wallet object.""" - - mock_wallet = _get_mock_wallet() - - return mock_wallet - - -class CLOSE_IN_VALUE: - value: Union[float, int, Balance] - tolerance: Union[float, int, Balance] - - def __init__( - self, - value: Union[float, int, Balance], - tolerance: Union[float, int, Balance] = 0.0, - ) -> None: - self.value = value - self.tolerance = tolerance - - def __eq__(self, __o: Union[float, int, Balance]) -> bool: - # True if __o \in [value - tolerance, value + tolerance] - # or if value \in [__o - tolerance, __o + tolerance] - return ((self.value - self.tolerance) <= __o and __o <= (self.value + self.tolerance)) or ( - (__o - self.tolerance) <= self.value and self.value <= (__o + self.tolerance) - ) - - -def get_mock_neuron(**kwargs) -> NeuronInfo: - """ - Returns a mock neuron with the given kwargs overriding the default values. - """ - - mock_neuron_d = dict( - { - "netuid": -1, # mock netuid - "axon_info": AxonInfo( - block=0, - version=1, - ip=0, - port=0, - ip_type=0, - protocol=0, - placeholder1=0, - placeholder2=0, - ), - "prometheus_info": PrometheusInfo(block=0, version=1, ip=0, port=0, ip_type=0), - "validator_permit": True, - "uid": 1, - "hotkey": "some_hotkey", - "coldkey": "some_coldkey", - "active": 0, - "last_update": 0, - "stake": {"some_coldkey": 1e12}, - "total_stake": 1e12, - "rank": 0.0, - "trust": 0.0, - "consensus": 0.0, - "validator_trust": 0.0, - "incentive": 0.0, - "dividends": 0.0, - "emission": 0.0, - "bonds": [], - "weights": [], - "stake_dict": {}, - "pruning_score": 0.0, - "is_null": False, - } - ) - - mock_neuron_d.update(kwargs) # update with kwargs - - if kwargs.get("stake") is None and kwargs.get("coldkey") is not None: - mock_neuron_d["stake"] = {kwargs.get("coldkey"): 1e12} - - if kwargs.get("total_stake") is None: - mock_neuron_d["total_stake"] = sum(mock_neuron_d["stake"].values()) - - mock_neuron = NeuronInfo._neuron_dict_to_namespace(mock_neuron_d) - - return mock_neuron - - -def get_mock_neuron_by_uid(uid: int, **kwargs) -> NeuronInfo: - return get_mock_neuron(uid=uid, hotkey=_get_mock_hotkey(uid), coldkey=_get_mock_coldkey(uid), **kwargs) - - -class MockStatus: - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - pass - - def start(self): - pass - - def stop(self): - pass - - def update(self, *args, **kwargs): - MockConsole().print(*args, **kwargs) - - -class MockConsole: - """ - Mocks the console object for status and print. - Captures the last print output as a string. - """ - - captured_print = None - - def status(self, *args, **kwargs): - return MockStatus() - - def print(self, *args, **kwargs): - console = Console(width=1000, no_color=True, markup=False) # set width to 1000 to avoid truncation - console.begin_capture() - console.print(*args, **kwargs) - self.captured_print = console.end_capture() - - def clear(self, *args, **kwargs): - pass - - @staticmethod - def remove_rich_syntax(text: str) -> str: - """ - Removes rich syntax from the given text. - Removes markup and ansi syntax. - """ - output_no_syntax = Text.from_ansi(Text.from_markup(text).plain).plain - - return output_no_syntax +# from typing import Union + +# from bittensor import AxonInfo, Balance, NeuronInfo, PrometheusInfo +# from bittensor.mock.wallet_mock import MockWallet as _MockWallet +# from bittensor.mock.wallet_mock import get_mock_coldkey as _get_mock_coldkey +# from bittensor.mock.wallet_mock import get_mock_hotkey as _get_mock_hotkey +# from bittensor.mock.wallet_mock import get_mock_wallet as _get_mock_wallet +# from rich.console import Console +# from rich.text import Text + + +# def __mock_wallet_factory__(*args, **kwargs) -> _MockWallet: +# """Returns a mock wallet object.""" + +# mock_wallet = _get_mock_wallet() + +# return mock_wallet + + +# class CLOSE_IN_VALUE: +# value: Union[float, int, Balance] +# tolerance: Union[float, int, Balance] + +# def __init__( +# self, +# value: Union[float, int, Balance], +# tolerance: Union[float, int, Balance] = 0.0, +# ) -> None: +# self.value = value +# self.tolerance = tolerance + +# def __eq__(self, __o: Union[float, int, Balance]) -> bool: +# # True if __o \in [value - tolerance, value + tolerance] +# # or if value \in [__o - tolerance, __o + tolerance] +# return ((self.value - self.tolerance) <= __o and __o <= (self.value + self.tolerance)) or ( +# (__o - self.tolerance) <= self.value and self.value <= (__o + self.tolerance) +# ) + + +# def get_mock_neuron(**kwargs) -> NeuronInfo: +# """ +# Returns a mock neuron with the given kwargs overriding the default values. +# """ + +# mock_neuron_d = dict( +# { +# "netuid": -1, # mock netuid +# "axon_info": AxonInfo( +# block=0, +# version=1, +# ip=0, +# port=0, +# ip_type=0, +# protocol=0, +# placeholder1=0, +# placeholder2=0, +# ), +# "prometheus_info": PrometheusInfo(block=0, version=1, ip=0, port=0, ip_type=0), +# "validator_permit": True, +# "uid": 1, +# "hotkey": "some_hotkey", +# "coldkey": "some_coldkey", +# "active": 0, +# "last_update": 0, +# "stake": {"some_coldkey": 1e12}, +# "total_stake": 1e12, +# "rank": 0.0, +# "trust": 0.0, +# "consensus": 0.0, +# "validator_trust": 0.0, +# "incentive": 0.0, +# "dividends": 0.0, +# "emission": 0.0, +# "bonds": [], +# "weights": [], +# "stake_dict": {}, +# "pruning_score": 0.0, +# "is_null": False, +# } +# ) + +# mock_neuron_d.update(kwargs) # update with kwargs + +# if kwargs.get("stake") is None and kwargs.get("coldkey") is not None: +# mock_neuron_d["stake"] = {kwargs.get("coldkey"): 1e12} + +# if kwargs.get("total_stake") is None: +# mock_neuron_d["total_stake"] = sum(mock_neuron_d["stake"].values()) + +# mock_neuron = NeuronInfo._neuron_dict_to_namespace(mock_neuron_d) + +# return mock_neuron + + +# def get_mock_neuron_by_uid(uid: int, **kwargs) -> NeuronInfo: +# return get_mock_neuron(uid=uid, hotkey=_get_mock_hotkey(uid), coldkey=_get_mock_coldkey(uid), **kwargs) + + +# class MockStatus: +# def __enter__(self): +# return self + +# def __exit__(self, exc_type, exc_value, traceback): +# pass + +# def start(self): +# pass + +# def stop(self): +# pass + +# def update(self, *args, **kwargs): +# MockConsole().print(*args, **kwargs) + + +# class MockConsole: +# """ +# Mocks the console object for status and print. +# Captures the last print output as a string. +# """ + +# captured_print = None + +# def status(self, *args, **kwargs): +# return MockStatus() + +# def print(self, *args, **kwargs): +# console = Console(width=1000, no_color=True, markup=False) # set width to 1000 to avoid truncation +# console.begin_capture() +# console.print(*args, **kwargs) +# self.captured_print = console.end_capture() + +# def clear(self, *args, **kwargs): +# pass + +# @staticmethod +# def remove_rich_syntax(text: str) -> str: +# """ +# Removes rich syntax from the given text. +# Removes markup and ansi syntax. +# """ +# output_no_syntax = Text.from_ansi(Text.from_markup(text).plain).plain + +# return output_no_syntax diff --git a/tests/test_package.py b/tests/test_package.py new file mode 100644 index 00000000..a3084cce --- /dev/null +++ b/tests/test_package.py @@ -0,0 +1,14 @@ +import unittest + +from snp_oracle import __version__ + + +class TestPackage(unittest.TestCase): + + def setUp(self): + pass + + def test_package_version(self): + # Check that version is as expected + # Must update to increment package version successfully + self.assertEqual(__version__, "2.2.1") \ No newline at end of file diff --git a/tests/test_template_validator.py b/tests/test_template_validator.py index 14492e5e..85dc7e55 100644 --- a/tests/test_template_validator.py +++ b/tests/test_template_validator.py @@ -1,110 +1,92 @@ -# The MIT License (MIT) -# Copyright © 2023 Yuma Rao -# Copyright © 2023 Opentensor Foundation - -# 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. - -import sys -import unittest - -import bittensor as bt -from numpy import array -from template.base.validator import BaseValidatorNeuron -from template.protocol import Dummy -from template.utils.uids import get_random_uids -from template.validator.reward import get_rewards - -from neurons.validator import Neuron as Validator - - -class TemplateValidatorNeuronTestCase(unittest.TestCase): - """ - This class contains unit tests for the RewardEvent classes. - - The tests cover different scenarios where completions may or may not be successful and the reward events are checked that they don't contain missing values. - The `reward` attribute of all RewardEvents is expected to be a float, and the `is_filter_model` attribute is expected to be a boolean. - """ - - def setUp(self): - sys.argv = sys.argv[0] + ["--config", "tests/configs/validator.json"] - - config = BaseValidatorNeuron.config() - config.wallet._mock = True - config.metagraph._mock = True - config.subtensor._mock = True - self.neuron = Validator(config) - self.miner_uids = get_random_uids(self, k=10) - - def test_run_single_step(self): - # TODO: Test a single step - pass - - def test_sync_error_if_not_registered(self): - # TODO: Test that the validator throws an error if it is not registered on metagraph - pass - - def test_forward(self): - # TODO: Test that the forward function returns the correct value - pass - - def test_dummy_responses(self): - # TODO: Test that the dummy responses are correctly constructed - - responses = self.neuron.dendrite.query( - # Send the query to miners in the network. - axons=[self.neuron.metagraph.axons[uid] for uid in self.miner_uids], - # Construct a dummy query. - synapse=Dummy(dummy_input=self.neuron.step), - # All responses have the deserialize function called on them before returning. - deserialize=True, - ) - - for i, response in enumerate(responses): - self.assertEqual(response, self.neuron.step * 2) - - def test_reward(self): - # TODO: Test that the reward function returns the correct value - responses = self.dendrite.query( - # Send the query to miners in the network. - axons=[self.metagraph.axons[uid] for uid in self.miner_uids], - # Construct a dummy query. - synapse=Dummy(dummy_input=self.neuron.step), - # All responses have the deserialize function called on them before returning. - deserialize=True, - ) - - rewards = get_rewards(self.neuron, responses) - expected_rewards = array([1.0] * len(responses)) - self.assertEqual(rewards, expected_rewards) - - def test_reward_with_nan(self): - # TODO: Test that NaN rewards are correctly sanitized - # TODO: Test that a bt.logging.warning is thrown when a NaN reward is sanitized - responses = self.dendrite.query( - # Send the query to miners in the network. - axons=[self.metagraph.axons[uid] for uid in self.miner_uids], - # Construct a dummy query. - synapse=Dummy(dummy_input=self.neuron.step), - # All responses have the deserialize function called on them before returning. - deserialize=True, - ) - - rewards = get_rewards(self.neuron, responses) - _ = rewards.clone() # expected rewards - # Add NaN values to rewards - rewards[0] = float("nan") - - with self.assertLogs(bt.logging, level="WARNING") as _: - self.neuron.update_scores(rewards, self.miner_uids) +# import sys +# import unittest + +# import bittensor as bt +# from numpy import array +# from template.base.validator import BaseValidatorNeuron +# from template.protocol import Dummy +# from template.utils.uids import get_random_uids +# from template.validator.reward import get_rewards + +# from neurons.validator import Neuron as Validator + + +# class TemplateValidatorNeuronTestCase(unittest.TestCase): +# """ +# This class contains unit tests for the RewardEvent classes. + +# The tests cover different scenarios where completions may or may not be successful and the reward events are checked that they don't contain missing values. +# The `reward` attribute of all RewardEvents is expected to be a float, and the `is_filter_model` attribute is expected to be a boolean. +# """ + +# def setUp(self): +# sys.argv = sys.argv[0] + ["--config", "tests/configs/validator.json"] + +# config = BaseValidatorNeuron.config() +# config.wallet._mock = True +# config.metagraph._mock = True +# config.subtensor._mock = True +# self.neuron = Validator(config) +# self.miner_uids = get_random_uids(self, k=10) + +# def test_run_single_step(self): +# # TODO: Test a single step +# pass + +# def test_sync_error_if_not_registered(self): +# # TODO: Test that the validator throws an error if it is not registered on metagraph +# pass + +# def test_forward(self): +# # TODO: Test that the forward function returns the correct value +# pass + +# def test_dummy_responses(self): +# # TODO: Test that the dummy responses are correctly constructed + +# responses = self.neuron.dendrite.query( +# # Send the query to miners in the network. +# axons=[self.neuron.metagraph.axons[uid] for uid in self.miner_uids], +# # Construct a dummy query. +# synapse=Dummy(dummy_input=self.neuron.step), +# # All responses have the deserialize function called on them before returning. +# deserialize=True, +# ) + +# for i, response in enumerate(responses): +# self.assertEqual(response, self.neuron.step * 2) + +# def test_reward(self): +# # TODO: Test that the reward function returns the correct value +# responses = self.dendrite.query( +# # Send the query to miners in the network. +# axons=[self.metagraph.axons[uid] for uid in self.miner_uids], +# # Construct a dummy query. +# synapse=Dummy(dummy_input=self.neuron.step), +# # All responses have the deserialize function called on them before returning. +# deserialize=True, +# ) + +# rewards = get_rewards(self.neuron, responses) +# expected_rewards = array([1.0] * len(responses)) +# self.assertEqual(rewards, expected_rewards) + +# def test_reward_with_nan(self): +# # TODO: Test that NaN rewards are correctly sanitized +# # TODO: Test that a bt.logging.warning is thrown when a NaN reward is sanitized +# responses = self.dendrite.query( +# # Send the query to miners in the network. +# axons=[self.metagraph.axons[uid] for uid in self.miner_uids], +# # Construct a dummy query. +# synapse=Dummy(dummy_input=self.neuron.step), +# # All responses have the deserialize function called on them before returning. +# deserialize=True, +# ) + +# rewards = get_rewards(self.neuron, responses) +# _ = rewards.clone() # expected rewards +# # Add NaN values to rewards +# rewards[0] = float("nan") + +# with self.assertLogs(bt.logging, level="WARNING") as _: +# self.neuron.update_scores(rewards, self.miner_uids) From fa3c2c30462d1a2ae05bcad58d37da663294ddc8 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Wed, 18 Dec 2024 16:09:44 -0500 Subject: [PATCH 138/201] Adjust github actions to leverage poetry --- .github/workflows/build.yml | 67 +++++++++++++++++++++++-------------- .github/workflows/ci.yml | 24 ++++++------- 2 files changed, 54 insertions(+), 37 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 288f6159..6c7142d5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,4 @@ -name: Cache and Load Build +name: Cache Build on: workflow_call: @@ -17,7 +17,7 @@ jobs: steps: #------------------------------------------------ - # Checkout repo and setup python + # check-out repo and set-up python #------------------------------------------------ - name: Check out repository uses: actions/checkout@v4 @@ -27,41 +27,58 @@ jobs: python-version: '3.11' #------------------------------------------------ - # Load cached venv if cache exists + # ----- install & configure poetry ----- #------------------------------------------------ - - name: Restore cached virtualenv - uses: actions/cache/restore@v4 - id: restore-cache + - name: Load cached Poetry installation + id: cached-poetry + uses: actions/cache@v4 + with: + path: ~/.local # the path depends on the OS + key: poetry-0 # increment to reset cache + + - name: Install Poetry + if: steps.cached-poetry.outputs.cache-hit != 'true' + uses: snok/install-poetry@v1 + with: + version: latest + virtualenvs-create: true + virtualenvs-in-project: true + virtualenvs-path: .venv + installer-parallel: true + + # If cache was loaded, we must redo configuration + - name: Configure poetry + if: steps.cached-poetry.outputs.cache-hit == 'true' + run: | + poetry config virtualenvs.create true + poetry config virtualenvs.in-project true + poetry config virtualenvs.path .venv + + #------------------------------------------------ + # Load cached venv if exists + #------------------------------------------------ + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v4 with: - key: venv-${{ runner.os }}-${{ steps.setup_python.outputs.python-version }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('dev_requirements.txt') }} path: .venv + key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} #------------------------------------------------ - # Install dependencies - if cache does not exist + # Install dependencies if cache does not exist #------------------------------------------------ - name: Install dependencies - if: steps.restore-cache.outputs.cache-hit != 'true' - run: | - python -m venv .venv - source .venv/bin/activate - python -m pip install .[DEV] - echo "$VIRTUAL_ENV/bin" >> $GITHUB_PATH - echo "VIRTUAL_ENV=$VIRTUAL_ENV" >> $GITHUB_ENV + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + run: poetry install --no-interaction --no-root #------------------------------------------------ - # Save venv to cache - if not exists + # Install your root project #------------------------------------------------ - - name: Saved cached virtualenv - if: steps.restore-cache.outputs.cache-hit != 'true' - uses: actions/cache/save@v4 - with: - key: ${{ steps.restore-cache.outputs.cache-primary-key }} - path: .venv + - name: Install project + run: poetry install --no-interaction #------------------------------------------------ # Run custom command(s) within venv #------------------------------------------------ - name: Run commands - run: | - source .venv/bin/activate - ${{ inputs.command }} + run: ${{ inputs.command }} \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2ad04403..3425cdd4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,9 +1,9 @@ -name: Continuous Integration +name: CI on: pull_request: push: - branches: [main, dev] + branches: [main, staging, dev] jobs: #---------------------------------------------- @@ -15,9 +15,10 @@ jobs: with: name: Cache command: | - python -m pip list - python --version - echo "Build successful" + poetry run python -m pip list + poetry run python --version + poetry --version + poetry run echo "Build successful" #---------------------------------------------- # Run Linters @@ -28,14 +29,14 @@ jobs: uses: ./.github/workflows/build.yml with: name: Black - command: python -m black --check . + command: poetry run python -m black --check . lint-isort: name: Linter needs: build uses: ./.github/workflows/build.yml with: name: Isort - command: python -m isort --check-only . + command: poetry run python -m isort --check-only . lint-mypy: name: Linter needs: build @@ -43,14 +44,14 @@ jobs: uses: ./.github/workflows/build.yml with: name: Mypy - command: python -m mypy --verbose 0 . + command: poetry run python -m mypy --verbose 0 . lint-flake8: name: Linter needs: build uses: ./.github/workflows/build.yml with: name: Flake8 - command: python -m flake8 . + command: poetry run python -m flake8 . #---------------------------------------------- # Run Tests @@ -63,9 +64,8 @@ jobs: lint-mypy, lint-flake8, ] - # `${{ always() }}` will run the tests regardless of linting success - if: false # This condition ensures the job is never executed + if: ${{ always() }} # will run the tests regardless of linting success uses: ./.github/workflows/build.yml with: name: Unittests - command: pytest tests/ + command: poetry run pytest tests/ \ No newline at end of file From 04cec4d5e6d6d73e928093c90bc70ac26dd8ae4f Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Wed, 18 Dec 2024 16:30:50 -0500 Subject: [PATCH 139/201] Use poetry for dependency management --- poetry.lock | 2484 +++++++++++++++++++++-------- pyproject.toml | 38 +- requirements/dev_requirements.txt | 10 - requirements/requirements.txt | 17 - setup.py | 94 -- 5 files changed, 1886 insertions(+), 757 deletions(-) delete mode 100644 requirements/dev_requirements.txt delete mode 100644 requirements/requirements.txt delete mode 100644 setup.py diff --git a/poetry.lock b/poetry.lock index 12bcd95f..e03d850a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "absl-py" @@ -24,87 +24,87 @@ files = [ [[package]] name = "aiohttp" -version = "3.11.10" +version = "3.11.11" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" files = [ - {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d"}, - {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f"}, - {file = "aiohttp-3.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4"}, - {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6"}, - {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769"}, - {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f"}, - {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df"}, - {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219"}, - {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d"}, - {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9"}, - {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77"}, - {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767"}, - {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d"}, - {file = "aiohttp-3.11.10-cp310-cp310-win32.whl", hash = "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91"}, - {file = "aiohttp-3.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33"}, - {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b"}, - {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1"}, - {file = "aiohttp-3.11.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683"}, - {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d"}, - {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299"}, - {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8"}, - {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0"}, - {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5"}, - {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46"}, - {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838"}, - {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b"}, - {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52"}, - {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3"}, - {file = "aiohttp-3.11.10-cp311-cp311-win32.whl", hash = "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4"}, - {file = "aiohttp-3.11.10-cp311-cp311-win_amd64.whl", hash = "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec"}, - {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf"}, - {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138"}, - {file = "aiohttp-3.11.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5"}, - {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50"}, - {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c"}, - {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d"}, - {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b"}, - {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109"}, - {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab"}, - {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69"}, - {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0"}, - {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9"}, - {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc"}, - {file = "aiohttp-3.11.10-cp312-cp312-win32.whl", hash = "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985"}, - {file = "aiohttp-3.11.10-cp312-cp312-win_amd64.whl", hash = "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408"}, - {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816"}, - {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf"}, - {file = "aiohttp-3.11.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5"}, - {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32"}, - {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01"}, - {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34"}, - {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99"}, - {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39"}, - {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e"}, - {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a"}, - {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542"}, - {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60"}, - {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836"}, - {file = "aiohttp-3.11.10-cp313-cp313-win32.whl", hash = "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c"}, - {file = "aiohttp-3.11.10-cp313-cp313-win_amd64.whl", hash = "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6"}, - {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf"}, - {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f"}, - {file = "aiohttp-3.11.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59"}, - {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f"}, - {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199"}, - {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079"}, - {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf"}, - {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc"}, - {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82"}, - {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c"}, - {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487"}, - {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1"}, - {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4"}, - {file = "aiohttp-3.11.10-cp39-cp39-win32.whl", hash = "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be"}, - {file = "aiohttp-3.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74"}, - {file = "aiohttp-3.11.10.tar.gz", hash = "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c"}, + {file = "aiohttp-3.11.11-cp310-cp310-win32.whl", hash = "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745"}, + {file = "aiohttp-3.11.11-cp310-cp310-win_amd64.whl", hash = "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773"}, + {file = "aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62"}, + {file = "aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e"}, + {file = "aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600"}, + {file = "aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5"}, + {file = "aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d"}, + {file = "aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226"}, + {file = "aiohttp-3.11.11-cp39-cp39-win32.whl", hash = "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3"}, + {file = "aiohttp-3.11.11-cp39-cp39-win_amd64.whl", hash = "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1"}, + {file = "aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e"}, ] [package.dependencies] @@ -122,13 +122,13 @@ speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] [[package]] name = "aiosignal" -version = "1.3.1" +version = "1.3.2" description = "aiosignal: a list of registered asynchronous callbacks" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, - {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, + {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"}, + {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"}, ] [package.dependencies] @@ -218,17 +218,6 @@ doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", 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)"] trio = ["trio (>=0.26.1)"] -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -optional = false -python-versions = "*" -files = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] - [[package]] name = "astunparse" version = "1.6.3" @@ -257,19 +246,19 @@ files = [ [[package]] name = "attrs" -version = "24.2.0" +version = "24.3.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, - {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, + {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, + {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, ] [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]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "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"] @@ -372,6 +361,52 @@ wheel = "*" dev = ["aioresponses (==0.7.6)", "black (==24.3.0)", "coveralls (==3.3.1)", "ddt (==1.6.0)", "factory-boy (==3.3.0)", "flake8 (==7.0.0)", "freezegun (==1.5.0)", "httpx (==0.27.0)", "hypothesis (==6.81.1)", "mypy (==1.8.0)", "pytest (==7.2.0)", "pytest-asyncio (==0.23.7)", "pytest-cov (==4.0.0)", "pytest-mock (==3.12.0)", "pytest-rerunfailures (==10.2)", "pytest-split (==0.8.0)", "pytest-xdist (==3.0.2)", "ruff (==0.4.7)", "torch (>=1.13.1)", "types-retry (==0.9.9.4)"] torch = ["torch (>=1.13.1)"] +[[package]] +name = "black" +version = "24.10.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.9" +files = [ + {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, + {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, + {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"}, + {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"}, + {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"}, + {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"}, + {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"}, + {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"}, + {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"}, + {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"}, + {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"}, + {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"}, + {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"}, + {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"}, + {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"}, + {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"}, + {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"}, + {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"}, + {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"}, + {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"}, + {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"}, + {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.10)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + [[package]] name = "certifi" version = "2024.7.4" @@ -462,6 +497,17 @@ files = [ [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" @@ -657,97 +703,111 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "cytoolz" -version = "1.0.0" +version = "1.0.1" description = "Cython implementation of Toolz: High performance functional utilities" optional = false python-versions = ">=3.8" files = [ - {file = "cytoolz-1.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ecf5a887acb8f079ab1b81612b1c889bcbe6611aa7804fd2df46ed310aa5a345"}, - {file = "cytoolz-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0ef30c1e091d4d59d14d8108a16d50bd227be5d52a47da891da5019ac2f8e4"}, - {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7df2dfd679f0517a96ced1cdd22f5c6c6aeeed28d928a82a02bf4c3fd6fd7ac4"}, - {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c51452c938e610f57551aa96e34924169c9100c0448bac88c2fb395cbd3538c"}, - {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6433f03910c5e5345d82d6299457c26bf33821224ebb837c6b09d9cdbc414a6c"}, - {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:389ec328bb535f09e71dfe658bf0041f17194ca4cedaacd39bafe7893497a819"}, - {file = "cytoolz-1.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c64658e1209517ce4b54c1c9269a508b289d8d55fc742760e4b8579eacf09a33"}, - {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f6039a9bd5bb988762458b9ca82b39e60ca5e5baae2ba93913990dcc5d19fa88"}, - {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85c9c8c4465ed1b2c8d67003809aec9627b129cb531d2f6cf0bbfe39952e7e4d"}, - {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:49375aad431d76650f94877afb92f09f58b6ff9055079ef4f2cd55313f5a1b39"}, - {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:4c45106171c824a61e755355520b646cb35a1987b34bbf5789443823ee137f63"}, - {file = "cytoolz-1.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3b319a7f0fed5db07d189db4046162ebc183c108df3562a65ba6ebe862d1f634"}, - {file = "cytoolz-1.0.0-cp310-cp310-win32.whl", hash = "sha256:9770e1b09748ad0d751853d994991e2592a9f8c464a87014365f80dac2e83faa"}, - {file = "cytoolz-1.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:20194dd02954c00c1f0755e636be75a20781f91a4ac9270c7f747e82d3c7f5a5"}, - {file = "cytoolz-1.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dffc22fd2c91be64dbdbc462d0786f8e8ac9a275cfa1869a1084d1867d4f67e0"}, - {file = "cytoolz-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a99e7e29274e293f4ffe20e07f76c2ac753a78f1b40c1828dfc54b2981b2f6c4"}, - {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c507a3e0a45c41d66b43f96797290d75d1e7a8549aa03a4a6b8854fdf3f7b8d8"}, - {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:643a593ec272ef7429099e1182a22f64ec2696c00d295d2a5be390db1b7ff176"}, - {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ce38e2e42cbae30446190c59b92a8a9029e1806fd79eaf88f48b0fe33003893"}, - {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810a6a168b8c5ecb412fbae3dd6f7ed6c6253a63caf4174ee9794ebd29b2224f"}, - {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ce8a2a85c0741c1b19b16e6782c4a5abc54c3caecda66793447112ab2fa9884"}, - {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ea4ac72e6b830861035c4c7999af8e55813f57c6d1913a3d93cc4a6babc27bf7"}, - {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a09cdfb21dfb38aa04df43e7546a41f673377eb5485da88ceb784e327ec7603b"}, - {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:658dd85deb375ff7af990a674e5c9058cef1c9d1f5dc89bc87b77be499348144"}, - {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9715d1ff5576919d10b68f17241375f6a1eec8961c25b78a83e6ef1487053f39"}, - {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f370a1f1f1afc5c1c8cc5edc1cfe0ba444263a0772af7ce094be8e734f41769d"}, - {file = "cytoolz-1.0.0-cp311-cp311-win32.whl", hash = "sha256:dbb2ec1177dca700f3db2127e572da20de280c214fc587b2a11c717fc421af56"}, - {file = "cytoolz-1.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:0983eee73df86e54bb4a79fcc4996aa8b8368fdbf43897f02f9c3bf39c4dc4fb"}, - {file = "cytoolz-1.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:10e3986066dc379e30e225b230754d9f5996aa8d84c2accc69c473c21d261e46"}, - {file = "cytoolz-1.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:16576f1bb143ee2cb9f719fcc4b845879fb121f9075c7c5e8a5ff4854bd02fc6"}, - {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3faa25a1840b984315e8b3ae517312375f4273ffc9a2f035f548b7f916884f37"}, - {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:781fce70a277b20fd95dc66811d1a97bb07b611ceea9bda8b7dd3c6a4b05d59a"}, - {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a562c25338eb24d419d1e80a7ae12133844ce6fdeb4ab54459daf250088a1b2"}, - {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f29d8330aaf070304f7cd5cb7e73e198753624eb0aec278557cccd460c699b5b"}, - {file = "cytoolz-1.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:98a96c54aa55ed9c7cdb23c2f0df39a7b4ee518ac54888480b5bdb5ef69c7ef0"}, - {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:287d6d7f475882c2ddcbedf8da9a9b37d85b77690779a2d1cdceb5ae3998d52e"}, - {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:05a871688df749b982839239fcd3f8ec3b3b4853775d575ff9cd335fa7c75035"}, - {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:28bb88e1e2f7d6d4b8e0890b06d292c568984d717de3e8381f2ca1dd12af6470"}, - {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:576a4f1fc73d8836b10458b583f915849da6e4f7914f4ecb623ad95c2508cad5"}, - {file = "cytoolz-1.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:509ed3799c47e4ada14f63e41e8f540ac6e2dab97d5d7298934e6abb9d3830ec"}, - {file = "cytoolz-1.0.0-cp312-cp312-win32.whl", hash = "sha256:9ce25f02b910630f6dc2540dd1e26c9326027ddde6c59f8cab07c56acc70714c"}, - {file = "cytoolz-1.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:7e53cfcce87e05b7f0ae2fb2b3e5820048cd0bb7b701e92bd8f75c9fbb7c9ae9"}, - {file = "cytoolz-1.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7d56569dfe67a39ce74ffff0dc12cf0a3d1aae709667a303fe8f2dd5fd004fdf"}, - {file = "cytoolz-1.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:035c8bb4706dcf93a89fb35feadff67e9301935bf6bb864cd2366923b69d9a29"}, - {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27c684799708bdc7ee7acfaf464836e1b4dec0996815c1d5efd6a92a4356a562"}, - {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44ab57cfc922b15d94899f980d76759ef9e0256912dfab70bf2561bea9cd5b19"}, - {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:478af5ecc066da093d7660b23d0b465a7f44179739937afbded8af00af412eb6"}, - {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da1f82a7828a42468ea2820a25b6e56461361390c29dcd4d68beccfa1b71066b"}, - {file = "cytoolz-1.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c371b3114d38ee717780b239179e88d5d358fe759a00dcf07691b8922bbc762"}, - {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:90b343b2f3b3e77c3832ba19b0b17e95412a5b2e715b05c23a55ba525d1fca49"}, - {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89a554a9ba112403232a54e15e46ff218b33020f3f45c4baf6520ab198b7ad93"}, - {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:0d603f5e2b1072166745ecdd81384a75757a96a704a5642231eb51969f919d5f"}, - {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:122ef2425bd3c0419e6e5260d0b18cd25cf74de589cd0184e4a63b24a4641e2e"}, - {file = "cytoolz-1.0.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8819f1f97ebe36efcaf4b550e21677c46ac8a41bed482cf66845f377dd20700d"}, - {file = "cytoolz-1.0.0-cp38-cp38-win32.whl", hash = "sha256:fcddbb853770dd6e270d89ea8742f0aa42c255a274b9e1620eb04e019b79785e"}, - {file = "cytoolz-1.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ca526905a014a38cc23ae78635dc51d0462c5c24425b22c08beed9ff2ee03845"}, - {file = "cytoolz-1.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:05df5ff1cdd198fb57e7368623662578c950be0b14883cadfb9ee4098415e1e5"}, - {file = "cytoolz-1.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04a84778f48ebddb26948971dc60948907c876ba33b13f9cbb014fe65b341fc2"}, - {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f65283b618b4c4df759f57bcf8483865a73f7f268e6d76886c743407c8d26c1c"}, - {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388cd07ee9a9e504c735a0a933e53c98586a1c301a64af81f7aa7ff40c747520"}, - {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06d09e9569cfdfc5c082806d4b4582db8023a3ce034097008622bcbac7236f38"}, - {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9502bd9e37779cc9893cbab515a474c2ab6af61ed22ac2f7e16033db18fcaa85"}, - {file = "cytoolz-1.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:364c2fda148def38003b2c86e8adde1d2aab12411dd50872c244a815262e2fda"}, - {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9b2e945617325242687189966335e785dc0fae316f4c1825baacf56e5a97e65f"}, - {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0f16907fdc724c55b16776bdb7e629deae81d500fe48cfc3861231753b271355"}, - {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d3206c81ca3ba2d7b8fe78f2e116e3028e721148be753308e88dcbbc370bca52"}, - {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:becce4b13e110b5ac6b23753dcd0c977f4fdccffa31898296e13fd1109e517e3"}, - {file = "cytoolz-1.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:69a7e5e98fd446079b8b8ec5987aec9a31ec3570a6f494baefa6800b783eaf22"}, - {file = "cytoolz-1.0.0-cp39-cp39-win32.whl", hash = "sha256:b1707b6c3a91676ac83a28a231a14b337dbb4436b937e6b3e4fd44209852a48b"}, - {file = "cytoolz-1.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:11d48b8521ef5fe92e099f4fc00717b5d0789c3c90d5d84031b6d3b17dee1700"}, - {file = "cytoolz-1.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e672712d5dc3094afc6fb346dd4e9c18c1f3c69608ddb8cf3b9f8428f9c26a5c"}, - {file = "cytoolz-1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86fb208bfb7420e1d0d20065d661310e4a8a6884851d4044f47d37ed4cd7410e"}, - {file = "cytoolz-1.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dbe5fe3b835859fc559eb59bf2775b5a108f7f2cfab0966f3202859d787d8fd"}, - {file = "cytoolz-1.0.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cace092dfda174eed09ed871793beb5b65633963bcda5b1632c73a5aceea1ce"}, - {file = "cytoolz-1.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f7a9d816af3be9725c70efe0a6e4352a45d3877751b395014b8eb2f79d7d8d9d"}, - {file = "cytoolz-1.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:caa7ef840847a23b379e6146760e3a22f15f445656af97e55a435c592125cfa5"}, - {file = "cytoolz-1.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:921082fff09ff6e40c12c87b49be044492b2d6bb01d47783995813b76680c7b2"}, - {file = "cytoolz-1.0.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a32f1356f3b64dda883583383966948604ac69ca0b7fbcf5f28856e5f9133b4e"}, - {file = "cytoolz-1.0.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9af793b1738e4191d15a92e1793f1ffea9f6461022c7b2442f3cb1ea0a4f758a"}, - {file = "cytoolz-1.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:51dfda3983fcc59075c534ce54ca041bb3c80e827ada5d4f25ff7b4049777f94"}, - {file = "cytoolz-1.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:acfb8780c04d29423d14aaab74cd1b7b4beaba32f676e7ace02c9acfbf532aba"}, - {file = "cytoolz-1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99f39dcc46416dca3eb23664b73187b77fb52cd8ba2ddd8020a292d8f449db67"}, - {file = "cytoolz-1.0.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0d56b3721977806dcf1a68b0ecd56feb382fdb0f632af1a9fc5ab9b662b32c6"}, - {file = "cytoolz-1.0.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d346620abc8c83ae634136e700432ad6202faffcc24c5ab70b87392dcda8a1"}, - {file = "cytoolz-1.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:df0c81197fc130de94c09fc6f024a6a19c98ba8fe55c17f1e45ebba2e9229079"}, - {file = "cytoolz-1.0.0.tar.gz", hash = "sha256:eb453b30182152f9917a5189b7d99046b6ce90cdf8aeb0feff4b2683e600defd"}, + {file = "cytoolz-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cec9af61f71fc3853eb5dca3d42eb07d1f48a4599fa502cbe92adde85f74b042"}, + {file = "cytoolz-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:140bbd649dbda01e91add7642149a5987a7c3ccc251f2263de894b89f50b6608"}, + {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e90124bdc42ff58b88cdea1d24a6bc5f776414a314cc4d94f25c88badb3a16d1"}, + {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e74801b751e28f7c5cc3ad264c123954a051f546f2fdfe089f5aa7a12ccfa6da"}, + {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:582dad4545ddfb5127494ef23f3fa4855f1673a35d50c66f7638e9fb49805089"}, + {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd7bd0618e16efe03bd12f19c2a26a27e6e6b75d7105adb7be1cd2a53fa755d8"}, + {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d74cca6acf1c4af58b2e4a89cc565ed61c5e201de2e434748c93e5a0f5c541a5"}, + {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:823a3763828d8d457f542b2a45d75d6b4ced5e470b5c7cf2ed66a02f508ed442"}, + {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:51633a14e6844c61db1d68c1ffd077cf949f5c99c60ed5f1e265b9e2966f1b52"}, + {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f3ec9b01c45348f1d0d712507d54c2bfd69c62fbd7c9ef555c9d8298693c2432"}, + {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1855022b712a9c7a5bce354517ab4727a38095f81e2d23d3eabaf1daeb6a3b3c"}, + {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9930f7288c4866a1dc1cc87174f0c6ff4cad1671eb1f6306808aa6c445857d78"}, + {file = "cytoolz-1.0.1-cp310-cp310-win32.whl", hash = "sha256:a9baad795d72fadc3445ccd0f122abfdbdf94269157e6d6d4835636dad318804"}, + {file = "cytoolz-1.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:ad95b386a84e18e1f6136f6d343d2509d4c3aae9f5a536f3dc96808fcc56a8cf"}, + {file = "cytoolz-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2d958d4f04d9d7018e5c1850790d9d8e68b31c9a2deebca74b903706fdddd2b6"}, + {file = "cytoolz-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0f445b8b731fc0ecb1865b8e68a070084eb95d735d04f5b6c851db2daf3048ab"}, + {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f546a96460a7e28eb2ec439f4664fa646c9b3e51c6ebad9a59d3922bbe65e30"}, + {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0317681dd065532d21836f860b0563b199ee716f55d0c1f10de3ce7100c78a3b"}, + {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c0ef52febd5a7821a3fd8d10f21d460d1a3d2992f724ba9c91fbd7a96745d41"}, + {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebaf419acf2de73b643cf96108702b8aef8e825cf4f63209ceb078d5fbbbfd"}, + {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f7f04eeb4088947585c92d6185a618b25ad4a0f8f66ea30c8db83cf94a425e3"}, + {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f61928803bb501c17914b82d457c6f50fe838b173fb40d39c38d5961185bd6c7"}, + {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d2960cb4fa01ccb985ad1280db41f90dc97a80b397af970a15d5a5de403c8c61"}, + {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b2b407cc3e9defa8df5eb46644f6f136586f70ba49eba96f43de67b9a0984fd3"}, + {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8245f929144d4d3bd7b972c9593300195c6cea246b81b4c46053c48b3f044580"}, + {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e37385db03af65763933befe89fa70faf25301effc3b0485fec1c15d4ce4f052"}, + {file = "cytoolz-1.0.1-cp311-cp311-win32.whl", hash = "sha256:50f9c530f83e3e574fc95c264c3350adde8145f4f8fc8099f65f00cc595e5ead"}, + {file = "cytoolz-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:b7f6b617454b4326af7bd3c7c49b0fc80767f134eb9fd6449917a058d17a0e3c"}, + {file = "cytoolz-1.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fcb8f7d0d65db1269022e7e0428471edee8c937bc288ebdcb72f13eaa67c2fe4"}, + {file = "cytoolz-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:207d4e4b445e087e65556196ff472ff134370d9a275d591724142e255f384662"}, + {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21cdf6bac6fd843f3b20280a66fd8df20dea4c58eb7214a2cd8957ec176f0bb3"}, + {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a55ec098036c0dea9f3bdc021f8acd9d105a945227d0811589f0573f21c9ce1"}, + {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a13ab79ff4ce202e03ab646a2134696988b554b6dc4b71451e948403db1331d8"}, + {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2d944799026e1ff08a83241f1027a2d9276c41f7a74224cd98b7df6e03957d"}, + {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88ba85834cd523b91fdf10325e1e6d71c798de36ea9bdc187ca7bd146420de6f"}, + {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a750b1af7e8bf6727f588940b690d69e25dc47cce5ce467925a76561317eaf7"}, + {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44a71870f7eae31d263d08b87da7c2bf1176f78892ed8bdade2c2850478cb126"}, + {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8231b9abbd8e368e036f4cc2e16902c9482d4cf9e02a6147ed0e9a3cd4a9ab0"}, + {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:aa87599ccc755de5a096a4d6c34984de6cd9dc928a0c5eaa7607457317aeaf9b"}, + {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67cd16537df51baabde3baa770ab7b8d16839c4d21219d5b96ac59fb012ebd2d"}, + {file = "cytoolz-1.0.1-cp312-cp312-win32.whl", hash = "sha256:fb988c333f05ee30ad4693fe4da55d95ec0bb05775d2b60191236493ea2e01f9"}, + {file = "cytoolz-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:8f89c48d8e5aec55ffd566a8ec858706d70ed0c6a50228eca30986bfa5b4da8b"}, + {file = "cytoolz-1.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6944bb93b287032a4c5ca6879b69bcd07df46f3079cf8393958cf0b0454f50c0"}, + {file = "cytoolz-1.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e027260fd2fc5cb041277158ac294fc13dca640714527219f702fb459a59823a"}, + {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88662c0e07250d26f5af9bc95911e6137e124a5c1ec2ce4a5d74de96718ab242"}, + {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309dffa78b0961b4c0cf55674b828fbbc793cf2d816277a5c8293c0c16155296"}, + {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:edb34246e6eb40343c5860fc51b24937698e4fa1ee415917a73ad772a9a1746b"}, + {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54da7a8e4348a18d45d4d5bc84af6c716d7f131113a4f1cc45569d37edff1b"}, + {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:241c679c3b1913c0f7259cf1d9639bed5084c86d0051641d537a0980548aa266"}, + {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5bfc860251a8f280ac79696fc3343cfc3a7c30b94199e0240b6c9e5b6b01a2a5"}, + {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c8edd1547014050c1bdad3ff85d25c82bd1c2a3c96830c6181521eb78b9a42b3"}, + {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b349bf6162e8de215403d7f35f8a9b4b1853dc2a48e6e1a609a5b1a16868b296"}, + {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1b18b35256219b6c3dd0fa037741b85d0bea39c552eab0775816e85a52834140"}, + {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:738b2350f340ff8af883eb301054eb724997f795d20d90daec7911c389d61581"}, + {file = "cytoolz-1.0.1-cp313-cp313-win32.whl", hash = "sha256:9cbd9c103df54fcca42be55ef40e7baea624ac30ee0b8bf1149f21146d1078d9"}, + {file = "cytoolz-1.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:90e577e08d3a4308186d9e1ec06876d4756b1e8164b92971c69739ea17e15297"}, + {file = "cytoolz-1.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f3a509e4ac8e711703c368476b9bbce921fcef6ebb87fa3501525f7000e44185"}, + {file = "cytoolz-1.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a7eecab6373e933dfbf4fdc0601d8fd7614f8de76793912a103b5fccf98170cd"}, + {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e55ed62087f6e3e30917b5f55350c3b6be6470b849c6566018419cd159d2cebc"}, + {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43de33d99a4ccc07234cecd81f385456b55b0ea9c39c9eebf42f024c313728a5"}, + {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:139bed875828e1727018aa0982aa140e055cbafccb7fd89faf45cbb4f2a21514"}, + {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22c12671194b518aa8ce2f4422bd5064f25ab57f410ba0b78705d0a219f4a97a"}, + {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79888f2f7dc25709cd5d37b032a8833741e6a3692c8823be181d542b5999128e"}, + {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:51628b4eb41fa25bd428f8f7b5b74fbb05f3ae65fbd265019a0dd1ded4fdf12a"}, + {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:1db9eb7179285403d2fb56ba1ff6ec35a44921b5e2fa5ca19d69f3f9f0285ea5"}, + {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:08ab7efae08e55812340bfd1b3f09f63848fe291675e2105eab1aa5327d3a16e"}, + {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e5fdc5264f884e7c0a1711a81dff112708a64b9c8561654ee578bfdccec6be09"}, + {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:90d6a2e6ab891043ee655ec99d5e77455a9bee9e1131bdfcfb745edde81200dd"}, + {file = "cytoolz-1.0.1-cp38-cp38-win32.whl", hash = "sha256:08946e083faa5147751b34fbf78ab931f149ef758af5c1092932b459e18dcf5c"}, + {file = "cytoolz-1.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:a91b4e10a9c03796c0dc93e47ebe25bb41ecc6fafc3cf5197c603cf767a3d44d"}, + {file = "cytoolz-1.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:980c323e626ba298b77ae62871b2de7c50b9d7219e2ddf706f52dd34b8be7349"}, + {file = "cytoolz-1.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:45f6fa1b512bc2a0f2de5123db932df06c7f69d12874fe06d67772b2828e2c8b"}, + {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93f42d9100c415155ad1f71b0de362541afd4ac95e3153467c4c79972521b6b"}, + {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a76d20dec9c090cdf4746255bbf06a762e8cc29b5c9c1d138c380bbdb3122ade"}, + {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:239039585487c69aa50c5b78f6a422016297e9dea39755761202fb9f0530fe87"}, + {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28307640ca2ab57b9fbf0a834b9bf563958cd9e038378c3a559f45f13c3c541"}, + {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:454880477bb901cee3a60f6324ec48c95d45acc7fecbaa9d49a5af737ded0595"}, + {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:902115d1b1f360fd81e44def30ac309b8641661150fcbdde18ead446982ada6a"}, + {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e68e6b38473a3a79cee431baa22be31cac39f7df1bf23eaa737eaff42e213883"}, + {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:32fba3f63fcb76095b0a22f4bdcc22bc62a2bd2d28d58bf02fd21754c155a3ec"}, + {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:0724ba4cf41eb40b6cf75250820ab069e44bdf4183ff78857aaf4f0061551075"}, + {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c42420e0686f887040d5230420ed44f0e960ccbfa29a0d65a3acd9ca52459209"}, + {file = "cytoolz-1.0.1-cp39-cp39-win32.whl", hash = "sha256:4ba8b16358ea56b1fe8e637ec421e36580866f2e787910bac1cf0a6997424a34"}, + {file = "cytoolz-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:92d27f84bf44586853d9562bfa3610ecec000149d030f793b4cb614fd9da1813"}, + {file = "cytoolz-1.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:83d19d55738ad9c60763b94f3f6d3c6e4de979aeb8d76841c1401081e0e58d96"}, + {file = "cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f112a71fad6ea824578e6393765ce5c054603afe1471a5c753ff6c67fd872d10"}, + {file = "cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a515df8f8aa6e1eaaf397761a6e4aff2eef73b5f920aedf271416d5471ae5ee"}, + {file = "cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92c398e7b7023460bea2edffe5fcd0a76029580f06c3f6938ac3d198b47156f3"}, + {file = "cytoolz-1.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3237e56211e03b13df47435b2369f5df281e02b04ad80a948ebd199b7bc10a47"}, + {file = "cytoolz-1.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba0d1da50aab1909b165f615ba1125c8b01fcc30d606c42a61c42ea0269b5e2c"}, + {file = "cytoolz-1.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25b6e8dec29aa5a390092d193abd673e027d2c0b50774ae816a31454286c45c7"}, + {file = "cytoolz-1.0.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36cd6989ebb2f18fe9af8f13e3c61064b9f741a40d83dc5afeb0322338ad25f2"}, + {file = "cytoolz-1.0.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47394f8ab7fca3201f40de61fdeea20a2baffb101485ae14901ea89c3f6c95d"}, + {file = "cytoolz-1.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d00ac423542af944302e034e618fb055a0c4e87ba704cd6a79eacfa6ac83a3c9"}, + {file = "cytoolz-1.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a5ca923d1fa632f7a4fb33c0766c6fba7f87141a055c305c3e47e256fb99c413"}, + {file = "cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:058bf996bcae9aad3acaeeb937d42e0c77c081081e67e24e9578a6a353cb7fb2"}, + {file = "cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69e2a1f41a3dad94a17aef4a5cc003323359b9f0a9d63d4cc867cb5690a2551d"}, + {file = "cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67daeeeadb012ec2b59d63cb29c4f2a2023b0c4957c3342d354b8bb44b209e9a"}, + {file = "cytoolz-1.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:54d3d36bbf0d4344d1afa22c58725d1668e30ff9de3a8f56b03db1a6da0acb11"}, + {file = "cytoolz-1.0.1.tar.gz", hash = "sha256:89cc3161b89e1bb3ed7636f74ed2e55984fd35516904fc878cae216e42b2c7d6"}, ] [package.dependencies] @@ -778,6 +838,17 @@ files = [ {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 = "docker-pycreds" version = "0.4.0" @@ -891,6 +962,20 @@ docs = ["sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)" lint = ["black (>=23)", "flake8 (==3.8.3)", "isort (>=5.11.0)", "mypy (==0.971)", "pydocstyle (>=5.0.0)", "types-setuptools"] test = ["hypothesis (>=4.43.0)", "mypy (==0.971)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "types-setuptools"] +[[package]] +name = "eval-type-backport" +version = "0.2.0" +description = "Like `typing._eval_type`, but lets older Python versions use newer typing features." +optional = false +python-versions = ">=3.8" +files = [ + {file = "eval_type_backport-0.2.0-py3-none-any.whl", hash = "sha256:ac2f73d30d40c5a30a80b8739a789d6bb5e49fdffa66d7912667e2015d9c9933"}, + {file = "eval_type_backport-0.2.0.tar.gz", hash = "sha256:68796cfbc7371ebf923f03bdf7bef415f3ec098aeced24e054b253a0e78f7b37"}, +] + +[package.extras] +tests = ["pytest"] + [[package]] name = "exceptiongroup" version = "1.2.2" @@ -905,6 +990,28 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "exchange-calendars" +version = "4.5.6" +description = "Calendars for securities exchanges" +optional = false +python-versions = "~=3.9" +files = [ + {file = "exchange_calendars-4.5.6-py3-none-any.whl", hash = "sha256:5abf5ebcb8ceef0ced36fe4e20071d42517091bf081e6c44354cb343009d672b"}, + {file = "exchange_calendars-4.5.6.tar.gz", hash = "sha256:5db77178cf849f81dd6dcc99995e2163b928c0f45dcd0a2c395958beb1dbb145"}, +] + +[package.dependencies] +korean-lunar-calendar = "*" +numpy = "*" +pandas = ">=1.5" +pyluach = "*" +toolz = "*" +tzdata = "*" + +[package.extras] +dev = ["flake8", "hypothesis", "pip-tools", "pytest", "pytest-benchmark", "pytest-xdist"] + [[package]] name = "fastapi" version = "0.110.3" @@ -940,6 +1047,22 @@ docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2. 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 = "flake8" +version = "7.1.1" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-7.1.1-py2.py3-none-any.whl", hash = "sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213"}, + {file = "flake8-7.1.1.tar.gz", hash = "sha256:049d058491e228e03e67b390f311bbf88fce2dbaa8fa673e7aea87b7198b8d38"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.12.0,<2.13.0" +pyflakes = ">=3.2.0,<3.3.0" + [[package]] name = "flatbuffers" version = "24.3.25" @@ -1350,13 +1473,13 @@ lxml = ["lxml"] [[package]] name = "huggingface-hub" -version = "0.22.2" +version = "0.27.0" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.22.2-py3-none-any.whl", hash = "sha256:3429e25f38ccb834d310804a3b711e7e4953db5a9e420cc147a5e194ca90fd17"}, - {file = "huggingface_hub-0.22.2.tar.gz", hash = "sha256:32e9a9a6843c92f253ff9ca16b9985def4d80a93fb357af5353f770ef74a81be"}, + {file = "huggingface_hub-0.27.0-py3-none-any.whl", hash = "sha256:8f2e834517f1f1ddf1ecc716f91b120d7333011b7485f665a9a412eacb1a2a81"}, + {file = "huggingface_hub-0.27.0.tar.gz", hash = "sha256:902cce1a1be5739f5589e560198a65a8edcfd3b830b1666f36e4b961f0454fac"}, ] [package.dependencies] @@ -1369,19 +1492,33 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] cli = ["InquirerPy (==0.3.4)"] -dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] hf-transfer = ["hf-transfer (>=0.1.4)"] -inference = ["aiohttp", "minijinja (>=1.0)"] -quality = ["mypy (==1.5.1)", "ruff (>=0.3.0)"] +inference = ["aiohttp"] +quality = ["libcst (==1.4.0)", "mypy (==1.5.1)", "ruff (>=0.5.0)"] tensorflow = ["graphviz", "pydot", "tensorflow"] tensorflow-testing = ["keras (<3.0)", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] -torch = ["safetensors", "torch"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors[torch]", "torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] +[[package]] +name = "identify" +version = "2.6.3" +description = "File identification library for Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "identify-2.6.3-py2.py3-none-any.whl", hash = "sha256:9edba65473324c2ea9684b1f944fe3191db3345e50b6d04571d10ed164f8d7bd"}, + {file = "identify-2.6.3.tar.gz", hash = "sha256:62f5dae9b5fef52c84cc188514e9ea4f3f636b1d8799ab5ebc475471f9e47a02"}, +] + +[package.extras] +license = ["ukkonen"] + [[package]] name = "idna" version = "3.10" @@ -1434,6 +1571,20 @@ files = [ docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] testing = ["pytest (>=3.5,!=3.7.3)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler", "pytest-flake8", "pytest-mypy"] +[[package]] +name = "isort" +version = "5.13.2" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, +] + +[package.extras] +colors = ["colorama (>=0.4.6)"] + [[package]] name = "jinja2" version = "3.1.4" @@ -1451,6 +1602,28 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + +[[package]] +name = "joblib" +version = "1.4.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + [[package]] name = "keras" version = "3.7.0" @@ -1472,6 +1645,17 @@ optree = "*" packaging = "*" rich = "*" +[[package]] +name = "korean-lunar-calendar" +version = "0.3.1" +description = "Korean Lunar Calendar" +optional = false +python-versions = "*" +files = [ + {file = "korean_lunar_calendar-0.3.1-py3-none-any.whl", hash = "sha256:392757135c492c4f42a604e6038042953c35c6f449dda5f27e3f86a7f9c943e5"}, + {file = "korean_lunar_calendar-0.3.1.tar.gz", hash = "sha256:eb2c485124a061016926bdea6d89efdf9b9fdbf16db55895b6cf1e5bec17b857"}, +] + [[package]] name = "levenshtein" version = "0.26.1" @@ -1591,6 +1775,24 @@ files = [ {file = "libclang-18.1.1.tar.gz", hash = "sha256:a1214966d08d73d971287fc3ead8dfaf82eb07fb197680d8b3859dbbbbf78250"}, ] +[[package]] +name = "loguru" +version = "0.7.3" +description = "Python logging made (stupidly) simple" +optional = false +python-versions = "<4.0,>=3.5" +files = [ + {file = "loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c"}, + {file = "loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6"}, +] + +[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 (==8.1.3)", "build (==1.2.2)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.5.0)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.13.0)", "mypy (==v1.4.1)", "myst-parser (==4.0.0)", "pre-commit (==4.0.1)", "pytest (==6.1.2)", "pytest (==8.3.2)", "pytest-cov (==2.12.1)", "pytest-cov (==5.0.0)", "pytest-cov (==6.0.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.1.0)", "sphinx-rtd-theme (==3.0.2)", "tox (==3.27.1)", "tox (==4.23.2)", "twine (==6.0.1)"] + [[package]] name = "lxml" version = "5.3.0" @@ -1857,6 +2059,17 @@ files = [ {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + [[package]] name = "mdurl" version = "0.1.2" @@ -1915,6 +2128,23 @@ files = [ {file = "more_itertools-10.5.0-py3-none-any.whl", hash = "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef"}, ] +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + [[package]] name = "msgpack" version = "1.1.0" @@ -2136,6 +2366,70 @@ six = "*" testing = ["astroid (>=1.5.3,<1.6.0)", "astroid (>=2.0)", "coverage", "pylint (>=1.7.2,<1.8.0)", "pylint (>=2.3.1,<2.4.0)", "pytest"] yaml = ["PyYAML (>=5.1.0)"] +[[package]] +name = "mypy" +version = "1.13.0" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, + {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, + {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, + {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, + {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, + {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, + {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, + {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, + {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, + {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, + {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, + {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, + {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, + {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, + {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, + {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, + {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, + {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, + {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, + {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, + {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, + {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=4.6.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +faster-cache = ["orjson"] +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 = "namex" version = "0.0.8" @@ -2172,6 +2466,35 @@ files = [ [package.extras] nicer-shell = ["ipython"] +[[package]] +name = "networkx" +version = "3.2.1" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.9" +files = [ + {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, + {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, +] + +[package.extras] +default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[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" @@ -2217,6 +2540,161 @@ files = [ {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] +[[package]] +name = "nvidia-cublas-cu12" +version = "12.4.5.8" +description = "CUBLAS native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3"}, + {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b"}, + {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-win_amd64.whl", hash = "sha256:5a796786da89203a0657eda402bcdcec6180254a8ac22d72213abc42069522dc"}, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.4.127" +description = "CUDA profiling tools runtime libs." +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a"}, + {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb"}, + {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:5688d203301ab051449a2b1cb6690fbe90d2b372f411521c86018b950f3d7922"}, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.4.127" +description = "NVRTC native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198"}, + {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338"}, + {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:a961b2f1d5f17b14867c619ceb99ef6fcec12e46612711bcec78eb05068a60ec"}, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.4.127" +description = "CUDA Runtime native Libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3"}, + {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5"}, + {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:09c2e35f48359752dfa822c09918211844a3d93c100a715d79b59591130c5e1e"}, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "9.1.0.70" +description = "cuDNN runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"}, + {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.2.1.3" +description = "CUFFT native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399"}, + {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9"}, + {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-win_amd64.whl", hash = "sha256:d802f4954291101186078ccbe22fc285a902136f974d369540fd4a5333d1440b"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.5.147" +description = "CURAND native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9"}, + {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b"}, + {file = "nvidia_curand_cu12-10.3.5.147-py3-none-win_amd64.whl", hash = "sha256:f307cc191f96efe9e8f05a87096abc20d08845a841889ef78cb06924437f6771"}, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.6.1.9" +description = "CUDA solver native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e"}, + {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260"}, + {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-win_amd64.whl", hash = "sha256:e77314c9d7b694fcebc84f58989f3aa4fb4cb442f12ca1a9bde50f5e8f6d1b9c"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" +nvidia-cusparse-cu12 = "*" +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.3.1.170" +description = "CUSPARSE native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3"}, + {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1"}, + {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-win_amd64.whl", hash = "sha256:9bc90fb087bc7b4c15641521f31c0371e9a612fc2ba12c338d3ae032e6b6797f"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.21.5" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0"}, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.4.127" +description = "Nvidia JIT LTO Library" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.4.127" +description = "NVIDIA Tools Extension" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3"}, + {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a"}, + {file = "nvidia_nvtx_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:641dccaaa1139f3ffb0d3164b4b84f9d253397e38246a4f2f36728b48566d485"}, +] + [[package]] name = "opt-einsum" version = "3.4.0" @@ -2433,6 +2911,26 @@ sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-d test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] xml = ["lxml (>=4.9.2)"] +[[package]] +name = "pandas-market-calendars" +version = "4.4.2" +description = "Market and exchange trading calendars for pandas" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pandas_market_calendars-4.4.2-py3-none-any.whl", hash = "sha256:52a0fea562113d511f3f1ae372e2a86e4a37147dacec9644094ff6f88aee8d53"}, + {file = "pandas_market_calendars-4.4.2.tar.gz", hash = "sha256:4261a2c065565de1cd3646982b2e206e1069714b8140878dd6eba972546dfbcb"}, +] + +[package.dependencies] +exchange-calendars = ">=3.3" +pandas = ">=1.1" +python-dateutil = "*" +pytz = "*" + +[package.extras] +dev = ["black", "pre-commit", "pytest"] + [[package]] name = "password-strength" version = "0.0.3.post2" @@ -2447,6 +2945,17 @@ files = [ [package.dependencies] six = "*" +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + [[package]] name = "peewee" version = "3.17.8" @@ -2457,6 +2966,40 @@ files = [ {file = "peewee-3.17.8.tar.gz", hash = "sha256:ce1d05db3438830b989a1b9d0d0aa4e7f6134d5f6fd57686eeaa26a3e6485a8c"}, ] +[[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 = "pre-commit-hooks" version = "5.0.0" @@ -2565,22 +3108,22 @@ files = [ [[package]] name = "protobuf" -version = "4.25.5" +version = "5.29.2" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.5-cp310-abi3-win32.whl", hash = "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8"}, - {file = "protobuf-4.25.5-cp310-abi3-win_amd64.whl", hash = "sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea"}, - {file = "protobuf-4.25.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2fde3d805354df675ea4c7c6338c1aecd254dfc9925e88c6d31a2bcb97eb173"}, - {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:919ad92d9b0310070f8356c24b855c98df2b8bd207ebc1c0c6fcc9ab1e007f3d"}, - {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fe14e16c22be926d3abfcb500e60cab068baf10b542b8c858fa27e098123e331"}, - {file = "protobuf-4.25.5-cp38-cp38-win32.whl", hash = "sha256:98d8d8aa50de6a2747efd9cceba361c9034050ecce3e09136f90de37ddba66e1"}, - {file = "protobuf-4.25.5-cp38-cp38-win_amd64.whl", hash = "sha256:b0234dd5a03049e4ddd94b93400b67803c823cfc405689688f59b34e0742381a"}, - {file = "protobuf-4.25.5-cp39-cp39-win32.whl", hash = "sha256:abe32aad8561aa7cc94fc7ba4fdef646e576983edb94a73381b03c53728a626f"}, - {file = "protobuf-4.25.5-cp39-cp39-win_amd64.whl", hash = "sha256:7a183f592dc80aa7c8da7ad9e55091c4ffc9497b3054452d629bb85fa27c2a45"}, - {file = "protobuf-4.25.5-py3-none-any.whl", hash = "sha256:0aebecb809cae990f8129ada5ca273d9d670b76d9bfc9b1809f0a9c02b7dbf41"}, - {file = "protobuf-4.25.5.tar.gz", hash = "sha256:7f8249476b4a9473645db7f8ab42b02fe1488cbe5fb72fddd445e0665afd8584"}, + {file = "protobuf-5.29.2-cp310-abi3-win32.whl", hash = "sha256:c12ba8249f5624300cf51c3d0bfe5be71a60c63e4dcf51ffe9a68771d958c851"}, + {file = "protobuf-5.29.2-cp310-abi3-win_amd64.whl", hash = "sha256:842de6d9241134a973aab719ab42b008a18a90f9f07f06ba480df268f86432f9"}, + {file = "protobuf-5.29.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a0c53d78383c851bfa97eb42e3703aefdc96d2036a41482ffd55dc5f529466eb"}, + {file = "protobuf-5.29.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:494229ecd8c9009dd71eda5fd57528395d1eacdf307dbece6c12ad0dd09e912e"}, + {file = "protobuf-5.29.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:b6b0d416bbbb9d4fbf9d0561dbfc4e324fd522f61f7af0fe0f282ab67b22477e"}, + {file = "protobuf-5.29.2-cp38-cp38-win32.whl", hash = "sha256:e621a98c0201a7c8afe89d9646859859be97cb22b8bf1d8eacfd90d5bda2eb19"}, + {file = "protobuf-5.29.2-cp38-cp38-win_amd64.whl", hash = "sha256:13d6d617a2a9e0e82a88113d7191a1baa1e42c2cc6f5f1398d3b054c8e7e714a"}, + {file = "protobuf-5.29.2-cp39-cp39-win32.whl", hash = "sha256:36000f97ea1e76e8398a3f02936aac2a5d2b111aae9920ec1b769fc4a222c4d9"}, + {file = "protobuf-5.29.2-cp39-cp39-win_amd64.whl", hash = "sha256:2d2e674c58a06311c8e99e74be43e7f3a8d1e2b2fdf845eaa347fbd866f23355"}, + {file = "protobuf-5.29.2-py3-none-any.whl", hash = "sha256:fde4554c0e578a5a0bcc9a276339594848d1e89f9ea47b4427c80e5d72f90181"}, + {file = "protobuf-5.29.2.tar.gz", hash = "sha256:b2cc8e8bb7c9326996f0e160137b0861f1a82162502658df2951209d0cb0309e"}, ] [[package]] @@ -2626,196 +3169,197 @@ files = [ [[package]] name = "py-bip39-bindings" -version = "0.1.12" +version = "0.2.0" description = "Python bindings for tiny-bip39 RUST crate" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "py_bip39_bindings-0.1.12-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:830a1cd07b46f84d07b9807ea1e378e947d95f9f69a1b4acc5012cf2e9336e47"}, - {file = "py_bip39_bindings-0.1.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ad84b1ca46329f23c808889d97bd79cc8a2c48e0b9fbf0ecefd16ba8c4e54761"}, - {file = "py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3772e233a03a322cd7d6587c393f24a6f98059fbeb723b05c536489671a9ae8a"}, - {file = "py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f28937f25cc9fcae37992460be1281e8d55973f8998c7d72e7b5047d3ead375a"}, - {file = "py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:332d6340201341dd87b1d5764ba40fd3b011b1f152145104d733c378a2af2970"}, - {file = "py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79daf697315084d1f91e865fae042e067c818c790dfdc6d2e65b8f9d119fc703"}, - {file = "py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7764520c8b347ff4f3ead955f2044644ab89dc82e61f3bf5b9baa45ff03b389b"}, - {file = "py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:09ca55cde30aea939c86cdadca13d7b500da414070b95fc5bf93ebdb0ec14cd7"}, - {file = "py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6e4e36c2474b946dab0c1019ac38be797073d9336e4735d574cd38cc506e5857"}, - {file = "py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:534609eef941e401aaba7fc54903e219bbe9bd652d02df1d275f242e28833aa0"}, - {file = "py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:260b61bbbed75afe4f5e2caeaefa0d844650c5bcde02dadbd963d73253554475"}, - {file = "py_bip39_bindings-0.1.12-cp310-none-win32.whl", hash = "sha256:b13e44670e34e2d28d1856bba82a362ed4b84822c73bdd23f57e941da0f7d489"}, - {file = "py_bip39_bindings-0.1.12-cp310-none-win_amd64.whl", hash = "sha256:09a1ed423242dccd5016eec18e74c80236d468ef2e85d3297615ddb4e792cd77"}, - {file = "py_bip39_bindings-0.1.12-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:200ce6173c330af830177944d18402b4861f1dd1b52a410a6c02d95f69f04b92"}, - {file = "py_bip39_bindings-0.1.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:808f1042c31e8373bcd56be45fbebbeae2ab2e90b91178bc4d5cfad13f235f34"}, - {file = "py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da4c11662304beb093dfaa24f5a3b036d4e76c21de7dafd2bd43d0e78325b377"}, - {file = "py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4af354d2e138304c20fffa0820aa79f9b4ee4de3f1db4e4b77cd0fdf72c39fc2"}, - {file = "py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a337fd6eaf16bf8c42752d9a25fd58bb303499da5d6428b466eff7ddb642237"}, - {file = "py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d72041b34d6a7ba5e83009cb96c59c48b356eb3831a0ab627421e1fcdec83c9a"}, - {file = "py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e48ab058ac4cfdcb6bdaefc8bb555a6d36b11673589332d6336495d388a4902"}, - {file = "py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cbd4865d3ef310fbad03197511423376ff8fea162d8d14c4259ee086be249b74"}, - {file = "py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:b7eafc0ab28d5835789abc82d2443aec7154c0bca8b627597ab7b4761bb3d8ac"}, - {file = "py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:97e739430d3b7801a4afd0e767c82554b92ba727b52c8c3a1ed9f9b676c176e3"}, - {file = "py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6c3a446e7cb339f8d58659bf0bbf8b549482c2eefc37c7573b84150de4423d7"}, - {file = "py_bip39_bindings-0.1.12-cp311-none-win32.whl", hash = "sha256:6e9c09a916ac890ea629ad8334b02e43ce7d1887426d74c7c69f82d0820f66db"}, - {file = "py_bip39_bindings-0.1.12-cp311-none-win_amd64.whl", hash = "sha256:f3480cb2e99b7d0ffae676d2d59a844623cee4c73fbed5c9bb3069b9a9845859"}, - {file = "py_bip39_bindings-0.1.12-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a65facd53ff11314a1e2411fced145daa3a07448c40d8aff87b22dec703d631c"}, - {file = "py_bip39_bindings-0.1.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd1490d168409763b846df691e14756c1461b1edf62343ad72c4b1e00918798d"}, - {file = "py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21bc7bfb907ebb4805b83f4e674dbe2745dd505d22472eefb65dec09c679a718"}, - {file = "py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1aa1cf5a76ea8280f2f684593f1456d8f459f200f13e7e1c351e27001310ae1"}, - {file = "py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:950a127bf0a71be0a163bcce16d9cbb227e80da4f12ffcc0effecd9743c806d7"}, - {file = "py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7ad2ed21601f40037e912e87725bb3e3aef1635fdd84eae21d5bbb0034d5727"}, - {file = "py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aed015ca58ae7e9912e7cead85feba9ce7ccabd6605d76c436615fbc035278a5"}, - {file = "py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5f6aab32cd3cc0fd7fb72247bada0cb269c3fc120dbdf12cfa06af1e5d3243"}, - {file = "py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d4f62d125f9cd9a3bf183d1cc3d0ff794e78185098c61c6392221a00e15dc4c7"}, - {file = "py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:25f3f6ab788d14a56691cbef8ad3345040c358fced832338b81fb87e9951ea5e"}, - {file = "py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fdf3c4d3acbb772c5e90da1f24db39b889d9e69b442925ebe56244a89fc24f9"}, - {file = "py_bip39_bindings-0.1.12-cp312-none-win32.whl", hash = "sha256:c7af72b8afcac625d69acd40f714963725d8078bee57c36844ae1b924d6490d2"}, - {file = "py_bip39_bindings-0.1.12-cp312-none-win_amd64.whl", hash = "sha256:1dedf9899cb9cc6000373858ea9d7069ff4d961d4c53f6624496ff31fb4398f8"}, - {file = "py_bip39_bindings-0.1.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fc0b89d9075e7953512d06e02bc8865e7da4cf7061e8454a8b42d6030a06e06"}, - {file = "py_bip39_bindings-0.1.12-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8311c96ecf7924d57170159c984fc638f2a57ae79eef23799d4f3f8fb0ea0be6"}, - {file = "py_bip39_bindings-0.1.12-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ed3ad284923e70ceeb5dc2e75bc8773c0ad52ca41aca34ec92b81d9b370b9a5"}, - {file = "py_bip39_bindings-0.1.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:472af4061746f3df6933271b919c53ef28d7cfa98801888ef4f1a97559153c19"}, - {file = "py_bip39_bindings-0.1.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f6e3a3528a3b00113f491ec63b38a1994e7439372a88419926a5671098e69eb0"}, - {file = "py_bip39_bindings-0.1.12-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:5d9bd8b18ff5ada4890425103fc404021bbf10b4fed9f42cb2f9ccbc7048314f"}, - {file = "py_bip39_bindings-0.1.12-cp37-cp37m-musllinux_1_2_armv7l.whl", hash = "sha256:2a49972d462b0617d478b1b38a44eb6ce6e4752d6f76df79421693ac21a06039"}, - {file = "py_bip39_bindings-0.1.12-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:e15994ac3507a77e86218e286cdacc3b5c3439effcf8b6b9f56be81c889c7654"}, - {file = "py_bip39_bindings-0.1.12-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:44ad459b210b0b3e834878a92e5ab52662c544cfc10ba225db7fd34efb6b40fe"}, - {file = "py_bip39_bindings-0.1.12-cp37-none-win32.whl", hash = "sha256:74b7505ceb5cda18cd2ff3c715b19ce160ae4e303d4d4c1081c93cc11601cd11"}, - {file = "py_bip39_bindings-0.1.12-cp37-none-win_amd64.whl", hash = "sha256:aada0bb86b457d08cd4475f90b8e0ebd05b05a1c67da0507b0a3050a31e39f76"}, - {file = "py_bip39_bindings-0.1.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e37498866fe2cb7dfb2ca1c5fefb45257ed298d3f6d10584497f2851441c975"}, - {file = "py_bip39_bindings-0.1.12-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f9bc513f94a93bff54b8941ca85666fa2e476a6a430ca68bcea0767342225d9"}, - {file = "py_bip39_bindings-0.1.12-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:24ebfd63786707b6be86bb34478e0f14200e2b046722601001552f5e997f12ce"}, - {file = "py_bip39_bindings-0.1.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fedcf19d9a72670400b417173f239a3e455b3ea40e06398a2d9f11970358ceb5"}, - {file = "py_bip39_bindings-0.1.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db374557720ceb6e42a976395d9b4d53f6c91ba7e372d3538c79e2369f7a98bc"}, - {file = "py_bip39_bindings-0.1.12-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:96e8b7035077026fa6c36d09195cc7b65be0a47a8dcc947c8482e4ee6f45cef1"}, - {file = "py_bip39_bindings-0.1.12-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:5f5dbb28b583d324f693d5a3e0e15a995788298e530dfcbd367921a471587698"}, - {file = "py_bip39_bindings-0.1.12-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5d209d95e6d675c7d5d335d96987fe4a9d4b2d7e30ae2266406915a6479bbc2d"}, - {file = "py_bip39_bindings-0.1.12-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:78b2e516449321761314f4490013be21ed1d70a156a742f5875d4d81bc78a36a"}, - {file = "py_bip39_bindings-0.1.12-cp38-none-win32.whl", hash = "sha256:4f5d1fe3e31a98d2563267da9f3c7342187d062e8ba5e47203e62c5afab7b9b2"}, - {file = "py_bip39_bindings-0.1.12-cp38-none-win_amd64.whl", hash = "sha256:5199fc82b703a2e68957ba8e190772cb70cdb11fc0276e9b4a756b572122a137"}, - {file = "py_bip39_bindings-0.1.12-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bf359da1ac1648f851754ddf230ab228986653d87af7ade00e11d7ee59feba14"}, - {file = "py_bip39_bindings-0.1.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:596c266afc617de543153ee95184c1ff54e355194a44bc0be962798a197cf367"}, - {file = "py_bip39_bindings-0.1.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a524054b860730d76b4bf81a3f71ea82e1e74bb0dd5192019b06a31c80393e1"}, - {file = "py_bip39_bindings-0.1.12-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:11c43577a8a5cc55e88b07507fd9bde7885b948d1319c3850945b135a54b4285"}, - {file = "py_bip39_bindings-0.1.12-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ee82d050e97cce6ac8298bb77119e9aaff2a51feec07e6682fd3b8dba405cf7"}, - {file = "py_bip39_bindings-0.1.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ae80c05dbe60d55691ee948927e80bef4e846c652735c639c571578e1686c1"}, - {file = "py_bip39_bindings-0.1.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3999ce6d43cb3ea9d23b41883f2284326647604a91dd23030973d345691838f2"}, - {file = "py_bip39_bindings-0.1.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d0b160e9999e331e574135784136f500924a36d57d0c738a778b09abc36a495"}, - {file = "py_bip39_bindings-0.1.12-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:8c202356183a467307930a8da21c6a1e6a2a4ce4841805dcfec0629229265ac4"}, - {file = "py_bip39_bindings-0.1.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:7b0f6f92da76fec954c3199ff94c6ae080e174ee33b7241fe75d921d5c9954ef"}, - {file = "py_bip39_bindings-0.1.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6fef2cb2525609d2881685e5ea383d93ba1a1aa2e8c2d94fb72d8e005fafe70c"}, - {file = "py_bip39_bindings-0.1.12-cp39-none-win32.whl", hash = "sha256:89b7c4a1194dc2b1edbd05532d6ba193ad5c0ada03d5a0a78744ef723007ceb5"}, - {file = "py_bip39_bindings-0.1.12-cp39-none-win_amd64.whl", hash = "sha256:43d831223bc76cdee33ef5668a736db098a0c20e80f9e10bd2574253ec8a5e5c"}, - {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60e46ecd3bee23f4e458303ace7c86c592cff2d28860808a5e46398f915035a"}, - {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:71afa142cf045b4d7743a96aef66f030342a8f287a83733c6841d3b005954c52"}, - {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c65ba92ec43ef78c5926506437b62d959ac4e343f8bf2cfc8ed799c3a6495f23"}, - {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf3a5ec5095f56dbf0ab8258d722d860746e807c5ace99ea5ab92000268a750b"}, - {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6232b0b8dfecd73bbc4dc4865f1c0b10d00df63dc19ad7448b5e5e45fdd279e7"}, - {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:fd13f3ba45ea56f2db85a66c1d8b03337ec8977b0a00a02448f4f65112638177"}, - {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:bc00a31943d3d6d6a1ab61321d0c14675f4f1452165ab712c90c8368f754648a"}, - {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d9f96bb10320a1ddd354ea639c434cfb1e594d4a1cb9425a476f06fc04aa18d2"}, - {file = "py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e106a1d6d1106cf40a49b3e17748c89fd9561a3aeeb98725dca9ce751c780e16"}, - {file = "py_bip39_bindings-0.1.12-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:028efb46d7823347b4a89822debf6a4aec45e32d5e1bc41c9b9e7e3e1262c622"}, - {file = "py_bip39_bindings-0.1.12-pp37-pypy37_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:caa6590d00cfbc48477811aee439254ca702568ca248487e8550a1d9a737efd3"}, - {file = "py_bip39_bindings-0.1.12-pp37-pypy37_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bee3de0777c914ba39f65882a0e2d1ff27377a01d516e81f462c4a0cebe41529"}, - {file = "py_bip39_bindings-0.1.12-pp37-pypy37_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:352b5af9916dd819570a22114f15c69b9a3abbd9fd48f0d8d3ae8a7461becc7d"}, - {file = "py_bip39_bindings-0.1.12-pp37-pypy37_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:ae023404b40c542169acce708047ba2df5f854815b4c26173484f220cb249109"}, - {file = "py_bip39_bindings-0.1.12-pp37-pypy37_pp73-musllinux_1_2_i686.whl", hash = "sha256:12886fc8e517224caef0f574a4cd1e56eb625fca32a1a9544551f7bb85f87739"}, - {file = "py_bip39_bindings-0.1.12-pp37-pypy37_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8b1ecc43e62f75cc2184c4a781cdc991636eb1b9d958fe79b5e2294327418b4b"}, - {file = "py_bip39_bindings-0.1.12-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6dc1803dedebca90327f41c4479dd4bb0ac7f5d75d4ea626737f137569288a8"}, - {file = "py_bip39_bindings-0.1.12-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:027266306c4f72ee3eeb3b4a9114a2b5f05c61b620127ca5e48f55ad0f40c3da"}, - {file = "py_bip39_bindings-0.1.12-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35a7b8324c3f1c1be522484d829433587e08318772998c5b8b0c3c26a6430ae"}, - {file = "py_bip39_bindings-0.1.12-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4e3f31d513f69043648a91a8ab500a12aa1945c60bb7d245ef4891ec8c22f123"}, - {file = "py_bip39_bindings-0.1.12-pp38-pypy38_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:39fde6be4b2dd765359d470d9fbef5f892c87f17b9569d621a4d85970082059c"}, - {file = "py_bip39_bindings-0.1.12-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:cb898867f198ed7e8a446464d275d81f627e32371eb4730d2c916317a3844a08"}, - {file = "py_bip39_bindings-0.1.12-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dea4f82f5e3997b7633c03c5618f41b89d220008dcb9fb067303a796c8aa5726"}, - {file = "py_bip39_bindings-0.1.12-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0222bc5d439151db46a00cba51a4d4b1d4bad453e760f0904b506e296c5d7b5"}, - {file = "py_bip39_bindings-0.1.12-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:451217d29b37c0d168b1dc4e9c29d0960ffc0d1857e9dfe9d90089c8044820b6"}, - {file = "py_bip39_bindings-0.1.12-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c012eb605dd09d2d161438bde8dad7d75c13a8fef7ecaa5f463f0dfd2e1a2a8f"}, - {file = "py_bip39_bindings-0.1.12-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e0f85a2a460a8e7241b42e3caba9a5afc3ea6e4d47c6dd39d3d490583418cfd0"}, - {file = "py_bip39_bindings-0.1.12-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:436bae87732b90eb315845a95a41446dc0e5dbe77ea6c018b28d2b73a489ef04"}, - {file = "py_bip39_bindings-0.1.12-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4d6c13fb07cd7d4068fb2a82f91217d7ea8962ebbeffa88f9aa57e4d24b38f0c"}, - {file = "py_bip39_bindings-0.1.12-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:bbe75eb05d5cadbb32cb6db0d0af53fe2c64ce70121e2704111ada8575778255"}, - {file = "py_bip39_bindings-0.1.12.tar.gz", hash = "sha256:56f446e665a4511e9e7dab807a908ca692247a257e141f76633110e3d30e53af"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a9379172311aa9cdca13176fa541a7a8d5c99bb36360a35075b1687ca2a68f8"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f423282376ef9f080d52b213aa5800b78ba4a5c0da174679fe1989e632fd1def"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c61f08ee3a934932fb395a01b5f8f22e530e6c57a097fab40571ea635e28098"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8254c1b630aea2d8d3010f7dae4ed8f55f0ecc166122314b76c91541aeeb4df0"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e68c0db919ebba87666a947efafa92e41beeaf19b254ce3c3787085ab0c5829"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d36d468abc23d31bf19e3642b384fe28c7600c96239d4436f033d744a9137079"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f5ac37b6c6f3e32397925949f9c738e677c0b6ac7d3aa01d813724d86ce9045e"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8a1f2353c7fdbec4ea6f0a6a088cde076523b3bfce193786e096c4831ec723bb"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cb05d97ed2d018a08715ff06051c8de75c75b44eb73a428aaa204b56ce69d8f4"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-win32.whl", hash = "sha256:588ec726717b3ceaabff9b10d357a3a042a9a6cc075e3a9e14a3d7ba226c5ddf"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:4e5e2af6c4b6a3640648fb28c8655b4a3275cee9a5160de8ec8db5ab295b7ec9"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2af7c8dedaa1076002872eda378153e053e4c9f5ce39570da3c65ce7306f4439"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:08e03bc728aa599e3cfac9395787618308c8b8e6f35a9ee0b11b73dcde72e3fc"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f052e5740d500e5a6a24c97e026ce152bbee58b56f2944ed455788f65658884"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd441833b21a5da2ccfebbdf800892e41282b24fc782eabae2a576e3d74d67f8"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f39ac5d74640d1d48c80404e549be9dc5a8931383e7f94ee388e4d972b571f42"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55ee7185bb1b5fb5ec4abcdea1ad89256dc7ee7e9a69843390a98068832169d6"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:42a00be8009d3c396bc9719fc743b85cb928cf163b081ad6ead8fc7c9c2fefdb"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ccc54690103b537f6650a8053f905e56772ae0aeb7e456c062a290357953f292"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:59a954b4e22e3cb3da441a94576002eaaba0b9ad75956ebb871f9b8e8bd7044a"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:54ac4841e7f018811b0ffa4baae5bce82347f448b99c13b030fb9a0c263efc3d"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2d1cdceebf62c804d53ff676f14fcadf43eeac7e8b10af2058f9387b9417094d"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-win32.whl", hash = "sha256:be0786e712fb32efc55f06270c3da970e667dcec7f116b3defba802e6913e834"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:82593f31fb59f5b42ffdd4b177e0472ec32b178321063a93f6d609d672f0a087"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c763de71a7c83fcea7d6058a516e8ee3fd0f7111b6b02173381c35f48d96b090"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c61f65286fe314c28a4cf78f92bd549dbcc8f2dad99034ec7b47a688b2695cae"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:287301a2406e18cfb42bcc1b38cbd390ed11880cec371cd45471c00f75c3db8c"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:69c55c11228f91de55415eb31d5e5e8007b0544a48e2780e521a15a3fb713e8f"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ec5e6adb8ea6ffa22ed701d9749a184a203005538e276dcd2de183f27edebef"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831b0649d603b2e7905e09e39e36955f756abb19200beb630afc168b5c03d681"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:629399c400d605fbcb8de5ea942634ac06940e733e43753e0c23aee96fee6e45"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:15daa05fa85564f3ef7f3251ba9616cfc48f48d467cbecaf241194d0f8f62194"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:236aa7edb9ad3cade3e554743d00a620f47a228f36aa512dd0ee2fa75ea21c44"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:677ad9a382e8c2e73ca61f357a9c20a45885cd407afecc0c6e6604644c6ddfdc"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5f3b7bc29eda6ad7347caf07a91941a1c6a7c5c94212ffec7b056a9c4801911e"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-win32.whl", hash = "sha256:41f12635c5f0af0e406054d3a3ba0fad2045dfed461f43182bfa24edf11d90ca"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:e3a4f2e05b6aaabbe3e59cebab72b57f216e118e5e3f167d93ee9b9e2257871b"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:21eed9f92eaf9746459cb7a2d0c97b98c885c51a279ec5bbf0b7ff8c26fe5bcc"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:350e83133f4445c038d39ada05add91743bbff904774b220e5b143df4ca7c4c3"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c46c3aca25f0c9840303d1fc16ad21b3bc620255e9a09fe0f739108419029245"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57bd5454a3f4cad68ebb3b5978f166cb01bf0153f39e7bfc83af99399f142374"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8039f96b52b4ab348e01459e24355b62a6ad1d6a6ab9b3fcb40cfc404640ca9f"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6919cd972bad09afacd266af560379bafc10f708c959d2353aea1584019de023"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4737db37d8800eb2de056b736058b7d3f2d7c424320d26e275d9015b05b1f562"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:98df51a42035466cab5dfb69faec63c2e666c391ff6746a8603cc9cabfcebe24"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d55c6af3cebb5c640ff12d29d7ca152d2b8188db49b0a53fc52fd2a748a7e231"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:eae5c4956613134ec5abc696121272a6ce7107af1509d8cdea3e24db1dff351b"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:071c4e67e9ae4a5ae12d781483f3a46d81d6b20be965dade39044ed0f89df34a"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7642f598e9cd7caddcc2f57f50335a16677c02bb9a7c9bb01b1814ddab85bb5"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0d0cff505237fd8c7103243f242610501afcd8a917ce484e50097189a7115c55"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fec3d7b30980978bd73103e27907ca37766762c21cfce1abcc6f9032d54274f"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:876006fa8936ad413d2f53e67246478fc94c19d38dc45f6bfd5f9861853ac999"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e6064feb105ed5c7278d19e8c4e371710ce56adcdd48e0c5e6b77f9b005201b9"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0cb7a39bd65455c4cc3feb3f8d5766644410f32ac137aeea88b119c6ebe2d58b"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:58743e95cedee157a545d060ee401639308f995badb91477d195f1d571664b65"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84f4c53eab32476e3a9dd473ad4e0093dd284e7868da886d37a0be9e67ec7509"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e219d724c39cbaaabab1d1f10975399d46ba83a228437680dc29ccb7c8b4d38d"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fda7efd3befc614966169c10a4d5f60958698c13d4d0b97f069540220b45544"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5319b6ad23e46e8521fa23c0204ba22bbc5ebc5002f8808182b07c216223b8ed"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1b1de6b2e12a7992aa91501e80724b89a4636b91b22a2288bae5c417e358466"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:bae82c4505a79ed7f621d45e9ea225e7cd5e0804ce4c8022ab7a2b92bd007d53"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:d42d44532f395c59059551fd030e91dd39cbe1b30cb7a1cf7636f9a6a6a36a94"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a29bca14abb51449bd051d59040966c6feff43b01f6b8a9669d876d7195d215f"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e7cb5aefdbc142b5c9b56b2c89c0112fd2288d52be8024cf1f1b66a4b84e3c83"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-win32.whl", hash = "sha256:e846c0eebeb0b684da4d41ac0751e510f91d7568cc9bc085cb93aa50d9b1ee6e"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0a2024c9e9a5b9d90ab9c1fdaddd1abb7e632ef309efc4b89656fc25689c4456"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e3438f2568c1fdd8862a9946800570dbb8665b6c46412fa60745975cd82083a"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d5339d0b99d2ce9835f467ed3790399793ed4d51982881ff9c1f854649055d42"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:856b69bc125c40264bf9e749efc1b66405b27cfc4c7f96cd3c5e6a657b143859"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91cffd83189f42f2945693786104c51fa775ba8f09c532bf8c504916d6ddb565"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c72195aa802a36ad81bcc07fc23d59b83214511b1569e5cb245402a9209614e7"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a5224fc1417d35413f914bbe414b276941dd1d03466ed8a8a259dc4fa330b60c"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:86265b865bcacd3fcd30f89012cd248142d3eb6f36785c213f00d2d84d41e6fc"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:96337e30589963b6b849415e0c1dc9fe5c671f51c1f10e10e40f825460078318"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:07f2cd20581104c2bc02ccf90aaeb5e31b7dda2bbdb24afbaef69d410eb18bf0"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-win32.whl", hash = "sha256:d26f9e2007c1275a869711bae2d1f1c6f99feadc3ea8ebb0aed4b69d1290bfa9"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3e79ad1cbf5410db23db6579111ed27aa7fac38969739040a9e3909a10d303fc"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2491fc1a1c37052cf9538118ddde51c94a0d85804a6d06fddb930114a8f41385"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5ecf247c9ea0c32c37bdde2db616cf3fff3d29a6b4c8945957f13e4c9e32c71a"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ce39808c717b13c02edca9eea4d139fc4d86c01acad99efb113b04e9639e2b9"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c5f38b01283e5973b1dfcdedc4e941c463f89879dc5d86463e77e816d240182"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fb1503c87e3d97f6802b28bd3b808ce5f0d88b7a38ed413275616d1962f0a6d"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e9ae6318f14bf8683cc11714516a04ac60095eab1aaf6ca6d1c99d508e399c64"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:7be4ac068391c80fdee956f7c4309533fcf7a4fae45dec46179af757961efefc"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e26059b46eff40ccb282966c49c475633cd7d3a1c08780fff3527d2ff247a014"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e8a63d04f68269e7e42219b30ff1e1e013f08d2fecef3f39f1588db512339509"}, + {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b85cb77708a4d1aceac8140604148c97894d3e7a3a531f8cfb82a85c574e4ac"}, + {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57a0c57a431fcd9873ae3d00b6227e39b80e63d9924d74a9f34972fd9f2e3076"}, + {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28bc089c7a7f22ac67de0e9e8308873c151cac9c5320c610392cdcb1c20e915e"}, + {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bfcec453c1069e87791ed0e1bc7168bbc3883dd40b0d7b35236e77dd0b1411c0"}, + {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:850cd2b2341a5438ae23b53054f1130f377813417f1fbe56c8424224dad0a408"}, + {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:424a2df31bcd3c9649598fc1ea443267db724754f9ec19ac3bd2c42542643043"}, + {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:06fe0f8bb2bd28266bf5182320b3f0cef94b103e03e81999f67cae194b7ea097"}, + {file = "py_bip39_bindings-0.2.0.tar.gz", hash = "sha256:38eac2c2be53085b8c2a215ebf12abcdaefee07bc8e00d7649b6b27399612b83"}, ] [[package]] name = "py-ed25519-zebra-bindings" -version = "1.1.0" +version = "1.2.0" description = "Python bindings for the ed25519-zebra RUST crate" optional = false python-versions = ">=3.9" files = [ - {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f0634c6b56cd81ce8bc10c322c14a7cd2a72f3742572c0dec332979df36e7cf5"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc91befe939088aedd176e46f1316b46b4c5dd8f44a14d309e49a634fd65dbe7"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70cc6b1d460608b23e7a0f91ecb0cd4d8ed54762fc9035cc7d5d6a22358d5679"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:045396583efc93f16ee80df7739040a66cc7f8e048e9aec60d19e4cd2afaafb8"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:838ea2bb3f27907ec7a07aff6b267646b7c0c010f506673cbbc0d911e57cdfb8"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:716f090ab1564c9bf13e790b6f8bdea5ae40b68082def48f91023a8e12e38cf1"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ebf8935bf1a856d9283916cfa62083b5cdfb24f7b772f42276fbf5b5af0f1f6"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a9e5652d3bc2e4e5ef7c12ba6767800b49f9504207e4210ac4bac9c2e31efa9"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:b846ffdfd035206e16e76026bc1f4cb45964068a929b76b2ec3289fef3ee420b"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c97c0d04be12b299581daba0296bd522460a0f7001b9340d1551c0e2daea18a4"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1d8f8b04c2b3372ef33554d62fec44db28517dea1986944fc65ce3b35341800"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp310-none-win32.whl", hash = "sha256:3243cdaad41406c21e3840630ca46a997f30644a7b3c4aa7fe54c930d0ad66af"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp310-none-win_amd64.whl", hash = "sha256:278481a18225dc74e4292980c1859b1774b9e86da2d9a4cd63988717d24d421c"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:048e84121007b6ced32b70086e9bd710a825920f0715d73be4760c45f61847be"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8200479a222da9bab0abbe35d9a60e4f658a4039054c3b9f2e58a102a393a658"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ef039b7a7e4f1653e7f0c467d136a7e135061e53fdc74934d36489a8859f9e4"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d6d035b7bd3dd998ef6030666e69cde95c34225187f53ebb9c2fa7298a65ffde"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f4a7bb72294f7f1f560a464832c0fc32bc0a20cf4d3b638f2428bf3dde6ebda"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89735c2623bcf02177004eaa895250a3115214cd51df2ab561863f565aa06b1b"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4a7cccd8ab3156d1f397c6476583e78427e93cd01fa82173df78b96e15eb9f4d"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:27483aa9262d0952e886d01ec174056503238064ce1f08a3fb17752db18071dd"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:b461baeb4adb5c5d916f8cf31651142744f29b90f010a71bb22beafe0d803f40"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1b79af368be80b5cd32b2a678c775f113c1d76c6f0e1ea5e66586c81c9e0ab5b"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9555ccf645374e5282103416fe5cba60937d7bf12af676980bd4e18cfa2fab48"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp311-none-win32.whl", hash = "sha256:1c55a32c2070aa68e0ed5a2930ba547fbf47617fd279462171d5c0f87b00df6d"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp311-none-win_amd64.whl", hash = "sha256:c4a4dedb1b8edf7f68dd8015f9d8a20f2f0ecca90fac4432e5cbabfcc16ab13d"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3ee9a0b7eb896547e539a27c4286461d58c6a99952ea27fa1b5f5e39e63019dc"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:93e2a12d0bbf58f4d1e5ae2a1c352e43302cadd747a1a5e88fea03ce7a78a562"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33673e6047eba0a0a28e818fa0b36b703986347fc98e6f0f96e36af68756787"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:14399e6e8c5b9c193256a1b9aec16b9de719691de84ab23a690056cfe011d13b"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85ea7a5632a1bf6713518bb56d4c8abe5128aee173a3c498b3a564cfb346ca72"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a01f58a1c980df68c8efd43892562b3224507bab83d880910fbb4a3c84fc965"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:655360cd74718d4efb8fbaf7afb2e4ce459af5f1d399479f577a63bd9177aa3b"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:650081644c6613fdf658456ed4b2a6580ec1b54084f318a31a924ce5cf536bb9"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5d56b81186fc75cbcf80d0549f83e98c62c4359460e512f9fb8d6c7be2a158dd"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:072bf62421ad890c1849aaa19c7b6e6a890d337f0622e9bd09161b180a10496c"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e09830c3672699f5f1f164fe92b102254ef68300ceaddc847d9a35bf4a2ec270"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp312-none-win32.whl", hash = "sha256:33ca2a7ad10846c281a73450316b390c7343e62e40516389fc1b580241f3907f"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp312-none-win_amd64.whl", hash = "sha256:4ba042528ddb81f8f025b1987bf8f19547f188efb7aa4c95d1a4e3e7f968e991"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:d75a61407651174841051d59ebcee5716207371999bef78055193e96b6dec546"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b5afba0bd4ae86f06b278698d24acebe2d4b912e0490c94ee550a859377e5c05"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d977fb8d7f5594278ea3eb8283dac811cc35c925176454ccbb3ddf0110e194fa"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:83aa29a0d0df233591da3118142c818adc3f697143d655378ee076e6f091be7e"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01f2952e5c7082dc9266d668528b27711874d0f5d2aa2e85994a46643b12686e"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0db1e886f65a439fe9641196e05229715701df572a92b41428ad097d4889c5b"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dada974b078204d1591851d0e5958824569900be3ea53676b84165ba16283641"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0f7aa0056c7af9df6c580880948cce42f779951e3e551573acf9b30462d9ca9"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:2176111de560441caaf72f09da77a1d4f8eacbb34245e2531c7243ee4070829f"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6f8686f160c4e7e928c79ad33919817b9eb608e5808154311a933078bad243b4"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:09b089af355cb0815cca4796407f89aaf08aceb5d39c5b7de087533319e3673e"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp39-none-win32.whl", hash = "sha256:12e5f602897c1c95217e406d80f2e7901c90b9345011c147c36989bfb7c3bb49"}, - {file = "py_ed25519_zebra_bindings-1.1.0-cp39-none-win_amd64.whl", hash = "sha256:119c3ca0c23570ead0a3ea9e8b7fb9716bf3675229562a7dadd815009cecf3eb"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ded8debbcffc756214cd55ebefff44fb23640c9f54edf34c0e43b371e2d2b42d"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:db18ef79ea6dc0bc42e28cd46eb442d8e84c0c9c8b2809babd63608efe015ec9"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:875bba860c5ce874e33e6d04c4804c8e4149754720bf47bd66c068a61c2ed3cc"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de987c5c8b3a69504f82adc4d3b70aa322315550f945684111d8bfe40288517b"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9721c029279a6e074d4a69a8ca2ee5da6264efda052fe07afcae6ca04e340805"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:b8843fe090b793449fc8b581ff5d55c03ae9bb18ecd4943ef27c51751df9e5e8"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:b8da29729eb83c1aeeb80f0a60ceb30f6c00ba9c2c208548f6628b8f4764eccd"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a99ab59da361a9834c0019954e72a7687fa19a3380c5acc3274452c26af3b791"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4b40b19b0259412171a36f51778bc9d8e92f21baea469549a03ff99318bc640e"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7c389eee3f99c1ad3b3fa32fc53914dda22876f8e2918b5b564b98f029dd92"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f13dffb7875eea6b2bd8f9b1165e29d9cd3df2c919c2f2db0f164926c99393e8"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a55f043d87e00e7d68fed03d02ac0725acd2dff9a03e61388285d6d920f6850f"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48f09c403c58245cc6712ce34ba3cab91705c901a6c4bb1e865847f46b26ec9"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17694b0afce037860043cf8237a990e8df9c307b4decb73028d794ae56733875"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:c80f339abfc522248c749323b2cd6d555c3095128b01d845eb48a746318553da"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:89222bb4e16d1e222a95c622630f3380fe1896ab7d0cd145da39f3aa8888ed64"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:85904f3b4e11d2fc7358686e15c1e0e3707b4e1846e82d49d764c9c44881f2a3"}, - {file = "py_ed25519_zebra_bindings-1.1.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:b4452e9ed752db2c1ed2b7c74e1d589dfa68101b04c3304ba87a3cb843d34306"}, - {file = "py_ed25519_zebra_bindings-1.1.0.tar.gz", hash = "sha256:2977603b59cfc593fb01284465fe41062d6929b0d09edf0e1ade40709977014f"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d488bf0ac70424514fddb3cf9cca6166ad149b7655970719e9bbef398054e6ad"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c3f97af9b0db7fe2bba1b1ac8d684711fc33e6383c067e1a1fc642e1595282a"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9798a82efe73cfff02eb4c09576af0dc0ca3b41cc3e17cf469179add708c8b40"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0837d10e19e72bb4665c584c89f207bad8b3d29cf2410c0f9ea310c6698f4b26"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bb278da1728db5259d5c29dcc95717336a69fc6e6159cb7400ac262ee8a96ca"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5a739e82c82a1f62de54cc0482e9d007b961c84220849ffd86924e34f8db5c9e"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d311a44ae162da4b391eb4d47675709b5044b925bef20e4e2209cdfa28ccc1ee"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c4a30a6a22f28173de66634294824455ae683163be32565f36fbfa27b8a76495"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:325eb5d0c7a406fd6abbd5b2daeb6d16e4c161a86909bf11a34a3a2c351e7fa0"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp310-cp310-win32.whl", hash = "sha256:dcd8f8ecbc3593c54fb3fcc1d0d847d2fdf86c8d2e6840d319d152f4efdef498"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:b762e13f1e2cedfac4be954a70a75330a5368e2c0ecd64db7ce1e2e9672ed4da"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:dbfe655442b73d49c1ac740f87a480cfee4c013fcb0ba2b639290b20f8dc9bb5"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b03308c3eb2311b5d308c3df22dbf244073e4c014cda5da2609a562adb4121fc"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1828031f38f246d35c7c7b427c17a3525fc311c0402d3b32572510977b9d0f67"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f88238cf167ba5681e74a556b1e6ce825cb157825ce40c7f757b7d02a7c47dfb"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b25ca1596ae3be7e6ce6e78252ce7efa570000f9ba5b39cfe8dd10e79f73d50"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a33b1d8af961d28831caf2d481879bb1592f700da79aa5613d845ae6b8153a"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:41ee171c18852f6db4a86e68c4fbd622f5415f15c0ab9b40ac1fe66a8ddc3844"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:58623ff56bf1da2581a7d52507d9757ec3b03d49879fc8611646faf666bd0120"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3fdd9cc305dd88562b9fe4d27762070bfdaa1e88647a1509a22fe252e17148d7"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:911f068d15159798309dc1895ce156b1bca2f91e34446be3ac5f54f2d3418979"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9d0fc9c1afbf4b5ff0bc03accf5f07bf53971839eb373d1139eb3bb5a02b3bd0"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp311-cp311-win32.whl", hash = "sha256:256b96fdf0e264a348bf4176c0fb180a0efc6627ac312cb5e71ec95b347d1ff5"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:efa06b8a0e11c62c10fdf576679ab3039aa6a7254e6cfa4d2d230941799fef5b"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8d63a447d3adac9b431fecd886cf711a6d44200d8b2497598a8ab44ac897f1fb"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5b1c32414a6da709e84d0614e1ed153a5e1dbcbf6d4d17baa31c493fdbd4da4"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:780073555571390c4b355b5646c0b59c2a90d3393e354d58c4ad904121a2aee2"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:677ade8ab3348604a9e4176b068ff19707cf205fd8ee4f1781614b085628fa45"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c19c0cc491bc4999245f9d2e904f611354f442710b6dae6d1d6ebc81666124cc"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1317a8af53c658f1e89b346d361edaf10eccd428c937a17d0684b2192fa77c40"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cdc05ade2608707f6c54701e7425d9c00751ccffa57533a48f68f61b0aada9f1"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec1965ed54fd162da564cc33676377888bd1ad14c15680465463d06e14aac74d"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7386e7cec522ac50e7d81cfc8488e463fe93902d6ba0f7c79d6f6db0fcf71111"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b06102b2be52da075f29f0db907bb5a03af942e2f6fb558065ea5717aa567d32"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4237cf821f74126077220d5826448c0b68c8807f40db961b1335bb6a66a83af8"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp312-cp312-win32.whl", hash = "sha256:fe11223695c94040f31b48a2128f1642a1b689aaaa91b5f8ae018d53b1497409"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:87654379855152770974c045099e488b577d86429af609524903b8029b276417"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2e10a578c1297a9b12a818c5b874d9830afba1592e8cb9df3a44b2afbc241cf0"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f0edbed9d94f5295c4f360baa38e124626296e36f315d6a19bc91f7d8a61627"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe2d0db5c2d4c0575b91373eb0c33b1d222fbb38664e17d807c8845eab268c16"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b371742adbd9be4a5a813e5d920a1a057fe9013620681651a3e7c84fd1f8d8b"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f82a6ae05ac4feb16d077ce1b4a48396c9685bc2b37d3a1ffbcd16023a4f3b8a"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:446f26b62311db93205507fedb3fa07dae786ae75822182d44dadd28984d7768"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f76ccb64577bbdfdacc543298355747dca9684e74262f844c3d892bd583e023b"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c5c95587f93f9cbf73e3609e8befe2b36c488bcf96ccc1c8c63b257212e1b9df"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3f157f87844d5e395380eaf03d9baa2108126ad276088c7edb55869683cc2cfc"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:022499a21096d03d90654af2203a5475f6c3c5572245b7bc6a1bbeeb4e42c319"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7b466ec2de929e38e6f441156a3e108a3c090dbc6b624864f6c1b300cc329f8d"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:998b5d9c4db1053156a55e8edf06a5dce68ddaa3e928e2861f8ba9a5fe5b6119"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a0fe34c20032f406a78c865c308b49fe3c79c9e1642f6471228cfbc6c513348"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7e3273d73148d983a5e7f9ed3e8b53824dcb7833393aa09dd969dd3e7a1f3c1"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cb5858f54ebd7d37c9d21c6dd80367d0031dbda7bd91b333018c0f243e1284f5"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:4fd00c8686b17e31ec29d8e4e7ce97f465fe26227f12c9e111e012b9d0dff4b9"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:e4e55fc5be4ba0c723d424cefdbb8d863e74d2ff25fbeadca9539ca60d78cc0f"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:91816ed4cef90d4d08fa9f55fa0c5687c5eba601dc1a44f211adcf1c20d96cc3"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da78de274a8276ba8127cd1a0c8dc7889162703d0f21b8ca136587a40ab911fb"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:acc66206412d2abbfb088bd4027c7e21949975cc66f5ccd6249b8937a3cf315d"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71f36c2465d808149604e536e50e3d6038c5bc83165df3b71a78345a66437819"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c8ff027c9363f9c52ee36967b74e948f583e90a5bcbc24b31831a5ce9a25173"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:161f5996ac22ba224e3c1026fef7992a7f2be71685f7dc3208b2f94039a680cc"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:eeec2b39546ebea93f96cfd8c7984e1d5489c4767f053225b1b71da1aba60273"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4524e3a900d6f11daa12185ee0d96c11f215ddf714b697599d8f0ec99d03275a"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0614733ed55ad8bd80a4a3a8abf21d26e39678c6fe31ee164388c7dc543e070d"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:aa9a2a610ffe5b576513ff4d6bd77b79e1c818c1a11df51522e7a82c9c299059"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp39-cp39-win32.whl", hash = "sha256:81b2dac4669d2935edf5953eb53c2507023774d2fa6e3a51743e8e3757f28e1a"}, + {file = "py_ed25519_zebra_bindings-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3503a179561ada2ac456351e211a28b433083d5fa48ff605e9670ae51797ea12"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f76228db22d018a66e858b27d4c074a0111438919a45276ac1a00d397d6daca"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f7c0875eda221bfdc1029207d7807c2ae5446bf4aaf5d34def94b8fa2abeace"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c713b7dba676380e2a1c3208667a71bf4bcc02a67b487894cda35c6103079e9"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fe2882a1377199cdb656e42adf5e97869d1b04af1f66a7300179f95692603c2"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c6afd09a1b831444a5107ca8e48f14db837a2351cac25e70e71f80f976c76ca2"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:91c0627efe7048ce552be5db08c11a99d532b2e115316daed3b53e52ba9f383b"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:d6efc48c7c26838044c7f58ba2e7944776ef6eaef21c962a528ddffd3943e1b4"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:7cb8befc4c52c681c4e2f5994adeff28f529f767c979921faaa1fbb84a52afae"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3b976f2c6053011c08dcde2f5805e285a8ff53eec5a42be0cc24ce93bc5729ac"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7ac9e2f0856b2ce3db7bfb6bb1b750e2533846b8aaf6106d5edc4fca33d4e2"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97df330d22c671e4e494b4e4f85ab06a4b067f38201430d8d08e687c6c1ef25"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac83999ed7ef81a64830495ad356e587ff89bdc20c79ad81d2baf8e38c707d76"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:78c23fe0e20159268ee343110a9afe58813691c9fe94bfb3525efcd23af97b81"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:900e1fd3d1474b02342d5e388fe874b2b71d1c87e4e652ed5b7773ca25c34754"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:c11f644619ca166fb62b6ec4586d53fc74e1bc3a5345e9b84af6baca7b5ca6b1"}, + {file = "py_ed25519_zebra_bindings-1.2.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:f03a9514c7e763367128a7e6be529fe8417775f72d5d717c0c3004047f188596"}, + {file = "py_ed25519_zebra_bindings-1.2.0.tar.gz", hash = "sha256:d9ec63d54b1801d5b5bdef0b3096ed94e2e1a7c870c937682afc7b8b25ffc2fc"}, ] [[package]] @@ -2932,6 +3476,17 @@ files = [ {file = "py_sr25519_bindings-0.2.1.tar.gz", hash = "sha256:1b96d3dde43adcf86ab427a9fd72b2c6291dca36eb40747df631588c16f01c1a"}, ] +[[package]] +name = "pycodestyle" +version = "2.12.1" +description = "Python style guide checker" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3"}, + {file = "pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521"}, +] + [[package]] name = "pycparser" version = "2.22" @@ -2986,18 +3541,18 @@ files = [ [[package]] name = "pydantic" -version = "2.10.3" +version = "2.10.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.10.3-py3-none-any.whl", hash = "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d"}, - {file = "pydantic-2.10.3.tar.gz", hash = "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9"}, + {file = "pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d"}, + {file = "pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.27.1" +pydantic-core = "2.27.2" typing-extensions = ">=4.12.2" [package.extras] @@ -3006,116 +3561,127 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.27.1" +version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a"}, - {file = "pydantic_core-2.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6"}, - {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807"}, - {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c"}, - {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206"}, - {file = "pydantic_core-2.27.1-cp310-none-win32.whl", hash = "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c"}, - {file = "pydantic_core-2.27.1-cp310-none-win_amd64.whl", hash = "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17"}, - {file = "pydantic_core-2.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8"}, - {file = "pydantic_core-2.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e"}, - {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919"}, - {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c"}, - {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc"}, - {file = "pydantic_core-2.27.1-cp311-none-win32.whl", hash = "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9"}, - {file = "pydantic_core-2.27.1-cp311-none-win_amd64.whl", hash = "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5"}, - {file = "pydantic_core-2.27.1-cp311-none-win_arm64.whl", hash = "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89"}, - {file = "pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f"}, - {file = "pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089"}, - {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381"}, - {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb"}, - {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae"}, - {file = "pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c"}, - {file = "pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16"}, - {file = "pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e"}, - {file = "pydantic_core-2.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073"}, - {file = "pydantic_core-2.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a"}, - {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc"}, - {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960"}, - {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23"}, - {file = "pydantic_core-2.27.1-cp313-none-win32.whl", hash = "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05"}, - {file = "pydantic_core-2.27.1-cp313-none-win_amd64.whl", hash = "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337"}, - {file = "pydantic_core-2.27.1-cp313-none-win_arm64.whl", hash = "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5"}, - {file = "pydantic_core-2.27.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62"}, - {file = "pydantic_core-2.27.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f"}, - {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36"}, - {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a"}, - {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b"}, - {file = "pydantic_core-2.27.1-cp38-none-win32.whl", hash = "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618"}, - {file = "pydantic_core-2.27.1-cp38-none-win_amd64.whl", hash = "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4"}, - {file = "pydantic_core-2.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967"}, - {file = "pydantic_core-2.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792"}, - {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01"}, - {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9"}, - {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131"}, - {file = "pydantic_core-2.27.1-cp39-none-win32.whl", hash = "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3"}, - {file = "pydantic_core-2.27.1-cp39-none-win_amd64.whl", hash = "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840"}, - {file = "pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235"}, + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, + {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, ] [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pyflakes" +version = "3.2.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, + {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, +] + [[package]] name = "pygments" version = "2.18.0" @@ -3130,6 +3696,21 @@ files = [ [package.extras] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pyluach" +version = "2.2.0" +description = "A Python package for dealing with Hebrew (Jewish) calendar dates." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyluach-2.2.0-py3-none-any.whl", hash = "sha256:d1eb49d6292087e9290f4661ae01b60c8c933704ec8c9cef82673b349ff96adf"}, + {file = "pyluach-2.2.0.tar.gz", hash = "sha256:9063a25387cd7624276fd0656508bada08aa8a6f22e8db352844cd858e69012b"}, +] + +[package.extras] +doc = ["sphinx (>=6.1.3,<6.2.0)", "sphinx_rtd_theme (>=1.2.0,<1.3.0)"] +test = ["beautifulsoup4", "flake8", "pytest", "pytest-cov"] + [[package]] name = "pynacl" version = "1.5.0" @@ -3170,6 +3751,20 @@ files = [ [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-levenshtein" version = "0.26.1" @@ -3273,104 +3868,207 @@ files = [ [[package]] name = "rapidfuzz" -version = "3.10.1" +version = "3.11.0" description = "rapid fuzzy string matching" optional = false python-versions = ">=3.9" files = [ - {file = "rapidfuzz-3.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f17d9f21bf2f2f785d74f7b0d407805468b4c173fa3e52c86ec94436b338e74a"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b31f358a70efc143909fb3d75ac6cd3c139cd41339aa8f2a3a0ead8315731f2b"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4f43f2204b56a61448ec2dd061e26fd344c404da99fb19f3458200c5874ba2"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d81bf186a453a2757472133b24915768abc7c3964194406ed93e170e16c21cb"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3611c8f45379a12063d70075c75134f2a8bd2e4e9b8a7995112ddae95ca1c982"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c3b537b97ac30da4b73930fa8a4fe2f79c6d1c10ad535c5c09726612cd6bed9"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:231ef1ec9cf7b59809ce3301006500b9d564ddb324635f4ea8f16b3e2a1780da"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed4f3adc1294834955b7e74edd3c6bd1aad5831c007f2d91ea839e76461a5879"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7b6015da2e707bf632a71772a2dbf0703cff6525732c005ad24987fe86e8ec32"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1b35a118d61d6f008e8e3fb3a77674d10806a8972c7b8be433d6598df4d60b01"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bc308d79a7e877226f36bdf4e149e3ed398d8277c140be5c1fd892ec41739e6d"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f017dbfecc172e2d0c37cf9e3d519179d71a7f16094b57430dffc496a098aa17"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-win32.whl", hash = "sha256:36c0e1483e21f918d0f2f26799fe5ac91c7b0c34220b73007301c4f831a9c4c7"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:10746c1d4c8cd8881c28a87fd7ba0c9c102346dfe7ff1b0d021cdf093e9adbff"}, - {file = "rapidfuzz-3.10.1-cp310-cp310-win_arm64.whl", hash = "sha256:dfa64b89dcb906835e275187569e51aa9d546a444489e97aaf2cc84011565fbe"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:92958ae075c87fef393f835ed02d4fe8d5ee2059a0934c6c447ea3417dfbf0e8"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba7521e072c53e33c384e78615d0718e645cab3c366ecd3cc8cb732befd94967"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d02cbd75d283c287471b5b3738b3e05c9096150f93f2d2dfa10b3d700f2db9"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efa1582a397da038e2f2576c9cd49b842f56fde37d84a6b0200ffebc08d82350"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f12912acee1f506f974f58de9fdc2e62eea5667377a7e9156de53241c05fdba8"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666d5d8b17becc3f53447bcb2b6b33ce6c2df78792495d1fa82b2924cd48701a"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26f71582c0d62445067ee338ddad99b655a8f4e4ed517a90dcbfbb7d19310474"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8a2ef08b27167bcff230ffbfeedd4c4fa6353563d6aaa015d725dd3632fc3de7"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:365e4fc1a2b95082c890f5e98489b894e6bf8c338c6ac89bb6523c2ca6e9f086"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1996feb7a61609fa842e6b5e0c549983222ffdedaf29644cc67e479902846dfe"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:cf654702f144beaa093103841a2ea6910d617d0bb3fccb1d1fd63c54dde2cd49"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec108bf25de674781d0a9a935030ba090c78d49def3d60f8724f3fc1e8e75024"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-win32.whl", hash = "sha256:031f8b367e5d92f7a1e27f7322012f3c321c3110137b43cc3bf678505583ef48"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:f98f36c6a1bb9a6c8bbec99ad87c8c0e364f34761739b5ea9adf7b48129ae8cf"}, - {file = "rapidfuzz-3.10.1-cp311-cp311-win_arm64.whl", hash = "sha256:f1da2028cb4e41be55ee797a82d6c1cf589442504244249dfeb32efc608edee7"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1340b56340896bede246f612b6ecf685f661a56aabef3d2512481bfe23ac5835"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2316515169b7b5a453f0ce3adbc46c42aa332cae9f2edb668e24d1fc92b2f2bb"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e06fe6a12241ec1b72c0566c6b28cda714d61965d86569595ad24793d1ab259"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d99c1cd9443b19164ec185a7d752f4b4db19c066c136f028991a480720472e23"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1d9aa156ed52d3446388ba4c2f335e312191d1ca9d1f5762ee983cf23e4ecf6"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54bcf4efaaee8e015822be0c2c28214815f4f6b4f70d8362cfecbd58a71188ac"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0c955e32afdbfdf6e9ee663d24afb25210152d98c26d22d399712d29a9b976b"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:191633722203f5b7717efcb73a14f76f3b124877d0608c070b827c5226d0b972"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:195baad28057ec9609e40385991004e470af9ef87401e24ebe72c064431524ab"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0fff4a6b87c07366662b62ae994ffbeadc472e72f725923f94b72a3db49f4671"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4ffed25f9fdc0b287f30a98467493d1e1ce5b583f6317f70ec0263b3c97dbba6"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d02cf8e5af89a9ac8f53c438ddff6d773f62c25c6619b29db96f4aae248177c0"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-win32.whl", hash = "sha256:f3bb81d4fe6a5d20650f8c0afcc8f6e1941f6fecdb434f11b874c42467baded0"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:aaf83e9170cb1338922ae42d320699dccbbdca8ffed07faeb0b9257822c26e24"}, - {file = "rapidfuzz-3.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:c5da802a0d085ad81b0f62828fb55557996c497b2d0b551bbdfeafd6d447892f"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fc22d69a1c9cccd560a5c434c0371b2df0f47c309c635a01a913e03bbf183710"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38b0dac2c8e057562b8f0d8ae5b663d2d6a28c5ab624de5b73cef9abb6129a24"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fde3bbb14e92ce8fcb5c2edfff72e474d0080cadda1c97785bf4822f037a309"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9141fb0592e55f98fe9ac0f3ce883199b9c13e262e0bf40c5b18cdf926109d16"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:237bec5dd1bfc9b40bbd786cd27949ef0c0eb5fab5eb491904c6b5df59d39d3c"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18123168cba156ab5794ea6de66db50f21bb3c66ae748d03316e71b27d907b95"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b75fe506c8e02769cc47f5ab21ce3e09b6211d3edaa8f8f27331cb6988779be"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da82aa4b46973aaf9e03bb4c3d6977004648c8638febfc0f9d237e865761270"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c34c022d5ad564f1a5a57a4a89793bd70d7bad428150fb8ff2760b223407cdcf"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e96c84d6c2a0ca94e15acb5399118fff669f4306beb98a6d8ec6f5dccab4412"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e8e154b84a311263e1aca86818c962e1fa9eefdd643d1d5d197fcd2738f88cb9"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:335fee93188f8cd585552bb8057228ce0111bd227fa81bfd40b7df6b75def8ab"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-win32.whl", hash = "sha256:6729b856166a9e95c278410f73683957ea6100c8a9d0a8dbe434c49663689255"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:0e06d99ad1ad97cb2ef7f51ec6b1fedd74a3a700e4949353871cf331d07b382a"}, - {file = "rapidfuzz-3.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:8d1b7082104d596a3eb012e0549b2634ed15015b569f48879701e9d8db959dbb"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:779027d3307e1a2b1dc0c03c34df87a470a368a1a0840a9d2908baf2d4067956"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:440b5608ab12650d0390128d6858bc839ae77ffe5edf0b33a1551f2fa9860651"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82cac41a411e07a6f3dc80dfbd33f6be70ea0abd72e99c59310819d09f07d945"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:958473c9f0bca250590200fd520b75be0dbdbc4a7327dc87a55b6d7dc8d68552"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ef60dfa73749ef91cb6073be1a3e135f4846ec809cc115f3cbfc6fe283a5584"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7fbac18f2c19fc983838a60611e67e3262e36859994c26f2ee85bb268de2355"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a0d519ff39db887cd73f4e297922786d548f5c05d6b51f4e6754f452a7f4296"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bebb7bc6aeb91cc57e4881b222484c26759ca865794187217c9dcea6c33adae6"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe07f8b9c3bb5c5ad1d2c66884253e03800f4189a60eb6acd6119ebaf3eb9894"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:bfa48a4a2d45a41457f0840c48e579db157a927f4e97acf6e20df8fc521c79de"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2cf44d01bfe8ee605b7eaeecbc2b9ca64fc55765f17b304b40ed8995f69d7716"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e6bbca9246d9eedaa1c84e04a7f555493ba324d52ae4d9f3d9ddd1b740dcd87"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-win32.whl", hash = "sha256:567f88180f2c1423b4fe3f3ad6e6310fc97b85bdba574801548597287fc07028"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:6b2cd7c29d6ecdf0b780deb587198f13213ac01c430ada6913452fd0c40190fc"}, - {file = "rapidfuzz-3.10.1-cp39-cp39-win_arm64.whl", hash = "sha256:9f912d459e46607ce276128f52bea21ebc3e9a5ccf4cccfef30dd5bddcf47be8"}, - {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ac4452f182243cfab30ba4668ef2de101effaedc30f9faabb06a095a8c90fd16"}, - {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:565c2bd4f7d23c32834652b27b51dd711814ab614b4e12add8476be4e20d1cf5"}, - {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:187d9747149321607be4ccd6f9f366730078bed806178ec3eeb31d05545e9e8f"}, - {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:616290fb9a8fa87e48cb0326d26f98d4e29f17c3b762c2d586f2b35c1fd2034b"}, - {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:073a5b107e17ebd264198b78614c0206fa438cce749692af5bc5f8f484883f50"}, - {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39c4983e2e2ccb9732f3ac7d81617088822f4a12291d416b09b8a1eadebb3e29"}, - {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ac7adee6bcf0c6fee495d877edad1540a7e0f5fc208da03ccb64734b43522d7a"}, - {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:425f4ac80b22153d391ee3f94bc854668a0c6c129f05cf2eaf5ee74474ddb69e"}, - {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65a2fa13e8a219f9b5dcb9e74abe3ced5838a7327e629f426d333dfc8c5a6e66"}, - {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75561f3df9a906aaa23787e9992b228b1ab69007932dc42070f747103e177ba8"}, - {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:edd062490537e97ca125bc6c7f2b7331c2b73d21dc304615afe61ad1691e15d5"}, - {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfcc8feccf63245a22dfdd16e222f1a39771a44b870beb748117a0e09cbb4a62"}, - {file = "rapidfuzz-3.10.1.tar.gz", hash = "sha256:5a15546d847a915b3f42dc79ef9b0c78b998b4e2c53b252e7166284066585979"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eb8a54543d16ab1b69e2c5ed96cabbff16db044a50eddfc028000138ca9ddf33"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:231c8b2efbd7f8d2ecd1ae900363ba168b8870644bb8f2b5aa96e4a7573bde19"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54e7f442fb9cca81e9df32333fb075ef729052bcabe05b0afc0441f462299114"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:906f1f2a1b91c06599b3dd1be207449c5d4fc7bd1e1fa2f6aef161ea6223f165"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed59044aea9eb6c663112170f2399b040d5d7b162828b141f2673e822093fa8"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cb1965a28b0fa64abdee130c788a0bc0bb3cf9ef7e3a70bf055c086c14a3d7e"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b488b244931d0291412917e6e46ee9f6a14376625e150056fe7c4426ef28225"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f0ba13557fec9d5ffc0a22826754a7457cc77f1b25145be10b7bb1d143ce84c6"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3871fa7dfcef00bad3c7e8ae8d8fd58089bad6fb21f608d2bf42832267ca9663"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b2669eafee38c5884a6e7cc9769d25c19428549dcdf57de8541cf9e82822e7db"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ffa1bb0e26297b0f22881b219ffc82a33a3c84ce6174a9d69406239b14575bd5"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:45b15b8a118856ac9caac6877f70f38b8a0d310475d50bc814698659eabc1cdb"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-win32.whl", hash = "sha256:22033677982b9c4c49676f215b794b0404073f8974f98739cb7234e4a9ade9ad"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:be15496e7244361ff0efcd86e52559bacda9cd975eccf19426a0025f9547c792"}, + {file = "rapidfuzz-3.11.0-cp310-cp310-win_arm64.whl", hash = "sha256:714a7ba31ba46b64d30fccfe95f8013ea41a2e6237ba11a805a27cdd3bce2573"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8724a978f8af7059c5323d523870bf272a097478e1471295511cf58b2642ff83"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b63cb1f2eb371ef20fb155e95efd96e060147bdd4ab9fc400c97325dfee9fe1"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82497f244aac10b20710448645f347d862364cc4f7d8b9ba14bd66b5ce4dec18"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:339607394941801e6e3f6c1ecd413a36e18454e7136ed1161388de674f47f9d9"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84819390a36d6166cec706b9d8f0941f115f700b7faecab5a7e22fc367408bc3"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eea8d9e20632d68f653455265b18c35f90965e26f30d4d92f831899d6682149b"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b659e1e2ea2784a9a397075a7fc395bfa4fe66424042161c4bcaf6e4f637b38"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1315cd2a351144572e31fe3df68340d4b83ddec0af8b2e207cd32930c6acd037"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a7743cca45b4684c54407e8638f6d07b910d8d811347b9d42ff21262c7c23245"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5bb636b0150daa6d3331b738f7c0f8b25eadc47f04a40e5c23c4bfb4c4e20ae3"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:42f4dd264ada7a9aa0805ea0da776dc063533917773cf2df5217f14eb4429eae"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:51f24cb39e64256221e6952f22545b8ce21cacd59c0d3e367225da8fc4b868d8"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-win32.whl", hash = "sha256:aaf391fb6715866bc14681c76dc0308f46877f7c06f61d62cc993b79fc3c4a2a"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:ebadd5b8624d8ad503e505a99b8eb26fe3ea9f8e9c2234e805a27b269e585842"}, + {file = "rapidfuzz-3.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:d895998fec712544c13cfe833890e0226585cf0391dd3948412441d5d68a2b8c"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f382fec4a7891d66fb7163c90754454030bb9200a13f82ee7860b6359f3f2fa8"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dfaefe08af2a928e72344c800dcbaf6508e86a4ed481e28355e8d4b6a6a5230e"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92ebb7c12f682b5906ed98429f48a3dd80dd0f9721de30c97a01473d1a346576"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a1b3ebc62d4bcdfdeba110944a25ab40916d5383c5e57e7c4a8dc0b6c17211a"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c6d7fea39cb33e71de86397d38bf7ff1a6273e40367f31d05761662ffda49e4"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99aebef8268f2bc0b445b5640fd3312e080bd17efd3fbae4486b20ac00466308"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4469307f464ae3089acf3210b8fc279110d26d10f79e576f385a98f4429f7d97"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:eb97c53112b593f89a90b4f6218635a9d1eea1d7f9521a3b7d24864228bbc0aa"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ef8937dae823b889c0273dfa0f0f6c46a3658ac0d851349c464d1b00e7ff4252"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d95f9e9f3777b96241d8a00d6377cc9c716981d828b5091082d0fe3a2924b43e"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:b1d67d67f89e4e013a5295e7523bc34a7a96f2dba5dd812c7c8cb65d113cbf28"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d994cf27e2f874069884d9bddf0864f9b90ad201fcc9cb2f5b82bacc17c8d5f2"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-win32.whl", hash = "sha256:ba26d87fe7fcb56c4a53b549a9e0e9143f6b0df56d35fe6ad800c902447acd5b"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:b1f7efdd7b7adb32102c2fa481ad6f11923e2deb191f651274be559d56fc913b"}, + {file = "rapidfuzz-3.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:ed78c8e94f57b44292c1a0350f580e18d3a3c5c0800e253f1583580c1b417ad2"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e60814edd0c9b511b5f377d48b9782b88cfe8be07a98f99973669299c8bb318a"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f28952da055dbfe75828891cd3c9abf0984edc8640573c18b48c14c68ca5e06"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e8f93bc736020351a6f8e71666e1f486bb8bd5ce8112c443a30c77bfde0eb68"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76a4a11ba8f678c9e5876a7d465ab86def047a4fcc043617578368755d63a1bc"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc0e0d41ad8a056a9886bac91ff9d9978e54a244deb61c2972cc76b66752de9c"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e8ea35f2419c7d56b3e75fbde2698766daedb374f20eea28ac9b1f668ef4f74"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd340bbd025302276b5aa221dccfe43040c7babfc32f107c36ad783f2ffd8775"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:494eef2c68305ab75139034ea25328a04a548d297712d9cf887bf27c158c388b"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5a167344c1d6db06915fb0225592afdc24d8bafaaf02de07d4788ddd37f4bc2f"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8c7af25bda96ac799378ac8aba54a8ece732835c7b74cfc201b688a87ed11152"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d2a0f7e17f33e7890257367a1662b05fecaf56625f7dbb6446227aaa2b86448b"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4d0d26c7172bdb64f86ee0765c5b26ea1dc45c52389175888ec073b9b28f4305"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-win32.whl", hash = "sha256:6ad02bab756751c90fa27f3069d7b12146613061341459abf55f8190d899649f"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:b1472986fd9c5d318399a01a0881f4a0bf4950264131bb8e2deba9df6d8c362b"}, + {file = "rapidfuzz-3.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:c408f09649cbff8da76f8d3ad878b64ba7f7abdad1471efb293d2c075e80c822"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1bac4873f6186f5233b0084b266bfb459e997f4c21fc9f029918f44a9eccd304"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f9f12c2d0aa52b86206d2059916153876a9b1cf9dfb3cf2f344913167f1c3d4"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd501de6f7a8f83557d20613b58734d1cb5f0be78d794cde64fe43cfc63f5f2"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4416ca69af933d4a8ad30910149d3db6d084781d5c5fdedb713205389f535385"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f0821b9bdf18c5b7d51722b906b233a39b17f602501a966cfbd9b285f8ab83cd"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0edecc3f90c2653298d380f6ea73b536944b767520c2179ec5d40b9145e47aa"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4513dd01cee11e354c31b75f652d4d466c9440b6859f84e600bdebfccb17735a"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d9727b85511b912571a76ce53c7640ba2c44c364e71cef6d7359b5412739c570"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ab9eab33ee3213f7751dc07a1a61b8d9a3d748ca4458fffddd9defa6f0493c16"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6b01c1ddbb054283797967ddc5433d5c108d680e8fa2684cf368be05407b07e4"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3857e335f97058c4b46fa39ca831290b70de554a5c5af0323d2f163b19c5f2a6"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d98a46cf07c0c875d27e8a7ed50f304d83063e49b9ab63f21c19c154b4c0d08d"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-win32.whl", hash = "sha256:c36539ed2c0173b053dafb221458812e178cfa3224ade0960599bec194637048"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:ec8d7d8567e14af34a7911c98f5ac74a3d4a743cd848643341fc92b12b3784ff"}, + {file = "rapidfuzz-3.11.0-cp39-cp39-win_arm64.whl", hash = "sha256:62171b270ecc4071be1c1f99960317db261d4c8c83c169e7f8ad119211fe7397"}, + {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f06e3c4c0a8badfc4910b9fd15beb1ad8f3b8fafa8ea82c023e5e607b66a78e4"}, + {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fe7aaf5a54821d340d21412f7f6e6272a9b17a0cbafc1d68f77f2fc11009dcd5"}, + {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25398d9ac7294e99876a3027ffc52c6bebeb2d702b1895af6ae9c541ee676702"}, + {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a52eea839e4bdc72c5e60a444d26004da00bb5bc6301e99b3dde18212e41465"}, + {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c87319b0ab9d269ab84f6453601fd49b35d9e4a601bbaef43743f26fabf496c"}, + {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3048c6ed29d693fba7d2a7caf165f5e0bb2b9743a0989012a98a47b975355cca"}, + {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b04f29735bad9f06bb731c214f27253bd8bedb248ef9b8a1b4c5bde65b838454"}, + {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7864e80a0d4e23eb6194254a81ee1216abdc53f9dc85b7f4d56668eced022eb8"}, + {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3794df87313dfb56fafd679b962e0613c88a293fd9bd5dd5c2793d66bf06a101"}, + {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d71da0012face6f45432a11bc59af19e62fac5a41f8ce489e80c0add8153c3d1"}, + {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff38378346b7018f42cbc1f6d1d3778e36e16d8595f79a312b31e7c25c50bd08"}, + {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6668321f90aa02a5a789d4e16058f2e4f2692c5230252425c3532a8a62bc3424"}, + {file = "rapidfuzz-3.11.0.tar.gz", hash = "sha256:a53ca4d3f52f00b393fab9b5913c5bafb9afc27d030c8a1db1283da6917a860f"}, ] [package.extras] all = ["numpy"] +[[package]] +name = "regex" +version = "2024.11.6" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, + {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, + {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, + {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, + {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, + {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, + {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, + {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, + {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, + {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, + {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, + {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, + {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, + {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, +] + [[package]] name = "requests" version = "2.32.3" @@ -3511,6 +4209,138 @@ files = [ {file = "ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f"}, ] +[[package]] +name = "safetensors" +version = "0.4.5" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "safetensors-0.4.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a63eaccd22243c67e4f2b1c3e258b257effc4acd78f3b9d397edc8cf8f1298a7"}, + {file = "safetensors-0.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:23fc9b4ec7b602915cbb4ec1a7c1ad96d2743c322f20ab709e2c35d1b66dad27"}, + {file = "safetensors-0.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6885016f34bef80ea1085b7e99b3c1f92cb1be78a49839203060f67b40aee761"}, + {file = "safetensors-0.4.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:133620f443450429322f238fda74d512c4008621227fccf2f8cf4a76206fea7c"}, + {file = "safetensors-0.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4fb3e0609ec12d2a77e882f07cced530b8262027f64b75d399f1504ffec0ba56"}, + {file = "safetensors-0.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0f1dd769f064adc33831f5e97ad07babbd728427f98e3e1db6902e369122737"}, + {file = "safetensors-0.4.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6d156bdb26732feada84f9388a9f135528c1ef5b05fae153da365ad4319c4c5"}, + {file = "safetensors-0.4.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e347d77e2c77eb7624400ccd09bed69d35c0332f417ce8c048d404a096c593b"}, + {file = "safetensors-0.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9f556eea3aec1d3d955403159fe2123ddd68e880f83954ee9b4a3f2e15e716b6"}, + {file = "safetensors-0.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9483f42be3b6bc8ff77dd67302de8ae411c4db39f7224dec66b0eb95822e4163"}, + {file = "safetensors-0.4.5-cp310-none-win32.whl", hash = "sha256:7389129c03fadd1ccc37fd1ebbc773f2b031483b04700923c3511d2a939252cc"}, + {file = "safetensors-0.4.5-cp310-none-win_amd64.whl", hash = "sha256:e98ef5524f8b6620c8cdef97220c0b6a5c1cef69852fcd2f174bb96c2bb316b1"}, + {file = "safetensors-0.4.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:21f848d7aebd5954f92538552d6d75f7c1b4500f51664078b5b49720d180e47c"}, + {file = "safetensors-0.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bb07000b19d41e35eecef9a454f31a8b4718a185293f0d0b1c4b61d6e4487971"}, + {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09dedf7c2fda934ee68143202acff6e9e8eb0ddeeb4cfc24182bef999efa9f42"}, + {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:59b77e4b7a708988d84f26de3ebead61ef1659c73dcbc9946c18f3b1786d2688"}, + {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d3bc83e14d67adc2e9387e511097f254bd1b43c3020440e708858c684cbac68"}, + {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39371fc551c1072976073ab258c3119395294cf49cdc1f8476794627de3130df"}, + {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6c19feda32b931cae0acd42748a670bdf56bee6476a046af20181ad3fee4090"}, + {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a659467495de201e2f282063808a41170448c78bada1e62707b07a27b05e6943"}, + {file = "safetensors-0.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bad5e4b2476949bcd638a89f71b6916fa9a5cae5c1ae7eede337aca2100435c0"}, + {file = "safetensors-0.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a3a315a6d0054bc6889a17f5668a73f94f7fe55121ff59e0a199e3519c08565f"}, + {file = "safetensors-0.4.5-cp311-none-win32.whl", hash = "sha256:a01e232e6d3d5cf8b1667bc3b657a77bdab73f0743c26c1d3c5dd7ce86bd3a92"}, + {file = "safetensors-0.4.5-cp311-none-win_amd64.whl", hash = "sha256:cbd39cae1ad3e3ef6f63a6f07296b080c951f24cec60188378e43d3713000c04"}, + {file = "safetensors-0.4.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:473300314e026bd1043cef391bb16a8689453363381561b8a3e443870937cc1e"}, + {file = "safetensors-0.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:801183a0f76dc647f51a2d9141ad341f9665602a7899a693207a82fb102cc53e"}, + {file = "safetensors-0.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1524b54246e422ad6fb6aea1ac71edeeb77666efa67230e1faf6999df9b2e27f"}, + {file = "safetensors-0.4.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b3139098e3e8b2ad7afbca96d30ad29157b50c90861084e69fcb80dec7430461"}, + {file = "safetensors-0.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65573dc35be9059770808e276b017256fa30058802c29e1038eb1c00028502ea"}, + {file = "safetensors-0.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd33da8e9407559f8779c82a0448e2133737f922d71f884da27184549416bfed"}, + {file = "safetensors-0.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3685ce7ed036f916316b567152482b7e959dc754fcc4a8342333d222e05f407c"}, + {file = "safetensors-0.4.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dde2bf390d25f67908278d6f5d59e46211ef98e44108727084d4637ee70ab4f1"}, + {file = "safetensors-0.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7469d70d3de970b1698d47c11ebbf296a308702cbaae7fcb993944751cf985f4"}, + {file = "safetensors-0.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a6ba28118636a130ccbb968bc33d4684c48678695dba2590169d5ab03a45646"}, + {file = "safetensors-0.4.5-cp312-none-win32.whl", hash = "sha256:c859c7ed90b0047f58ee27751c8e56951452ed36a67afee1b0a87847d065eec6"}, + {file = "safetensors-0.4.5-cp312-none-win_amd64.whl", hash = "sha256:b5a8810ad6a6f933fff6c276eae92c1da217b39b4d8b1bc1c0b8af2d270dc532"}, + {file = "safetensors-0.4.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:25e5f8e2e92a74f05b4ca55686234c32aac19927903792b30ee6d7bd5653d54e"}, + {file = "safetensors-0.4.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:81efb124b58af39fcd684254c645e35692fea81c51627259cdf6d67ff4458916"}, + {file = "safetensors-0.4.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:585f1703a518b437f5103aa9cf70e9bd437cb78eea9c51024329e4fb8a3e3679"}, + {file = "safetensors-0.4.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b99fbf72e3faf0b2f5f16e5e3458b93b7d0a83984fe8d5364c60aa169f2da89"}, + {file = "safetensors-0.4.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b17b299ca9966ca983ecda1c0791a3f07f9ca6ab5ded8ef3d283fff45f6bcd5f"}, + {file = "safetensors-0.4.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76ded72f69209c9780fdb23ea89e56d35c54ae6abcdec67ccb22af8e696e449a"}, + {file = "safetensors-0.4.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2783956926303dcfeb1de91a4d1204cd4089ab441e622e7caee0642281109db3"}, + {file = "safetensors-0.4.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d94581aab8c6b204def4d7320f07534d6ee34cd4855688004a4354e63b639a35"}, + {file = "safetensors-0.4.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:67e1e7cb8678bb1b37ac48ec0df04faf689e2f4e9e81e566b5c63d9f23748523"}, + {file = "safetensors-0.4.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:dbd280b07e6054ea68b0cb4b16ad9703e7d63cd6890f577cb98acc5354780142"}, + {file = "safetensors-0.4.5-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:77d9b228da8374c7262046a36c1f656ba32a93df6cc51cd4453af932011e77f1"}, + {file = "safetensors-0.4.5-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:500cac01d50b301ab7bb192353317035011c5ceeef0fca652f9f43c000bb7f8d"}, + {file = "safetensors-0.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75331c0c746f03158ded32465b7d0b0e24c5a22121743662a2393439c43a45cf"}, + {file = "safetensors-0.4.5-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670e95fe34e0d591d0529e5e59fd9d3d72bc77b1444fcaa14dccda4f36b5a38b"}, + {file = "safetensors-0.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:098923e2574ff237c517d6e840acada8e5b311cb1fa226019105ed82e9c3b62f"}, + {file = "safetensors-0.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13ca0902d2648775089fa6a0c8fc9e6390c5f8ee576517d33f9261656f851e3f"}, + {file = "safetensors-0.4.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f0032bedc869c56f8d26259fe39cd21c5199cd57f2228d817a0e23e8370af25"}, + {file = "safetensors-0.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4b15f51b4f8f2a512341d9ce3475cacc19c5fdfc5db1f0e19449e75f95c7dc8"}, + {file = "safetensors-0.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f6594d130d0ad933d885c6a7b75c5183cb0e8450f799b80a39eae2b8508955eb"}, + {file = "safetensors-0.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:60c828a27e852ded2c85fc0f87bf1ec20e464c5cd4d56ff0e0711855cc2e17f8"}, + {file = "safetensors-0.4.5-cp37-none-win32.whl", hash = "sha256:6d3de65718b86c3eeaa8b73a9c3d123f9307a96bbd7be9698e21e76a56443af5"}, + {file = "safetensors-0.4.5-cp37-none-win_amd64.whl", hash = "sha256:5a2d68a523a4cefd791156a4174189a4114cf0bf9c50ceb89f261600f3b2b81a"}, + {file = "safetensors-0.4.5-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:e7a97058f96340850da0601a3309f3d29d6191b0702b2da201e54c6e3e44ccf0"}, + {file = "safetensors-0.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:63bfd425e25f5c733f572e2246e08a1c38bd6f2e027d3f7c87e2e43f228d1345"}, + {file = "safetensors-0.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3664ac565d0e809b0b929dae7ccd74e4d3273cd0c6d1220c6430035befb678e"}, + {file = "safetensors-0.4.5-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:313514b0b9b73ff4ddfb4edd71860696dbe3c1c9dc4d5cc13dbd74da283d2cbf"}, + {file = "safetensors-0.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31fa33ee326f750a2f2134a6174773c281d9a266ccd000bd4686d8021f1f3dac"}, + {file = "safetensors-0.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09566792588d77b68abe53754c9f1308fadd35c9f87be939e22c623eaacbed6b"}, + {file = "safetensors-0.4.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309aaec9b66cbf07ad3a2e5cb8a03205663324fea024ba391594423d0f00d9fe"}, + {file = "safetensors-0.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:53946c5813b8f9e26103c5efff4a931cc45d874f45229edd68557ffb35ffb9f8"}, + {file = "safetensors-0.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:868f9df9e99ad1e7f38c52194063a982bc88fedc7d05096f4f8160403aaf4bd6"}, + {file = "safetensors-0.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9cc9449bd0b0bc538bd5e268221f0c5590bc5c14c1934a6ae359d44410dc68c4"}, + {file = "safetensors-0.4.5-cp38-none-win32.whl", hash = "sha256:83c4f13a9e687335c3928f615cd63a37e3f8ef072a3f2a0599fa09f863fb06a2"}, + {file = "safetensors-0.4.5-cp38-none-win_amd64.whl", hash = "sha256:b98d40a2ffa560653f6274e15b27b3544e8e3713a44627ce268f419f35c49478"}, + {file = "safetensors-0.4.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cf727bb1281d66699bef5683b04d98c894a2803442c490a8d45cd365abfbdeb2"}, + {file = "safetensors-0.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96f1d038c827cdc552d97e71f522e1049fef0542be575421f7684756a748e457"}, + {file = "safetensors-0.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:139fbee92570ecea774e6344fee908907db79646d00b12c535f66bc78bd5ea2c"}, + {file = "safetensors-0.4.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c36302c1c69eebb383775a89645a32b9d266878fab619819ce660309d6176c9b"}, + {file = "safetensors-0.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d641f5b8149ea98deb5ffcf604d764aad1de38a8285f86771ce1abf8e74c4891"}, + {file = "safetensors-0.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b4db6a61d968de73722b858038c616a1bebd4a86abe2688e46ca0cc2d17558f2"}, + {file = "safetensors-0.4.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b75a616e02f21b6f1d5785b20cecbab5e2bd3f6358a90e8925b813d557666ec1"}, + {file = "safetensors-0.4.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:788ee7d04cc0e0e7f944c52ff05f52a4415b312f5efd2ee66389fb7685ee030c"}, + {file = "safetensors-0.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:87bc42bd04fd9ca31396d3ca0433db0be1411b6b53ac5a32b7845a85d01ffc2e"}, + {file = "safetensors-0.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4037676c86365a721a8c9510323a51861d703b399b78a6b4486a54a65a975fca"}, + {file = "safetensors-0.4.5-cp39-none-win32.whl", hash = "sha256:1500418454529d0ed5c1564bda376c4ddff43f30fce9517d9bee7bcce5a8ef50"}, + {file = "safetensors-0.4.5-cp39-none-win_amd64.whl", hash = "sha256:9d1a94b9d793ed8fe35ab6d5cea28d540a46559bafc6aae98f30ee0867000cab"}, + {file = "safetensors-0.4.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fdadf66b5a22ceb645d5435a0be7a0292ce59648ca1d46b352f13cff3ea80410"}, + {file = "safetensors-0.4.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d42ffd4c2259f31832cb17ff866c111684c87bd930892a1ba53fed28370c918c"}, + {file = "safetensors-0.4.5-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd8a1f6d2063a92cd04145c7fd9e31a1c7d85fbec20113a14b487563fdbc0597"}, + {file = "safetensors-0.4.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:951d2fcf1817f4fb0ef0b48f6696688a4e852a95922a042b3f96aaa67eedc920"}, + {file = "safetensors-0.4.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ac85d9a8c1af0e3132371d9f2d134695a06a96993c2e2f0bbe25debb9e3f67a"}, + {file = "safetensors-0.4.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e3cec4a29eb7fe8da0b1c7988bc3828183080439dd559f720414450de076fcab"}, + {file = "safetensors-0.4.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:21742b391b859e67b26c0b2ac37f52c9c0944a879a25ad2f9f9f3cd61e7fda8f"}, + {file = "safetensors-0.4.5-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c7db3006a4915151ce1913652e907cdede299b974641a83fbc092102ac41b644"}, + {file = "safetensors-0.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f68bf99ea970960a237f416ea394e266e0361895753df06e3e06e6ea7907d98b"}, + {file = "safetensors-0.4.5-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8158938cf3324172df024da511839d373c40fbfaa83e9abf467174b2910d7b4c"}, + {file = "safetensors-0.4.5-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:540ce6c4bf6b58cb0fd93fa5f143bc0ee341c93bb4f9287ccd92cf898cc1b0dd"}, + {file = "safetensors-0.4.5-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bfeaa1a699c6b9ed514bd15e6a91e74738b71125a9292159e3d6b7f0a53d2cde"}, + {file = "safetensors-0.4.5-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:01c8f00da537af711979e1b42a69a8ec9e1d7112f208e0e9b8a35d2c381085ef"}, + {file = "safetensors-0.4.5-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a0dd565f83b30f2ca79b5d35748d0d99dd4b3454f80e03dfb41f0038e3bdf180"}, + {file = "safetensors-0.4.5-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:023b6e5facda76989f4cba95a861b7e656b87e225f61811065d5c501f78cdb3f"}, + {file = "safetensors-0.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9633b663393d5796f0b60249549371e392b75a0b955c07e9c6f8708a87fc841f"}, + {file = "safetensors-0.4.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78dd8adfb48716233c45f676d6e48534d34b4bceb50162c13d1f0bdf6f78590a"}, + {file = "safetensors-0.4.5-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e8deb16c4321d61ae72533b8451ec4a9af8656d1c61ff81aa49f966406e4b68"}, + {file = "safetensors-0.4.5-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:52452fa5999dc50c4decaf0c53aa28371f7f1e0fe5c2dd9129059fbe1e1599c7"}, + {file = "safetensors-0.4.5-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d5f23198821e227cfc52d50fa989813513db381255c6d100927b012f0cfec63d"}, + {file = "safetensors-0.4.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f4beb84b6073b1247a773141a6331117e35d07134b3bb0383003f39971d414bb"}, + {file = "safetensors-0.4.5-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:68814d599d25ed2fdd045ed54d370d1d03cf35e02dce56de44c651f828fb9b7b"}, + {file = "safetensors-0.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0b6453c54c57c1781292c46593f8a37254b8b99004c68d6c3ce229688931a22"}, + {file = "safetensors-0.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adaa9c6dead67e2dd90d634f89131e43162012479d86e25618e821a03d1eb1dc"}, + {file = "safetensors-0.4.5-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73e7d408e9012cd17511b382b43547850969c7979efc2bc353f317abaf23c84c"}, + {file = "safetensors-0.4.5-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:775409ce0fcc58b10773fdb4221ed1eb007de10fe7adbdf8f5e8a56096b6f0bc"}, + {file = "safetensors-0.4.5-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:834001bed193e4440c4a3950a31059523ee5090605c907c66808664c932b549c"}, + {file = "safetensors-0.4.5.tar.gz", hash = "sha256:d73de19682deabb02524b3d5d1f8b3aaba94c72f1bbfc7911b9b9d5d391c0310"}, +] + +[package.extras] +all = ["safetensors[jax]", "safetensors[numpy]", "safetensors[paddlepaddle]", "safetensors[pinned-tf]", "safetensors[quality]", "safetensors[testing]", "safetensors[torch]"] +dev = ["safetensors[all]"] +jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "safetensors[numpy]"] +mlx = ["mlx (>=0.0.9)"] +numpy = ["numpy (>=1.21.6)"] +paddlepaddle = ["paddlepaddle (>=2.4.1)", "safetensors[numpy]"] +pinned-tf = ["safetensors[numpy]", "tensorflow (==2.11.0)"] +quality = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"] +tensorflow = ["safetensors[numpy]", "tensorflow (>=2.11.0)"] +testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "hypothesis (>=6.70.2)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "safetensors[numpy]", "setuptools-rust (>=1.5.2)"] +torch = ["safetensors[numpy]", "torch (>=1.10)"] + [[package]] name = "scalecodec" version = "1.2.11" @@ -3530,6 +4360,102 @@ requests = ">=2.24.0" [package.extras] test = ["coverage", "pytest"] +[[package]] +name = "scikit-learn" +version = "1.6.0" +description = "A set of python modules for machine learning and data mining" +optional = false +python-versions = ">=3.9" +files = [ + {file = "scikit_learn-1.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:366fb3fa47dce90afed3d6106183f4978d6f24cfd595c2373424171b915ee718"}, + {file = "scikit_learn-1.6.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:59cd96a8d9f8dfd546f5d6e9787e1b989e981388d7803abbc9efdcde61e47460"}, + {file = "scikit_learn-1.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efa7a579606c73a0b3d210e33ea410ea9e1af7933fe324cb7e6fbafae4ea5948"}, + {file = "scikit_learn-1.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a46d3ca0f11a540b8eaddaf5e38172d8cd65a86cb3e3632161ec96c0cffb774c"}, + {file = "scikit_learn-1.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:5be4577769c5dde6e1b53de8e6520f9b664ab5861dd57acee47ad119fd7405d6"}, + {file = "scikit_learn-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1f50b4f24cf12a81c3c09958ae3b864d7534934ca66ded3822de4996d25d7285"}, + {file = "scikit_learn-1.6.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:eb9ae21f387826da14b0b9cb1034f5048ddb9182da429c689f5f4a87dc96930b"}, + {file = "scikit_learn-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0baa91eeb8c32632628874a5c91885eaedd23b71504d24227925080da075837a"}, + {file = "scikit_learn-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c716d13ba0a2f8762d96ff78d3e0cde90bc9c9b5c13d6ab6bb9b2d6ca6705fd"}, + {file = "scikit_learn-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:9aafd94bafc841b626681e626be27bf1233d5a0f20f0a6fdb4bee1a1963c6643"}, + {file = "scikit_learn-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:04a5ba45c12a5ff81518aa4f1604e826a45d20e53da47b15871526cda4ff5174"}, + {file = "scikit_learn-1.6.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:21fadfc2ad7a1ce8bd1d90f23d17875b84ec765eecbbfc924ff11fb73db582ce"}, + {file = "scikit_learn-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30f34bb5fde90e020653bb84dcb38b6c83f90c70680dbd8c38bd9becbad7a127"}, + {file = "scikit_learn-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dad624cffe3062276a0881d4e441bc9e3b19d02d17757cd6ae79a9d192a0027"}, + {file = "scikit_learn-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2fce7950a3fad85e0a61dc403df0f9345b53432ac0e47c50da210d22c60b6d85"}, + {file = "scikit_learn-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e5453b2e87ef8accedc5a8a4e6709f887ca01896cd7cc8a174fe39bd4bb00aef"}, + {file = "scikit_learn-1.6.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5fe11794236fb83bead2af26a87ced5d26e3370b8487430818b915dafab1724e"}, + {file = "scikit_learn-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61fe3dcec0d82ae280877a818ab652f4988371e32dd5451e75251bece79668b1"}, + {file = "scikit_learn-1.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b44e3a51e181933bdf9a4953cc69c6025b40d2b49e238233f149b98849beb4bf"}, + {file = "scikit_learn-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:a17860a562bac54384454d40b3f6155200c1c737c9399e6a97962c63fce503ac"}, + {file = "scikit_learn-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:98717d3c152f6842d36a70f21e1468fb2f1a2f8f2624d9a3f382211798516426"}, + {file = "scikit_learn-1.6.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:34e20bfac8ff0ebe0ff20fb16a4d6df5dc4cc9ce383e00c2ab67a526a3c67b18"}, + {file = "scikit_learn-1.6.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eba06d75815406091419e06dd650b91ebd1c5f836392a0d833ff36447c2b1bfa"}, + {file = "scikit_learn-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b6916d1cec1ff163c7d281e699d7a6a709da2f2c5ec7b10547e08cc788ddd3ae"}, + {file = "scikit_learn-1.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:66b1cf721a9f07f518eb545098226796c399c64abdcbf91c2b95d625068363da"}, + {file = "scikit_learn-1.6.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:7b35b60cf4cd6564b636e4a40516b3c61a4fa7a8b1f7a3ce80c38ebe04750bc3"}, + {file = "scikit_learn-1.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a73b1c2038c93bc7f4bf21f6c9828d5116c5d2268f7a20cfbbd41d3074d52083"}, + {file = "scikit_learn-1.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c3fa7d3dd5a0ec2d0baba0d644916fa2ab180ee37850c5d536245df916946bd"}, + {file = "scikit_learn-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:df778486a32518cda33818b7e3ce48c78cef1d5f640a6bc9d97c6d2e71449a51"}, + {file = "scikit_learn-1.6.0.tar.gz", hash = "sha256:9d58481f9f7499dff4196927aedd4285a0baec8caa3790efbe205f13de37dd6e"}, +] + +[package.dependencies] +joblib = ">=1.2.0" +numpy = ">=1.19.5" +scipy = ">=1.6.0" +threadpoolctl = ">=3.1.0" + +[package.extras] +benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] +build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.17.1)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)", "towncrier (>=24.8.0)"] +examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] +install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] +maintenance = ["conda-lock (==2.5.6)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.5.1)", "scikit-image (>=0.17.2)"] + +[[package]] +name = "scipy" +version = "1.13.1" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca"}, + {file = "scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f"}, + {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989"}, + {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f"}, + {file = "scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94"}, + {file = "scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54"}, + {file = "scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9"}, + {file = "scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326"}, + {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299"}, + {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa"}, + {file = "scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59"}, + {file = "scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b"}, + {file = "scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1"}, + {file = "scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d"}, + {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627"}, + {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884"}, + {file = "scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16"}, + {file = "scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949"}, + {file = "scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5"}, + {file = "scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24"}, + {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004"}, + {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d"}, + {file = "scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c"}, + {file = "scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2"}, + {file = "scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c"}, +] + +[package.dependencies] +numpy = ">=1.22.4,<2.3" + +[package.extras] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.12.0)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] +test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + [[package]] name = "sentry-sdk" version = "2.19.2" @@ -3803,14 +4729,70 @@ xxhash = ">=1.3.0,<4" [package.extras] test = ["coverage", "pytest"] +[[package]] +name = "sympy" +version = "1.13.1" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, + {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, +] + +[package.dependencies] +mpmath = ">=1.1.0,<1.4" + +[package.extras] +dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] + +[[package]] +name = "ta" +version = "0.11.0" +description = "Technical Analysis Library in Python" +optional = false +python-versions = "*" +files = [ + {file = "ta-0.11.0.tar.gz", hash = "sha256:de86af43418420bd6b088a2ea9b95483071bf453c522a8441bc2f12bcf8493fd"}, +] + +[package.dependencies] +numpy = "*" +pandas = "*" + +[[package]] +name = "template" +version = "0.7.6" +description = "A CLI tool for generating files from Jinja2 templates and environment variables." +optional = false +python-versions = "*" +files = [ + {file = "template-0.7.6-py2.py3-none-any.whl", hash = "sha256:9404c263631671d571de564fd44bba327a87c20079754f03981bad40317fd6c5"}, + {file = "template-0.7.6.tar.gz", hash = "sha256:d7b4c0f699f9e8528e1d16a853a4cee0f945c5a9db75c0a7cddb51df573f05ea"}, +] + +[package.dependencies] +Jinja2 = "*" +jmespath = "*" +PyYAML = "*" +toml = "*" + +[package.extras] +all = ["PyYAML", "jmespath", "netaddr", "toml"] +dev = ["pipenv"] +jmespath = ["jmespath"] +netaddr = ["netaddr"] +toml = ["toml"] +yaml = ["PyYAML"] + [[package]] name = "tensorboard" -version = "2.17.1" +version = "2.18.0" description = "TensorBoard lets you watch Tensors Flow" optional = false python-versions = ">=3.9" files = [ - {file = "tensorboard-2.17.1-py3-none-any.whl", hash = "sha256:253701a224000eeca01eee6f7e978aea7b408f60b91eb0babdb04e78947b773e"}, + {file = "tensorboard-2.18.0-py3-none-any.whl", hash = "sha256:107ca4821745f73e2aefa02c50ff70a9b694f39f790b11e6f682f7d326745eab"}, ] [package.dependencies] @@ -3839,27 +4821,27 @@ files = [ [[package]] name = "tensorflow" -version = "2.17.0" +version = "2.18.0" description = "TensorFlow is an open source machine learning framework for everyone." optional = false python-versions = ">=3.9" files = [ - {file = "tensorflow-2.17.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:515fe5ae8a9bc50312575412b08515f3ca66514c155078e0707bdffbea75d783"}, - {file = "tensorflow-2.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b36683ac28af20abc3a548c72bf4537b00df1b1f3dd39d59df3873fefaf26f15"}, - {file = "tensorflow-2.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:147c93ded4cb7e500a65d3c26d74744ff41660db7a8afe2b00d1d08bf329b4ec"}, - {file = "tensorflow-2.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46090587f69e33637d17d7c3d94a790cac7d4bc5ff5ecbf3e71fdc6982fe96e"}, - {file = "tensorflow-2.17.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e8d26d6c24ccfb139db1306599257ca8f5cfe254ef2d023bfb667f374a17a64d"}, - {file = "tensorflow-2.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca82f98ea38fa6c9e08ccc69eb6c2fab5b35b30a8999115b8b63b6f02fc69d9d"}, - {file = "tensorflow-2.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8339777b1b5ebd8ffadaa8196f786e65fbb081a371d8e87b52f24563392d8552"}, - {file = "tensorflow-2.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:ef615c133cf4d592a073feda634ccbeb521a554be57de74f8c318d38febbeab5"}, - {file = "tensorflow-2.17.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ee18b4fcd627c5e872eabb25092af6c808b6ec77948662c88fc5c89a60eb0211"}, - {file = "tensorflow-2.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72adfef0ee39dd641627906fd7b244fcf21bdd8a87216a998ed74d9c74653aff"}, - {file = "tensorflow-2.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ad7bfea6afb4ded3928ca5b24df9fda876cea4904c103a5163fcc0c3483e7a4"}, - {file = "tensorflow-2.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:278bc80642d799adf08dc4e04f291aab603bba7457d50c1f9bc191ebbca83f43"}, - {file = "tensorflow-2.17.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:97f89e95d68b4b46e1072243b9f315c3b340e27cc07b1e1988e2ca97ad844305"}, - {file = "tensorflow-2.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dde37cff74ed22b8fa2eea944805b001ae38e96adc989666422bdea34f4e2d47"}, - {file = "tensorflow-2.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ae8e6746deb2ec807b902ba26d62fcffb6a6b53555a1a5906ec00416c5e4175"}, - {file = "tensorflow-2.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:8f80d11ad3766570deb6ff47d2bed2d166f51399ca08205e38ef024345571d6f"}, + {file = "tensorflow-2.18.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:8da90a9388a1f6dd00d626590d2b5810faffbb3e7367f9783d80efff882340ee"}, + {file = "tensorflow-2.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:589342fb9bdcab2e9af0f946da4ca97757677e297d934fcdc087e87db99d6353"}, + {file = "tensorflow-2.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eb77fae50d699442726d1b23c7512c97cd688cc7d857b028683d4535bbf3709"}, + {file = "tensorflow-2.18.0-cp310-cp310-win_amd64.whl", hash = "sha256:46f5a8b4e6273f488dc069fc3ac2211b23acd3d0437d919349c787fa341baa8a"}, + {file = "tensorflow-2.18.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:453cb60638a02fd26316fb36c8cbcf1569d33671f17c658ca0cf2b4626f851e7"}, + {file = "tensorflow-2.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85f1e7369af6d329b117b52e86093cd1e0458dd5404bf5b665853f873dd00b48"}, + {file = "tensorflow-2.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b8dd70fa3600bfce66ab529eebb804e1f9d7c863d2f71bc8fe9fc7a1ec3976"}, + {file = "tensorflow-2.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e8b0f499ef0b7652480a58e358a73844932047f21c42c56f7f3bdcaf0803edc"}, + {file = "tensorflow-2.18.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ec4133a215c59314e929e7cbe914579d3afbc7874d9fa924873ee633fe4f71d0"}, + {file = "tensorflow-2.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4822904b3559d8a9c25f0fe5fef191cfc1352ceca42ca64f2a7bc7ae0ff4a1f5"}, + {file = "tensorflow-2.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfdd65ea7e064064283dd78d529dd621257ee617218f63681935fd15817c6286"}, + {file = "tensorflow-2.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:a701c2d3dca5f2efcab315b2c217f140ebd3da80410744e87d77016b3aaf53cb"}, + {file = "tensorflow-2.18.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:336cace378c129c20fee6292f6a541165073d153a9a4c9cf4f14478a81895776"}, + {file = "tensorflow-2.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcfd32134de8f95515b2d0ced89cdae15484b787d3a21893e9291def06c10c4e"}, + {file = "tensorflow-2.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada1f7290c75b34748ee7378c1b77927e4044c94b8dc72dc75e7667c4fdaeb94"}, + {file = "tensorflow-2.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:f8c946df1cb384504578fac1c199a95322373b8e04abd88aa8ae01301df469ea"}, ] [package.dependencies] @@ -3869,25 +4851,25 @@ flatbuffers = ">=24.3.25" gast = ">=0.2.1,<0.5.0 || >0.5.0,<0.5.1 || >0.5.1,<0.5.2 || >0.5.2" google-pasta = ">=0.1.1" grpcio = ">=1.24.3,<2.0" -h5py = ">=3.10.0" -keras = ">=3.2.0" +h5py = ">=3.11.0" +keras = ">=3.5.0" libclang = ">=13.0.0" -ml-dtypes = ">=0.3.1,<0.5.0" -numpy = {version = ">=1.23.5,<2.0.0", markers = "python_version <= \"3.11\""} +ml-dtypes = ">=0.4.0,<0.5.0" +numpy = ">=1.26.0,<2.1.0" opt-einsum = ">=2.3.2" packaging = "*" -protobuf = ">=3.20.3,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +protobuf = ">=3.20.3,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" requests = ">=2.21.0,<3" setuptools = "*" six = ">=1.12.0" -tensorboard = ">=2.17,<2.18" +tensorboard = ">=2.18,<2.19" tensorflow-io-gcs-filesystem = {version = ">=0.23.1", markers = "python_version < \"3.12\""} termcolor = ">=1.1.0" typing-extensions = ">=3.6.6" wrapt = ">=1.11.0" [package.extras] -and-cuda = ["nvidia-cublas-cu12 (==12.3.4.1)", "nvidia-cuda-cupti-cu12 (==12.3.101)", "nvidia-cuda-nvcc-cu12 (==12.3.107)", "nvidia-cuda-nvrtc-cu12 (==12.3.107)", "nvidia-cuda-runtime-cu12 (==12.3.101)", "nvidia-cudnn-cu12 (==8.9.7.29)", "nvidia-cufft-cu12 (==11.0.12.1)", "nvidia-curand-cu12 (==10.3.4.107)", "nvidia-cusolver-cu12 (==11.5.4.101)", "nvidia-cusparse-cu12 (==12.2.0.103)", "nvidia-nccl-cu12 (==2.19.3)", "nvidia-nvjitlink-cu12 (==12.3.101)"] +and-cuda = ["nvidia-cublas-cu12 (==12.5.3.2)", "nvidia-cuda-cupti-cu12 (==12.5.82)", "nvidia-cuda-nvcc-cu12 (==12.5.82)", "nvidia-cuda-nvrtc-cu12 (==12.5.82)", "nvidia-cuda-runtime-cu12 (==12.5.82)", "nvidia-cudnn-cu12 (==9.3.0.75)", "nvidia-cufft-cu12 (==11.2.3.61)", "nvidia-curand-cu12 (==10.3.6.82)", "nvidia-cusolver-cu12 (==11.6.3.83)", "nvidia-cusparse-cu12 (==12.5.1.3)", "nvidia-nccl-cu12 (==2.21.5)", "nvidia-nvjitlink-cu12 (==12.5.82)"] [[package]] name = "tensorflow-io-gcs-filesystem" @@ -3935,6 +4917,60 @@ files = [ [package.extras] tests = ["pytest", "pytest-cov"] +[[package]] +name = "threadpoolctl" +version = "3.5.0" +description = "threadpoolctl" +optional = false +python-versions = ">=3.8" +files = [ + {file = "threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467"}, + {file = "threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107"}, +] + +[[package]] +name = "tokenizers" +version = "0.21.0" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tokenizers-0.21.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:3c4c93eae637e7d2aaae3d376f06085164e1660f89304c0ab2b1d08a406636b2"}, + {file = "tokenizers-0.21.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:f53ea537c925422a2e0e92a24cce96f6bc5046bbef24a1652a5edc8ba975f62e"}, + {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b177fb54c4702ef611de0c069d9169f0004233890e0c4c5bd5508ae05abf193"}, + {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b43779a269f4629bebb114e19c3fca0223296ae9fea8bb9a7a6c6fb0657ff8e"}, + {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aeb255802be90acfd363626753fda0064a8df06031012fe7d52fd9a905eb00e"}, + {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8b09dbeb7a8d73ee204a70f94fc06ea0f17dcf0844f16102b9f414f0b7463ba"}, + {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:400832c0904f77ce87c40f1a8a27493071282f785724ae62144324f171377273"}, + {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84ca973b3a96894d1707e189c14a774b701596d579ffc7e69debfc036a61a04"}, + {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:eb7202d231b273c34ec67767378cd04c767e967fda12d4a9e36208a34e2f137e"}, + {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:089d56db6782a73a27fd8abf3ba21779f5b85d4a9f35e3b493c7bbcbbf0d539b"}, + {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:c87ca3dc48b9b1222d984b6b7490355a6fdb411a2d810f6f05977258400ddb74"}, + {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4145505a973116f91bc3ac45988a92e618a6f83eb458f49ea0790df94ee243ff"}, + {file = "tokenizers-0.21.0-cp39-abi3-win32.whl", hash = "sha256:eb1702c2f27d25d9dd5b389cc1f2f51813e99f8ca30d9e25348db6585a97e24a"}, + {file = "tokenizers-0.21.0-cp39-abi3-win_amd64.whl", hash = "sha256:87841da5a25a3a5f70c102de371db120f41873b854ba65e52bccd57df5a3780c"}, + {file = "tokenizers-0.21.0.tar.gz", hash = "sha256:ee0894bf311b75b0c03079f33859ae4b2334d675d4e93f5a4132e1eae2834fe4"}, +] + +[package.dependencies] +huggingface-hub = ">=0.16.4,<1.0" + +[package.extras] +dev = ["tokenizers[testing]"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] + +[[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 = "tomli" version = "2.2.1" @@ -3987,6 +5023,57 @@ files = [ {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, ] +[[package]] +name = "torch" +version = "2.5.1" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "torch-2.5.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:71328e1bbe39d213b8721678f9dcac30dfc452a46d586f1d514a6aa0a99d4744"}, + {file = "torch-2.5.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:34bfa1a852e5714cbfa17f27c49d8ce35e1b7af5608c4bc6e81392c352dbc601"}, + {file = "torch-2.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:32a037bd98a241df6c93e4c789b683335da76a2ac142c0973675b715102dc5fa"}, + {file = "torch-2.5.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:23d062bf70776a3d04dbe74db950db2a5245e1ba4f27208a87f0d743b0d06e86"}, + {file = "torch-2.5.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:de5b7d6740c4b636ef4db92be922f0edc425b65ed78c5076c43c42d362a45457"}, + {file = "torch-2.5.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:340ce0432cad0d37f5a31be666896e16788f1adf8ad7be481196b503dad675b9"}, + {file = "torch-2.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:603c52d2fe06433c18b747d25f5c333f9c1d58615620578c326d66f258686f9a"}, + {file = "torch-2.5.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:31f8c39660962f9ae4eeec995e3049b5492eb7360dd4f07377658ef4d728fa4c"}, + {file = "torch-2.5.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:ed231a4b3a5952177fafb661213d690a72caaad97d5824dd4fc17ab9e15cec03"}, + {file = "torch-2.5.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:3f4b7f10a247e0dcd7ea97dc2d3bfbfc90302ed36d7f3952b0008d0df264e697"}, + {file = "torch-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:73e58e78f7d220917c5dbfad1a40e09df9929d3b95d25e57d9f8558f84c9a11c"}, + {file = "torch-2.5.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:8c712df61101964eb11910a846514011f0b6f5920c55dbf567bff8a34163d5b1"}, + {file = "torch-2.5.1-cp313-cp313-manylinux1_x86_64.whl", hash = "sha256:9b61edf3b4f6e3b0e0adda8b3960266b9009d02b37555971f4d1c8f7a05afed7"}, + {file = "torch-2.5.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1f3b7fb3cf7ab97fae52161423f81be8c6b8afac8d9760823fd623994581e1a3"}, + {file = "torch-2.5.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:7974e3dce28b5a21fb554b73e1bc9072c25dde873fa00d54280861e7a009d7dc"}, + {file = "torch-2.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:46c817d3ea33696ad3b9df5e774dba2257e9a4cd3c4a3afbf92f6bb13ac5ce2d"}, + {file = "torch-2.5.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:8046768b7f6d35b85d101b4b38cba8aa2f3cd51952bc4c06a49580f2ce682291"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +jinja2 = "*" +networkx = "*" +nvidia-cublas-cu12 = {version = "12.4.5.8", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "9.1.0.70", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.2.1.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.5.147", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.6.1.9", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.3.1.170", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.21.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvjitlink-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +sympy = {version = "1.13.1", markers = "python_version >= \"3.9\""} +triton = {version = "3.1.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.13\""} +typing-extensions = ">=4.8.0" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] +optree = ["optree (>=0.12.0)"] + [[package]] name = "tqdm" version = "4.67.1" @@ -4008,6 +5095,97 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] +[[package]] +name = "transformers" +version = "4.47.1" +description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "transformers-4.47.1-py3-none-any.whl", hash = "sha256:d2f5d19bb6283cd66c893ec7e6d931d6370bbf1cc93633326ff1f41a40046c9c"}, + {file = "transformers-4.47.1.tar.gz", hash = "sha256:6c29c05a5f595e278481166539202bf8641281536df1c42357ee58a45d0a564a"}, +] + +[package.dependencies] +filelock = "*" +huggingface-hub = ">=0.24.0,<1.0" +numpy = ">=1.17" +packaging = ">=20.0" +pyyaml = ">=5.1" +regex = "!=2019.12.17" +requests = "*" +safetensors = ">=0.4.1" +tokenizers = ">=0.21,<0.22" +tqdm = ">=4.27" + +[package.extras] +accelerate = ["accelerate (>=0.26.0)"] +agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch", "torchaudio", "torchvision"] +audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +benchmark = ["optimum-benchmark (>=0.3.0)"] +codecarbon = ["codecarbon (==1.2.0)"] +deepspeed = ["accelerate (>=0.26.0)", "deepspeed (>=0.9.3)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.26.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.21,<0.22)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "libcst", "librosa", "nltk (<=3.8.1)", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] +flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +ftfy = ["ftfy"] +integrations = ["optuna", "ray[tune] (>=2.7.0)", "sigopt"] +ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0,<1.3.1)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] +modelcreation = ["cookiecutter (==1.7.3)"] +natten = ["natten (>=0.14.6,<0.15.0)"] +onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] +onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] +optuna = ["optuna"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "libcst", "rich", "ruff (==0.5.1)", "urllib3 (<2.0.0)"] +ray = ["ray[tune] (>=2.7.0)"] +retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] +ruff = ["ruff (==0.5.1)"] +sagemaker = ["sagemaker (>=2.31.0)"] +sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"] +serving = ["fastapi", "pydantic", "starlette", "uvicorn"] +sigopt = ["sigopt"] +sklearn = ["scikit-learn"] +speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +tiktoken = ["blobfile", "tiktoken"] +timm = ["timm (<=1.0.11)"] +tokenizers = ["tokenizers (>=0.21,<0.22)"] +torch = ["accelerate (>=0.26.0)", "torch"] +torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] +torchhub = ["filelock", "huggingface-hub (>=0.24.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.21,<0.22)", "torch", "tqdm (>=4.27)"] +video = ["av (==9.2.0)"] +vision = ["Pillow (>=10.0.1,<=15.0)"] + +[[package]] +name = "triton" +version = "3.1.0" +description = "A language and compiler for custom Deep Learning operations" +optional = false +python-versions = "*" +files = [ + {file = "triton-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b0dd10a925263abbe9fa37dcde67a5e9b2383fc269fdf59f5657cac38c5d1d8"}, + {file = "triton-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f34f6e7885d1bf0eaaf7ba875a5f0ce6f3c13ba98f9503651c1e6dc6757ed5c"}, + {file = "triton-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8182f42fd8080a7d39d666814fa36c5e30cc00ea7eeeb1a2983dbb4c99a0fdc"}, + {file = "triton-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dadaca7fc24de34e180271b5cf864c16755702e9f63a16f62df714a8099126a"}, + {file = "triton-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aafa9a20cd0d9fee523cd4504aa7131807a864cd77dcf6efe7e981f18b8c6c11"}, +] + +[package.dependencies] +filelock = "*" + +[package.extras] +build = ["cmake (>=3.20)", "lit"] +tests = ["autopep8", "flake8", "isort", "llnl-hatchet", "numpy", "pytest", "scipy (>=1.7.1)"] +tutorials = ["matplotlib", "pandas", "tabulate"] + [[package]] name = "typing-extensions" version = "4.12.2" @@ -4049,13 +5227,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.32.1" +version = "0.34.0" description = "The lightning-fast ASGI server." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "uvicorn-0.32.1-py3-none-any.whl", hash = "sha256:82ad92fd58da0d12af7482ecdb5f2470a04c9c9a53ced65b9bbb4a205377602e"}, - {file = "uvicorn-0.32.1.tar.gz", hash = "sha256:ee9519c246a72b1c084cea8d3b44ed6026e78a4a309cbedae9c37e4cb9fbb175"}, + {file = "uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4"}, + {file = "uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9"}, ] [package.dependencies] @@ -4066,47 +5244,77 @@ typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} [package.extras] standard = ["colorama (>=0.4)", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] +[[package]] +name = "virtualenv" +version = "20.28.0" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.8" +files = [ + {file = "virtualenv-20.28.0-py3-none-any.whl", hash = "sha256:23eae1b4516ecd610481eda647f3a7c09aea295055337331bb4e6892ecce47b0"}, + {file = "virtualenv-20.28.0.tar.gz", hash = "sha256:2c9c3262bb8e7b87ea801d715fae4495e6032450c71d2309be9550e7364049aa"}, +] + +[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 = "wandb" -version = "0.16.6" +version = "0.19.1" description = "A CLI and library for interacting with the Weights & Biases API." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "wandb-0.16.6-py3-none-any.whl", hash = "sha256:5810019a3b981c796e98ea58557a7c380f18834e0c6bdaed15df115522e5616e"}, - {file = "wandb-0.16.6.tar.gz", hash = "sha256:86f491e3012d715e0d7d7421a4d6de41abef643b7403046261f962f3e512fe1c"}, + {file = "wandb-0.19.1-py3-none-any.whl", hash = "sha256:b3195b3fe4d1b8131f64b956e6a5de7486cecfec179570986dbd6c64cd29b3c5"}, + {file = "wandb-0.19.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:788c20d8c3dabe490b50961dc91298886853dd8a0276a09ef3fc5c7f1f137c1d"}, + {file = "wandb-0.19.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:343d46c59aba3c30cf98ce8e0b9a2e1e52986a0ac0433d092de9aa856aeece98"}, + {file = "wandb-0.19.1-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:7541efa8ffab715ba932fcb5117c4255a47cadebf0365d1dc1eb684a94744573"}, + {file = "wandb-0.19.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec64a859478b9f5bcf894aedd2bcccaf6917abe7b8adbd722b2a43b7063d33db"}, + {file = "wandb-0.19.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:405000bc3d2e369934ff1266fcc55ff968e4a0f24c2fdaa9a0585b170c01b60c"}, + {file = "wandb-0.19.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:809b5ae83ed314b97db1077490f37d6c926c7c96fad9b6b5a2476534d54defb4"}, + {file = "wandb-0.19.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e01e9176b5ca9660226edcbfd9323019aa9bd5789a4b384d23ba53e062d3966e"}, + {file = "wandb-0.19.1-py3-none-win32.whl", hash = "sha256:093cc5c39ce629390c4f465b1ae89bab2ee9b29c2a46c8b5143858dd8c73264b"}, + {file = "wandb-0.19.1-py3-none-win_amd64.whl", hash = "sha256:1fc9d403fffb84e37f4e56a075b26b639e9f489899c9b9db9f46e3a7b7d93c64"}, + {file = "wandb-0.19.1.tar.gz", hash = "sha256:a9b4bf790c468e7b350eeaba2de002672a5cbaa3049899ab060940e2388f429a"}, ] [package.dependencies] -appdirs = ">=1.4.3" -Click = ">=7.1,<8.0.0 || >8.0.0" +click = ">=7.1,<8.0.0 || >8.0.0" docker-pycreds = ">=0.4.0" -GitPython = ">=1.0.0,<3.1.29 || >3.1.29" +eval-type-backport = {version = "*", markers = "python_version < \"3.10\""} +gitpython = ">=1.0.0,<3.1.29 || >3.1.29" +platformdirs = "*" protobuf = [ - {version = ">=3.15.0,<4.21.0 || >4.21.0,<5", markers = "python_version == \"3.9\" and sys_platform == \"linux\""}, - {version = ">=3.19.0,<4.21.0 || >4.21.0,<5", markers = "python_version > \"3.9\" or sys_platform != \"linux\""}, + {version = ">=3.15.0,<4.21.0 || >4.21.0,<5.28.0 || >5.28.0,<6", markers = "python_version == \"3.9\" and sys_platform == \"linux\""}, + {version = ">=3.19.0,<4.21.0 || >4.21.0,<5.28.0 || >5.28.0,<6", markers = "python_version > \"3.9\" or sys_platform != \"linux\""}, ] psutil = ">=5.0.0" -PyYAML = "*" +pydantic = ">=2.6,<3" +pyyaml = "*" requests = ">=2.0.0,<3" -sentry-sdk = ">=1.0.0" +sentry-sdk = ">=2.0.0" setproctitle = "*" setuptools = "*" -typing-extensions = {version = "*", markers = "python_version < \"3.10\""} +typing-extensions = {version = ">=4.4,<5", markers = "python_version < \"3.12\""} [package.extras] -async = ["httpx (>=0.23.0)"] aws = ["boto3"] azure = ["azure-identity", "azure-storage-blob"] gcp = ["google-cloud-storage"] -importers = ["filelock", "mlflow", "polars", "rich", "tenacity"] +importers = ["filelock", "mlflow", "polars (<=1.2.1)", "rich", "tenacity"] kubeflow = ["google-cloud-storage", "kubernetes", "minio", "sh"] -launch = ["PyYAML (>=6.0.0)", "awscli", "azure-containerregistry", "azure-identity", "azure-storage-blob", "boto3", "botocore", "chardet", "google-auth", "google-cloud-aiplatform", "google-cloud-artifact-registry", "google-cloud-compute", "google-cloud-storage", "iso8601", "kubernetes", "kubernetes-asyncio", "nbconvert", "nbformat", "optuna", "pydantic", "tomli", "typing-extensions"] -media = ["bokeh", "moviepy", "numpy", "pillow", "plotly (>=5.18.0)", "rdkit-pypi", "soundfile"] +launch = ["awscli", "azure-containerregistry", "azure-identity", "azure-storage-blob", "boto3", "botocore", "chardet", "google-auth", "google-cloud-aiplatform", "google-cloud-artifact-registry", "google-cloud-compute", "google-cloud-storage", "iso8601", "jsonschema", "kubernetes", "kubernetes-asyncio", "nbconvert", "nbformat", "optuna", "pydantic", "pyyaml (>=6.0.0)", "tomli", "typing-extensions"] +media = ["bokeh", "imageio", "moviepy", "numpy", "pillow", "plotly (>=5.18.0)", "rdkit", "soundfile"] models = ["cloudpickle"] perf = ["orjson"] -reports = ["pydantic (>=2.0.0)"] sweeps = ["sweeps (>=0.2.0)"] +workspaces = ["wandb-workspaces"] [[package]] name = "webencodings" @@ -4166,6 +5374,20 @@ files = [ [package.extras] test = ["pytest (>=6.0.0)", "setuptools (>=65)"] +[[package]] +name = "win32-setctime" +version = "1.2.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" +files = [ + {file = "win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390"}, + {file = "win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0"}, +] + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + [[package]] name = "wrapt" version = "1.17.0" @@ -4470,17 +5692,16 @@ propcache = ">=0.2.0" [[package]] name = "yfinance" -version = "0.2.37" +version = "0.2.50" description = "Download market data from Yahoo! Finance API" optional = false python-versions = "*" files = [ - {file = "yfinance-0.2.37-py2.py3-none-any.whl", hash = "sha256:3ac75fa1cd3496ee76b6df5d63d29679487ea9447123c5b935d1593240737a8f"}, - {file = "yfinance-0.2.37.tar.gz", hash = "sha256:e5f78c9bd27bae7abfd0af9b7996620eaa9aba759d67f957296634d7d54f0cef"}, + {file = "yfinance-0.2.50-py2.py3-none-any.whl", hash = "sha256:0db13b19313043328fe88ded2ddc306ede7d901d0f5181462a1cce76acdbcd2a"}, + {file = "yfinance-0.2.50.tar.gz", hash = "sha256:33b379cad4261313dc93bfe3148d2f6e6083210e6341f0c93dd3af853019b1a0"}, ] [package.dependencies] -appdirs = ">=1.4.4" beautifulsoup4 = ">=4.11.1" frozendict = ">=2.3.4" html5lib = ">=1.1" @@ -4489,6 +5710,7 @@ multitasking = ">=0.0.7" numpy = ">=1.16.5" pandas = ">=1.3.0" peewee = ">=3.16.2" +platformdirs = ">=2.0.0" pytz = ">=2022.5" requests = ">=2.31" @@ -4518,4 +5740,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">= 3.9, < 3.12" -content-hash = "38288209b911c23a8aadb82192c05befd224f433ab68fe0e9c20807b2efd0c47" +content-hash = "0548c6c88d5d60cda87bdbee47c5446871aed569d21f9de0010db7225834b521" diff --git a/pyproject.toml b/pyproject.toml index f67b1900..c7ad6ea8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,18 +6,46 @@ authors = ["Foundry Digital"] readme = "README.md" [tool.poetry.dependencies] +# ^1.2.3 means >=1.2.3 and <2.0.0 +# ~1.2.3 means >=1.2.3 and <1.3.0 + # Python version - 3.9, 3.10, 3.11 python = ">= 3.9, < 3.12" -# Copied from requirements.txt +# Bittensor Version Strict bittensor = "7.4.0" -huggingface_hub = "0.22.2" -tensorflow = "2.17.0" -wandb = "0.16.6" -yfinance = "0.2.37" + +# Bittensor Dependencies We Also Need +setuptools = "~70.0.0" +pydantic = "^2.3.0" +numpy = "^1.26" + +# Subnet Specific Dependencies +torch = "^2.5.1" +ta = "^0.11.0" +joblib = "^1.4.2" +pandas = "^2.2.3" +pytz = "^2024.2" +tensorflow = "^2.18.0" +yfinance = "^0.2.50" +huggingface-hub = "^0.27.0" +loguru = "^0.7.3" +pandas-market-calendars = "^4.4.2" +python-dotenv = "^1.0.1" +scikit-learn = "^1.6.0" +wandb = "^0.19.1" [tool.poetry.group.dev.dependencies] pre-commit-hooks = "5.0.0" +black = "^24.10.0" +flake8 = "^7.1.1" +isort = "^5.13.2" +mypy = "^1.13.0" +pre-commit = "^4.0.1" +rich = "^13.9.4" +transformers = "^4.47.1" +template = "^0.7.6" +starlette = "~0.37.2" [tool.black] line-length = 120 diff --git a/requirements/dev_requirements.txt b/requirements/dev_requirements.txt deleted file mode 100644 index 81602a07..00000000 --- a/requirements/dev_requirements.txt +++ /dev/null @@ -1,10 +0,0 @@ -black -flake8 -isort -mypy -pre-commit -pre-commit-hooks==5.0.0 -rich -starlette -template -transformers diff --git a/requirements/requirements.txt b/requirements/requirements.txt deleted file mode 100644 index 5d71539f..00000000 --- a/requirements/requirements.txt +++ /dev/null @@ -1,17 +0,0 @@ -bittensor==7.4.0 -huggingface_hub==0.26.5 -joblib -loguru -numpy -pandas -pandas_market_calendars -pydantic -python_dotenv -pytz -scikit_learn -setuptools -ta -tensorflow==2.17.0 -torch -wandb==0.16.6 -yfinance==0.2.37 diff --git a/setup.py b/setup.py deleted file mode 100644 index 4a3f3ee5..00000000 --- a/setup.py +++ /dev/null @@ -1,94 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2023 Yuma Rao -# TODO(developer): Set your name -# Copyright © 2023 - -# 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. - -import codecs -import os -import re -from io import open -from os import path - -from setuptools import find_packages, setup - - -def read_requirements(path): - with open(path, "r") as f: - requirements = f.read().splitlines() - processed_requirements = [] - - for req in requirements: - # For git or other VCS links - if req.startswith("git+") or "@" in req: - pkg_name = re.search(r"(#egg=)([\w\-_]+)", req) - if pkg_name: - processed_requirements.append(pkg_name.group(2)) - else: - # You may decide to raise an exception here, - # if you want to ensure every VCS link has an #egg= at the end - continue - else: - processed_requirements.append(req) - return processed_requirements - - -here = path.abspath(path.dirname(__file__)) -requirements = read_requirements(path.join(here, "requirements", "requirements.txt")) -dev_requirements = read_requirements(path.join(here, "requirements", "dev_requirements.txt")) - -with open(path.join(here, "README.md"), encoding="utf-8") as f: - long_description = f.read() - -# loading version from setup.py -with codecs.open(os.path.join(here, "predictionnet/__init__.py"), encoding="utf-8") as init_file: - version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", init_file.read(), re.M) - version_string = version_match.group(1) - -setup( - name="predictionnet", # TODO(developer): Change this value to your module subnet name. - version=version_string, - description="bittensor_subnet_template", # TODO(developer): Change this value to your module subnet description. - long_description=long_description, - long_description_content_type="text/markdown", - url="https://github.com/opentensor/bittensor-subnet-template", # TODO(developer): Change this url to your module subnet github url. - author="bittensor.com", # TODO(developer): Change this value to your module subnet author name. - packages=find_packages(), - include_package_data=True, - author_email="", # TODO(developer): Change this value to your module subnet author email. - license="MIT", - python_requires=">=3.9", - install_requires=requirements, - extras_require={ - "DEV": dev_requirements, - }, - classifiers=[ - "Development Status :: 3 - Alpha", - "Intended Audience :: Developers", - "Topic :: Software Development :: Build Tools", - # Pick your license as you wish - "License :: OSI Approved :: MIT License", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Topic :: Scientific/Engineering", - "Topic :: Scientific/Engineering :: Mathematics", - "Topic :: Scientific/Engineering :: Artificial Intelligence", - "Topic :: Software Development", - "Topic :: Software Development :: Libraries", - "Topic :: Software Development :: Libraries :: Python Modules", - ], -) From 48c3228ad15889772372a4a0218b560ccb99e5eb Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Wed, 18 Dec 2024 16:33:41 -0500 Subject: [PATCH 140/201] Run pre-commit hooks --- .github/workflows/build.yml | 2 +- .github/workflows/ci.yml | 2 +- snp_oracle/__init__.py | 2 +- snp_oracle/neurons/miner.py | 5 +---- snp_oracle/neurons/validator.py | 2 -- snp_oracle/predictionnet/__init__.py | 1 - snp_oracle/predictionnet/api/example.py | 1 - snp_oracle/predictionnet/base/neuron.py | 1 - tests/test_package.py | 2 +- 9 files changed, 5 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6c7142d5..4af059f8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -81,4 +81,4 @@ jobs: # Run custom command(s) within venv #------------------------------------------------ - name: Run commands - run: ${{ inputs.command }} \ No newline at end of file + run: ${{ inputs.command }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3425cdd4..4f66fc49 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,4 +68,4 @@ jobs: uses: ./.github/workflows/build.yml with: name: Unittests - command: poetry run pytest tests/ \ No newline at end of file + command: poetry run pytest tests/ diff --git a/snp_oracle/__init__.py b/snp_oracle/__init__.py index 93623516..e51a7ecd 100644 --- a/snp_oracle/__init__.py +++ b/snp_oracle/__init__.py @@ -2,4 +2,4 @@ __version__ = importlib.metadata.version(__name__ or __package__) version_split = __version__.split(".") -__spec_version__ = (1000 * int(version_split[0])) + (10 * int(version_split[1])) + (1 * int(version_split[2])) \ No newline at end of file +__spec_version__ = (1000 * int(version_split[0])) + (10 * int(version_split[1])) + (1 * int(version_split[2])) diff --git a/snp_oracle/neurons/miner.py b/snp_oracle/neurons/miner.py index 08d35625..76cf6911 100644 --- a/snp_oracle/neurons/miner.py +++ b/snp_oracle/neurons/miner.py @@ -3,17 +3,14 @@ import typing import bittensor as bt - from dotenv import load_dotenv from huggingface_hub import hf_hub_download from tensorflow.keras.models import load_model -import snp_oracle.predictionnet +import snp_oracle.predictionnet as predictionnet from snp_oracle.base_miner.get_data import prep_data, scale_data from snp_oracle.base_miner.predict import predict - from snp_oracle.predictionnet.base.miner import BaseMinerNeuron - from snp_oracle.predictionnet.utils.miner_hf import MinerHfInterface load_dotenv() diff --git a/snp_oracle/neurons/validator.py b/snp_oracle/neurons/validator.py index 8494e77b..ee0a3f48 100644 --- a/snp_oracle/neurons/validator.py +++ b/snp_oracle/neurons/validator.py @@ -12,11 +12,9 @@ from numpy import full, nan from snp_oracle import __version__ - from snp_oracle.predictionnet.base.validator import BaseValidatorNeuron from snp_oracle.predictionnet.utils.huggingface import HfInterface from snp_oracle.predictionnet.utils.uids import check_uid_availability - from snp_oracle.predictionnet.validator import forward load_dotenv() diff --git a/snp_oracle/predictionnet/__init__.py b/snp_oracle/predictionnet/__init__.py index 12830a0e..b574050e 100644 --- a/snp_oracle/predictionnet/__init__.py +++ b/snp_oracle/predictionnet/__init__.py @@ -2,4 +2,3 @@ # Import all submodules. from snp_oracle.predictionnet import base, protocol, validator - diff --git a/snp_oracle/predictionnet/api/example.py b/snp_oracle/predictionnet/api/example.py index cd7b6480..cc841b4c 100644 --- a/snp_oracle/predictionnet/api/example.py +++ b/snp_oracle/predictionnet/api/example.py @@ -1,5 +1,4 @@ import bittensor as bt - from predictionnet.api.get_query_axons import get_query_api_axons from predictionnet.api.prediction import PredictionAPI diff --git a/snp_oracle/predictionnet/base/neuron.py b/snp_oracle/predictionnet/base/neuron.py index 607f6872..3d1efef8 100644 --- a/snp_oracle/predictionnet/base/neuron.py +++ b/snp_oracle/predictionnet/base/neuron.py @@ -4,7 +4,6 @@ import bittensor as bt from snp_oracle import __spec_version__ as spec_version - from snp_oracle.predictionnet.utils.config import add_args, check_config, config from snp_oracle.predictionnet.utils.misc import ttl_get_block diff --git a/tests/test_package.py b/tests/test_package.py index a3084cce..1f1e03b9 100644 --- a/tests/test_package.py +++ b/tests/test_package.py @@ -11,4 +11,4 @@ def setUp(self): def test_package_version(self): # Check that version is as expected # Must update to increment package version successfully - self.assertEqual(__version__, "2.2.1") \ No newline at end of file + self.assertEqual(__version__, "2.2.1") From be016cfac6db6e4c9e3d644d3ea2f68536eed7b2 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Wed, 18 Dec 2024 16:37:09 -0500 Subject: [PATCH 141/201] Delete unused tests --- tests/helpers.py | 144 ------------------------------- tests/test_template_validator.py | 92 -------------------- 2 files changed, 236 deletions(-) delete mode 100644 tests/helpers.py delete mode 100644 tests/test_template_validator.py diff --git a/tests/helpers.py b/tests/helpers.py deleted file mode 100644 index 7fcf148e..00000000 --- a/tests/helpers.py +++ /dev/null @@ -1,144 +0,0 @@ -# from typing import Union - -# from bittensor import AxonInfo, Balance, NeuronInfo, PrometheusInfo -# from bittensor.mock.wallet_mock import MockWallet as _MockWallet -# from bittensor.mock.wallet_mock import get_mock_coldkey as _get_mock_coldkey -# from bittensor.mock.wallet_mock import get_mock_hotkey as _get_mock_hotkey -# from bittensor.mock.wallet_mock import get_mock_wallet as _get_mock_wallet -# from rich.console import Console -# from rich.text import Text - - -# def __mock_wallet_factory__(*args, **kwargs) -> _MockWallet: -# """Returns a mock wallet object.""" - -# mock_wallet = _get_mock_wallet() - -# return mock_wallet - - -# class CLOSE_IN_VALUE: -# value: Union[float, int, Balance] -# tolerance: Union[float, int, Balance] - -# def __init__( -# self, -# value: Union[float, int, Balance], -# tolerance: Union[float, int, Balance] = 0.0, -# ) -> None: -# self.value = value -# self.tolerance = tolerance - -# def __eq__(self, __o: Union[float, int, Balance]) -> bool: -# # True if __o \in [value - tolerance, value + tolerance] -# # or if value \in [__o - tolerance, __o + tolerance] -# return ((self.value - self.tolerance) <= __o and __o <= (self.value + self.tolerance)) or ( -# (__o - self.tolerance) <= self.value and self.value <= (__o + self.tolerance) -# ) - - -# def get_mock_neuron(**kwargs) -> NeuronInfo: -# """ -# Returns a mock neuron with the given kwargs overriding the default values. -# """ - -# mock_neuron_d = dict( -# { -# "netuid": -1, # mock netuid -# "axon_info": AxonInfo( -# block=0, -# version=1, -# ip=0, -# port=0, -# ip_type=0, -# protocol=0, -# placeholder1=0, -# placeholder2=0, -# ), -# "prometheus_info": PrometheusInfo(block=0, version=1, ip=0, port=0, ip_type=0), -# "validator_permit": True, -# "uid": 1, -# "hotkey": "some_hotkey", -# "coldkey": "some_coldkey", -# "active": 0, -# "last_update": 0, -# "stake": {"some_coldkey": 1e12}, -# "total_stake": 1e12, -# "rank": 0.0, -# "trust": 0.0, -# "consensus": 0.0, -# "validator_trust": 0.0, -# "incentive": 0.0, -# "dividends": 0.0, -# "emission": 0.0, -# "bonds": [], -# "weights": [], -# "stake_dict": {}, -# "pruning_score": 0.0, -# "is_null": False, -# } -# ) - -# mock_neuron_d.update(kwargs) # update with kwargs - -# if kwargs.get("stake") is None and kwargs.get("coldkey") is not None: -# mock_neuron_d["stake"] = {kwargs.get("coldkey"): 1e12} - -# if kwargs.get("total_stake") is None: -# mock_neuron_d["total_stake"] = sum(mock_neuron_d["stake"].values()) - -# mock_neuron = NeuronInfo._neuron_dict_to_namespace(mock_neuron_d) - -# return mock_neuron - - -# def get_mock_neuron_by_uid(uid: int, **kwargs) -> NeuronInfo: -# return get_mock_neuron(uid=uid, hotkey=_get_mock_hotkey(uid), coldkey=_get_mock_coldkey(uid), **kwargs) - - -# class MockStatus: -# def __enter__(self): -# return self - -# def __exit__(self, exc_type, exc_value, traceback): -# pass - -# def start(self): -# pass - -# def stop(self): -# pass - -# def update(self, *args, **kwargs): -# MockConsole().print(*args, **kwargs) - - -# class MockConsole: -# """ -# Mocks the console object for status and print. -# Captures the last print output as a string. -# """ - -# captured_print = None - -# def status(self, *args, **kwargs): -# return MockStatus() - -# def print(self, *args, **kwargs): -# console = Console(width=1000, no_color=True, markup=False) # set width to 1000 to avoid truncation -# console.begin_capture() -# console.print(*args, **kwargs) -# self.captured_print = console.end_capture() - -# def clear(self, *args, **kwargs): -# pass - -# @staticmethod -# def remove_rich_syntax(text: str) -> str: -# """ -# Removes rich syntax from the given text. -# Removes markup and ansi syntax. -# """ -# output_no_syntax = Text.from_ansi(Text.from_markup(text).plain).plain - -# return output_no_syntax diff --git a/tests/test_template_validator.py b/tests/test_template_validator.py deleted file mode 100644 index 85dc7e55..00000000 --- a/tests/test_template_validator.py +++ /dev/null @@ -1,92 +0,0 @@ -# import sys -# import unittest - -# import bittensor as bt -# from numpy import array -# from template.base.validator import BaseValidatorNeuron -# from template.protocol import Dummy -# from template.utils.uids import get_random_uids -# from template.validator.reward import get_rewards - -# from neurons.validator import Neuron as Validator - - -# class TemplateValidatorNeuronTestCase(unittest.TestCase): -# """ -# This class contains unit tests for the RewardEvent classes. - -# The tests cover different scenarios where completions may or may not be successful and the reward events are checked that they don't contain missing values. -# The `reward` attribute of all RewardEvents is expected to be a float, and the `is_filter_model` attribute is expected to be a boolean. -# """ - -# def setUp(self): -# sys.argv = sys.argv[0] + ["--config", "tests/configs/validator.json"] - -# config = BaseValidatorNeuron.config() -# config.wallet._mock = True -# config.metagraph._mock = True -# config.subtensor._mock = True -# self.neuron = Validator(config) -# self.miner_uids = get_random_uids(self, k=10) - -# def test_run_single_step(self): -# # TODO: Test a single step -# pass - -# def test_sync_error_if_not_registered(self): -# # TODO: Test that the validator throws an error if it is not registered on metagraph -# pass - -# def test_forward(self): -# # TODO: Test that the forward function returns the correct value -# pass - -# def test_dummy_responses(self): -# # TODO: Test that the dummy responses are correctly constructed - -# responses = self.neuron.dendrite.query( -# # Send the query to miners in the network. -# axons=[self.neuron.metagraph.axons[uid] for uid in self.miner_uids], -# # Construct a dummy query. -# synapse=Dummy(dummy_input=self.neuron.step), -# # All responses have the deserialize function called on them before returning. -# deserialize=True, -# ) - -# for i, response in enumerate(responses): -# self.assertEqual(response, self.neuron.step * 2) - -# def test_reward(self): -# # TODO: Test that the reward function returns the correct value -# responses = self.dendrite.query( -# # Send the query to miners in the network. -# axons=[self.metagraph.axons[uid] for uid in self.miner_uids], -# # Construct a dummy query. -# synapse=Dummy(dummy_input=self.neuron.step), -# # All responses have the deserialize function called on them before returning. -# deserialize=True, -# ) - -# rewards = get_rewards(self.neuron, responses) -# expected_rewards = array([1.0] * len(responses)) -# self.assertEqual(rewards, expected_rewards) - -# def test_reward_with_nan(self): -# # TODO: Test that NaN rewards are correctly sanitized -# # TODO: Test that a bt.logging.warning is thrown when a NaN reward is sanitized -# responses = self.dendrite.query( -# # Send the query to miners in the network. -# axons=[self.metagraph.axons[uid] for uid in self.miner_uids], -# # Construct a dummy query. -# synapse=Dummy(dummy_input=self.neuron.step), -# # All responses have the deserialize function called on them before returning. -# deserialize=True, -# ) - -# rewards = get_rewards(self.neuron, responses) -# _ = rewards.clone() # expected rewards -# # Add NaN values to rewards -# rewards[0] = float("nan") - -# with self.assertLogs(bt.logging, level="WARNING") as _: -# self.neuron.update_scores(rewards, self.miner_uids) From c83ee565dd388b5a10191299b3e59ffe324d857b Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Wed, 18 Dec 2024 16:45:42 -0500 Subject: [PATCH 142/201] Add pytest dependency --- poetry.lock | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index e03d850a..62d4bbf7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1571,6 +1571,17 @@ files = [ docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] testing = ["pytest (>=3.5,!=3.7.3)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler", "pytest-flake8", "pytest-mypy"] +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + [[package]] name = "isort" version = "5.13.2" @@ -2982,6 +2993,21 @@ docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-a 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 = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + [[package]] name = "pre-commit" version = "4.0.1" @@ -3737,6 +3763,28 @@ cffi = ">=1.4.1" docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] +[[package]] +name = "pytest" +version = "8.3.4" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, + {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -5740,4 +5788,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">= 3.9, < 3.12" -content-hash = "0548c6c88d5d60cda87bdbee47c5446871aed569d21f9de0010db7225834b521" +content-hash = "1d71dd7c0b3ed60b1360fc9bd74591729b62f6eab617f2c8bdb3326723a8904d" diff --git a/pyproject.toml b/pyproject.toml index c7ad6ea8..a5736c74 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,6 +46,7 @@ rich = "^13.9.4" transformers = "^4.47.1" template = "^0.7.6" starlette = "~0.37.2" +pytest = "^8.3.4" [tool.black] line-length = 120 From d07beef42335642d2c3902d024c6412cac7e284b Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 18 Dec 2024 18:02:31 -0500 Subject: [PATCH 143/201] fix poetry error --- poetry.lock | 82 ++--------------------------------------------------- 1 file changed, 3 insertions(+), 79 deletions(-) diff --git a/poetry.lock b/poetry.lock index bd33e221..ac393882 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "absl-py" @@ -647,83 +647,6 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "coverage" -version = "7.6.9" -description = "Code coverage measurement for Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"}, - {file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"}, - {file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"}, - {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"}, - {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"}, - {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"}, - {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"}, - {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"}, - {file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"}, - {file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"}, - {file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"}, - {file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"}, - {file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"}, - {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"}, - {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"}, - {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"}, - {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"}, - {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"}, - {file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"}, - {file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"}, - {file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"}, - {file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"}, - {file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"}, - {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"}, - {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"}, - {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"}, - {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"}, - {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"}, - {file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"}, - {file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"}, - {file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"}, - {file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"}, - {file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"}, - {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"}, - {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"}, - {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"}, - {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"}, - {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"}, - {file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"}, - {file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"}, - {file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"}, - {file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"}, - {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"}, - {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"}, - {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"}, - {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"}, - {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"}, - {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"}, - {file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"}, - {file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"}, - {file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"}, - {file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"}, - {file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"}, - {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"}, - {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"}, - {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"}, - {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"}, - {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"}, - {file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"}, - {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"}, - {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"}, - {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"}, -] - -[package.dependencies] -tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} - -[package.extras] -toml = ["tomli"] - [[package]] name = "cryptography" version = "42.0.8" @@ -3633,6 +3556,7 @@ files = [ [package.extras] test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] +[[package]] name = "pycodestyle" version = "2.12.1" description = "Python style guide checker" @@ -5918,4 +5842,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">= 3.9, < 3.12" -content-hash = "1d71dd7c0b3ed60b1360fc9bd74591729b62f6eab617f2c8bdb3326723a8904d" +content-hash = "57e86779a3da6261051c5112eaefdca6ae9bd9935848690426add58b8fafc317" From a475125929ec95f0488fe42752fa077dbab33319 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 18 Dec 2024 18:09:27 -0500 Subject: [PATCH 144/201] fix isort issue --- tests/unit/test_dataset_manager.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unit/test_dataset_manager.py b/tests/unit/test_dataset_manager.py index 0adbe662..ae5dc248 100644 --- a/tests/unit/test_dataset_manager.py +++ b/tests/unit/test_dataset_manager.py @@ -5,7 +5,6 @@ import pandas as pd import pytest - from predictionnet.utils.dataset_manager import DatasetManager From b7c9df2b36f58abc90b408f7fa6eb8fd6bd1765d Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 19 Dec 2024 09:02:19 -0500 Subject: [PATCH 145/201] fix test imports --- tests/unit/test_dataset_manager.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/test_dataset_manager.py b/tests/unit/test_dataset_manager.py index ae5dc248..9ec29856 100644 --- a/tests/unit/test_dataset_manager.py +++ b/tests/unit/test_dataset_manager.py @@ -5,7 +5,8 @@ import pandas as pd import pytest -from predictionnet.utils.dataset_manager import DatasetManager + +from snp_oracle.predictionnet.utils.dataset_manager import DatasetManager @pytest.fixture From ff0bd02b0651b3d29f484135d2ba4cc647fd7c4c Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 19 Dec 2024 09:33:10 -0500 Subject: [PATCH 146/201] fix yfinance error --- snp_oracle/base_miner/get_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snp_oracle/base_miner/get_data.py b/snp_oracle/base_miner/get_data.py index 76b5d1db..8da0e8aa 100644 --- a/snp_oracle/base_miner/get_data.py +++ b/snp_oracle/base_miner/get_data.py @@ -29,7 +29,7 @@ def prep_data(drop_na: bool = True) -> DataFrame: """ # Fetch S&P 500 data - when capturing data any interval, the max we can go back is 60 days # using Yahoo Finance's Python SDK - data = yf.download("^GSPC", period="60d", interval="5m") + data = yf.download("^GSPC", period="1m", interval="5m") # Calculate technical indicators - all technical indicators computed here are based on the 5m data # For example - SMA_50, is not a 50-day moving average, but is instead a 50 5m moving average From 0ec864286d63b468b76a9d48093530617c4782df Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 19 Dec 2024 09:47:43 -0500 Subject: [PATCH 147/201] update config files to reflect new structure --- miner.config.js | 2 +- validator.config.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/miner.config.js b/miner.config.js index d4ccc2e2..3a69689c 100644 --- a/miner.config.js +++ b/miner.config.js @@ -3,7 +3,7 @@ module.exports = { { name: 'miner', script: 'python3', - args: './neurons/miner.py --netuid 28 --logging.debug --logging.trace --subtensor.network local --wallet.name walletName --wallet.hotkey hotkeyName --axon.port 8091 --hf_repo_id foundryservices/bittensor-sn28-base-lstm --model mining_models/base_lstm_new.h5' + args: './snp_oracle/neurons/miner.py --netuid 28 --logging.debug --logging.trace --subtensor.network local --wallet.name walletName --wallet.hotkey hotkeyName --axon.port 8091 --hf_repo_id foundryservices/bittensor-sn28-base-lstm --model mining_models/base_lstm_new.h5' }, ], }; diff --git a/validator.config.js b/validator.config.js index d70dd17a..a07ed2c2 100644 --- a/validator.config.js +++ b/validator.config.js @@ -3,7 +3,7 @@ module.exports = { { name: 'validator', script: 'python3', - args: './neurons/validator.py --netuid 28 --logging.debug --logging.trace --subtensor.network local --wallet.name walletName --wallet.hotkey hotkeyName' + args: './snp_oracle/neurons/validator.py --netuid 28 --logging.debug --logging.trace --subtensor.network local --wallet.name walletName --wallet.hotkey hotkeyName --neuron.organization huggingfaceOrganization' }, ], }; From 728f0a810aeac9228d6f9643724d72e29c689e01 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 19 Dec 2024 13:14:59 -0500 Subject: [PATCH 148/201] Adjust network name case --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 31c659f0..182b957b 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@
- -| This repository is the official codebase
for Bittensor Subnet 28 (SN28) v1.0.0+,
which was released on February 20th 2024. | **TestNet UID:** 93
**MainNet UID:** 28 | + +| This repository is the official codebase
for Bittensor Subnet 28 (SN28) v1.0.0+,
which was released on February 20th 2024. | **Testnet UID:** 93
**Mainnet UID:** 28 | | - | - |
From 9fbe57c0184e93a0b413f8eec0e7e9d1c3844bd4 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 19 Dec 2024 13:27:28 -0500 Subject: [PATCH 149/201] Adjust badge display --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 182b957b..44acdbf4 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,8 @@ | :-: | :-: | | **Status** |

| | **Activity** |

| -| **Compatibility** |
| -| **Social** |

| +| **Compatibility** |
| +| **Social** |

| From 8e93c723acc17adccf6b03d41da5b6b31a2bed9d Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 19 Dec 2024 14:45:30 -0500 Subject: [PATCH 150/201] suggested changes --- poetry.lock | 4 +- pyproject.toml | 3 +- .../predictionnet/utils/dataset_manager.py | 53 +++---------------- snp_oracle/predictionnet/utils/miner_hf.py | 24 +++------ 4 files changed, 17 insertions(+), 67 deletions(-) diff --git a/poetry.lock b/poetry.lock index ac393882..ce103f8d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -5841,5 +5841,5 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" -python-versions = ">= 3.9, < 3.12" -content-hash = "57e86779a3da6261051c5112eaefdca6ae9bd9935848690426add58b8fafc317" +python-versions = ">3.9.1,<3.12" +content-hash = "afd62eaac40fe3bb28ea794f177d48a681b981b2b3bc8da12bb3d3718a01b141" diff --git a/pyproject.toml b/pyproject.toml index 5943d9c4..962c07d7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ readme = "README.md" # ~1.2.3 means >=1.2.3 and <1.3.0 # Python version - 3.9, 3.10, 3.11 -python = ">= 3.9, < 3.12" +python = ">3.9.1,<3.12" # Bittensor Version Strict bittensor = "7.4.0" @@ -35,6 +35,7 @@ pandas-market-calendars = "^4.4.2" python-dotenv = "^1.0.1" scikit-learn = "^1.6.0" wandb = "^0.19.1" +cryptography = ">=42.0.5,<42.1.0" [tool.poetry.group.dev.dependencies] pre-commit-hooks = "5.0.0" diff --git a/snp_oracle/predictionnet/utils/dataset_manager.py b/snp_oracle/predictionnet/utils/dataset_manager.py index 304b4f33..e44fbb71 100644 --- a/snp_oracle/predictionnet/utils/dataset_manager.py +++ b/snp_oracle/predictionnet/utils/dataset_manager.py @@ -1,20 +1,3 @@ -# The MIT License (MIT) -# Copyright © 2024 Foundry Digital - -# 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. - import asyncio import json import os @@ -27,8 +10,6 @@ import bittensor as bt import pandas as pd -import pyarrow as pa -import pyarrow.parquet as pq from cryptography.fernet import Fernet from dotenv import load_dotenv from git import Repo @@ -132,13 +113,9 @@ def store_local_data( if metadata: full_metadata.update(metadata) - # Convert to PyArrow Table with metadata - table = pa.Table.from_pandas(miner_data) - for key, value in full_metadata.items(): - table = table.replace_schema_metadata({**table.schema.metadata, key.encode(): str(value).encode()}) - - # Write Parquet file with compression - pq.write_table(table, file_path, compression="snappy", use_dictionary=True, use_byte_stream_split=True) + # Add metadata to DataFrame and save to parquet + miner_data.attrs.update(full_metadata) + miner_data.to_parquet(file_path, engine="pyarrow", compression="snappy", index=False) return True, { "local_path": str(file_path), @@ -282,27 +259,9 @@ def decrypt_data(self, data_path: str, decryption_key: bytes) -> Tuple[bool, Dic temp_file.write(decrypted_data) temp_file.flush() - # Read Parquet file - table = pq.read_table(temp_file.name) - df = table.to_pandas() - - # Extract metadata from Parquet schema - metadata = {} - predictions = None - - if table.schema.metadata: - for key, value in table.schema.metadata.items(): - try: - key_str = key.decode() if isinstance(key, bytes) else key - value_str = value.decode() if isinstance(value, bytes) else value - - if key_str == "predictions": - predictions = json.loads(value_str) - else: - metadata[key_str] = value_str - except Exception as e: - bt.logging.error(f"Error while extracting metadata: {str(e)}") - continue + df = pd.read_parquet(temp_file.name) + metadata = df.attrs.copy() + predictions = json.loads(metadata.pop("predictions", "null")) return True, {"data": df, "metadata": metadata, "predictions": predictions} diff --git a/snp_oracle/predictionnet/utils/miner_hf.py b/snp_oracle/predictionnet/utils/miner_hf.py index 79e193cc..6af9cf65 100644 --- a/snp_oracle/predictionnet/utils/miner_hf.py +++ b/snp_oracle/predictionnet/utils/miner_hf.py @@ -4,8 +4,6 @@ import bittensor as bt import pandas as pd -import pyarrow as pa -import pyarrow.parquet as pq from cryptography.fernet import Fernet from dotenv import load_dotenv from huggingface_hub import HfApi @@ -92,7 +90,7 @@ def upload_model(self, repo_id=None, model_path=None, hotkey=None): bt.logging.debug(f"Error in upload_model: {str(e)}") return False, {"error": str(e)} - def upload_data(self, repo_id=None, data: pd.DataFrame = None, hotkey=None, encryption_key=None): + def upload_data(self, repo_id, data: pd.DataFrame, hotkey=None, encryption_key=None): """ Upload encrypted training/validation data to HuggingFace Hub using Parquet format. @@ -145,22 +143,14 @@ def upload_data(self, repo_id=None, data: pd.DataFrame = None, hotkey=None, encr temp_encrypted = os.path.join(temp_dir, data_filename) try: - # Convert to PyArrow Table with metadata - table = pa.Table.from_pandas(data) - table = table.replace_schema_metadata( - { - **table.schema.metadata, - b"timestamp": timestamp.encode(), - b"hotkey": hotkey.encode() if hotkey else b"", - } - ) + # Add metadata to the DataFrame + data.attrs["timestamp"] = timestamp + data.attrs["hotkey"] = hotkey if hotkey else "" - # Write Parquet file with compression - pq.write_table( - table, temp_parquet, compression="snappy", use_dictionary=True, use_byte_stream_split=True - ) + # Write to parquet with compression + data.to_parquet(temp_parquet, compression="snappy", engine="pyarrow") - # Read and encrypt the Parquet file + # Read and encrypt the temporary Parquet file with open(temp_parquet, "rb") as f: parquet_data = f.read() encrypted_data = fernet.encrypt(parquet_data) From 8d426fa8d3905bbe941a47e8ed6c212ddd780741 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 19 Dec 2024 14:55:35 -0500 Subject: [PATCH 151/201] Draft individual miner / validator readme instructions --- docs/miners/mainnet.md | 120 +++++++++++++++++++++++++++++++++++++ docs/miners/testnet.md | 112 ++++++++++++++++++++++++++++++++++ docs/validators/mainnet.md | 83 +++++++++++++++++++++++++ docs/validators/testnet.md | 83 +++++++++++++++++++++++++ 4 files changed, 398 insertions(+) create mode 100644 docs/miners/mainnet.md create mode 100644 docs/miners/testnet.md create mode 100644 docs/validators/mainnet.md create mode 100644 docs/validators/testnet.md diff --git a/docs/miners/mainnet.md b/docs/miners/mainnet.md new file mode 100644 index 00000000..d7e90e39 --- /dev/null +++ b/docs/miners/mainnet.md @@ -0,0 +1,120 @@ +# Mainnet Miners + +# **DO NOT RUN THE BASE MINER ON MAINNET!** + +> **The base miner provided in this repo is _not intended_ to be run on mainnet!** +> +> **If you run the base miner on mainnet, you are not guaranteed to earn anything!** +> It is provided as an example to help you build your own custom models! +> + +## Compute Requirements + +| Miner | +|-----------| +| 8gb RAM | +| 2 vCPUs | + +## Installation + +First, install PM2: +``` +sudo apt update +sudo apt install nodejs npm +sudo npm install pm2@latest -g +``` + +Verify installation: +``` +pm2 --version +``` + +Clone the repository: +``` +git clone https://github.com/foundryservices/snpOracle.git +cd snpOracle +``` + +Create and source a python virtual environment: +``` +python3 -m venv +source .venv/bin/activate +``` + +Install the requirements with poetry: +``` +pip install poetry +poetry install +``` + +## Configuration + +#### Environment Variables +First copy the `.env.template` file to `.env` + +```shell +cp .env.template .env +``` + +Update the `.env` file with your miner's values. + +```text +WANDB_API_KEY='REPLACE_WITH_WANDB_API_KEY' +MINER_HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' +HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' +HF_ACCESS_TOKEN = 'REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' +WANDB_API_KEY = 'REPLACE_WITH_WANDB_API_KEY' +GIT_TOKEN='REPLACE_WITH_GIT_TOKEN' +GIT_USERNAME='REPLACE_WITH_GIT_USERNAME' +GIT_NAME="REPLACE_WITH_GIT_NAME" +GIT_EMAIL="REPLACE_WITH_GIT_EMAIL" +``` + +#### HuggingFace Access Token +A huggingface access token can be procured from the huggingface platform. Follow the steps mentioned here to get your huggingface access token. + +#### Makefile +Edit the Makefile with you wallet and network information. + +```text +## Network Parameters ## +finney = wss://entrypoint-finney.opentensor.ai:443 +testnet = wss://test.finney.opentensor.ai:443 +locanet = ws://127.0.0.1:9944 + +testnet_netuid = 93 +localnet_netuid = 1 +logging_level = trace # options= ['info', 'debug', 'trace'] + +netuid = $(testnet_netuid) +network = $(testnet) + +## User Parameters +coldkey = default +validator_hotkey = validator +miner_hotkey = miner +``` + +## Deploying a Miner + +### Base miner +We highly recommend that you run your miners on testnet before deploying on mainnet. + +**IMPORTANT** +> Make sure your have activated your virtual environment before running your validator. + +1. Run the command: + ```shell + make miner + ``` + +### Custom Miner +We highly recommend that you run your miners on testnet before deploying on mainnet. + +**IMPORTANT** +> Make sure your have activated your virtual environment before running your validator. + +1. Run the Command: + ``` + make miner_custom + ``` diff --git a/docs/miners/testnet.md b/docs/miners/testnet.md new file mode 100644 index 00000000..836e105c --- /dev/null +++ b/docs/miners/testnet.md @@ -0,0 +1,112 @@ +# Testnet Miners + +## Compute Requirements + +| Miner | +|-----------| +| 8gb RAM | +| 2 vCPUs | + +## Installation + +First, install PM2: +``` +sudo apt update +sudo apt install nodejs npm +sudo npm install pm2@latest -g +``` + +Verify installation: +``` +pm2 --version +``` + +Clone the repository: +``` +git clone https://github.com/foundryservices/snpOracle.git +cd snpOracle +``` + +Create and source a python virtual environment: +``` +python3 -m venv +source .venv/bin/activate +``` + +Install the requirements with poetry: +``` +pip install poetry +poetry install +``` + +## Configuration + +#### Environment Variables +First copy the `.env.template` file to `.env` + +```shell +cp .env.template .env +``` + +Update the `.env` file with your miner's values. + +```text +WANDB_API_KEY='REPLACE_WITH_WANDB_API_KEY' +MINER_HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' +HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' +HF_ACCESS_TOKEN = 'REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' +WANDB_API_KEY = 'REPLACE_WITH_WANDB_API_KEY' +GIT_TOKEN='REPLACE_WITH_GIT_TOKEN' +GIT_USERNAME='REPLACE_WITH_GIT_USERNAME' +GIT_NAME="REPLACE_WITH_GIT_NAME" +GIT_EMAIL="REPLACE_WITH_GIT_EMAIL" +``` + +#### HuggingFace Access Token +A huggingface access token can be procured from the huggingface platform. Follow the steps mentioned here to get your huggingface access token. + +#### Makefile +Edit the Makefile with you wallet and network information. + +```text +## Network Parameters ## +finney = wss://entrypoint-finney.opentensor.ai:443 +testnet = wss://test.finney.opentensor.ai:443 +locanet = ws://127.0.0.1:9944 + +testnet_netuid = 93 +localnet_netuid = 1 +logging_level = trace # options= ['info', 'debug', 'trace'] + +netuid = $(testnet_netuid) +network = $(testnet) + +## User Parameters +coldkey = default +validator_hotkey = validator +miner_hotkey = miner +``` + +## Deploying a Miner + +### Base miner +We highly recommend that you run your miners on testnet before deploying on mainnet. + +**IMPORTANT** +> Make sure your have activated your virtual environment before running your miner. + +1. Run the command: + ```shell + make miner + ``` + +### Custom Miner +We highly recommend that you run your miners on testnet before deploying on mainnet. + +**IMPORTANT** +> Make sure your have activated your virtual environment before running your miner. + +1. Run the Command: + ``` + make miner_custom + ``` diff --git a/docs/validators/mainnet.md b/docs/validators/mainnet.md new file mode 100644 index 00000000..a3423fd6 --- /dev/null +++ b/docs/validators/mainnet.md @@ -0,0 +1,83 @@ +# Mainnet Validators + +## Compute Requirements + +| Validator | +| :-------: | +| 8gb RAM | +| 2 vCPUs | + +## Installation + +First, install PM2: +``` +sudo apt update +sudo apt install nodejs npm +sudo npm install pm2@latest -g +``` + +Verify installation: +``` +pm2 --version +``` + +Clone the repository: +``` +git clone https://github.com/foundryservices/snpOracle.git +cd snpOracle +``` + +Create and source a python virtual environment: +``` +python3 -m venv +source .venv/bin/activate +``` + +Install the requirements with poetry: +``` +pip install poetry +poetry install +``` + +## Configuration + +#### Environment Variables +First copy the `.env.template` file to `.env` + +```shell +cp .env.template .env +``` + +Update the `.env` file with your validator's values. + +```text +WANDB_API_KEY='REPLACE_WITH_WANDB_API_KEY' +MINER_HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' +HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' +HF_ACCESS_TOKEN = 'REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' +WANDB_API_KEY = 'REPLACE_WITH_WANDB_API_KEY' +GIT_TOKEN='REPLACE_WITH_GIT_TOKEN' +GIT_USERNAME='REPLACE_WITH_GIT_USERNAME' +GIT_NAME="REPLACE_WITH_GIT_NAME" +GIT_EMAIL="REPLACE_WITH_GIT_EMAIL" +``` + +See WandB API Key and HuggingFace setup below. + +#### Obtain & Setup WandB API Key +Before starting the process, validators would be required to procure a WANDB API Key. Please follow the instructions mentioned below:
+ +- Log in to Weights & Biases and generate an API key in your account settings. +- Set the variable `WANDB_API_KEY` in the `.env` file. +- Finally, run `wandb login` and paste your API key. Now you're all set with weights & biases. + +#### HuggingFace Access Token +A huggingface access token can be procured from the huggingface platform. Follow the steps mentioned here to get your huggingface access token. + +## Deploying a Validator +**IMPORTANT** +> Make sure your have activated your virtual environment before running your validator. +1. Run the command: + ```shell + make validator + ``` diff --git a/docs/validators/testnet.md b/docs/validators/testnet.md new file mode 100644 index 00000000..b9025323 --- /dev/null +++ b/docs/validators/testnet.md @@ -0,0 +1,83 @@ +# Testnet Validators + +## Compute Requirements + +| Validator | +| :-------: | +| 8gb RAM | +| 2 vCPUs | + +## Installation + +First, install PM2: +``` +sudo apt update +sudo apt install nodejs npm +sudo npm install pm2@latest -g +``` + +Verify installation: +``` +pm2 --version +``` + +Clone the repository: +``` +git clone https://github.com/foundryservices/snpOracle.git +cd snpOracle +``` + +Create and source a python virtual environment: +``` +python3 -m venv +source .venv/bin/activate +``` + +Install the requirements with poetry: +``` +pip install poetry +poetry install +``` + +## Configuration + +#### Environment Variables +First copy the `.env.template` file to `.env` + +```shell +cp .env.template .env +``` + +Update the `.env` file with your validator's values. + +```text +WANDB_API_KEY='REPLACE_WITH_WANDB_API_KEY' +MINER_HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' +HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' +HF_ACCESS_TOKEN = 'REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' +WANDB_API_KEY = 'REPLACE_WITH_WANDB_API_KEY' +GIT_TOKEN='REPLACE_WITH_GIT_TOKEN' +GIT_USERNAME='REPLACE_WITH_GIT_USERNAME' +GIT_NAME="REPLACE_WITH_GIT_NAME" +GIT_EMAIL="REPLACE_WITH_GIT_EMAIL" +``` + +See WandB API Key and HuggingFace setup below. + +#### Obtain & Setup WandB API Key +Before starting the process, validators would be required to procure a WANDB API Key. Please follow the instructions mentioned below:
+ +- Log in to Weights & Biases and generate an API key in your account settings. +- Set the variable `WANDB_API_KEY` in the `.env` file. +- Finally, run `wandb login` and paste your API key. Now you're all set with weights & biases. + +#### HuggingFace Access Token +A huggingface access token can be procured from the huggingface platform. Follow the steps mentioned here to get your huggingface access token. + +## Deploying a Validator +**IMPORTANT** +> Make sure your have activated your virtual environment before running your validator. +1. Run the command: + ```shell + make validator + ``` From 77a16617fc20a753d348ade799cc6a22cc745590 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 19 Dec 2024 15:01:14 -0500 Subject: [PATCH 152/201] Add incentive mechanism white paper to the git repo --- docs/SN28 Incentive Mechanism.pdf | Bin 0 -> 353003 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/SN28 Incentive Mechanism.pdf diff --git a/docs/SN28 Incentive Mechanism.pdf b/docs/SN28 Incentive Mechanism.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b8870facd3b8c9bdf04714691cdd916d951d87f0 GIT binary patch literal 353003 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 {VNoV>A?jjZns-_5J)xyt> z)&fC^s{O;WSxG4$&GH0(89E^bXmJv)3gKxD+QiTyZS7R!6kYKAlwG=X917!V5oP0| zkzrv*P->20V_|uCd;O+O>quE?ahS}4gfzwWU`H(k!A~95e$h;&MzEf{a{V!IowNId z*|{3J{X%Zv{*-2vboS~zBp>}m`S~$Q`KO_3zcsI1Gfr$b57q8b+t&n@$nR>OYHIG> zzP-)mV9QJ;r~5mU=8#C-V=Kls|8(KH@BFkj6NlB`_3&%k!tC?$+7+T3Y9RgmBzp<) zlx)2l*RNlU{_R}oHT4YDQsh$)`;Zud#~H1{Ek3%h&SmqqZJ*w}A;unld^N9S6^$Km ze6SCqNiF@x(@=7ZQZX9n?bXhHvD0Brf|aY<-cH|wcuzm}H$!3(vI53g*ubdmLb``8 zl=5a22-1hfpZ0W>$vtAnBd{chs&dzeJ%8Cj?e*M`q zCxB}oU${=7ix=4qL|+|jZ8aM@Iyye)&1(Y1EdC?griX@S7)?$~7^Uec%Tr^iXb)}s zPG4aVk%JF1h2Kifgv_E(9d>pEY%?P#wRAcMi`&MdETb;ef|CRwzel@85mZq zT<8^s?v9fW6zb6*{wn(7SJ)N5QXGMlXU}RDzL?*gQD9&I$`J_7qz*-G+&GAkA-a6| za&Pthce{>*n)%@jBSYF9$~u8PkzOoKOjt2PeNf4usj$;`eiog8qqVP*HlOOmh29bq zzF?8cir$x$Zot(H`D@};o<4re&Cjpj06mEwi)R@BVS~TD{)-NL8tP^QzJKxJ&&G5P z#pl%!2nbwDyv&Y1S24Ovjzo=EhAL&6r0$iJ z47#)8@})~S6h-KVD=ggmWi|+Hf;inWxdLY?-0tc347vsfp$_e3VDJfzTU@-CIV#Gi ztJS@1fX5Bors4eHUcC?QB6=02p9kUCxU`q8|p=YNp_X3n*~S-O%6;#g;dBD z$aZ`z_@pIdgvv}`XlRt%rArwQ^u@O_`&Fgo74>ZZTal8Ri&3Wzj3n7J9NBL9k9MIeAZJc9uzrq8AvJ4w1=lCs%eOUu!O5(S-+my%y=JP{x>M}H|@2^eg z*V&-CKJm%FpUn22*ZA(U22gKr`{T^*DGMEkAO4iknhcn3|LJn$oT{166P?`EX?L}M zMalKL4YmauFiNfne}>*$A2Vr;XAikj)Kp&|-gW)N4q@TzUDq>Y<>e!1_87W)^wo>V zHS_H}^Yhm)QBl#4gP|aVN*YFPP&lu%DfKM)J?cY8Agl${xjJ4Y_IMBGYD0gzw?E;= zjdB2Hk(Xi{7&qr}wh_mrJ{*zMviW@~9;3E^UkGJpqoi_7Ok_RLV%bc+)uIVJskdFa zxxD=2LQ(pyEy`DLoStlc@GR-9PC&cI@CJ`6tMAGto6A2e9wvU=M+$ zMxb;5a{m!X73KSe#>IWZ=Wf}U#glJ`0XFH3#9XkKFJGdV`1GlxKa(JAFbV=64?cN> znHu6f_NNr4SWP}2S~g5h{0?L&3yu$^&cOw{iqI`ulf_ZDrZ#NYU|jdz>JM=7<}FRl zSqkVS_o#l_+)(2|JC(xqw z<4c6|=YVP7y%dWFM#*u$Z5BFNf2?&CI=n;DjiHqQ}sA`KU2WUH_gl$BaiYGGgPB-cKG-;&09h!z?u3_M+U)(iad=jv)N5bUAC`Y ziiZT<&r=-&rn(g@EwNoLuJNkgx~^&e2*-Axp%u7=oPitu{(^LGtCkFHu(R`Bd-!NT z5#Q_B*o}%e$%8OH-SZlpr(tzb ziD&J@-bax-DJ5ms#qV!^xQ4K0)yzgi?)xp(-_PO8lP`oTs ?${u^YgZm9QXU>d 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

hMF$Rap;|gQ)tszyJn#u;2!$_ugZRNaP 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

Y+oG(Mha0fQ$~L!NfX;bApOd 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

  • ^y1OwGSXY56VotT}F4K6yW_15~}tvmw7%7w%w9C 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 Date: Thu, 19 Dec 2024 15:05:16 -0500 Subject: [PATCH 153/201] Fix miner readme typo --- docs/miners/mainnet.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/miners/mainnet.md b/docs/miners/mainnet.md index d7e90e39..5879b6c0 100644 --- a/docs/miners/mainnet.md +++ b/docs/miners/mainnet.md @@ -101,7 +101,7 @@ miner_hotkey = miner We highly recommend that you run your miners on testnet before deploying on mainnet. **IMPORTANT** -> Make sure your have activated your virtual environment before running your validator. +> Make sure your have activated your virtual environment before running your miner. 1. Run the command: ```shell @@ -112,7 +112,7 @@ We highly recommend that you run your miners on testnet before deploying on main We highly recommend that you run your miners on testnet before deploying on mainnet. **IMPORTANT** -> Make sure your have activated your virtual environment before running your validator. +> Make sure your have activated your virtual environment before running your miner. 1. Run the Command: ``` From e6ef194dd33f8e3fcec8463ebe6a5a847604d7fd Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 19 Dec 2024 15:05:44 -0500 Subject: [PATCH 154/201] Add working links to top level readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 44acdbf4..3fe8d9f7 100644 --- a/README.md +++ b/README.md @@ -37,13 +37,13 @@ Validators store price forecasts for the S&P 500 and compare these predictions a | Miners | Validators | | :----: | :--------: | -| [TestNet Docs]() | [TestNet Docs]() | -| [MainNet Docs]() | [MainNet Docs]() | +| [TestNet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/miners/testnet.md) | [TestNet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/validators/testnet.md) | +| [MainNet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/miners/mainnet.md) | [MainNet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/validators/mainnet.md) | ## Incentive Mechanism -Please read the [incentive mechanism white paper]() to understand exactly how miners are scored and ranked. +Please read the [incentive mechanism white paper](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/SN28%20Incentive%20Mechanism.pdf) to understand exactly how miners are scored and ranked. For transparency, there are two key metrics detailed in the white paper that will be calculated to score each miner: 1. **Directional Accuracy** - was the prediction in the same direction of the true price? From cd746009194f52dc1a26adc0e3baafd1f82425e8 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Thu, 19 Dec 2024 15:08:21 -0500 Subject: [PATCH 155/201] Adjust network name case --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3fe8d9f7..249fcec2 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,8 @@ Validators store price forecasts for the S&P 500 and compare these predictions a | Miners | Validators | | :----: | :--------: | -| [TestNet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/miners/testnet.md) | [TestNet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/validators/testnet.md) | -| [MainNet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/miners/mainnet.md) | [MainNet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/validators/mainnet.md) | +| [Testnet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/miners/testnet.md) | [Testnet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/validators/testnet.md) | +| [Mainnet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/miners/mainnet.md) | [Mainnet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/validators/mainnet.md) | From 349acc28b88d8d50b550b7691ca1c4c4e7ade116 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 19 Dec 2024 15:22:01 -0500 Subject: [PATCH 156/201] update reward.py --- snp_oracle/predictionnet/validator/reward.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snp_oracle/predictionnet/validator/reward.py b/snp_oracle/predictionnet/validator/reward.py index 3038e5c4..beb88b53 100644 --- a/snp_oracle/predictionnet/validator/reward.py +++ b/snp_oracle/predictionnet/validator/reward.py @@ -240,7 +240,7 @@ def get_rewards( prediction_times.append(rounded_up_time - timedelta(minutes=(i + 1) * prediction_interval)) bt.logging.info(f"Prediction times: {prediction_times}") data = yf.download(tickers=ticker_symbol, period="5d", interval="5m", progress=False) - close_price = data.iloc[data.index.tz_localize(None).isin(prediction_times)]["Close"].tolist() + close_price = data.iloc[data.index.tz_localize(None).isin(prediction_times)]["Close"].values.tolist() if len(close_price) < (N_TIMEPOINTS + 1): # edge case where its between 9:30am and 10am close_price = data.iloc[-N_TIMEPOINTS - 1 :]["Close"].tolist() From 877c34e49417545601ae2ebed717103d5c3a9bd5 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 19 Dec 2024 15:30:28 -0500 Subject: [PATCH 157/201] ensure correct yfinance version --- poetry.lock | 21 +++++++++++++++----- pyproject.toml | 2 +- snp_oracle/base_miner/get_data.py | 2 +- snp_oracle/predictionnet/validator/reward.py | 2 +- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/poetry.lock b/poetry.lock index ce103f8d..214223ae 100644 --- a/poetry.lock +++ b/poetry.lock @@ -218,6 +218,17 @@ doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", 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)"] trio = ["trio (>=0.26.1)"] +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + [[package]] name = "astunparse" version = "1.6.3" @@ -5794,16 +5805,17 @@ propcache = ">=0.2.0" [[package]] name = "yfinance" -version = "0.2.50" +version = "0.2.37" description = "Download market data from Yahoo! Finance API" optional = false python-versions = "*" files = [ - {file = "yfinance-0.2.50-py2.py3-none-any.whl", hash = "sha256:0db13b19313043328fe88ded2ddc306ede7d901d0f5181462a1cce76acdbcd2a"}, - {file = "yfinance-0.2.50.tar.gz", hash = "sha256:33b379cad4261313dc93bfe3148d2f6e6083210e6341f0c93dd3af853019b1a0"}, + {file = "yfinance-0.2.37-py2.py3-none-any.whl", hash = "sha256:3ac75fa1cd3496ee76b6df5d63d29679487ea9447123c5b935d1593240737a8f"}, + {file = "yfinance-0.2.37.tar.gz", hash = "sha256:e5f78c9bd27bae7abfd0af9b7996620eaa9aba759d67f957296634d7d54f0cef"}, ] [package.dependencies] +appdirs = ">=1.4.4" beautifulsoup4 = ">=4.11.1" frozendict = ">=2.3.4" html5lib = ">=1.1" @@ -5812,7 +5824,6 @@ multitasking = ">=0.0.7" numpy = ">=1.16.5" pandas = ">=1.3.0" peewee = ">=3.16.2" -platformdirs = ">=2.0.0" pytz = ">=2022.5" requests = ">=2.31" @@ -5842,4 +5853,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">3.9.1,<3.12" -content-hash = "afd62eaac40fe3bb28ea794f177d48a681b981b2b3bc8da12bb3d3718a01b141" +content-hash = "e31107374c14b5a2c82dfed31c60fbe028de4dac175ce19b917e3960cf9ef53c" diff --git a/pyproject.toml b/pyproject.toml index 962c07d7..7a508c64 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ joblib = "^1.4.2" pandas = "^2.2.3" pytz = "^2024.2" tensorflow = "^2.18.0" -yfinance = "^0.2.50" +yfinance = "0.2.37" huggingface-hub = "^0.27.0" loguru = "^0.7.3" pyarrow = "^18.1.0" diff --git a/snp_oracle/base_miner/get_data.py b/snp_oracle/base_miner/get_data.py index 8da0e8aa..76b5d1db 100644 --- a/snp_oracle/base_miner/get_data.py +++ b/snp_oracle/base_miner/get_data.py @@ -29,7 +29,7 @@ def prep_data(drop_na: bool = True) -> DataFrame: """ # Fetch S&P 500 data - when capturing data any interval, the max we can go back is 60 days # using Yahoo Finance's Python SDK - data = yf.download("^GSPC", period="1m", interval="5m") + data = yf.download("^GSPC", period="60d", interval="5m") # Calculate technical indicators - all technical indicators computed here are based on the 5m data # For example - SMA_50, is not a 50-day moving average, but is instead a 50 5m moving average diff --git a/snp_oracle/predictionnet/validator/reward.py b/snp_oracle/predictionnet/validator/reward.py index beb88b53..3038e5c4 100644 --- a/snp_oracle/predictionnet/validator/reward.py +++ b/snp_oracle/predictionnet/validator/reward.py @@ -240,7 +240,7 @@ def get_rewards( prediction_times.append(rounded_up_time - timedelta(minutes=(i + 1) * prediction_interval)) bt.logging.info(f"Prediction times: {prediction_times}") data = yf.download(tickers=ticker_symbol, period="5d", interval="5m", progress=False) - close_price = data.iloc[data.index.tz_localize(None).isin(prediction_times)]["Close"].values.tolist() + close_price = data.iloc[data.index.tz_localize(None).isin(prediction_times)]["Close"].tolist() if len(close_price) < (N_TIMEPOINTS + 1): # edge case where its between 9:30am and 10am close_price = data.iloc[-N_TIMEPOINTS - 1 :]["Close"].tolist() From 327a84d4869ca8596db1f319492c45fbee2b2902 Mon Sep 17 00:00:00 2001 From: hscott Date: Thu, 19 Dec 2024 15:55:03 -0500 Subject: [PATCH 158/201] added Makefile --- Makefile | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..5a64da6c --- /dev/null +++ b/Makefile @@ -0,0 +1,57 @@ +################################################################################ +# User Parameters # +################################################################################ +coldkey = default +validator_hotkey = validator +miner_hotkey = miner +netuid = $(testnet_netuid) +network = $(testnet) + + +################################################################################ +# Network Parameters # +################################################################################ +finney = wss://entrypoint-finney.opentensor.ai:443 +testnet = wss://test.finney.opentensor.ai:443 +locanet = ws://127.0.0.1:9944 + +finney_netuid = 28 +testnet_netuid = 93 +localnet_netuid = 1 +logging_level = info # options= ['info', 'debug', 'trace'] + + +################################################################################ +# Commands # +################################################################################ +metagraph: + btcli subnet metagraph --netuid $(netuid) --subtensor.chain_endpoint $(network) + +register: + { \ + read -p 'Wallet name?: ' wallet_name ;\ + read -p 'Hotkey?: ' hotkey_name ;\ + btcli subnet register --netuid $(netuid) --wallet.name "$$wallet_name" --wallet.hotkey "$$hotkey_name" --subtensor.chain_endpoint $(network) ;\ + } + +validator: + pm2 start python --name validator -- ./snp_oracle/neurons/validator.py \ + --wallet.name $(coldkey) \ + --wallet.hotkey $(validator_hotkey) \ + --subtensor.chain_endpoint $(network) \ + --axon.port 8091 \ + --netuid $(netuid) \ + --logging.level $(logging_level) + +miner: + pm2 start python --name miner -- ./snp_oracle/neurons/miner.py \ + --wallet.name $(coldkey) \ + --wallet.hotkey $(miner_hotkey) \ + --subtensor.chain_endpoint $(network) \ + --axon.port 8092 \ + --netuid $(netuid) \ + --logging.level $(logging_level) \ + --vpermit_tao_limit 2 \ + --hf_repo_id foundryservices/bittensor-sn28-base-lstm + --model mining_models/base_lstm_new.h5 + From eea6e92f6d4ca13428d6ba794fc66baeb6b90e39 Mon Sep 17 00:00:00 2001 From: hscott Date: Thu, 19 Dec 2024 15:58:51 -0500 Subject: [PATCH 159/201] missing \ in makefile --- Makefile | 2 +- miner.config.js | 9 --------- validator.config.js | 9 --------- 3 files changed, 1 insertion(+), 19 deletions(-) delete mode 100644 miner.config.js delete mode 100644 validator.config.js diff --git a/Makefile b/Makefile index 5a64da6c..fa5a06d8 100644 --- a/Makefile +++ b/Makefile @@ -52,6 +52,6 @@ miner: --netuid $(netuid) \ --logging.level $(logging_level) \ --vpermit_tao_limit 2 \ - --hf_repo_id foundryservices/bittensor-sn28-base-lstm + --hf_repo_id foundryservices/bittensor-sn28-base-lstm \ --model mining_models/base_lstm_new.h5 diff --git a/miner.config.js b/miner.config.js deleted file mode 100644 index 3a69689c..00000000 --- a/miner.config.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - apps: [ - { - name: 'miner', - script: 'python3', - args: './snp_oracle/neurons/miner.py --netuid 28 --logging.debug --logging.trace --subtensor.network local --wallet.name walletName --wallet.hotkey hotkeyName --axon.port 8091 --hf_repo_id foundryservices/bittensor-sn28-base-lstm --model mining_models/base_lstm_new.h5' - }, - ], -}; diff --git a/validator.config.js b/validator.config.js deleted file mode 100644 index a07ed2c2..00000000 --- a/validator.config.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - apps: [ - { - name: 'validator', - script: 'python3', - args: './snp_oracle/neurons/validator.py --netuid 28 --logging.debug --logging.trace --subtensor.network local --wallet.name walletName --wallet.hotkey hotkeyName --neuron.organization huggingfaceOrganization' - }, - ], -}; From 118d1cbfe2644f37e7b444c8d08add4c20947f99 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 20 Dec 2024 13:18:26 -0500 Subject: [PATCH 160/201] Alter mainnet miner readme --- docs/miners/mainnet.md | 43 ++++++++++++------------------------------ 1 file changed, 12 insertions(+), 31 deletions(-) diff --git a/docs/miners/mainnet.md b/docs/miners/mainnet.md index 5879b6c0..d13781e8 100644 --- a/docs/miners/mainnet.md +++ b/docs/miners/mainnet.md @@ -56,52 +56,37 @@ First copy the `.env.template` file to `.env` cp .env.template .env ``` -Update the `.env` file with your miner's values. +Update the `.env` file with your miner's values for the following properties. ```text -WANDB_API_KEY='REPLACE_WITH_WANDB_API_KEY' MINER_HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' -HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' -HF_ACCESS_TOKEN = 'REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' -WANDB_API_KEY = 'REPLACE_WITH_WANDB_API_KEY' -GIT_TOKEN='REPLACE_WITH_GIT_TOKEN' -GIT_USERNAME='REPLACE_WITH_GIT_USERNAME' -GIT_NAME="REPLACE_WITH_GIT_NAME" -GIT_EMAIL="REPLACE_WITH_GIT_EMAIL" ``` #### HuggingFace Access Token A huggingface access token can be procured from the huggingface platform. Follow the steps mentioned here to get your huggingface access token. #### Makefile -Edit the Makefile with you wallet and network information. +Edit the Makefile with you wallet information. ```text -## Network Parameters ## -finney = wss://entrypoint-finney.opentensor.ai:443 -testnet = wss://test.finney.opentensor.ai:443 -locanet = ws://127.0.0.1:9944 - -testnet_netuid = 93 -localnet_netuid = 1 -logging_level = trace # options= ['info', 'debug', 'trace'] - -netuid = $(testnet_netuid) -network = $(testnet) - -## User Parameters +################################################################################ +# User Parameters # +################################################################################ coldkey = default -validator_hotkey = validator miner_hotkey = miner +logging_level = info # options = [info, debug, trace] ``` -## Deploying a Miner +#### Ports +In the Makefile, we have default ports set to `8091` for validator and `8092` for miner. Please change as-needed. -### Base miner +## Deploying a Miner We highly recommend that you run your miners on testnet before deploying on mainnet. **IMPORTANT** -> Make sure your have activated your virtual environment before running your miner. +> Make sure you have activated your virtual environment before running your miner. + +### Base miner 1. Run the command: ```shell @@ -109,10 +94,6 @@ We highly recommend that you run your miners on testnet before deploying on main ``` ### Custom Miner -We highly recommend that you run your miners on testnet before deploying on mainnet. - -**IMPORTANT** -> Make sure your have activated your virtual environment before running your miner. 1. Run the Command: ``` From a450a90488e2ad5ca0880777a63c492acde5196f Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 20 Dec 2024 13:32:34 -0500 Subject: [PATCH 161/201] Rename to a single miners readme --- docs/{miners/mainnet.md => miners.md} | 0 docs/miners/testnet.md | 112 -------------------------- 2 files changed, 112 deletions(-) rename docs/{miners/mainnet.md => miners.md} (100%) delete mode 100644 docs/miners/testnet.md diff --git a/docs/miners/mainnet.md b/docs/miners.md similarity index 100% rename from docs/miners/mainnet.md rename to docs/miners.md diff --git a/docs/miners/testnet.md b/docs/miners/testnet.md deleted file mode 100644 index 836e105c..00000000 --- a/docs/miners/testnet.md +++ /dev/null @@ -1,112 +0,0 @@ -# Testnet Miners - -## Compute Requirements - -| Miner | -|-----------| -| 8gb RAM | -| 2 vCPUs | - -## Installation - -First, install PM2: -``` -sudo apt update -sudo apt install nodejs npm -sudo npm install pm2@latest -g -``` - -Verify installation: -``` -pm2 --version -``` - -Clone the repository: -``` -git clone https://github.com/foundryservices/snpOracle.git -cd snpOracle -``` - -Create and source a python virtual environment: -``` -python3 -m venv -source .venv/bin/activate -``` - -Install the requirements with poetry: -``` -pip install poetry -poetry install -``` - -## Configuration - -#### Environment Variables -First copy the `.env.template` file to `.env` - -```shell -cp .env.template .env -``` - -Update the `.env` file with your miner's values. - -```text -WANDB_API_KEY='REPLACE_WITH_WANDB_API_KEY' -MINER_HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' -HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' -HF_ACCESS_TOKEN = 'REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' -WANDB_API_KEY = 'REPLACE_WITH_WANDB_API_KEY' -GIT_TOKEN='REPLACE_WITH_GIT_TOKEN' -GIT_USERNAME='REPLACE_WITH_GIT_USERNAME' -GIT_NAME="REPLACE_WITH_GIT_NAME" -GIT_EMAIL="REPLACE_WITH_GIT_EMAIL" -``` - -#### HuggingFace Access Token -A huggingface access token can be procured from the huggingface platform. Follow the steps mentioned here to get your huggingface access token. - -#### Makefile -Edit the Makefile with you wallet and network information. - -```text -## Network Parameters ## -finney = wss://entrypoint-finney.opentensor.ai:443 -testnet = wss://test.finney.opentensor.ai:443 -locanet = ws://127.0.0.1:9944 - -testnet_netuid = 93 -localnet_netuid = 1 -logging_level = trace # options= ['info', 'debug', 'trace'] - -netuid = $(testnet_netuid) -network = $(testnet) - -## User Parameters -coldkey = default -validator_hotkey = validator -miner_hotkey = miner -``` - -## Deploying a Miner - -### Base miner -We highly recommend that you run your miners on testnet before deploying on mainnet. - -**IMPORTANT** -> Make sure your have activated your virtual environment before running your miner. - -1. Run the command: - ```shell - make miner - ``` - -### Custom Miner -We highly recommend that you run your miners on testnet before deploying on mainnet. - -**IMPORTANT** -> Make sure your have activated your virtual environment before running your miner. - -1. Run the Command: - ``` - make miner_custom - ``` From b8d73d6f92a0ffd6d29235017b20304bae5b21f4 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 20 Dec 2024 13:33:03 -0500 Subject: [PATCH 162/201] Move logging level in makefile --- Makefile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Makefile b/Makefile index fa5a06d8..e2936d2a 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,7 @@ validator_hotkey = validator miner_hotkey = miner netuid = $(testnet_netuid) network = $(testnet) +logging_level = info # options= ['info', 'debug', 'trace'] ################################################################################ @@ -18,7 +19,6 @@ locanet = ws://127.0.0.1:9944 finney_netuid = 28 testnet_netuid = 93 localnet_netuid = 1 -logging_level = info # options= ['info', 'debug', 'trace'] ################################################################################ @@ -54,4 +54,3 @@ miner: --vpermit_tao_limit 2 \ --hf_repo_id foundryservices/bittensor-sn28-base-lstm \ --model mining_models/base_lstm_new.h5 - From 0d589d21f6c2483d4982fe53da71afb8eadd1da6 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 20 Dec 2024 13:36:44 -0500 Subject: [PATCH 163/201] Alter readme links --- README.md | 7 +++---- docs/miners.md | 7 +++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 249fcec2..4464e9f2 100644 --- a/README.md +++ b/README.md @@ -35,10 +35,9 @@ Validators store price forecasts for the S&P 500 and compare these predictions a
    -| Miners | Validators | -| :----: | :--------: | -| [Testnet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/miners/testnet.md) | [Testnet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/validators/testnet.md) | -| [Mainnet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/miners/mainnet.md) | [Mainnet Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/validators/mainnet.md) | +| [Miner Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/miners.md) | [Validator Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/validators.md) | +| - | - | +
    diff --git a/docs/miners.md b/docs/miners.md index d13781e8..c7bbfc7d 100644 --- a/docs/miners.md +++ b/docs/miners.md @@ -8,6 +8,13 @@ > It is provided as an example to help you build your own custom models! > +
    + +| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 93
    **Mainnet UID:** 28 | +| - | - | + +
    + ## Compute Requirements | Miner | From baee9691f51252aca13c02c47e4d972fbbec0d32 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 20 Dec 2024 13:51:28 -0500 Subject: [PATCH 164/201] Rename validator readme --- docs/{validators/mainnet.md => validators.md} | 0 docs/validators/testnet.md | 83 ------------------- 2 files changed, 83 deletions(-) rename docs/{validators/mainnet.md => validators.md} (100%) delete mode 100644 docs/validators/testnet.md diff --git a/docs/validators/mainnet.md b/docs/validators.md similarity index 100% rename from docs/validators/mainnet.md rename to docs/validators.md diff --git a/docs/validators/testnet.md b/docs/validators/testnet.md deleted file mode 100644 index b9025323..00000000 --- a/docs/validators/testnet.md +++ /dev/null @@ -1,83 +0,0 @@ -# Testnet Validators - -## Compute Requirements - -| Validator | -| :-------: | -| 8gb RAM | -| 2 vCPUs | - -## Installation - -First, install PM2: -``` -sudo apt update -sudo apt install nodejs npm -sudo npm install pm2@latest -g -``` - -Verify installation: -``` -pm2 --version -``` - -Clone the repository: -``` -git clone https://github.com/foundryservices/snpOracle.git -cd snpOracle -``` - -Create and source a python virtual environment: -``` -python3 -m venv -source .venv/bin/activate -``` - -Install the requirements with poetry: -``` -pip install poetry -poetry install -``` - -## Configuration - -#### Environment Variables -First copy the `.env.template` file to `.env` - -```shell -cp .env.template .env -``` - -Update the `.env` file with your validator's values. - -```text -WANDB_API_KEY='REPLACE_WITH_WANDB_API_KEY' -MINER_HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' -HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' -HF_ACCESS_TOKEN = 'REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' -WANDB_API_KEY = 'REPLACE_WITH_WANDB_API_KEY' -GIT_TOKEN='REPLACE_WITH_GIT_TOKEN' -GIT_USERNAME='REPLACE_WITH_GIT_USERNAME' -GIT_NAME="REPLACE_WITH_GIT_NAME" -GIT_EMAIL="REPLACE_WITH_GIT_EMAIL" -``` - -See WandB API Key and HuggingFace setup below. - -#### Obtain & Setup WandB API Key -Before starting the process, validators would be required to procure a WANDB API Key. Please follow the instructions mentioned below:
    - -- Log in to Weights & Biases and generate an API key in your account settings. -- Set the variable `WANDB_API_KEY` in the `.env` file. -- Finally, run `wandb login` and paste your API key. Now you're all set with weights & biases. - -#### HuggingFace Access Token -A huggingface access token can be procured from the huggingface platform. Follow the steps mentioned here to get your huggingface access token. - -## Deploying a Validator -**IMPORTANT** -> Make sure your have activated your virtual environment before running your validator. -1. Run the command: - ```shell - make validator - ``` From 103fb18d87b7ddc5663ff999b7ff34a59488495a Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 20 Dec 2024 13:52:06 -0500 Subject: [PATCH 165/201] Adjust custom miner readme instructions --- docs/miners.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/miners.md b/docs/miners.md index c7bbfc7d..c946801e 100644 --- a/docs/miners.md +++ b/docs/miners.md @@ -1,4 +1,4 @@ -# Mainnet Miners +# Miners # **DO NOT RUN THE BASE MINER ON MAINNET!** @@ -102,7 +102,12 @@ We highly recommend that you run your miners on testnet before deploying on main ### Custom Miner -1. Run the Command: +1. Write custom logic inside the existing `forward` function located in the file `snp_oracle/neurons/miner.py` +2. This function should handle how the miner responds to requests from the validator. + 1. See `base_miner.py` for an example. +3. Edit the command in the Makefile. + 1. Add values for `hf_repo_id` and so forth. +4. Run the Command: ``` - make miner_custom + make miner ``` From 9d3f97754510941940c86343fcbe3a123f1fc4ad Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 20 Dec 2024 13:53:33 -0500 Subject: [PATCH 166/201] Adjust title of validator readme --- docs/validators.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/validators.md b/docs/validators.md index a3423fd6..ad1a951a 100644 --- a/docs/validators.md +++ b/docs/validators.md @@ -1,4 +1,11 @@ -# Mainnet Validators +# Validators + +
    + +| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 93
    **Mainnet UID:** 28 | +| - | - | + +
    ## Compute Requirements From f2a18acea9184e312ba76168bc98dcacc0b283c9 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 20 Dec 2024 14:08:49 -0500 Subject: [PATCH 167/201] update validator to check file size before saving to disc. Ensure that miner only has to save 1 data file. --- .../predictionnet/utils/dataset_manager.py | 29 +++++++++++++++++-- snp_oracle/predictionnet/utils/miner_hf.py | 2 +- snp_oracle/predictionnet/validator/forward.py | 2 +- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/snp_oracle/predictionnet/utils/dataset_manager.py b/snp_oracle/predictionnet/utils/dataset_manager.py index e44fbb71..cf93d2c8 100644 --- a/snp_oracle/predictionnet/utils/dataset_manager.py +++ b/snp_oracle/predictionnet/utils/dataset_manager.py @@ -69,6 +69,23 @@ def _get_local_path(self, hotkey: str) -> Path: path.mkdir(parents=True, exist_ok=True) return path + def _check_data_size(self, df: pd.DataFrame) -> Tuple[bool, float]: + """ + Check if DataFrame size is within allowed limits. + + Args: + df (pd.DataFrame): DataFrame to check + + Returns: + Tuple[bool, float]: (is_within_limit, size_in_mb) + """ + # Calculate size in memory + size_bytes = df.memory_usage(deep=True).sum() + size_mb = size_bytes / (1024 * 1024) # Convert to MB + max_size_mb = float(os.getenv("MAX_FILE_SIZE_MB", "100")) + + return size_mb <= max_size_mb, size_mb + def store_local_data( self, timestamp: str, @@ -78,7 +95,7 @@ def store_local_data( metadata: Optional[Dict] = None, ) -> Tuple[bool, Dict]: """ - Store data locally in Parquet format. + Store data locally in Parquet format with size validation. Args: timestamp (str): Current timestamp @@ -94,6 +111,12 @@ def store_local_data( if not isinstance(miner_data, pd.DataFrame) or miner_data.empty: raise ValueError("miner_data must be a non-empty pandas DataFrame") + # Check data size before proceeding + is_size_ok, size_mb = self._check_data_size(miner_data) + if not is_size_ok: + max_size_mb = float(os.getenv("MAX_FILE_SIZE_MB", "100")) + return False, {"error": f"Data size ({size_mb:.2f}MB) exceeds maximum allowed size ({max_size_mb}MB)"} + # Get local storage path for this hotkey local_path = self._get_local_path(hotkey) @@ -109,6 +132,7 @@ def store_local_data( "shape": f"{miner_data.shape[0]},{miner_data.shape[1]}", "hotkey": hotkey, "predictions": json.dumps(predictions) if predictions else "", + "size_mb": f"{size_mb:.2f}", # Add size information to metadata } if metadata: full_metadata.update(metadata) @@ -121,6 +145,7 @@ def store_local_data( "local_path": str(file_path), "rows": miner_data.shape[0], "columns": miner_data.shape[1], + "size_mb": round(size_mb, 2), } except Exception as e: @@ -283,7 +308,7 @@ async def store_data_async( self.executor, lambda: self.store_local_data(timestamp, miner_data, predictions, hotkey, metadata) ) - def cleanup_local_storage(self, days_to_keep: int = 7): + def cleanup_local_storage(self, days_to_keep: int = 2): """Clean up old local storage directories""" try: dirs = sorted([d for d in self.local_storage.iterdir() if d.is_dir()]) diff --git a/snp_oracle/predictionnet/utils/miner_hf.py b/snp_oracle/predictionnet/utils/miner_hf.py index 6af9cf65..22552d61 100644 --- a/snp_oracle/predictionnet/utils/miner_hf.py +++ b/snp_oracle/predictionnet/utils/miner_hf.py @@ -131,7 +131,7 @@ def upload_data(self, repo_id, data: pd.DataFrame, hotkey=None, encryption_key=N # Create unique filename using timestamp timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - data_filename = f"data_{timestamp}.parquet.enc" + data_filename = "data.parquet.enc" hotkey_path = f"{hotkey}/data" data_full_path = f"{hotkey_path}/{data_filename}" diff --git a/snp_oracle/predictionnet/validator/forward.py b/snp_oracle/predictionnet/validator/forward.py index 21aaa32b..c5b5ab94 100644 --- a/snp_oracle/predictionnet/validator/forward.py +++ b/snp_oracle/predictionnet/validator/forward.py @@ -76,7 +76,7 @@ async def handle_market_close(self, dataset_manager: DatasetManager) -> None: """Handle data management operations when market is closed.""" try: # Clean up old data - dataset_manager.cleanup_local_storage(days_to_keep=7) + dataset_manager.cleanup_local_storage(days_to_keep=2) # Upload today's data success, result = dataset_manager.batch_upload_daily_data() From 960043510d10bd66b891bf37cc3cbcd597f9baf1 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 20 Dec 2024 15:30:47 -0500 Subject: [PATCH 168/201] Explicitly state open sourcing models and input data in the top level readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4464e9f2..830d30d1 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Foundry Digital is launching the Foundry S&P 500 Oracle. This subnet incentivizes accurate short term price forecasts of the S&P 500 during market trading hours. -Miners use Neural Network model architectures to perform short term price predictions on the S&P 500. +Miners use Neural Network model architectures to perform short term price predictions on the S&P 500. All models and input data must be open sourced on HuggingFace to receive emissions. Validators store price forecasts for the S&P 500 and compare these predictions against the true price of the S&P 500 as the predictions mature. From 1a36ad93c353fabf010481886347d8e6a9ae168d Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 20 Dec 2024 15:55:52 -0500 Subject: [PATCH 169/201] update max file size default --- snp_oracle/predictionnet/utils/dataset_manager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/snp_oracle/predictionnet/utils/dataset_manager.py b/snp_oracle/predictionnet/utils/dataset_manager.py index cf93d2c8..65f1dae9 100644 --- a/snp_oracle/predictionnet/utils/dataset_manager.py +++ b/snp_oracle/predictionnet/utils/dataset_manager.py @@ -82,7 +82,7 @@ def _check_data_size(self, df: pd.DataFrame) -> Tuple[bool, float]: # Calculate size in memory size_bytes = df.memory_usage(deep=True).sum() size_mb = size_bytes / (1024 * 1024) # Convert to MB - max_size_mb = float(os.getenv("MAX_FILE_SIZE_MB", "100")) + max_size_mb = float(os.getenv("MAX_FILE_SIZE_MB", "10")) return size_mb <= max_size_mb, size_mb @@ -114,7 +114,7 @@ def store_local_data( # Check data size before proceeding is_size_ok, size_mb = self._check_data_size(miner_data) if not is_size_ok: - max_size_mb = float(os.getenv("MAX_FILE_SIZE_MB", "100")) + max_size_mb = float(os.getenv("MAX_FILE_SIZE_MB", "10")) return False, {"error": f"Data size ({size_mb:.2f}MB) exceeds maximum allowed size ({max_size_mb}MB)"} # Get local storage path for this hotkey From 24cba9c413b62e351b4c547837291eadf44e7369 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 20 Dec 2024 15:59:12 -0500 Subject: [PATCH 170/201] Update validator instructions --- docs/validators.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/validators.md b/docs/validators.md index ad1a951a..1c7005f3 100644 --- a/docs/validators.md +++ b/docs/validators.md @@ -59,10 +59,7 @@ Update the `.env` file with your validator's values. ```text WANDB_API_KEY='REPLACE_WITH_WANDB_API_KEY' -MINER_HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' HF_ACCESS_TOKEN='REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' -HF_ACCESS_TOKEN = 'REPLACE_WITH_HUGGINGFACE_ACCESS_KEY' -WANDB_API_KEY = 'REPLACE_WITH_WANDB_API_KEY' GIT_TOKEN='REPLACE_WITH_GIT_TOKEN' GIT_USERNAME='REPLACE_WITH_GIT_USERNAME' GIT_NAME="REPLACE_WITH_GIT_NAME" @@ -81,6 +78,9 @@ Before starting the process, validators would be required to procure a WANDB API #### HuggingFace Access Token A huggingface access token can be procured from the huggingface platform. Follow the steps mentioned here to get your huggingface access token. +#### Git Access Token +A git token can be procured from the huggingface platform. Follow the steps mentioned here to get your huggingface access token. Be sure to scope this token to the organization repository. The `username`, `name`, and `email` environment variable properties are all tied to your HuggingFace account. + ## Deploying a Validator **IMPORTANT** > Make sure your have activated your virtual environment before running your validator. @@ -88,3 +88,5 @@ A huggingface access token can be procured from the huggingface platform. Follow ```shell make validator ``` + +Inspect the Makefile for port configurations. From cc9af5568c2ea799e7b7068ad824c45558aaa2b7 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 20 Dec 2024 16:06:26 -0500 Subject: [PATCH 171/201] Point at staging branch --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 830d30d1..7dc05e1a 100644 --- a/README.md +++ b/README.md @@ -35,14 +35,14 @@ Validators store price forecasts for the S&P 500 and compare these predictions a
    -| [Miner Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/miners.md) | [Validator Docs](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/validators.md) | +| [Miner Docs](https://github.com/foundryservices/snpOracle/blob/staging/docs/miners.md) | [Validator Docs](https://github.com/foundryservices/snpOracle/blob/staging/docs/validators.md) | | - | - |
    ## Incentive Mechanism -Please read the [incentive mechanism white paper](https://github.com/foundryservices/snpOracle/blob/266-enhance-readme/docs/SN28%20Incentive%20Mechanism.pdf) to understand exactly how miners are scored and ranked. +Please read the [incentive mechanism white paper](https://github.com/foundryservices/snpOracle/blob/staging/docs/SN28%20Incentive%20Mechanism.pdf) to understand exactly how miners are scored and ranked. For transparency, there are two key metrics detailed in the white paper that will be calculated to score each miner: 1. **Directional Accuracy** - was the prediction in the same direction of the true price? From 1a5ebd8eb917044fb2e34c589f543292ca456f5f Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 20 Dec 2024 16:14:55 -0500 Subject: [PATCH 172/201] Increment version and release notes --- docs/Release Notes.md | 10 +++++----- pyproject.toml | 2 +- tests/test_package.py | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/Release Notes.md b/docs/Release Notes.md index 2c587999..c3a8fdce 100644 --- a/docs/Release Notes.md +++ b/docs/Release Notes.md @@ -1,12 +1,12 @@ Release Notes ============= -2.3.0 +3.0.0 ----- -Released on -- Reduce dependencies required to deploy miners and validators -- Move top level files to sensible locations -- Enahnce README with badges and other cosmetic updates +Released on Testnet December 20th 2024 +- Require open sourcing on HuggingFace +- Leverage Poetry for dependency management +- Enhance README instructions 2.2.1 diff --git a/pyproject.toml b/pyproject.toml index 7a508c64..24742db8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "snp_oracle" -version = "2.2.1" +version = "3.0.0" description = "" authors = ["Foundry Digital"] readme = "README.md" diff --git a/tests/test_package.py b/tests/test_package.py index 1f1e03b9..46c0775d 100644 --- a/tests/test_package.py +++ b/tests/test_package.py @@ -11,4 +11,4 @@ def setUp(self): def test_package_version(self): # Check that version is as expected # Must update to increment package version successfully - self.assertEqual(__version__, "2.2.1") + self.assertEqual(__version__, "3.0.0") From 1ac966c5bd1ed06fb4ea3b9d4253a9540c94ae1b Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 24 Dec 2024 09:43:26 -0500 Subject: [PATCH 173/201] include more details about hugging face integration with miner docs --- docs/miners.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/docs/miners.md b/docs/miners.md index c946801e..363b7244 100644 --- a/docs/miners.md +++ b/docs/miners.md @@ -87,6 +87,15 @@ logging_level = info # options = [info, debug, trace] #### Ports In the Makefile, we have default ports set to `8091` for validator and `8092` for miner. Please change as-needed. +#### Models +In the Makefile, ensure that the `--model` flag points to the local location of the model you would like validators to evaluate. By default, the Makefile is populated with the base miner model: +`--model mining_models/base_lstm_new.h5` + +The `--hf_repo_id` flag will determine which hugging face repository your miner models and data will be uploaded to. This repository must be public in order to ensure validator access. A hugging face repository will be created at the provided path under your hugging face user assuming you provide a valid username and valid.`MINER_HF_ACCESS_TOKEN` in your `.env` file. + +#### Data +The data your model utilizes will be automatically uploaded to hugging face, in the same repository as your model, defined here: `--hf_repo_id`. The data will be encrypted initially. Once the model is evaluated by validators, the data will be decrypted and published on hugging face. + ## Deploying a Miner We highly recommend that you run your miners on testnet before deploying on mainnet. @@ -96,9 +105,9 @@ We highly recommend that you run your miners on testnet before deploying on main ### Base miner 1. Run the command: - ```shell - make miner - ``` + ```shell + make miner + ``` ### Custom Miner @@ -108,6 +117,6 @@ We highly recommend that you run your miners on testnet before deploying on main 3. Edit the command in the Makefile. 1. Add values for `hf_repo_id` and so forth. 4. Run the Command: - ``` - make miner - ``` + ``` + make miner + ``` From e6b82a68da9d8c9c2aa9734e0cb52110d1e89378 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 24 Dec 2024 09:45:57 -0500 Subject: [PATCH 174/201] fix spacing --- docs/miners.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/miners.md b/docs/miners.md index 363b7244..f7e68a54 100644 --- a/docs/miners.md +++ b/docs/miners.md @@ -91,7 +91,7 @@ In the Makefile, we have default ports set to `8091` for validator and `8092` fo In the Makefile, ensure that the `--model` flag points to the local location of the model you would like validators to evaluate. By default, the Makefile is populated with the base miner model: `--model mining_models/base_lstm_new.h5` -The `--hf_repo_id` flag will determine which hugging face repository your miner models and data will be uploaded to. This repository must be public in order to ensure validator access. A hugging face repository will be created at the provided path under your hugging face user assuming you provide a valid username and valid.`MINER_HF_ACCESS_TOKEN` in your `.env` file. +The `--hf_repo_id` flag will determine which hugging face repository your miner models and data will be uploaded to. This repository must be public in order to ensure validator access. A hugging face repository will be created at the provided path under your hugging face user assuming you provide a valid username and valid `MINER_HF_ACCESS_TOKEN` in your `.env` file. #### Data The data your model utilizes will be automatically uploaded to hugging face, in the same repository as your model, defined here: `--hf_repo_id`. The data will be encrypted initially. Once the model is evaluated by validators, the data will be decrypted and published on hugging face. From 44632be64d946298f68948cef41bab2c0f01b122 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 31 Dec 2024 12:15:44 -0700 Subject: [PATCH 175/201] Update to bittensor 8.5.1 --- poetry.lock | 1323 +++++++++++++++++++++++++++--------------------- pyproject.toml | 6 +- 2 files changed, 761 insertions(+), 568 deletions(-) diff --git a/poetry.lock b/poetry.lock index 214223ae..52fa0946 100644 --- a/poetry.lock +++ b/poetry.lock @@ -24,87 +24,102 @@ files = [ [[package]] name = "aiohttp" -version = "3.11.11" +version = "3.10.11" description = "Async http client/server framework (asyncio)" optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" files = [ - {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8"}, - {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5"}, - {file = "aiohttp-3.11.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c"}, - {file = "aiohttp-3.11.11-cp310-cp310-win32.whl", hash = "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745"}, - {file = "aiohttp-3.11.11-cp310-cp310-win_amd64.whl", hash = "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9"}, - {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76"}, - {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538"}, - {file = "aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773"}, - {file = "aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62"}, - {file = "aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac"}, - {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886"}, - {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2"}, - {file = "aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e"}, - {file = "aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600"}, - {file = "aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d"}, - {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9"}, - {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194"}, - {file = "aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5"}, - {file = "aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d"}, - {file = "aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99"}, - {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e"}, - {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add"}, - {file = "aiohttp-3.11.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226"}, - {file = "aiohttp-3.11.11-cp39-cp39-win32.whl", hash = "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3"}, - {file = "aiohttp-3.11.11-cp39-cp39-win_amd64.whl", hash = "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1"}, - {file = "aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e"}, + {file = "aiohttp-3.10.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5077b1a5f40ffa3ba1f40d537d3bec4383988ee51fbba6b74aa8fb1bc466599e"}, + {file = "aiohttp-3.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d6a14a4d93b5b3c2891fca94fa9d41b2322a68194422bef0dd5ec1e57d7d298"}, + {file = "aiohttp-3.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffbfde2443696345e23a3c597049b1dd43049bb65337837574205e7368472177"}, + {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20b3d9e416774d41813bc02fdc0663379c01817b0874b932b81c7f777f67b217"}, + {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b943011b45ee6bf74b22245c6faab736363678e910504dd7531a58c76c9015a"}, + {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48bc1d924490f0d0b3658fe5c4b081a4d56ebb58af80a6729d4bd13ea569797a"}, + {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e12eb3f4b1f72aaaf6acd27d045753b18101524f72ae071ae1c91c1cd44ef115"}, + {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f14ebc419a568c2eff3c1ed35f634435c24ead2fe19c07426af41e7adb68713a"}, + {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:72b191cdf35a518bfc7ca87d770d30941decc5aaf897ec8b484eb5cc8c7706f3"}, + {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5ab2328a61fdc86424ee540d0aeb8b73bbcad7351fb7cf7a6546fc0bcffa0038"}, + {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:aa93063d4af05c49276cf14e419550a3f45258b6b9d1f16403e777f1addf4519"}, + {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:30283f9d0ce420363c24c5c2421e71a738a2155f10adbb1a11a4d4d6d2715cfc"}, + {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e5358addc8044ee49143c546d2182c15b4ac3a60be01c3209374ace05af5733d"}, + {file = "aiohttp-3.10.11-cp310-cp310-win32.whl", hash = "sha256:e1ffa713d3ea7cdcd4aea9cddccab41edf6882fa9552940344c44e59652e1120"}, + {file = "aiohttp-3.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:778cbd01f18ff78b5dd23c77eb82987ee4ba23408cbed233009fd570dda7e674"}, + {file = "aiohttp-3.10.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:80ff08556c7f59a7972b1e8919f62e9c069c33566a6d28586771711e0eea4f07"}, + {file = "aiohttp-3.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c8f96e9ee19f04c4914e4e7a42a60861066d3e1abf05c726f38d9d0a466e695"}, + {file = "aiohttp-3.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fb8601394d537da9221947b5d6e62b064c9a43e88a1ecd7414d21a1a6fba9c24"}, + {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea224cf7bc2d8856d6971cea73b1d50c9c51d36971faf1abc169a0d5f85a382"}, + {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db9503f79e12d5d80b3efd4d01312853565c05367493379df76d2674af881caa"}, + {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0f449a50cc33f0384f633894d8d3cd020e3ccef81879c6e6245c3c375c448625"}, + {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82052be3e6d9e0c123499127782a01a2b224b8af8c62ab46b3f6197035ad94e9"}, + {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20063c7acf1eec550c8eb098deb5ed9e1bb0521613b03bb93644b810986027ac"}, + {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:489cced07a4c11488f47aab1f00d0c572506883f877af100a38f1fedaa884c3a"}, + {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ea9b3bab329aeaa603ed3bf605f1e2a6f36496ad7e0e1aa42025f368ee2dc07b"}, + {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ca117819d8ad113413016cb29774b3f6d99ad23c220069789fc050267b786c16"}, + {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2dfb612dcbe70fb7cdcf3499e8d483079b89749c857a8f6e80263b021745c730"}, + {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9b615d3da0d60e7d53c62e22b4fd1c70f4ae5993a44687b011ea3a2e49051b8"}, + {file = "aiohttp-3.10.11-cp311-cp311-win32.whl", hash = "sha256:29103f9099b6068bbdf44d6a3d090e0a0b2be6d3c9f16a070dd9d0d910ec08f9"}, + {file = "aiohttp-3.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:236b28ceb79532da85d59aa9b9bf873b364e27a0acb2ceaba475dc61cffb6f3f"}, + {file = "aiohttp-3.10.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7480519f70e32bfb101d71fb9a1f330fbd291655a4c1c922232a48c458c52710"}, + {file = "aiohttp-3.10.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f65267266c9aeb2287a6622ee2bb39490292552f9fbf851baabc04c9f84e048d"}, + {file = "aiohttp-3.10.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7400a93d629a0608dc1d6c55f1e3d6e07f7375745aaa8bd7f085571e4d1cee97"}, + {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f34b97e4b11b8d4eb2c3a4f975be626cc8af99ff479da7de49ac2c6d02d35725"}, + {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e7b825da878464a252ccff2958838f9caa82f32a8dbc334eb9b34a026e2c636"}, + {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9f92a344c50b9667827da308473005f34767b6a2a60d9acff56ae94f895f385"}, + {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc6f1ab987a27b83c5268a17218463c2ec08dbb754195113867a27b166cd6087"}, + {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1dc0f4ca54842173d03322793ebcf2c8cc2d34ae91cc762478e295d8e361e03f"}, + {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7ce6a51469bfaacff146e59e7fb61c9c23006495d11cc24c514a455032bcfa03"}, + {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:aad3cd91d484d065ede16f3cf15408254e2469e3f613b241a1db552c5eb7ab7d"}, + {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f4df4b8ca97f658c880fb4b90b1d1ec528315d4030af1ec763247ebfd33d8b9a"}, + {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2e4e18a0a2d03531edbc06c366954e40a3f8d2a88d2b936bbe78a0c75a3aab3e"}, + {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6ce66780fa1a20e45bc753cda2a149daa6dbf1561fc1289fa0c308391c7bc0a4"}, + {file = "aiohttp-3.10.11-cp312-cp312-win32.whl", hash = "sha256:a919c8957695ea4c0e7a3e8d16494e3477b86f33067478f43106921c2fef15bb"}, + {file = "aiohttp-3.10.11-cp312-cp312-win_amd64.whl", hash = "sha256:b5e29706e6389a2283a91611c91bf24f218962717c8f3b4e528ef529d112ee27"}, + {file = "aiohttp-3.10.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:703938e22434d7d14ec22f9f310559331f455018389222eed132808cd8f44127"}, + {file = "aiohttp-3.10.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9bc50b63648840854e00084c2b43035a62e033cb9b06d8c22b409d56eb098413"}, + {file = "aiohttp-3.10.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f0463bf8b0754bc744e1feb61590706823795041e63edf30118a6f0bf577461"}, + {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6c6dec398ac5a87cb3a407b068e1106b20ef001c344e34154616183fe684288"}, + {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcaf2d79104d53d4dcf934f7ce76d3d155302d07dae24dff6c9fffd217568067"}, + {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25fd5470922091b5a9aeeb7e75be609e16b4fba81cdeaf12981393fb240dd10e"}, + {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbde2ca67230923a42161b1f408c3992ae6e0be782dca0c44cb3206bf330dee1"}, + {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:249c8ff8d26a8b41a0f12f9df804e7c685ca35a207e2410adbd3e924217b9006"}, + {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:878ca6a931ee8c486a8f7b432b65431d095c522cbeb34892bee5be97b3481d0f"}, + {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8663f7777ce775f0413324be0d96d9730959b2ca73d9b7e2c2c90539139cbdd6"}, + {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6cd3f10b01f0c31481fba8d302b61603a2acb37b9d30e1d14e0f5a58b7b18a31"}, + {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e8d8aad9402d3aa02fdc5ca2fe68bcb9fdfe1f77b40b10410a94c7f408b664d"}, + {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:38e3c4f80196b4f6c3a85d134a534a56f52da9cb8d8e7af1b79a32eefee73a00"}, + {file = "aiohttp-3.10.11-cp313-cp313-win32.whl", hash = "sha256:fc31820cfc3b2863c6e95e14fcf815dc7afe52480b4dc03393c4873bb5599f71"}, + {file = "aiohttp-3.10.11-cp313-cp313-win_amd64.whl", hash = "sha256:4996ff1345704ffdd6d75fb06ed175938c133425af616142e7187f28dc75f14e"}, + {file = "aiohttp-3.10.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:74baf1a7d948b3d640badeac333af581a367ab916b37e44cf90a0334157cdfd2"}, + {file = "aiohttp-3.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:473aebc3b871646e1940c05268d451f2543a1d209f47035b594b9d4e91ce8339"}, + {file = "aiohttp-3.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c2f746a6968c54ab2186574e15c3f14f3e7f67aef12b761e043b33b89c5b5f95"}, + {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d110cabad8360ffa0dec8f6ec60e43286e9d251e77db4763a87dcfe55b4adb92"}, + {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0099c7d5d7afff4202a0c670e5b723f7718810000b4abcbc96b064129e64bc7"}, + {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0316e624b754dbbf8c872b62fe6dcb395ef20c70e59890dfa0de9eafccd2849d"}, + {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a5f7ab8baf13314e6b2485965cbacb94afff1e93466ac4d06a47a81c50f9cca"}, + {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c891011e76041e6508cbfc469dd1a8ea09bc24e87e4c204e05f150c4c455a5fa"}, + {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9208299251370ee815473270c52cd3f7069ee9ed348d941d574d1457d2c73e8b"}, + {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:459f0f32c8356e8125f45eeff0ecf2b1cb6db1551304972702f34cd9e6c44658"}, + {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:14cdc8c1810bbd4b4b9f142eeee23cda528ae4e57ea0923551a9af4820980e39"}, + {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:971aa438a29701d4b34e4943e91b5e984c3ae6ccbf80dd9efaffb01bd0b243a9"}, + {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9a309c5de392dfe0f32ee57fa43ed8fc6ddf9985425e84bd51ed66bb16bce3a7"}, + {file = "aiohttp-3.10.11-cp38-cp38-win32.whl", hash = "sha256:9ec1628180241d906a0840b38f162a3215114b14541f1a8711c368a8739a9be4"}, + {file = "aiohttp-3.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:9c6e0ffd52c929f985c7258f83185d17c76d4275ad22e90aa29f38e211aacbec"}, + {file = "aiohttp-3.10.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cdc493a2e5d8dc79b2df5bec9558425bcd39aff59fc949810cbd0832e294b106"}, + {file = "aiohttp-3.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3e70f24e7d0405be2348da9d5a7836936bf3a9b4fd210f8c37e8d48bc32eca6"}, + {file = "aiohttp-3.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:968b8fb2a5eee2770eda9c7b5581587ef9b96fbdf8dcabc6b446d35ccc69df01"}, + {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deef4362af9493d1382ef86732ee2e4cbc0d7c005947bd54ad1a9a16dd59298e"}, + {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:686b03196976e327412a1b094f4120778c7c4b9cff9bce8d2fdfeca386b89829"}, + {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3bf6d027d9d1d34e1c2e1645f18a6498c98d634f8e373395221121f1c258ace8"}, + {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:099fd126bf960f96d34a760e747a629c27fb3634da5d05c7ef4d35ef4ea519fc"}, + {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c73c4d3dae0b4644bc21e3de546530531d6cdc88659cdeb6579cd627d3c206aa"}, + {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0c5580f3c51eea91559db3facd45d72e7ec970b04528b4709b1f9c2555bd6d0b"}, + {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fdf6429f0caabfd8a30c4e2eaecb547b3c340e4730ebfe25139779b9815ba138"}, + {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d97187de3c276263db3564bb9d9fad9e15b51ea10a371ffa5947a5ba93ad6777"}, + {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:0acafb350cfb2eba70eb5d271f55e08bd4502ec35e964e18ad3e7d34d71f7261"}, + {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c13ed0c779911c7998a58e7848954bd4d63df3e3575f591e321b19a2aec8df9f"}, + {file = "aiohttp-3.10.11-cp39-cp39-win32.whl", hash = "sha256:22b7c540c55909140f63ab4f54ec2c20d2635c0289cdd8006da46f3327f971b9"}, + {file = "aiohttp-3.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:7b26b1551e481012575dab8e3727b16fe7dd27eb2711d2e63ced7368756268fb"}, + {file = "aiohttp-3.10.11.tar.gz", hash = "sha256:9dc2b8f3dcab2e39e0fa309c8da50c3b55e6f34ab25f1a71d3288f24924d33a7"}, ] [package.dependencies] @@ -114,8 +129,7 @@ async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -propcache = ">=0.2.0" -yarl = ">=1.17.0,<2.0" +yarl = ">=1.12.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -145,57 +159,6 @@ files = [ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] -[[package]] -name = "ansible" -version = "8.5.0" -description = "Radically simple IT automation" -optional = false -python-versions = ">=3.9" -files = [ - {file = "ansible-8.5.0-py3-none-any.whl", hash = "sha256:2749032e26b0dbc9a694528b85fd89e7f950b8c7b53606f17dd997f23ac7cc88"}, - {file = "ansible-8.5.0.tar.gz", hash = "sha256:327c509bdaf5cdb2489d85c09d2c107e9432f9874c8bb5c0702a731160915f2d"}, -] - -[package.dependencies] -ansible-core = ">=2.15.5,<2.16.0" - -[[package]] -name = "ansible-core" -version = "2.15.13" -description = "Radically simple IT automation" -optional = false -python-versions = ">=3.9" -files = [ - {file = "ansible_core-2.15.13-py3-none-any.whl", hash = "sha256:e7f50bbb61beae792f5ecb86eff82149d3948d078361d70aedb01d76bc483c30"}, - {file = "ansible_core-2.15.13.tar.gz", hash = "sha256:f542e702ee31fb049732143aeee6b36311ca48b7d13960a0685afffa0d742d7f"}, -] - -[package.dependencies] -cryptography = "*" -importlib-resources = {version = ">=5.0,<5.1", markers = "python_version < \"3.10\""} -jinja2 = ">=3.0.0" -packaging = "*" -PyYAML = ">=5.1" -resolvelib = ">=0.5.3,<1.1.0" - -[[package]] -name = "ansible-vault" -version = "2.1.0" -description = "R/W an ansible-vault yaml file" -optional = false -python-versions = "*" -files = [ - {file = "ansible-vault-2.1.0.tar.gz", hash = "sha256:5ce8fdb5470f1449b76bf07ae2abc56480dad48356ae405c85b686efb64dbd5e"}, -] - -[package.dependencies] -ansible = "*" -setuptools = "*" - -[package.extras] -dev = ["black", "flake8", "isort[pyproject]", "pytest"] -release = ["twine"] - [[package]] name = "anyio" version = "4.7.0" @@ -244,6 +207,17 @@ files = [ six = ">=1.6.1,<2.0" wheel = ">=0.23.0,<1.0" +[[package]] +name = "async-property" +version = "0.2.2" +description = "Python decorator for async properties." +optional = false +python-versions = "*" +files = [ + {file = "async_property-0.2.2-py2.py3-none-any.whl", hash = "sha256:8924d792b5843994537f8ed411165700b27b2bd966cefc4daeefc1253442a9d7"}, + {file = "async_property-0.2.2.tar.gz", hash = "sha256:17d9bd6ca67e27915a75d92549df64b5c7174e9dc806b30a3934dc4ff0506380"}, +] + [[package]] name = "async-timeout" version = "5.0.1" @@ -322,37 +296,32 @@ lxml = ["lxml"] [[package]] name = "bittensor" -version = "7.4.0" +version = "8.5.1" description = "bittensor" optional = false python-versions = ">=3.9" files = [ - {file = "bittensor-7.4.0-py3-none-any.whl", hash = "sha256:fefa7336f2a7f0dc1edea53a5b1296f95503d9e1cc01cb00a445e6c7afc10d1c"}, - {file = "bittensor-7.4.0.tar.gz", hash = "sha256:235b3f5bb3d93f098a41a4f63d7676bd548debb0bb58f02a104704c0beb20ea2"}, + {file = "bittensor-8.5.1-py3-none-any.whl", hash = "sha256:8dbf9c389d10fd043dab5da163377a43ec2ae1b1715e819a3602e07d36304f94"}, + {file = "bittensor-8.5.1.tar.gz", hash = "sha256:f1bb033ba1e2641881d37f9d8cfebdcb7145ae20975861863710bdd17941cce4"}, ] [package.dependencies] aiohttp = ">=3.9,<4.0" -ansible = ">=8.5.0,<8.6.0" -ansible-vault = ">=2.1,<3.0" -backoff = "*" -certifi = ">=2024.7.4,<2024.8.0" +async-property = "0.2.2" +bittensor-cli = "*" +bittensor-commit-reveal = ">=0.1.0" +bittensor-wallet = ">=2.1.3" +bt-decode = "0.4.0" colorama = ">=0.4.6,<0.5.0" -cryptography = ">=42.0.5,<42.1.0" -ddt = ">=1.6.0,<1.7.0" -eth-utils = "<2.3.0" fastapi = ">=0.110.1,<0.111.0" -fuzzywuzzy = ">=0.18.0" msgpack-numpy-opentensor = ">=0.5.0,<0.6.0" munch = ">=2.5.0,<2.6.0" nest-asyncio = "*" netaddr = "*" -numpy = ">=1.26,<2.0" +numpy = ">=2.0.1,<2.1.0" packaging = "*" -password-strength = "*" pycryptodome = ">=3.18.0,<4.0.0" pydantic = ">=2.3,<3" -PyNaCl = ">=1.3,<2.0" python-Levenshtein = "*" python-statemachine = ">=2.1,<3.0" pyyaml = "*" @@ -361,17 +330,123 @@ retry = "*" rich = "*" scalecodec = "1.2.11" setuptools = ">=70.0.0,<70.1.0" -shtab = ">=1.6.5,<1.7.0" substrate-interface = ">=1.7.9,<1.8.0" -termcolor = "*" -tqdm = "*" uvicorn = "*" +websockets = ">=14.1" wheel = "*" [package.extras] -dev = ["aioresponses (==0.7.6)", "black (==24.3.0)", "coveralls (==3.3.1)", "ddt (==1.6.0)", "factory-boy (==3.3.0)", "flake8 (==7.0.0)", "freezegun (==1.5.0)", "httpx (==0.27.0)", "hypothesis (==6.81.1)", "mypy (==1.8.0)", "pytest (==7.2.0)", "pytest-asyncio (==0.23.7)", "pytest-cov (==4.0.0)", "pytest-mock (==3.12.0)", "pytest-rerunfailures (==10.2)", "pytest-split (==0.8.0)", "pytest-xdist (==3.0.2)", "ruff (==0.4.7)", "torch (>=1.13.1)", "types-retry (==0.9.9.4)"] +dev = ["aioresponses (==0.7.6)", "coveralls (==3.3.1)", "ddt (==1.6.0)", "factory-boy (==3.3.0)", "flake8 (==7.0.0)", "freezegun (==1.5.0)", "httpx (==0.27.0)", "hypothesis (==6.81.1)", "mypy (==1.8.0)", "pytest (==7.2.0)", "pytest-asyncio (==0.23.7)", "pytest-cov (==4.0.0)", "pytest-mock (==3.12.0)", "pytest-rerunfailures (==10.2)", "pytest-split (==0.8.0)", "pytest-xdist (==3.0.2)", "ruff (==0.4.7)", "torch (>=1.13.1)", "types-retry (==0.9.9.4)"] torch = ["torch (>=1.13.1)"] +[[package]] +name = "bittensor-cli" +version = "8.4.2" +description = "Bittensor CLI" +optional = false +python-versions = ">=3.9" +files = [ + {file = "bittensor-cli-8.4.2.tar.gz", hash = "sha256:43efc081ed2ecf4357bf5c5322ccd6f7d1a5110eb842cf138c75adb3f21686fd"}, + {file = "bittensor_cli-8.4.2-py3-none-any.whl", hash = "sha256:e7fc5ff510f039fa0cb9c0c701a56c4eb2b644befb019b1cd0fac29546bfb764"}, +] + +[package.dependencies] +aiohttp = ">=3.10.2,<3.11.0" +async-property = "0.2.2" +backoff = ">=2.2.1,<2.3.0" +bittensor-wallet = ">=2.1.3" +bt-decode = "0.4.0" +fuzzywuzzy = ">=0.18.0,<0.19.0" +GitPython = ">=3.0.0" +Jinja2 = "*" +netaddr = ">=1.3.0,<1.4.0" +numpy = ">=2.0.1" +pycryptodome = "*" +pytest = "*" +python-Levenshtein = "*" +PyYAML = ">=6.0.1,<6.1.0" +rich = ">=13.7,<14.0" +scalecodec = "1.2.11" +substrate-interface = ">=1.7.9,<1.8.0" +typer = ">=0.12,<1.0" +websockets = ">=14.1" +wheel = "*" + +[package.extras] +cuda = ["cubit (>=1.1.0)", "torch"] + +[[package]] +name = "bittensor-commit-reveal" +version = "0.1.0" +description = "" +optional = false +python-versions = ">=3.9" +files = [ + {file = "bittensor_commit_reveal-0.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e628b052ebdbd6893eb996a0d03b4c5e0823e42ee410ff5066018700a35539a"}, + {file = "bittensor_commit_reveal-0.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:245a7e0defb79f6a45c243f72739ee5c58840cba51342d28322c6d7a73f475b9"}, + {file = "bittensor_commit_reveal-0.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2bb23935ac60a981bfb3d83397b83e858c0b69a11806969cf56486f5ebc90943"}, + {file = "bittensor_commit_reveal-0.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4917b215c24b10bd80c84db921113b9cd1346ca7dcaca75e286905ede81a3b18"}, + {file = "bittensor_commit_reveal-0.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c46cee3e5fa5fc9e6f6a444793062855f40495c1a00b52df6508e4449ac5e89f"}, + {file = "bittensor_commit_reveal-0.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d56407b879dcf82bdde5eaefede43c8891e122fefc03a32c77a063dfc52e0c8"}, + {file = "bittensor_commit_reveal-0.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8509250549b6f5c475a9150e941b28fc66e82f30b27fe078fd80fa840943bb7b"}, + {file = "bittensor_commit_reveal-0.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bed04f82f162121747cfd7f51bb5d625dda0bf763a0699054565f255d219a9c2"}, + {file = "bittensor_commit_reveal-0.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25af2d9c82cacc4278095460493430d36070cb2843c0aa54b1c563788d0742eb"}, + {file = "bittensor_commit_reveal-0.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8f530793274698aaf4ac7cc8f24e915749d8156df8302c9e1e16446177b429d"}, + {file = "bittensor_commit_reveal-0.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e52955d652b61f091310e2b9b232d26b9e586a928e3b414a09a1b6615e9cc7a0"}, + {file = "bittensor_commit_reveal-0.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7be8c8f79dea2e137f5add6ee4711447c4f5d43668be26616ab7c1cacf317e07"}, + {file = "bittensor_commit_reveal-0.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b88ecb6a0989c2200486e29419a8e7d3b3f7918bdbde4ec04dbb4464abdee08f"}, + {file = "bittensor_commit_reveal-0.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac015f9eefa9dbddd2875cd7214e3a0bc2e394a2915772e655bdcc5c0af67de"}, + {file = "bittensor_commit_reveal-0.1.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18062ccab9bd8c66eee741bab9c047ec302eede563b16d4a960bcef6ef4ab368"}, + {file = "bittensor_commit_reveal-0.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957eff5b5b760dd8267d5f3c23c1aab4155505aa15bc06e044ffca483979f3d1"}, + {file = "bittensor_commit_reveal-0.1.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df0ef502f07804bff843a7e6318f95b9a9ca5bcc9c75e501040202b38d09d8b5"}, + {file = "bittensor_commit_reveal-0.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8706ae43e3455913d210c7ab5fc0110595e45b8fa3964441e2842fc7975aec3"}, + {file = "bittensor_commit_reveal-0.1.0.tar.gz", hash = "sha256:1c8bb8d77f6279988902c5c28361cc460167829c63ffa8d788209f8810933211"}, +] + +[package.extras] +dev = ["maturin (==1.7.0)"] + +[[package]] +name = "bittensor-wallet" +version = "2.1.3" +description = "" +optional = false +python-versions = ">=3.9" +files = [ + {file = "bittensor_wallet-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07462933ace69992079013ff7497c5f67e94b5d1adbada4ff08c5b18ebc18afe"}, + {file = "bittensor_wallet-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23110aca2d8f3e58c0b7c7bb58a74a66227aea85b30e4fa3eb616f5a13a0f659"}, + {file = "bittensor_wallet-2.1.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a5199c84e9d33ccec451294f89d9354b61568a0b623ceee995f588ccdc14ea5c"}, + {file = "bittensor_wallet-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a34e524f21e8c7bd8edfd54db530480b81f48d2334a0a11b86ea22d9e349137c"}, + {file = "bittensor_wallet-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45a1556e02304e1e8e91059cc11bb8346fa2334ac039f79bb1e6f630fa26657f"}, + {file = "bittensor_wallet-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9399c753c37dbe63430c5aff4fba0a038e0349dde0061d623506a24e3b4d2cec"}, + {file = "bittensor_wallet-2.1.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1e2f0d03a21a0c54b1f8cd59f34941d7a60df490e9aab7d7776b03f290de6074"}, + {file = "bittensor_wallet-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24c446b0af4c9ffc3ac122f97a1de25b283c877aa49892748ad06a8a61a74e13"}, + {file = "bittensor_wallet-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eafd9c82720644b3eeac2f68deaa9cec4cf175836b16c89206d98ce22590e8e"}, + {file = "bittensor_wallet-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f5122b05d8eede2bfc2eb242214b75ecab08f0da5d4f7547ed01ad253349e019"}, + {file = "bittensor_wallet-2.1.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:88020b18aa2f91b336a6f04354b7acb124701f9678d74e41f5ffb64a7e1e5731"}, + {file = "bittensor_wallet-2.1.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb7dd2ed4c12e617574b7302a6c20fb8e915477ce2942627f624293b5de9a003"}, + {file = "bittensor_wallet-2.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de47dea7d283e83449465f9780d4dde608fe09da45d6ef8c795806e49ccf4fd2"}, + {file = "bittensor_wallet-2.1.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e35adc5303b2186df889e07c79bf0bc074df382df49e6c216a8feb27f00453a4"}, + {file = "bittensor_wallet-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ffd5bd02ca772151aca8d1883d3536718d170e9fd095593d6e7860b6bd4ac5b"}, + {file = "bittensor_wallet-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:75ec884ee9ea4117cae3d18f90044b76daa47463294b94f56260c700ee95e7e5"}, + {file = "bittensor_wallet-2.1.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e1ee5be2b8b4c8fa36bc1750da723152dd7c96c4e606121146913adf83cf667"}, + {file = "bittensor_wallet-2.1.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b879438249fc70dc2f7b8b579566c526dde68c2baa31d12ee3c4fcd4087f7b9"}, + {file = "bittensor_wallet-2.1.3.tar.gz", hash = "sha256:41927d7e5d68fff1494cef5abd861ede0afc684dff366824b0806cfa3ce13af0"}, +] + +[package.dependencies] +cryptography = ">=43.0.1,<43.1.0" +eth-utils = "<2.3.0" +munch = ">=2.5.0,<2.6.0" +password-strength = "*" +py-bip39-bindings = "0.1.11" +rich = "*" +substrate-interface = ">=1.7.9,<1.8.0" +termcolor = "*" + +[package.extras] +dev = ["aioresponses (==0.7.6)", "ansible-vault (>=2.1,<3.0)", "coveralls (==3.3.1)", "ddt (==1.6.0)", "factory-boy (==3.3.0)", "flake8 (==7.0.0)", "freezegun (==1.5.0)", "httpx (==0.27.0)", "hypothesis (==6.81.1)", "maturin (==1.7.0)", "mypy (==1.8.0)", "py-bip39-bindings (==0.1.11)", "pytest (==7.2.0)", "pytest-asyncio (==0.23.7)", "pytest-cov (==4.0.0)", "pytest-mock (==3.12.0)", "pytest-rerunfailures (==10.2)", "pytest-split (==0.8.0)", "pytest-xdist (==3.0.2)", "ruff (==0.4.7)", "types-retry (==0.9.9.4)"] + [[package]] name = "black" version = "24.10.0" @@ -418,15 +493,122 @@ d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "bt-decode" +version = "0.4.0" +description = "A wrapper around the scale-codec crate for fast scale-decoding of Bittensor data structures." +optional = false +python-versions = ">=3.9" +files = [ + {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c176595c23f3d9a632b8a4fe71f8ed74e05be0ff4d447719eab3de686699c6b"}, + {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4a5232cc226d7c537303691dbb27c5c734cabcf51e6c74d641d1721a2d3a119c"}, + {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93dfa1c342a6fb3cbd199b46f511951174503c8405854de484390776ff94228a"}, + {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17f6f94d3dee3d9c9909e936b57bc87acef29de9b1b8d4157efd806bc7ff3eee"}, + {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba2d5f8ef69dde9880db38e45beb4ed965868d660f8de68d8cc7838d6b244295"}, + {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8f76a6949edbb7bc9a095f1a732974db04ec39c671e188ee001998901b6cd460"}, + {file = "bt_decode-0.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6df00582855bc84c1cbb4f7f63900097b456a43fd92fd397466c85943c5ba9f2"}, + {file = "bt_decode-0.4.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:67547de47eb41026f3ec106f2681c45e34fc5d610dd462cbcca9885bf7581af5"}, + {file = "bt_decode-0.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fb100ff9d8688c1e5dd98f7aa721279f267408cf7079d8f2ca9ea1abd6c0edfc"}, + {file = "bt_decode-0.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:66b599c2af3a7a3f40af22fa3e6304bde56237242120cb37253e4a465dfd419c"}, + {file = "bt_decode-0.4.0-cp310-cp310-win32.whl", hash = "sha256:0635af47f0abd4a1c1d9566fb101c4b851c2499a8f8b53e37a496efcd69409da"}, + {file = "bt_decode-0.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:01421093b5e97751624de0113fb3da7fb50a1d70c883887555e73abff081ffcc"}, + {file = "bt_decode-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:e2dd446b5956c3c772cdcbfe08fe0d483e68dc07b1606cde5d39c689dffd736c"}, + {file = "bt_decode-0.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcbb0fb758460c5fe7e5276b4406dd15d22ff544d309dd4ebb8fc998ce30d51f"}, + {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:816f45a75dc78d6beafaf7cc02ab51d73a3dd1c91d4ba0e6b43aae3c637d793d"}, + {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:39d44102ea27a23644c262d98378ac0ac650e481508f5d6989b8b4e3fd638faf"}, + {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:82e959521c60bc48276a91a01bd97726820128a4f4670ae043da35ca11823ca3"}, + {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bdea70a4b83e46432999f7743d130dbd49ccf1974c87c87153f7ad3733f5ccea"}, + {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99b6cc694fe05037c1dca02111d25b2357fd460bea8d8ce9b2432e3ed1d049c"}, + {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:645e82838b2e8d7b03686f5cee44e880c56bed3a9dbf2a530c818d1a63544967"}, + {file = "bt_decode-0.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cb32f5c5fda6cada107e3d82b5d760c87cd49075f28105de0900e495ee211659"}, + {file = "bt_decode-0.4.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:d2ecb71c8b40f3a4abd9c8fda54febffaa298eceafc12a47e9c0cf93e4ccbb8b"}, + {file = "bt_decode-0.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9b7691207021f023485d5adff6758bc0f938f80cf7e1ca05d291189e869217b5"}, + {file = "bt_decode-0.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:912957e7373014acf4203f3a701f4b820d9d7f5bee1f710298d7346f12bcff59"}, + {file = "bt_decode-0.4.0-cp311-cp311-win32.whl", hash = "sha256:fb47926e13f39663e62b4105b436abc84b913cb27edd621308f441cb405956ac"}, + {file = "bt_decode-0.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:001995ff6a20438c5542b13ae0af6458845381ccfd0ef484ae5f7e012c6fb383"}, + {file = "bt_decode-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ee9731ecf76ba4f60e10378b16d15bea826b41183ab208e32a9a7fd86d3b7c21"}, + {file = "bt_decode-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6e0ebd9e6f6e710fce9432d448a6add5b266f19af5ec518a2faf19ddd19ce3dc"}, + {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd898558c915dd9374a1860c1aee944cd6acb25f8e0f33f58d18eb989c49fab"}, + {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f87500550b030c3d265ab6847ef25f1e4f756b455605f1977329a665e41b330"}, + {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59fa64d5eff9fcc00f536e3ef74932f40aeff1335bd75a469bce90c1762451ae"}, + {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2be0732720588d047b00eb87e234dd83ebbdb717da8d704b8930b9ab580a6c3"}, + {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b4107e8b75966c5be0822a5f0525b568c94dbc1faa8d928090fa48daa329b45"}, + {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:46e09e7c557fe753c20226ec4db887a4a1b520d36dc4d01eb5d2bd2e2846970e"}, + {file = "bt_decode-0.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e817fe5e805bc393b266909709660dc14bd34a671712da0087e164a760b928b4"}, + {file = "bt_decode-0.4.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:59f9a61789003c345b423f1728ee0d774f89cc41be0ab2af0f2ad6e2653084b5"}, + {file = "bt_decode-0.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:905715452ecf4ce204aa937ee8266ea539fc085377f92bd9506ec76dcd874347"}, + {file = "bt_decode-0.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2e85f5f12e6bb00253e194372d90e60f129d613f0ddedae659d3b9a3049a69cf"}, + {file = "bt_decode-0.4.0-cp312-cp312-win32.whl", hash = "sha256:ed4c3c4383c9903f371502c0d62ce88ecd2c531044e04deaeb60c827ae45ad8e"}, + {file = "bt_decode-0.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:68beccbb00f129b75d189d2ffc48fd430bf4eab8a456aab79615b17eec82437d"}, + {file = "bt_decode-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:88de7129c3323c36cd6cce28844fb475556a865ec6fc87934ec5deeb95ff2d86"}, + {file = "bt_decode-0.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:056e6245a2119b391306542134651df54df29569136be892411073fc10840c8e"}, + {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:faa76d0b8fcb0f9ae2107e8c6ae84ea670de81c0adda4967a52d4b7d1de8c605"}, + {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7a3ff15bfe86d482e642dfaa6e5581b65815e7663f337af7502b422fea2fdcc2"}, + {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa7687c01c516f84274a2e71ba717898eef095e08ec7125823f7a4e230bd46fe"}, + {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d3cf8cfff714600db01c6cd144906fe0a8be85293711e279b8089f6ccaffd71"}, + {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:983972ecc83bd0507e72ae316281960b7e26e31386525c7905f7cdb8fa3e7de1"}, + {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:32e3950b120b8b59ae5ab70005ba9b5c7560a0e222e805f47878cb259a32ed39"}, + {file = "bt_decode-0.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66d906ac225e3cd169dde1e0af21e8d73e8ea7dea3f7e9afcdec501bced3d83a"}, + {file = "bt_decode-0.4.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:58bf09b004dc182748e285b5bc15ac6305af4ab9c318f995c443ba33bb61fbb6"}, + {file = "bt_decode-0.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c202f22152b3186cbc1c319250d6b0ecfe87cf9a4e8e90b19cc9f83786acdf1a"}, + {file = "bt_decode-0.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b6dd31b0947b7b15a36f7f9bfdb8ae30ffe3f3f97e0dc4d60bf79b9baf57f4e5"}, + {file = "bt_decode-0.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebb3b72146e7feb08e235d78457b597697708149d7410f184098b73c5ab38aa"}, + {file = "bt_decode-0.4.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9571680e6b74fab00cbd10dc255594692a9cdf615e33170d5a32112c1da8e3e4"}, + {file = "bt_decode-0.4.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dec8af1719ced86da6f7b1dcf70e1d480cfb86e2cf7530692d3e66ad1e16067d"}, + {file = "bt_decode-0.4.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46d2308e13615951f89ff7ba05364a2e3747626b29fd4ee39c085ea56cb5fe"}, + {file = "bt_decode-0.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0df0436d736544587002e0fa4fe3887b28cec8de4a9036c1ea776c560e966b8d"}, + {file = "bt_decode-0.4.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:579aba5010a078831af2025cd03df9d429fa35008ec46bc1561e6147e2c9769e"}, + {file = "bt_decode-0.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:039e880688d4c5f2ee090980649811b700593e21eccee520b294c07b85008bce"}, + {file = "bt_decode-0.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1a45173a6f0e48b28b190bfb250b6683984d115d70a6d2ff5102a2421d581de6"}, + {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4680c70defaa3bd1313a19808f3f87bad0fc3a2fff50ee9cadcb5983cc955a29"}, + {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ad241020b27648aae002d51ed78011ed4392057b9042409334dd8e7de3c79925"}, + {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:555d69a324809fc2fd8ba42dfa5838d99e21c359b593b4c7a1abefef13010ab0"}, + {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:811180a24a8bca2662610c378db18824ea5d27ce34851216ec4bc072f23fb3d3"}, + {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ba2eca99c4a80c3b3dba563b6b1ea0015d50b92d50c85605834bf3cd46316b"}, + {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e7db5b96c9d9be14484818b2d048f115eb3c76d91a68242a43fd26dd4d73da29"}, + {file = "bt_decode-0.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:db9af85ca279781a91538a5f2600d5267eddab47ee0073ef045080a83f4ff3e6"}, + {file = "bt_decode-0.4.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:3625d23dccba53542842eab5eab5a17362a35b999c85aa675f690106f342b010"}, + {file = "bt_decode-0.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0a824aafdc2fffb5958c9ea221d9b6da5ce240c99704a20f7a50231cd9e66dd3"}, + {file = "bt_decode-0.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:084f3f97cd176f30baa415cd29a6ad1e35abdb0ff2ed6af238d5a1af921a3265"}, + {file = "bt_decode-0.4.0-cp39-cp39-win32.whl", hash = "sha256:dad1c2e4d8b4e45d2f5ccbf6bbad8c249a411d8df43fb036e2c3da56148a9f0b"}, + {file = "bt_decode-0.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:c7aa9acbd4c49543b0aa503367777e0290fd056ca1f8fa6e2c867739141d545c"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49cbf7ef7174d57b89c8e72d54749176da7f01926d963846042af7c141fc7c88"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7e85d5dfb4aaefa9dba9ed86b9dfc2efff35322053da2f774942a9da6d50486"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a061a29489eb9680a01085f87e575e7e69fbfdc2c533d361ab84486d65470986"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6def48997eac2b9aafde742c4c2a7d159623824e7f9d36bbfa95f12ba6354d5"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a5eee81c7a20bd2739f5867354afc38372b0307211a4c9a580bb99369f84835"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8914f5bd5bfe16e79fe6f8f94766d22635f1f4bef1567c545c22ecdf4f150313"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3b268f170bcf85e229078f3af589b977c56ed9b696fe9e1198c5d4c9607406f1"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:f3c54b14d914bf20669bbeedb97da18b3379c6d7f801404227519416cceda614"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a7733ff7bcded3211e3b64fb38a1c917543045a092153999ede98333af766d3c"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e1036e0db9f75fb2c2c690bddd2a02d0e94347c13d906eb5dbbf22202f3fa46f"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9eaaee96683fc1694da1eb4ae732b166ac53c2606b35a4269050044bd20cb2e"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f432b9feceb7179f85b5e92fd4d7fe74b62aaac1d66e7a64c54f80b63d3480f"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0bf214c3a88841643f29b5d3e82fbd4cf57145ea6408509fe5d6247be024fcaf"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d69253f642a5f432206bc82aa7d3dbea1387c29b16211c838f71e4ca041bdc5"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:94b87373da3f96701878f60aa7953051999c58c3c8d88c392c879eb2daa40dad"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:50a6cc797aaf802061b1808c8a599e4416dd18c4afdc498c8b81a24da6039083"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:d22ee4640808452e98a7b2919a6e70b8f338cd3922547895093ce0ff6cc37f97"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5f28274ba30e5d606535701affde5b71927d9cd2159206f237cdc75410d450d6"}, + {file = "bt_decode-0.4.0.tar.gz", hash = "sha256:5c7e6286a4f8b9b704f6a0c263ce0e8854fb95d94da5dff6e8835be6de04d508"}, +] + +[package.dependencies] +toml = "0.10.0" + +[package.extras] +dev = ["black (==23.7.0)", "maturin", "ruff (==0.4.7)"] +test = ["bittensor (==8.2.0)", "ddt (==1.6.0)", "pytest (==7.2.0)", "pytest-asyncio (==0.23.7)", "pytest-mock (==3.12.0)", "pytest-rerunfailures (==10.2)", "pytest-split (==0.8.0)", "pytest-xdist (==3.0.2)"] + [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, ] [[package]] @@ -521,127 +703,114 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.4.0" +version = "3.4.1" 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"}, +python-versions = ">=3.7" +files = [ + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, ] [[package]] name = "click" -version = "8.1.7" +version = "8.1.8" 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"}, + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, ] [package.dependencies] @@ -660,43 +829,38 @@ files = [ [[package]] name = "cryptography" -version = "42.0.8" +version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, - {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, - {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, - {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, - {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, - {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, - {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] [package.dependencies] @@ -709,7 +873,7 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -827,17 +991,6 @@ toolz = ">=0.8.0" [package.extras] cython = ["cython"] -[[package]] -name = "ddt" -version = "1.6.0" -description = "Data-Driven/Decorated Tests" -optional = false -python-versions = "*" -files = [ - {file = "ddt-1.6.0-py2.py3-none-any.whl", hash = "sha256:e3c93b961a108b4f4d5a6c7f2263513d928baf3bb5b32af8e1c804bfb041141d"}, - {file = "ddt-1.6.0.tar.gz", hash = "sha256:f71b348731b8c78c3100bffbd951a769fbd439088d1fdbb3841eee019af80acd"}, -] - [[package]] name = "decorator" version = "5.1.1" @@ -975,13 +1128,13 @@ test = ["hypothesis (>=4.43.0)", "mypy (==0.971)", "pytest (>=7.0.0)", "pytest-x [[package]] name = "eval-type-backport" -version = "0.2.0" +version = "0.2.2" description = "Like `typing._eval_type`, but lets older Python versions use newer typing features." optional = false python-versions = ">=3.8" files = [ - {file = "eval_type_backport-0.2.0-py3-none-any.whl", hash = "sha256:ac2f73d30d40c5a30a80b8739a789d6bb5e49fdffa66d7912667e2015d9c9933"}, - {file = "eval_type_backport-0.2.0.tar.gz", hash = "sha256:68796cfbc7371ebf923f03bdf7bef415f3ec098aeced24e054b253a0e78f7b37"}, + {file = "eval_type_backport-0.2.2-py3-none-any.whl", hash = "sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a"}, + {file = "eval_type_backport-0.2.2.tar.gz", hash = "sha256:f0576b4cf01ebb5bd358d02314d31846af5e07678387486e2c798af0e7d849c1"}, ] [package.extras] @@ -1076,13 +1229,13 @@ pyflakes = ">=3.2.0,<3.3.0" [[package]] name = "flatbuffers" -version = "24.3.25" +version = "24.12.23" description = "The FlatBuffers serialization format for Python" optional = false python-versions = "*" files = [ - {file = "flatbuffers-24.3.25-py2.py3-none-any.whl", hash = "sha256:8dbdec58f935f3765e4f7f3cf635ac3a77f83568138d6a2311f524ec96364812"}, - {file = "flatbuffers-24.3.25.tar.gz", hash = "sha256:de2ec5b203f21441716617f38443e0a8ebf3d25bf0d9c0bb0ce68fa00ad546a4"}, + {file = "flatbuffers-24.12.23-py2.py3-none-any.whl", hash = "sha256:c418e0d48890f4142b92fd3e343e73a48f194e1f80075ddcc5793779b3585444"}, + {file = "flatbuffers-24.12.23.tar.gz", hash = "sha256:2910b0bc6ae9b6db78dd2b18d0b7a0709ba240fb5585f286a3a2b30785c22dac"}, ] [[package]] @@ -1236,13 +1389,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.10.0" +version = "2024.12.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.10.0-py3-none-any.whl", hash = "sha256:03b9a6785766a4de40368b88906366755e2819e758b83705c88cd7cb5fe81871"}, - {file = "fsspec-2024.10.0.tar.gz", hash = "sha256:eda2d8a4116d4f2429db8550f2457da57279247dd930bb12f821b58391359493"}, + {file = "fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2"}, + {file = "fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f"}, ] [package.extras] @@ -1518,13 +1671,13 @@ typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "t [[package]] name = "identify" -version = "2.6.3" +version = "2.6.4" description = "File identification library for Python" optional = false python-versions = ">=3.9" files = [ - {file = "identify-2.6.3-py2.py3-none-any.whl", hash = "sha256:9edba65473324c2ea9684b1f944fe3191db3345e50b6d04571d10ed164f8d7bd"}, - {file = "identify-2.6.3.tar.gz", hash = "sha256:62f5dae9b5fef52c84cc188514e9ea4f3f636b1d8799ab5ebc475471f9e47a02"}, + {file = "identify-2.6.4-py2.py3-none-any.whl", hash = "sha256:993b0f01b97e0568c179bb9196391ff391bfb88a99099dbf5ce392b68f42d0af"}, + {file = "identify-2.6.4.tar.gz", hash = "sha256:285a7d27e397652e8cafe537a6cc97dd470a970f48fb2e9d979aa38eae5513ac"}, ] [package.extras] @@ -1567,21 +1720,6 @@ perf = ["ipython"] test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] type = ["pytest-mypy"] -[[package]] -name = "importlib-resources" -version = "5.0.7" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.6" -files = [ - {file = "importlib_resources-5.0.7-py3-none-any.whl", hash = "sha256:2238159eb743bd85304a16e0536048b3e991c531d1cd51c4a834d1ccf2829057"}, - {file = "importlib_resources-5.0.7.tar.gz", hash = "sha256:4df460394562b4581bb4e4087ad9447bd433148fba44241754ec3152499f1d1b"}, -] - -[package.extras] -docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler", "pytest-flake8", "pytest-mypy"] - [[package]] name = "iniconfig" version = "2.0.0" @@ -1609,13 +1747,13 @@ colors = ["colorama (>=0.4.6)"] [[package]] name = "jinja2" -version = "3.1.4" +version = "3.1.5" 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"}, + {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, + {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, ] [package.dependencies] @@ -2390,49 +2528,55 @@ yaml = ["PyYAML (>=5.1.0)"] [[package]] name = "mypy" -version = "1.13.0" +version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, - {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, - {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, - {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, - {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, - {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, - {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, - {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, - {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, - {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, - {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, - {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, - {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, - {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, - {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, - {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, - {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, - {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, - {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, - {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, - {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, - {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b"}, + {file = "mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427"}, + {file = "mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f"}, + {file = "mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1"}, + {file = "mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e"}, + {file = "mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89"}, + {file = "mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9"}, + {file = "mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd"}, + {file = "mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7084fb8f1128c76cd9cf68fe5971b37072598e7c31b2f9f95586b65c741a9d31"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f845a00b4f420f693f870eaee5f3e2692fa84cc8514496114649cfa8fd5e2c6"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44bf464499f0e3a2d14d58b54674dee25c031703b2ffc35064bd0df2e0fac319"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c99f27732c0b7dc847adb21c9d47ce57eb48fa33a17bc6d7d5c5e9f9e7ae5bac"}, + {file = "mypy-1.14.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bce23c7377b43602baa0bd22ea3265c49b9ff0b76eb315d6c34721af4cdf1d9b"}, + {file = "mypy-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:8edc07eeade7ebc771ff9cf6b211b9a7d93687ff892150cb5692e4f4272b0837"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb"}, + {file = "mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60"}, + {file = "mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c"}, + {file = "mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1"}, + {file = "mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6"}, ] [package.dependencies] -mypy-extensions = ">=1.0.0" +mypy_extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.6.0" +typing_extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -2519,47 +2663,56 @@ files = [ [[package]] name = "numpy" -version = "1.26.4" +version = "2.0.2" 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"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, + {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, + {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, + {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, + {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, + {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, + {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, + {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, + {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, + {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, ] [[package]] @@ -2935,13 +3088,13 @@ xml = ["lxml (>=4.9.2)"] [[package]] name = "pandas-market-calendars" -version = "4.4.2" +version = "4.5.0" description = "Market and exchange trading calendars for pandas" optional = false python-versions = ">=3.8" files = [ - {file = "pandas_market_calendars-4.4.2-py3-none-any.whl", hash = "sha256:52a0fea562113d511f3f1ae372e2a86e4a37147dacec9644094ff6f88aee8d53"}, - {file = "pandas_market_calendars-4.4.2.tar.gz", hash = "sha256:4261a2c065565de1cd3646982b2e206e1069714b8140878dd6eba972546dfbcb"}, + {file = "pandas_market_calendars-4.5.0-py3-none-any.whl", hash = "sha256:ed38d6d4d8ca02d3e6c1fc996fdbac9677906d85b88e1c2f45b1200f6e20231a"}, + {file = "pandas_market_calendars-4.5.0.tar.gz", hash = "sha256:3a09285594861ffb3d4a6700854ea4574dcab290b4ab78eeec55e33992294643"}, ] [package.dependencies] @@ -3165,32 +3318,32 @@ files = [ [[package]] name = "psutil" -version = "6.1.0" +version = "6.1.1" 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"}, + {file = "psutil-6.1.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8"}, + {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777"}, + {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8df0178ba8a9e5bc84fed9cfa61d54601b371fbec5c8eebad27575f1e105c0d4"}, + {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:1924e659d6c19c647e763e78670a05dbb7feaf44a0e9c94bf9e14dfc6ba50468"}, + {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:018aeae2af92d943fdf1da6b58665124897cfc94faa2ca92098838f83e1b1bca"}, + {file = "psutil-6.1.1-cp27-none-win32.whl", hash = "sha256:6d4281f5bbca041e2292be3380ec56a9413b790579b8e593b1784499d0005dac"}, + {file = "psutil-6.1.1-cp27-none-win_amd64.whl", hash = "sha256:c777eb75bb33c47377c9af68f30e9f11bc78e0f07fbf907be4a5d70b2fe5f030"}, + {file = "psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8"}, + {file = "psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3"}, + {file = "psutil-6.1.1-cp36-cp36m-win32.whl", hash = "sha256:384636b1a64b47814437d1173be1427a7c83681b17a450bfc309a1953e329603"}, + {file = "psutil-6.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8be07491f6ebe1a693f17d4f11e69d0dc1811fa082736500f649f79df7735303"}, + {file = "psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53"}, + {file = "psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649"}, + {file = "psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5"}, ] [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"] +dev = ["abi3audit", "black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] test = ["pytest", "pytest-xdist", "setuptools"] [[package]] @@ -3206,105 +3359,70 @@ files = [ [[package]] name = "py-bip39-bindings" -version = "0.2.0" +version = "0.1.11" description = "Python bindings for tiny-bip39 RUST crate" optional = false -python-versions = ">=3.8" +python-versions = "*" files = [ - {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a9379172311aa9cdca13176fa541a7a8d5c99bb36360a35075b1687ca2a68f8"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f423282376ef9f080d52b213aa5800b78ba4a5c0da174679fe1989e632fd1def"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c61f08ee3a934932fb395a01b5f8f22e530e6c57a097fab40571ea635e28098"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8254c1b630aea2d8d3010f7dae4ed8f55f0ecc166122314b76c91541aeeb4df0"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e68c0db919ebba87666a947efafa92e41beeaf19b254ce3c3787085ab0c5829"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d36d468abc23d31bf19e3642b384fe28c7600c96239d4436f033d744a9137079"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f5ac37b6c6f3e32397925949f9c738e677c0b6ac7d3aa01d813724d86ce9045e"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8a1f2353c7fdbec4ea6f0a6a088cde076523b3bfce193786e096c4831ec723bb"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cb05d97ed2d018a08715ff06051c8de75c75b44eb73a428aaa204b56ce69d8f4"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-win32.whl", hash = "sha256:588ec726717b3ceaabff9b10d357a3a042a9a6cc075e3a9e14a3d7ba226c5ddf"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:4e5e2af6c4b6a3640648fb28c8655b4a3275cee9a5160de8ec8db5ab295b7ec9"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2af7c8dedaa1076002872eda378153e053e4c9f5ce39570da3c65ce7306f4439"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:08e03bc728aa599e3cfac9395787618308c8b8e6f35a9ee0b11b73dcde72e3fc"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f052e5740d500e5a6a24c97e026ce152bbee58b56f2944ed455788f65658884"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd441833b21a5da2ccfebbdf800892e41282b24fc782eabae2a576e3d74d67f8"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f39ac5d74640d1d48c80404e549be9dc5a8931383e7f94ee388e4d972b571f42"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55ee7185bb1b5fb5ec4abcdea1ad89256dc7ee7e9a69843390a98068832169d6"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:42a00be8009d3c396bc9719fc743b85cb928cf163b081ad6ead8fc7c9c2fefdb"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ccc54690103b537f6650a8053f905e56772ae0aeb7e456c062a290357953f292"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:59a954b4e22e3cb3da441a94576002eaaba0b9ad75956ebb871f9b8e8bd7044a"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:54ac4841e7f018811b0ffa4baae5bce82347f448b99c13b030fb9a0c263efc3d"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2d1cdceebf62c804d53ff676f14fcadf43eeac7e8b10af2058f9387b9417094d"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-win32.whl", hash = "sha256:be0786e712fb32efc55f06270c3da970e667dcec7f116b3defba802e6913e834"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:82593f31fb59f5b42ffdd4b177e0472ec32b178321063a93f6d609d672f0a087"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c763de71a7c83fcea7d6058a516e8ee3fd0f7111b6b02173381c35f48d96b090"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c61f65286fe314c28a4cf78f92bd549dbcc8f2dad99034ec7b47a688b2695cae"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:287301a2406e18cfb42bcc1b38cbd390ed11880cec371cd45471c00f75c3db8c"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:69c55c11228f91de55415eb31d5e5e8007b0544a48e2780e521a15a3fb713e8f"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ec5e6adb8ea6ffa22ed701d9749a184a203005538e276dcd2de183f27edebef"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831b0649d603b2e7905e09e39e36955f756abb19200beb630afc168b5c03d681"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:629399c400d605fbcb8de5ea942634ac06940e733e43753e0c23aee96fee6e45"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:15daa05fa85564f3ef7f3251ba9616cfc48f48d467cbecaf241194d0f8f62194"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:236aa7edb9ad3cade3e554743d00a620f47a228f36aa512dd0ee2fa75ea21c44"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:677ad9a382e8c2e73ca61f357a9c20a45885cd407afecc0c6e6604644c6ddfdc"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5f3b7bc29eda6ad7347caf07a91941a1c6a7c5c94212ffec7b056a9c4801911e"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-win32.whl", hash = "sha256:41f12635c5f0af0e406054d3a3ba0fad2045dfed461f43182bfa24edf11d90ca"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:e3a4f2e05b6aaabbe3e59cebab72b57f216e118e5e3f167d93ee9b9e2257871b"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:21eed9f92eaf9746459cb7a2d0c97b98c885c51a279ec5bbf0b7ff8c26fe5bcc"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:350e83133f4445c038d39ada05add91743bbff904774b220e5b143df4ca7c4c3"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c46c3aca25f0c9840303d1fc16ad21b3bc620255e9a09fe0f739108419029245"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57bd5454a3f4cad68ebb3b5978f166cb01bf0153f39e7bfc83af99399f142374"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8039f96b52b4ab348e01459e24355b62a6ad1d6a6ab9b3fcb40cfc404640ca9f"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6919cd972bad09afacd266af560379bafc10f708c959d2353aea1584019de023"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4737db37d8800eb2de056b736058b7d3f2d7c424320d26e275d9015b05b1f562"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:98df51a42035466cab5dfb69faec63c2e666c391ff6746a8603cc9cabfcebe24"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d55c6af3cebb5c640ff12d29d7ca152d2b8188db49b0a53fc52fd2a748a7e231"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:eae5c4956613134ec5abc696121272a6ce7107af1509d8cdea3e24db1dff351b"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:071c4e67e9ae4a5ae12d781483f3a46d81d6b20be965dade39044ed0f89df34a"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7642f598e9cd7caddcc2f57f50335a16677c02bb9a7c9bb01b1814ddab85bb5"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0d0cff505237fd8c7103243f242610501afcd8a917ce484e50097189a7115c55"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fec3d7b30980978bd73103e27907ca37766762c21cfce1abcc6f9032d54274f"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:876006fa8936ad413d2f53e67246478fc94c19d38dc45f6bfd5f9861853ac999"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e6064feb105ed5c7278d19e8c4e371710ce56adcdd48e0c5e6b77f9b005201b9"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0cb7a39bd65455c4cc3feb3f8d5766644410f32ac137aeea88b119c6ebe2d58b"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:58743e95cedee157a545d060ee401639308f995badb91477d195f1d571664b65"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84f4c53eab32476e3a9dd473ad4e0093dd284e7868da886d37a0be9e67ec7509"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e219d724c39cbaaabab1d1f10975399d46ba83a228437680dc29ccb7c8b4d38d"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fda7efd3befc614966169c10a4d5f60958698c13d4d0b97f069540220b45544"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5319b6ad23e46e8521fa23c0204ba22bbc5ebc5002f8808182b07c216223b8ed"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1b1de6b2e12a7992aa91501e80724b89a4636b91b22a2288bae5c417e358466"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:bae82c4505a79ed7f621d45e9ea225e7cd5e0804ce4c8022ab7a2b92bd007d53"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:d42d44532f395c59059551fd030e91dd39cbe1b30cb7a1cf7636f9a6a6a36a94"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a29bca14abb51449bd051d59040966c6feff43b01f6b8a9669d876d7195d215f"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e7cb5aefdbc142b5c9b56b2c89c0112fd2288d52be8024cf1f1b66a4b84e3c83"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-win32.whl", hash = "sha256:e846c0eebeb0b684da4d41ac0751e510f91d7568cc9bc085cb93aa50d9b1ee6e"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0a2024c9e9a5b9d90ab9c1fdaddd1abb7e632ef309efc4b89656fc25689c4456"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e3438f2568c1fdd8862a9946800570dbb8665b6c46412fa60745975cd82083a"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d5339d0b99d2ce9835f467ed3790399793ed4d51982881ff9c1f854649055d42"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:856b69bc125c40264bf9e749efc1b66405b27cfc4c7f96cd3c5e6a657b143859"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91cffd83189f42f2945693786104c51fa775ba8f09c532bf8c504916d6ddb565"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c72195aa802a36ad81bcc07fc23d59b83214511b1569e5cb245402a9209614e7"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a5224fc1417d35413f914bbe414b276941dd1d03466ed8a8a259dc4fa330b60c"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:86265b865bcacd3fcd30f89012cd248142d3eb6f36785c213f00d2d84d41e6fc"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:96337e30589963b6b849415e0c1dc9fe5c671f51c1f10e10e40f825460078318"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:07f2cd20581104c2bc02ccf90aaeb5e31b7dda2bbdb24afbaef69d410eb18bf0"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-win32.whl", hash = "sha256:d26f9e2007c1275a869711bae2d1f1c6f99feadc3ea8ebb0aed4b69d1290bfa9"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3e79ad1cbf5410db23db6579111ed27aa7fac38969739040a9e3909a10d303fc"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2491fc1a1c37052cf9538118ddde51c94a0d85804a6d06fddb930114a8f41385"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5ecf247c9ea0c32c37bdde2db616cf3fff3d29a6b4c8945957f13e4c9e32c71a"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ce39808c717b13c02edca9eea4d139fc4d86c01acad99efb113b04e9639e2b9"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c5f38b01283e5973b1dfcdedc4e941c463f89879dc5d86463e77e816d240182"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fb1503c87e3d97f6802b28bd3b808ce5f0d88b7a38ed413275616d1962f0a6d"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e9ae6318f14bf8683cc11714516a04ac60095eab1aaf6ca6d1c99d508e399c64"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:7be4ac068391c80fdee956f7c4309533fcf7a4fae45dec46179af757961efefc"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e26059b46eff40ccb282966c49c475633cd7d3a1c08780fff3527d2ff247a014"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e8a63d04f68269e7e42219b30ff1e1e013f08d2fecef3f39f1588db512339509"}, - {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b85cb77708a4d1aceac8140604148c97894d3e7a3a531f8cfb82a85c574e4ac"}, - {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57a0c57a431fcd9873ae3d00b6227e39b80e63d9924d74a9f34972fd9f2e3076"}, - {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28bc089c7a7f22ac67de0e9e8308873c151cac9c5320c610392cdcb1c20e915e"}, - {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bfcec453c1069e87791ed0e1bc7168bbc3883dd40b0d7b35236e77dd0b1411c0"}, - {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:850cd2b2341a5438ae23b53054f1130f377813417f1fbe56c8424224dad0a408"}, - {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:424a2df31bcd3c9649598fc1ea443267db724754f9ec19ac3bd2c42542643043"}, - {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:06fe0f8bb2bd28266bf5182320b3f0cef94b103e03e81999f67cae194b7ea097"}, - {file = "py_bip39_bindings-0.2.0.tar.gz", hash = "sha256:38eac2c2be53085b8c2a215ebf12abcdaefee07bc8e00d7649b6b27399612b83"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:324a7363f8b49201ebe1cc72d970017ec5139f8a5ddf605fa2774904eb7f08a1"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:77173b83c7ade4ca3c91fae0da9c9b1bc5f4c6819baa2276feacd5abec6005fa"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84e5177fb3d3b9607f5d7d526a89f91b35687fcc34b643fc96cd168a0ae025cb"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ecd1cfb17f0b1bb56f0b1de5c533ff9830a60b5d657846b8cf500ff9fca8b3"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3408dc0809fca5691f9c02c8292d62590d90de4f02a4b2dcab35817fa857a71"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_28_armv7l.whl", hash = "sha256:d6f0eda277c6d0ef28cc83fd3f59a0f745394ea1e2807f2fea49186084b3d47d"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:963357db40dc7a816d55097a85929cae18c6174c5bedf0410f6e72181270b2b1"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:be06dc751be86cbd72cd71e318979d3ab27cee12fd84d1e5e4e84575c5c9355d"}, + {file = "py_bip39_bindings-0.1.11-cp310-none-win32.whl", hash = "sha256:b4e05b06831874fa8715bdb128ea776674ad708858a4b3b1a27e5710859b086d"}, + {file = "py_bip39_bindings-0.1.11-cp310-none-win_amd64.whl", hash = "sha256:e01a03e858a648d294bcf063368bf09027efa282f5192abddaf7af69c5e2a574"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:27cce22727e28705a660464689ade6d2cdad4e622bead5bde2ffa53c4f605ee5"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:cdf35d031587296dcbdb22dbc67f2eaf5b5df9d5036b77fbeb93affbb9eec8d3"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2fd5b926686207752d5f2e2ff164a9489b3613239d0967362f10c2fbd64eb018"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba84c38962bffdaea0e499245731d669cc21d1280f81ace8ff60ed3550024570"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9024ec3c4a3db005b355f9a00602cede290dec5e9c7cf7dd06a26f620b0cf99"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_28_armv7l.whl", hash = "sha256:ce028c8aef51dec2a85f298461b2988cca28740bf3cc23472c3469d3f853714e"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:51882cd0fa7529173b3543c089c24c775f1876ddf48f10e60f2ed07ad2af5cae"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ee776f3b33b2d71fee48679951f117e3d1f052449ec2fcb184f3c64a4c77e4f"}, + {file = "py_bip39_bindings-0.1.11-cp311-none-win32.whl", hash = "sha256:d8b722e49562810f94eb61c9efa172f327537c74c37da3e86b161f7f444c51bf"}, + {file = "py_bip39_bindings-0.1.11-cp311-none-win_amd64.whl", hash = "sha256:be934052497f07605768e2c7184e4f4269b3e2e77930131dfc9bdbb791e6fdf4"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:afa9c5762cfaec01141f478a9c3132de01ec3890ff2e5a4013c79d3ba3aff8bb"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a3af7c1f955c6bbd613c6b38d022f7c73896acaf0ecc972ac0dee4b952e14568"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6aed3e86f105a36676e8dd0c8bc3f611a81b7ba4309b22a77fdc0f63b260e094"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d202f051cf063abae3acd0b74454d9d7b1dbeaf466ef7cb47a34ccedac845b62"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae120b5542fecf97aa3fdb6a526bac1004cb641bc9cc0d0030c6735dc2156072"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:baf896aabb3bec42803015e010c121c8a3210b20184f37aaa6e400ae8e877e60"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e4d45324c598197dbddac10a0298197ca2587fa7b09d1450697517988a29d515"}, + {file = "py_bip39_bindings-0.1.11-cp312-none-win32.whl", hash = "sha256:92abce265b0f2d8c5830441aff06b7b4f9426088a3de39624b12f3f9ff9fc2eb"}, + {file = "py_bip39_bindings-0.1.11-cp312-none-win_amd64.whl", hash = "sha256:6794187229eb0b04d0770f0fba936f0c5c598f552848a398ed5af9a61638cacb"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:76fc141ed154ccef9c36d5e2eb615565f2e272a43ed56edbdda538840b597187"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:3837f7040e732f7be49da5f595f147de2304e92a67267b12d5aa08a9bb02dd4b"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82de90eabe531095d4e4721ea1546873f0161c101c30b43dcf0a7bbd9cdcce69"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19794bafd088cfb50f99b04f3710c895756fe25ec342eaea0b5c579512493b61"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_28_armv7l.whl", hash = "sha256:8b9aa564a0081c360776b2230472475bd2971ddbe8f99ed7d8676c0ab3b2e0e4"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f55ab4fc519b8a9b80b28e02756788b9da037a2484e42282497eb9a253e5a58"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:cd1b874bc812866804a40242cdb1303de9caeb0ed261852dfbb5cbce94db31a4"}, + {file = "py_bip39_bindings-0.1.11-cp37-none-win32.whl", hash = "sha256:aa643eae0ebc185e50fcbc088210930f2cb4b30145dfd18a2b031451ce3edb03"}, + {file = "py_bip39_bindings-0.1.11-cp37-none-win_amd64.whl", hash = "sha256:e68673dbe4d2d99f64e493ac1369ac39b0bd9266dddefe476802d853f9637906"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:b1bece61da3c8ed37b86ac19051bab4cb599318066cdcf6ca9d795bdf7553525"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5cc8a25d058f8f7741af38015b56177a1fbd442d7a2d463860c76fb86ff33211"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ac1d37c0266c40f592a53b282c392f40bc23c117ca092a46e419c9d141a3dc89"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd63afb8451a0ee91658144f1fa9d1b5ed908ca458e713864e775e47bb806414"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa30b9b4b01cc703801924be51e802f7ae778abea433f4e3908fc470e2a517ef"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_28_armv7l.whl", hash = "sha256:f826af5e54e250272af9203ce85bf53064fe514df8222836c3ff43f23ccd55fe"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:08ba04fbad6d795c0bc59bbdf05a2bae9de929f34101fa149501e83fc4e52d6f"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1f9ba82d427353bd6e7521b03583e0e72d745e7d6bf0b1505555a1032b6fd656"}, + {file = "py_bip39_bindings-0.1.11-cp38-none-win32.whl", hash = "sha256:86df39df8c573be8ff92e613d833045919e1351446898d683cc9a49ebeb25a87"}, + {file = "py_bip39_bindings-0.1.11-cp38-none-win_amd64.whl", hash = "sha256:e26cde6585ab95042fef48f6740a4f1a7962f2a571e73f1f12bfc4daee786c9a"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:3bb22e4f2430bc28d93599c70a4d6ce9fc3e88db3f20b24ca17902f796be6ae9"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:75de7c7e76581244c3893fb624e44d84dadcceddd73f221ab74a9cb3c04b416b"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7e1a364081460498caa7d8238c54ae78b009d331afcb4f037d659b02639b969e"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3112f408f2d58be9ea3189903e5f2d944a0d882fa35b91b7bb88a195a16a8c1"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b921f36a4ef7a3bccb2635f2a5f91647a63ebaa1a4962a24fa236e5a32834cf"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_28_armv7l.whl", hash = "sha256:77accd187ef9a87e1d32f279b45a6e23123816b933a7e3d8c4a2fe61f6bd1d2e"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fd74fd810cc1076dd0c2944490d4acb1a109837cc9cfd58b29605ea81b4034f5"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153f310e55795509b8b004590dbc0cff58d65e8f032c1558021fc0898121a465"}, + {file = "py_bip39_bindings-0.1.11-cp39-none-win32.whl", hash = "sha256:b769bcc358c806ca1a5983e57eb94ee33ec3a8ef69fa01aa6b28960fa3e0ab5a"}, + {file = "py_bip39_bindings-0.1.11-cp39-none-win_amd64.whl", hash = "sha256:3d8a802d504c928d97e951489e942f39c9bfeec2a7305a6f0f3d5d38e152db9e"}, + {file = "py_bip39_bindings-0.1.11.tar.gz", hash = "sha256:ebc128ccf3a0750d758557e094802f0975c3760a939f8a8b76392d7dbe6b52a1"}, ] [[package]] @@ -4203,23 +4321,6 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] -[[package]] -name = "resolvelib" -version = "1.0.1" -description = "Resolve abstract dependencies into concrete ones" -optional = false -python-versions = "*" -files = [ - {file = "resolvelib-1.0.1-py2.py3-none-any.whl", hash = "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf"}, - {file = "resolvelib-1.0.1.tar.gz", hash = "sha256:04ce76cbd63fded2078ce224785da6ecd42b9564b1390793f64ddecbe997b309"}, -] - -[package.extras] -examples = ["html5lib", "packaging", "pygraphviz", "requests"] -lint = ["black", "flake8", "isort", "mypy", "types-requests"] -release = ["build", "towncrier", "twine"] -test = ["commentjson", "packaging", "pytest"] - [[package]] name = "retry" version = "0.9.2" @@ -4256,13 +4357,13 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "ruamel-yaml" -version = "0.18.6" +version = "0.18.7" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" optional = false python-versions = ">=3.7" files = [ - {file = "ruamel.yaml-0.18.6-py3-none-any.whl", hash = "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636"}, - {file = "ruamel.yaml-0.18.6.tar.gz", hash = "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b"}, + {file = "ruamel.yaml-0.18.7-py3-none-any.whl", hash = "sha256:adef56d72a97bc2a6a78952ef398c4054f248fba5698ddc3ab07434e7fc47983"}, + {file = "ruamel.yaml-0.18.7.tar.gz", hash = "sha256:270638acec6659f7bb30f4ea40083c9a0d0d5afdcef5e63d666f11209091531a"}, ] [package.dependencies] @@ -4736,19 +4837,16 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] -name = "shtab" -version = "1.6.5" -description = "Automagic shell tab completion for Python CLI applications" +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" optional = false python-versions = ">=3.7" files = [ - {file = "shtab-1.6.5-py3-none-any.whl", hash = "sha256:3c7be25ab65a324ed41e9c2964f2146236a5da6e6a247355cfea56f65050f220"}, - {file = "shtab-1.6.5.tar.gz", hash = "sha256:cf4ab120183e84cce041abeb6f620f9560739741dfc31dd466315550c08be9ec"}, + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, ] -[package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout"] - [[package]] name = "six" version = "1.17.0" @@ -5075,13 +5173,13 @@ testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] [[package]] name = "toml" -version = "0.10.2" +version = "0.10.0" description = "Python Library for Tom's Obvious, Minimal Language" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "*" files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, + {file = "toml-0.10.0-py2.py3-none-any.whl", hash = "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e"}, + {file = "toml-0.10.0.tar.gz", hash = "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c"}, ] [[package]] @@ -5299,6 +5397,23 @@ build = ["cmake (>=3.20)", "lit"] tests = ["autopep8", "flake8", "isort", "llnl-hatchet", "numpy", "pytest", "scipy (>=1.7.1)"] tutorials = ["matplotlib", "pandas", "tabulate"] +[[package]] +name = "typer" +version = "0.15.1" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.7" +files = [ + {file = "typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847"}, + {file = "typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a"}, +] + +[package.dependencies] +click = ">=8.0.0" +rich = ">=10.11.0" +shellingham = ">=1.3.0" +typing-extensions = ">=3.7.4.3" + [[package]] name = "typing-extensions" version = "4.12.2" @@ -5323,13 +5438,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.3" +version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] @@ -5456,6 +5571,84 @@ docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] +[[package]] +name = "websockets" +version = "14.1" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "websockets-14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a0adf84bc2e7c86e8a202537b4fd50e6f7f0e4a6b6bf64d7ccb96c4cd3330b29"}, + {file = "websockets-14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90b5d9dfbb6d07a84ed3e696012610b6da074d97453bd01e0e30744b472c8179"}, + {file = "websockets-14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2177ee3901075167f01c5e335a6685e71b162a54a89a56001f1c3e9e3d2ad250"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f14a96a0034a27f9d47fd9788913924c89612225878f8078bb9d55f859272b0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f874ba705deea77bcf64a9da42c1f5fc2466d8f14daf410bc7d4ceae0a9fcb0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9607b9a442392e690a57909c362811184ea429585a71061cd5d3c2b98065c199"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bea45f19b7ca000380fbd4e02552be86343080120d074b87f25593ce1700ad58"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:219c8187b3ceeadbf2afcf0f25a4918d02da7b944d703b97d12fb01510869078"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad2ab2547761d79926effe63de21479dfaf29834c50f98c4bf5b5480b5838434"}, + {file = "websockets-14.1-cp310-cp310-win32.whl", hash = "sha256:1288369a6a84e81b90da5dbed48610cd7e5d60af62df9851ed1d1d23a9069f10"}, + {file = "websockets-14.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0744623852f1497d825a49a99bfbec9bea4f3f946df6eb9d8a2f0c37a2fec2e"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:449d77d636f8d9c17952628cc7e3b8faf6e92a17ec581ec0c0256300717e1512"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a35f704be14768cea9790d921c2c1cc4fc52700410b1c10948511039be824aac"}, + {file = "websockets-14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b1f3628a0510bd58968c0f60447e7a692933589b791a6b572fcef374053ca280"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c3deac3748ec73ef24fc7be0b68220d14d47d6647d2f85b2771cb35ea847aa1"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7048eb4415d46368ef29d32133134c513f507fff7d953c18c91104738a68c3b3"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cf0ad281c979306a6a34242b371e90e891bce504509fb6bb5246bbbf31e7b6"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc1fc87428c1d18b643479caa7b15db7d544652e5bf610513d4a3478dbe823d0"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f95ba34d71e2fa0c5d225bde3b3bdb152e957150100e75c86bc7f3964c450d89"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9481a6de29105d73cf4515f2bef8eb71e17ac184c19d0b9918a3701c6c9c4f23"}, + {file = "websockets-14.1-cp311-cp311-win32.whl", hash = "sha256:368a05465f49c5949e27afd6fbe0a77ce53082185bbb2ac096a3a8afaf4de52e"}, + {file = "websockets-14.1-cp311-cp311-win_amd64.whl", hash = "sha256:6d24fc337fc055c9e83414c94e1ee0dee902a486d19d2a7f0929e49d7d604b09"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed907449fe5e021933e46a3e65d651f641975a768d0649fee59f10c2985529ed"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87e31011b5c14a33b29f17eb48932e63e1dcd3fa31d72209848652310d3d1f0d"}, + {file = "websockets-14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc6ccf7d54c02ae47a48ddf9414c54d48af9c01076a2e1023e3b486b6e72c707"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9777564c0a72a1d457f0848977a1cbe15cfa75fa2f67ce267441e465717dcf1a"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a655bde548ca98f55b43711b0ceefd2a88a71af6350b0c168aa77562104f3f45"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfff83ca578cada2d19e665e9c8368e1598d4e787422a460ec70e531dbdd58"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6a6c9bcf7cdc0fd41cc7b7944447982e8acfd9f0d560ea6d6845428ed0562058"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4b6caec8576e760f2c7dd878ba817653144d5f369200b6ddf9771d64385b84d4"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb6d38971c800ff02e4a6afd791bbe3b923a9a57ca9aeab7314c21c84bf9ff05"}, + {file = "websockets-14.1-cp312-cp312-win32.whl", hash = "sha256:1d045cbe1358d76b24d5e20e7b1878efe578d9897a25c24e6006eef788c0fdf0"}, + {file = "websockets-14.1-cp312-cp312-win_amd64.whl", hash = "sha256:90f4c7a069c733d95c308380aae314f2cb45bd8a904fb03eb36d1a4983a4993f"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3630b670d5057cd9e08b9c4dab6493670e8e762a24c2c94ef312783870736ab9"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36ebd71db3b89e1f7b1a5deaa341a654852c3518ea7a8ddfdf69cc66acc2db1b"}, + {file = "websockets-14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5b918d288958dc3fa1c5a0b9aa3256cb2b2b84c54407f4813c45d52267600cd3"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00fe5da3f037041da1ee0cf8e308374e236883f9842c7c465aa65098b1c9af59"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8149a0f5a72ca36720981418eeffeb5c2729ea55fa179091c81a0910a114a5d2"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77569d19a13015e840b81550922056acabc25e3f52782625bc6843cfa034e1da"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cf5201a04550136ef870aa60ad3d29d2a59e452a7f96b94193bee6d73b8ad9a9"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:88cf9163ef674b5be5736a584c999e98daf3aabac6e536e43286eb74c126b9c7"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:836bef7ae338a072e9d1863502026f01b14027250a4545672673057997d5c05a"}, + {file = "websockets-14.1-cp313-cp313-win32.whl", hash = "sha256:0d4290d559d68288da9f444089fd82490c8d2744309113fc26e2da6e48b65da6"}, + {file = "websockets-14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8621a07991add373c3c5c2cf89e1d277e49dc82ed72c75e3afc74bd0acc446f0"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01bb2d4f0a6d04538d3c5dfd27c0643269656c28045a53439cbf1c004f90897a"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:414ffe86f4d6f434a8c3b7913655a1a5383b617f9bf38720e7c0799fac3ab1c6"}, + {file = "websockets-14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fda642151d5affdee8a430bd85496f2e2517be3a2b9d2484d633d5712b15c56"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd7c11968bc3860d5c78577f0dbc535257ccec41750675d58d8dc66aa47fe52c"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a032855dc7db987dff813583d04f4950d14326665d7e714d584560b140ae6b8b"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7e7ea2f782408c32d86b87a0d2c1fd8871b0399dd762364c731d86c86069a78"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:39450e6215f7d9f6f7bc2a6da21d79374729f5d052333da4d5825af8a97e6735"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ceada5be22fa5a5a4cdeec74e761c2ee7db287208f54c718f2df4b7e200b8d4a"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3fc753451d471cff90b8f467a1fc0ae64031cf2d81b7b34e1811b7e2691bc4bc"}, + {file = "websockets-14.1-cp39-cp39-win32.whl", hash = "sha256:14839f54786987ccd9d03ed7f334baec0f02272e7ec4f6e9d427ff584aeea8b4"}, + {file = "websockets-14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d9fd19ecc3a4d5ae82ddbfb30962cf6d874ff943e56e0c81f5169be2fda62979"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5dc25a9dbd1a7f61eca4b7cb04e74ae4b963d658f9e4f9aad9cd00b688692c8"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:04a97aca96ca2acedf0d1f332c861c5a4486fdcba7bcef35873820f940c4231e"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df174ece723b228d3e8734a6f2a6febbd413ddec39b3dc592f5a4aa0aff28098"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:034feb9f4286476f273b9a245fb15f02c34d9586a5bc936aff108c3ba1b21beb"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c308dabd2b380807ab64b62985eaccf923a78ebc572bd485375b9ca2b7dc7"}, + {file = "websockets-14.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a42d3ecbb2db5080fc578314439b1d79eef71d323dc661aa616fb492436af5d"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ddaa4a390af911da6f680be8be4ff5aaf31c4c834c1a9147bc21cbcbca2d4370"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4c805c6034206143fbabd2d259ec5e757f8b29d0a2f0bf3d2fe5d1f60147a4a"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:205f672a6c2c671a86d33f6d47c9b35781a998728d2c7c2a3e1cf3333fcb62b7"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef440054124728cc49b01c33469de06755e5a7a4e83ef61934ad95fc327fbb0"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7591d6f440af7f73c4bd9404f3772bfee064e639d2b6cc8c94076e71b2471c1"}, + {file = "websockets-14.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:25225cc79cfebc95ba1d24cd3ab86aaa35bcd315d12fa4358939bd55e9bd74a5"}, + {file = "websockets-14.1-py3-none-any.whl", hash = "sha256:4d4fc827a20abe6d544a119896f6b78ee13fe81cbfef416f3f2ddf09a03f0e2e"}, + {file = "websockets-14.1.tar.gz", hash = "sha256:398b10c77d471c0aab20a845e7a60076b6390bfdaac7a6d2edb0d2c59d75e8d8"}, +] + [[package]] name = "werkzeug" version = "3.1.3" @@ -5853,4 +6046,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">3.9.1,<3.12" -content-hash = "e31107374c14b5a2c82dfed31c60fbe028de4dac175ce19b917e3960cf9ef53c" +content-hash = "fcd3b4f3f8017a3713c7dba2390a8b383b357eb4740f013b73e42e582c88a7f5" diff --git a/pyproject.toml b/pyproject.toml index 24742db8..9aa64a42 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,12 +13,12 @@ readme = "README.md" python = ">3.9.1,<3.12" # Bittensor Version Strict -bittensor = "7.4.0" +bittensor = "8.5.1" # Bittensor Dependencies We Also Need setuptools = "~70.0.0" pydantic = "^2.3.0" -numpy = "^1.26" +numpy = ">=2.0.1,<2.1.0" # Subnet Specific Dependencies torch = "^2.5.1" @@ -35,7 +35,7 @@ pandas-market-calendars = "^4.4.2" python-dotenv = "^1.0.1" scikit-learn = "^1.6.0" wandb = "^0.19.1" -cryptography = ">=42.0.5,<42.1.0" +cryptography = ">=43.0.1,<43.1.0" [tool.poetry.group.dev.dependencies] pre-commit-hooks = "5.0.0" From a87befecfec5215bc48a75dfff3e83c2c731f630 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 31 Dec 2024 12:28:07 -0700 Subject: [PATCH 176/201] add branch specific environments to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 6d2dc13c..0cd41735 100644 --- a/.gitignore +++ b/.gitignore @@ -128,6 +128,8 @@ venv/ ENV/ env.bak/ venv.bak/ +# branch specific environments that start with issue number +.\d*-* # Spyder project settings .spyderproject From 5c5c90bb6cbc74d11dfb42df9bbdbd457affc93d Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 31 Dec 2024 12:29:55 -0700 Subject: [PATCH 177/201] ensure that branch specific venvs are ignored properly --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0cd41735..f8213977 100644 --- a/.gitignore +++ b/.gitignore @@ -129,7 +129,7 @@ ENV/ env.bak/ venv.bak/ # branch specific environments that start with issue number -.\d*-* +.[\d]*-*/ # Spyder project settings .spyderproject From e2808ed6431712f1e55d121c474745e07219ce5a Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 31 Dec 2024 12:35:50 -0700 Subject: [PATCH 178/201] change regex expression for venv ignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f8213977..a0b9a55e 100644 --- a/.gitignore +++ b/.gitignore @@ -129,7 +129,7 @@ ENV/ env.bak/ venv.bak/ # branch specific environments that start with issue number -.[\d]*-*/ +.[0-9]*-* # Spyder project settings .spyderproject From 08a0a1b34f5625367af2f88ac49832634b6dfddb Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 31 Dec 2024 13:03:29 -0700 Subject: [PATCH 179/201] remove version checking in verify function in base miner.py --- snp_oracle/predictionnet/base/miner.py | 123 ++++++++++++++----------- 1 file changed, 67 insertions(+), 56 deletions(-) diff --git a/snp_oracle/predictionnet/base/miner.py b/snp_oracle/predictionnet/base/miner.py index ea506b33..3c284489 100644 --- a/snp_oracle/predictionnet/base/miner.py +++ b/snp_oracle/predictionnet/base/miner.py @@ -4,7 +4,6 @@ import traceback import bittensor as bt -from bittensor.constants import V_7_2_0 from substrateinterface import Keypair from snp_oracle.predictionnet.base.neuron import BaseNeuron @@ -172,59 +171,71 @@ def _to_seconds(self, nano: int) -> int: return nano / 1_000_000_000 async def verify(self, synapse: Challenge) -> None: - # needs to replace the base miner verify logic + """ + Verifies the authenticity and validity of incoming requests. + + Args: + synapse: The Challenge object containing request details and credentials + + Raises: + Exception: If verification fails due to missing nonce, invalid timestamps, + duplicate nonces, or signature mismatch + """ bt.logging.debug(f"checking nonce: {synapse.dendrite}") - # Build the keypair from the dendrite_hotkey - if synapse.dendrite is not None: - keypair = Keypair(ss58_address=synapse.dendrite.hotkey) - - # Build the signature messages. - message = f"{synapse.dendrite.nonce}.{synapse.dendrite.hotkey}.{self.wallet.hotkey.ss58_address}.{synapse.dendrite.uuid}.{synapse.computed_body_hash}" - - # Build the unique endpoint key. - endpoint_key = f"{synapse.dendrite.hotkey}:{synapse.dendrite.uuid}" - - # Requests must have nonces to be safe from replays - if synapse.dendrite.nonce is None: - raise Exception("Missing Nonce") - if synapse.dendrite.version is not None and synapse.dendrite.version >= V_7_2_0: - bt.logging.debug("Using custom synapse verification logic") - # If we don't have a nonce stored, ensure that the nonce falls within - # a reasonable delta. - cur_time = time.time_ns() - - allowed_delta = self.config.timeout * 1_000_000_000 # nanoseconds - - latest_allowed_nonce = synapse.dendrite.nonce + allowed_delta - - bt.logging.debug(f"synapse.dendrite.nonce: {synapse.dendrite.nonce}") - bt.logging.debug(f"latest_allowed_nonce: {latest_allowed_nonce}") - bt.logging.debug(f"cur time: {cur_time}") - bt.logging.debug(f"delta: {self._to_seconds(cur_time - synapse.dendrite.nonce)}") - - if self.nonces.get(endpoint_key) is None and synapse.dendrite.nonce > latest_allowed_nonce: - raise Exception( - f"Nonce is too old. Allowed delta in seconds: {self._to_seconds(allowed_delta)}, got delta: {self._to_seconds(cur_time - synapse.dendrite.nonce)}" - ) - if self.nonces.get(endpoint_key) is not None and synapse.dendrite.nonce <= self.nonces[endpoint_key]: - raise Exception( - f"Nonce is too small, already have a newer nonce in the nonce store, got: {synapse.dendrite.nonce}, already have: {self.nonces[endpoint_key]}" - ) - else: - bt.logging.warning(f"Using synapse verification logic for version < 7.2.0: {synapse.dendrite.version}") - if ( - endpoint_key in self.nonces.keys() - and self.nonces[endpoint_key] is not None - and synapse.dendrite.nonce <= self.nonces[endpoint_key] - ): - raise Exception( - f"Nonce is too small, already have a newer nonce in the nonce store, got: {synapse.dendrite.nonce}, already have: {self.nonces[endpoint_key]}" - ) - - if not keypair.verify(message, synapse.dendrite.signature): - raise Exception( - f"Signature mismatch with {message} and {synapse.dendrite.signature}, from hotkey {synapse.dendrite.hotkey}" - ) - - # Success - self.nonces[endpoint_key] = synapse.dendrite.nonce # type: ignore + + # Skip verification if no dendrite info + if synapse.dendrite is None: + return + + # Build keypair and verify signature + keypair = Keypair(ss58_address=synapse.dendrite.hotkey) + + # Check for missing nonce + if synapse.dendrite.nonce is None: + raise Exception("Missing Nonce") + + # Build unique endpoint identifier + endpoint_key = f"{synapse.dendrite.hotkey}:{synapse.dendrite.uuid}" + + # Check timestamp validity + cur_time = time.time_ns() + allowed_delta = self.config.timeout * 1_000_000_000 # nanoseconds + latest_allowed_nonce = synapse.dendrite.nonce + allowed_delta + + # Log timing details for debugging + bt.logging.debug(f"synapse.dendrite.nonce: {synapse.dendrite.nonce}") + bt.logging.debug(f"latest_allowed_nonce: {latest_allowed_nonce}") + bt.logging.debug(f"cur time: {cur_time}") + bt.logging.debug(f"delta: {self._to_seconds(cur_time - synapse.dendrite.nonce)}") + + # Verify nonce timing + if self.nonces.get(endpoint_key) is None and synapse.dendrite.nonce > latest_allowed_nonce: + raise Exception( + f"Nonce is too old. Allowed delta in seconds: {self._to_seconds(allowed_delta)}, " + f"got delta: {self._to_seconds(cur_time - synapse.dendrite.nonce)}" + ) + + # Verify nonce order + if self.nonces.get(endpoint_key) is not None and synapse.dendrite.nonce <= self.nonces[endpoint_key]: + raise Exception( + f"Nonce is too small, already have a newer nonce in the nonce store, " + f"got: {synapse.dendrite.nonce}, already have: {self.nonces[endpoint_key]}" + ) + + # Build and verify signature message + message = ( + f"{synapse.dendrite.nonce}." + f"{synapse.dendrite.hotkey}." + f"{self.wallet.hotkey.ss58_address}." + f"{synapse.dendrite.uuid}." + f"{synapse.computed_body_hash}" + ) + + if not keypair.verify(message, synapse.dendrite.signature): + raise Exception( + f"Signature mismatch with {message} and {synapse.dendrite.signature}, " + f"from hotkey {synapse.dendrite.hotkey}" + ) + + # Store nonce after successful verification + self.nonces[endpoint_key] = synapse.dendrite.nonce # type: ignore From 9410ddb9ade0898c82ff935f66aeb747b6ee0172 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Fri, 3 Jan 2025 11:28:20 -0700 Subject: [PATCH 180/201] more cr3 updates --- .gitignore | 2 ++ Makefile | 24 +++++++++--------- snp_oracle/neurons/miner.py | 43 ++++++++++++++++++++++----------- snp_oracle/neurons/validator.py | 32 +++++++++++++++--------- 4 files changed, 65 insertions(+), 36 deletions(-) diff --git a/.gitignore b/.gitignore index a0b9a55e..77f984f8 100644 --- a/.gitignore +++ b/.gitignore @@ -168,3 +168,5 @@ timestamp.txt # localnet config miner.config.local.js validator.config.local.js + +local_data/ diff --git a/Makefile b/Makefile index e2936d2a..d6ca4849 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,13 @@ ################################################################################ # User Parameters # ################################################################################ -coldkey = default -validator_hotkey = validator -miner_hotkey = miner -netuid = $(testnet_netuid) -network = $(testnet) -logging_level = info # options= ['info', 'debug', 'trace'] +# coldkey = validator +coldkey = miner +validator_hotkey = default +miner_hotkey = default +netuid = $(localnet_netuid) +network = $(localnet) +logging_level = debug # options= ['info', 'debug', 'trace'] ################################################################################ @@ -14,7 +15,7 @@ logging_level = info # options= ['info', 'debug', 'trace'] ################################################################################ finney = wss://entrypoint-finney.opentensor.ai:443 testnet = wss://test.finney.opentensor.ai:443 -locanet = ws://127.0.0.1:9944 +localnet = ws://127.0.0.1:9945 finney_netuid = 28 testnet_netuid = 93 @@ -41,16 +42,17 @@ validator: --subtensor.chain_endpoint $(network) \ --axon.port 8091 \ --netuid $(netuid) \ - --logging.level $(logging_level) + --logging.$(logging_level) miner: - pm2 start python --name miner -- ./snp_oracle/neurons/miner.py \ + pm2 start python --name miner -- ./snp_oracle/neurons/miner.py --no-autorestart \ --wallet.name $(coldkey) \ --wallet.hotkey $(miner_hotkey) \ --subtensor.chain_endpoint $(network) \ --axon.port 8092 \ --netuid $(netuid) \ - --logging.level $(logging_level) \ + --logging.$(logging_level) \ --vpermit_tao_limit 2 \ - --hf_repo_id foundryservices/bittensor-sn28-base-lstm \ + --blacklist.force_validator_permit true \ + --hf_repo_id pcarlson-foundry-digital/localnet \ --model mining_models/base_lstm_new.h5 diff --git a/snp_oracle/neurons/miner.py b/snp_oracle/neurons/miner.py index b73146e5..3b70872e 100644 --- a/snp_oracle/neurons/miner.py +++ b/snp_oracle/neurons/miner.py @@ -3,12 +3,12 @@ import typing import bittensor as bt +import tensorflow as tf from cryptography.fernet import Fernet # ML imports from dotenv import load_dotenv from huggingface_hub import hf_hub_download -from tensorflow.keras.models import load_model import snp_oracle.predictionnet as predictionnet from snp_oracle.base_miner.get_data import prep_data, scale_data @@ -29,8 +29,13 @@ class Miner(BaseMinerNeuron): """ def __init__(self, config=None): + bt.logging.info("Initializing Miner...") + bt.logging.info(f"Initial config: {config}") + super(Miner, self).__init__(config=config) - print(config) + + bt.logging.info(f"Config after super init: {self.config}") + bt.logging.info(f"Config model path: {self.config.model if self.config else 'No config'}") # TODO(developer): Anything specific to your use case you can do here self.model_loc = self.config.model if self.config.neuron.device == "cpu": @@ -184,7 +189,7 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction ) bt.logging.info(f"Model downloaded from huggingface at {model_path}") - model = load_model(model_path) + model = tf.keras.models.load_model(model_path) data = prep_data() # Generate encryption key for this request @@ -237,17 +242,27 @@ def print_info(self): metagraph = self.metagraph self.uid = self.metagraph.hotkeys.index(self.wallet.hotkey.ss58_address) - log = ( - "Miner | " - f"Step:{self.step} | " - f"UID:{self.uid} | " - f"Block:{self.block} | " - f"Stake:{metagraph.S[self.uid]:.4f} | " - f"Trust:{metagraph.T[self.uid]:.4f} | " - f"Incentive:{metagraph.I[self.uid]:.4f} | " - f"Emission:{metagraph.E[self.uid]:.4f}" - ) - bt.logging.info(log) + # Get all values in one go to avoid multiple concurrent requests + try: + current_block = self.block # Single websocket call + stake = float(metagraph.S[self.uid]) + trust = float(metagraph.T[self.uid]) + incentive = float(metagraph.I[self.uid]) + emission = float(metagraph.E[self.uid]) + + log = ( + "Miner | " + f"Step:{self.step} | " + f"UID:{self.uid} | " + f"Block:{current_block} | " + f"Stake:{stake:.4f} | " + f"Trust:{trust:.4f} | " + f"Incentive:{incentive:.4f} | " + f"Emission:{emission:.4f}" + ) + bt.logging.info(log) + except Exception as e: + bt.logging.error(f"Error getting miner info: {e}") # This is the main function, which runs the miner. diff --git a/snp_oracle/neurons/validator.py b/snp_oracle/neurons/validator.py index ee0a3f48..29fa3a2e 100644 --- a/snp_oracle/neurons/validator.py +++ b/snp_oracle/neurons/validator.py @@ -129,17 +129,27 @@ def print_info(self): metagraph = self.metagraph self.uid = self.metagraph.hotkeys.index(self.wallet.hotkey.ss58_address) - log = ( - "Validator | " - f"Step:{self.step} | " - f"UID:{self.uid} | " - f"Block:{self.block} | " - f"Stake:{metagraph.S[self.uid]} | " - f"VTrust:{metagraph.Tv[self.uid]} | " - f"Dividend:{metagraph.D[self.uid]} | " - f"Emission:{metagraph.E[self.uid]}" - ) - bt.logging.info(log) + # Get all values in one go to avoid multiple concurrent requests + try: + current_block = self.block # Single websocket call + stake = float(metagraph.S[self.uid]) + vtrust = float(metagraph.Tv[self.uid]) + dividend = float(metagraph.D[self.uid]) + emission = float(metagraph.E[self.uid]) + + log = ( + "Validator | " + f"Step:{self.step} | " + f"UID:{self.uid} | " + f"Block:{current_block} | " + f"Stake:{stake:.4f} | " + f"VTrust:{vtrust:.4f} | " + f"Dividend:{dividend:.4f} | " + f"Emission:{emission:.4f}" + ) + bt.logging.info(log) + except Exception as e: + bt.logging.error(f"Error getting validator info: {e}") # The main function parses the configuration and runs the validator. From 10ec23e20bc7f5baae906448741d509976435c6b Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Tue, 7 Jan 2025 15:17:36 -0500 Subject: [PATCH 181/201] update testnet UID --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index d6ca4849..e59ab8e9 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ testnet = wss://test.finney.opentensor.ai:443 localnet = ws://127.0.0.1:9945 finney_netuid = 28 -testnet_netuid = 93 +testnet_netuid = 272 localnet_netuid = 1 From 43517e1157c6da78d1e9bb9cb6395604c69a54b9 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 09:27:46 -0500 Subject: [PATCH 182/201] update docs with new testnet UID --- README.md | 2 +- docs/validators.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7dc05e1a..13ad705f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@
    -| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 93
    **Mainnet UID:** 28 | +| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 272
    **Mainnet UID:** 28 | | - | - |
    diff --git a/docs/validators.md b/docs/validators.md index 1c7005f3..4e4437b1 100644 --- a/docs/validators.md +++ b/docs/validators.md @@ -2,7 +2,7 @@
    -| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 93
    **Mainnet UID:** 28 | +| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 272
    **Mainnet UID:** 28 | | - | - |
    From 56fcaf6276b24c78e0d36db8b0597bddd124f26e Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 09:33:58 -0500 Subject: [PATCH 183/201] forgot one! --- docs/miners.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/miners.md b/docs/miners.md index f7e68a54..f4e9447b 100644 --- a/docs/miners.md +++ b/docs/miners.md @@ -10,7 +10,7 @@
    -| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 93
    **Mainnet UID:** 28 | +| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 272
    **Mainnet UID:** 28 | | - | - |
    From cd3591ee6f3a549e4d9120c6e3bb485b5a7a74d2 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 09:41:06 -0500 Subject: [PATCH 184/201] update model file path on hf --- snp_oracle/neurons/miner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snp_oracle/neurons/miner.py b/snp_oracle/neurons/miner.py index b73146e5..d2540a8f 100644 --- a/snp_oracle/neurons/miner.py +++ b/snp_oracle/neurons/miner.py @@ -162,7 +162,7 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction f"👈 Received prediction request from: {synapse.dendrite.hotkey} for timestamp: {synapse.timestamp}" ) - model_filename = f"{self.wallet.hotkey.ss58_address}{os.path.splitext(self.config.model)[1]}" + model_filename = f"{self.wallet.hotkey.ss58_address}/models/model.{os.path.splitext(self.config.model)[1]}" timestamp = synapse.timestamp synapse.repo_id = self.config.hf_repo_id From 6055198b4e79dab415cf4775322cd100369f871d Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 09:52:25 -0500 Subject: [PATCH 185/201] extra period --- snp_oracle/neurons/miner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snp_oracle/neurons/miner.py b/snp_oracle/neurons/miner.py index d2540a8f..6bed24ae 100644 --- a/snp_oracle/neurons/miner.py +++ b/snp_oracle/neurons/miner.py @@ -162,7 +162,7 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction f"👈 Received prediction request from: {synapse.dendrite.hotkey} for timestamp: {synapse.timestamp}" ) - model_filename = f"{self.wallet.hotkey.ss58_address}/models/model.{os.path.splitext(self.config.model)[1]}" + model_filename = f"{self.wallet.hotkey.ss58_address}/models/model{os.path.splitext(self.config.model)[1]}" timestamp = synapse.timestamp synapse.repo_id = self.config.hf_repo_id From 791dda3083a44689e12956e9f79492ce82bc77b1 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 10:59:29 -0500 Subject: [PATCH 186/201] fix collection upload --- snp_oracle/predictionnet/utils/huggingface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/snp_oracle/predictionnet/utils/huggingface.py b/snp_oracle/predictionnet/utils/huggingface.py index d4df5607..c7b280d5 100644 --- a/snp_oracle/predictionnet/utils/huggingface.py +++ b/snp_oracle/predictionnet/utils/huggingface.py @@ -42,8 +42,8 @@ def update_collection(self, responses: List[Challenge]) -> None: id_list = [x.item_id for x in self.collection.items] for response in responses: either_none = response.repo_id is None or response.model is None - if f"{response.repo_id}/{response.model}" not in id_list and not either_none: - self.add_model_to_collection(repo_id=f"{response.repo_id}/{response.model}") + if f"{response.repo_id}" not in id_list and not either_none: + self.add_model_to_collection(repo_id=f"{response.repo_id}") self.collection = self.get_models() def hotkeys_match(self, synapse, hotkey) -> bool: From eb5f70c205959e150fd320712cfdb5def7777a5b Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 11:52:44 -0500 Subject: [PATCH 187/201] update to upload only data used for the prediction --- snp_oracle/base_miner/predict.py | 19 +++++++++++-------- snp_oracle/neurons/miner.py | 15 ++++++++------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/snp_oracle/base_miner/predict.py b/snp_oracle/base_miner/predict.py index 049443d4..89ecc9c0 100644 --- a/snp_oracle/base_miner/predict.py +++ b/snp_oracle/base_miner/predict.py @@ -10,7 +10,7 @@ from snp_oracle.base_miner.model import create_and_save_base_model_lstm -def predict(timestamp: datetime, scaler: MinMaxScaler, model, type) -> float: +def predict(timestamp: datetime, scaler: MinMaxScaler, model, type) -> tuple[float, pd.DataFrame]: """ Predicts the close price of the next 5m interval @@ -29,8 +29,8 @@ def predict(timestamp: datetime, scaler: MinMaxScaler, model, type) -> float: :type model: A keras model instance Output: - :returns: The close price of the 5m period that ends at the timestamp passed by the validator - :rtype: float + :returns: A tuple containing (prediction value, input data used for prediction) + :rtype: tuple[float, pd.DataFrame] """ # calling this to get the data - the information passed by the validator contains # only a timestamp, it is on the miners to get the data and prepare is according to their requirements @@ -50,7 +50,7 @@ def predict(timestamp: datetime, scaler: MinMaxScaler, model, type) -> float: # Check if matching_row is empty if matching_row.empty: print("No matching row found for the given timestamp.") - return 0.0 + return 0.0, pd.DataFrame() # data.to_csv('mining_models/base_miner_data.csv') input = matching_row[ @@ -67,6 +67,8 @@ def predict(timestamp: datetime, scaler: MinMaxScaler, model, type) -> float: ] ] + input_df = input.copy() + if type != "regression": input = np.array(input, dtype=np.float32).reshape(1, -1) input = np.reshape(input, (1, 1, input.shape[1])) @@ -76,8 +78,7 @@ def predict(timestamp: datetime, scaler: MinMaxScaler, model, type) -> float: if type != "regression": prediction = scaler.inverse_transform(prediction.reshape(1, -1)) - print(prediction) - return prediction + return prediction[0][0], input_df # Uncomment this section if you wanna do a local test without having to run the miner @@ -95,5 +96,7 @@ def predict(timestamp: datetime, scaler: MinMaxScaler, model, type) -> float: mse = create_and_save_base_model_lstm(scaler, X, y) model = load_model("mining_models/base_lstm_new.h5") - prediction = predict(timestamp, scaler, model, type="lstm") - print(prediction[0]) + prediction, input_data = predict(timestamp, scaler, model, type="lstm") + print("Prediction:", prediction) + print("\nInput data used:") + print(input_data) diff --git a/snp_oracle/neurons/miner.py b/snp_oracle/neurons/miner.py index 147b05fb..664025c9 100644 --- a/snp_oracle/neurons/miner.py +++ b/snp_oracle/neurons/miner.py @@ -192,6 +192,13 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction model = tf.keras.models.load_model(model_path) data = prep_data() + scaler, _, _ = scale_data(data) + # mse = create_and_save_base_model_lstm(scaler, X, y) + + # type needs to be changed based on the algo you're running + # any algo specific change logic can be added to predict function in predict.py + prediction, input_df = predict(timestamp, scaler, model, type="lstm") + # Generate encryption key for this request encryption_key = Fernet.generate_key() @@ -199,7 +206,7 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction hf_interface = MinerHfInterface(self.config) success, metadata = hf_interface.upload_data( hotkey=self.wallet.hotkey.ss58_address, - data=data, + data=input_df, repo_id=self.config.hf_repo_id, encryption_key=encryption_key, ) @@ -213,12 +220,6 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction else: bt.logging.error(f"Data upload failed: {metadata['error']}") - scaler, _, _ = scale_data(data) - # mse = create_and_save_base_model_lstm(scaler, X, y) - - # type needs to be changed based on the algo you're running - # any algo specific change logic can be added to predict function in predict.py - prediction = predict(timestamp, scaler, model, type="lstm") bt.logging.info(f"Prediction: {prediction}") # pred_np_array = np.array(prediction).reshape(-1, 1) From 5a3943f8e0aea578895b9d596fc18f0641a84bcc Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 13:14:30 -0500 Subject: [PATCH 188/201] update how prediction is passed into synapse --- snp_oracle/neurons/miner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snp_oracle/neurons/miner.py b/snp_oracle/neurons/miner.py index 664025c9..6db083c8 100644 --- a/snp_oracle/neurons/miner.py +++ b/snp_oracle/neurons/miner.py @@ -224,7 +224,7 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction # pred_np_array = np.array(prediction).reshape(-1, 1) # logic to ensure that only past 20 day context exists in synapse - synapse.prediction = list(prediction[0]) + synapse.prediction = list(prediction) if synapse.prediction is not None: bt.logging.success(f"Predicted price 🎯: {synapse.prediction}") From 988aab8ca1009a4a362f9dff17c686effdbb807a Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 13:23:24 -0500 Subject: [PATCH 189/201] more fixes --- snp_oracle/neurons/miner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snp_oracle/neurons/miner.py b/snp_oracle/neurons/miner.py index 6db083c8..98ea7cbf 100644 --- a/snp_oracle/neurons/miner.py +++ b/snp_oracle/neurons/miner.py @@ -224,7 +224,7 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction # pred_np_array = np.array(prediction).reshape(-1, 1) # logic to ensure that only past 20 day context exists in synapse - synapse.prediction = list(prediction) + synapse.prediction = [float(prediction)] if synapse.prediction is not None: bt.logging.success(f"Predicted price 🎯: {synapse.prediction}") From 81a56299026b7f9db8dd226abe8c1c63e44e3986 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 13:35:56 -0500 Subject: [PATCH 190/201] going back to previous implementation --- snp_oracle/base_miner/predict.py | 22 ++++++++++++---------- snp_oracle/neurons/miner.py | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/snp_oracle/base_miner/predict.py b/snp_oracle/base_miner/predict.py index 89ecc9c0..16172d4c 100644 --- a/snp_oracle/base_miner/predict.py +++ b/snp_oracle/base_miner/predict.py @@ -10,9 +10,9 @@ from snp_oracle.base_miner.model import create_and_save_base_model_lstm -def predict(timestamp: datetime, scaler: MinMaxScaler, model, type) -> tuple[float, pd.DataFrame]: +def predict(timestamp: datetime, scaler: MinMaxScaler, model, type: str) -> tuple[np.ndarray, pd.DataFrame]: """ - Predicts the close price of the next 5m interval + Predicts the close price of the next 5m interval and returns the input data used for prediction. The predict function also ensures that the data is procured - using yahoo finance's python module, prepares the data and gets basic technical analysis metrics, and finally predicts the model @@ -26,11 +26,14 @@ def predict(timestamp: datetime, scaler: MinMaxScaler, model, type) -> tuple[flo :type scaler: sklearn.preprocessing.MinMaxScaler :param model: The model used to make the predictions - in this case a .h5 file - :type model: A keras model instance + :type model: tensorflow.keras.Model + + :param type: The type of model being used (e.g. "regression" or "lstm") + :type type: str Output: - :returns: A tuple containing (prediction value, input data used for prediction) - :rtype: tuple[float, pd.DataFrame] + :returns: A tuple containing (prediction array, input data used for prediction) + :rtype: tuple[numpy.ndarray, pandas.DataFrame] """ # calling this to get the data - the information passed by the validator contains # only a timestamp, it is on the miners to get the data and prepare is according to their requirements @@ -78,7 +81,8 @@ def predict(timestamp: datetime, scaler: MinMaxScaler, model, type) -> tuple[flo if type != "regression": prediction = scaler.inverse_transform(prediction.reshape(1, -1)) - return prediction[0][0], input_df + print(prediction) + return prediction, input_df # Uncomment this section if you wanna do a local test without having to run the miner @@ -96,7 +100,5 @@ def predict(timestamp: datetime, scaler: MinMaxScaler, model, type) -> tuple[flo mse = create_and_save_base_model_lstm(scaler, X, y) model = load_model("mining_models/base_lstm_new.h5") - prediction, input_data = predict(timestamp, scaler, model, type="lstm") - print("Prediction:", prediction) - print("\nInput data used:") - print(input_data) + prediction, _ = predict(timestamp, scaler, model, type="lstm") + print(prediction[0]) diff --git a/snp_oracle/neurons/miner.py b/snp_oracle/neurons/miner.py index 98ea7cbf..664025c9 100644 --- a/snp_oracle/neurons/miner.py +++ b/snp_oracle/neurons/miner.py @@ -224,7 +224,7 @@ async def forward(self, synapse: predictionnet.protocol.Challenge) -> prediction # pred_np_array = np.array(prediction).reshape(-1, 1) # logic to ensure that only past 20 day context exists in synapse - synapse.prediction = [float(prediction)] + synapse.prediction = list(prediction[0]) if synapse.prediction is not None: bt.logging.success(f"Predicted price 🎯: {synapse.prediction}") From 1a444bbea7cd47913391ba8a28bd569c5257724a Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 13:53:56 -0500 Subject: [PATCH 191/201] only needed files --- .gitignore | 4 - Makefile | 26 +- README.md | 2 +- docs/miners.md | 23 +- docs/validators.md | 2 +- poetry.lock | 1323 ++++++++++-------------- pyproject.toml | 6 +- snp_oracle/neurons/validator.py | 32 +- snp_oracle/predictionnet/base/miner.py | 123 +-- 9 files changed, 656 insertions(+), 885 deletions(-) diff --git a/.gitignore b/.gitignore index 77f984f8..6d2dc13c 100644 --- a/.gitignore +++ b/.gitignore @@ -128,8 +128,6 @@ venv/ ENV/ env.bak/ venv.bak/ -# branch specific environments that start with issue number -.[0-9]*-* # Spyder project settings .spyderproject @@ -168,5 +166,3 @@ timestamp.txt # localnet config miner.config.local.js validator.config.local.js - -local_data/ diff --git a/Makefile b/Makefile index e59ab8e9..e2936d2a 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,12 @@ ################################################################################ # User Parameters # ################################################################################ -# coldkey = validator -coldkey = miner -validator_hotkey = default -miner_hotkey = default -netuid = $(localnet_netuid) -network = $(localnet) -logging_level = debug # options= ['info', 'debug', 'trace'] +coldkey = default +validator_hotkey = validator +miner_hotkey = miner +netuid = $(testnet_netuid) +network = $(testnet) +logging_level = info # options= ['info', 'debug', 'trace'] ################################################################################ @@ -15,10 +14,10 @@ logging_level = debug # options= ['info', 'debug', 'trace'] ################################################################################ finney = wss://entrypoint-finney.opentensor.ai:443 testnet = wss://test.finney.opentensor.ai:443 -localnet = ws://127.0.0.1:9945 +locanet = ws://127.0.0.1:9944 finney_netuid = 28 -testnet_netuid = 272 +testnet_netuid = 93 localnet_netuid = 1 @@ -42,17 +41,16 @@ validator: --subtensor.chain_endpoint $(network) \ --axon.port 8091 \ --netuid $(netuid) \ - --logging.$(logging_level) + --logging.level $(logging_level) miner: - pm2 start python --name miner -- ./snp_oracle/neurons/miner.py --no-autorestart \ + pm2 start python --name miner -- ./snp_oracle/neurons/miner.py \ --wallet.name $(coldkey) \ --wallet.hotkey $(miner_hotkey) \ --subtensor.chain_endpoint $(network) \ --axon.port 8092 \ --netuid $(netuid) \ - --logging.$(logging_level) \ + --logging.level $(logging_level) \ --vpermit_tao_limit 2 \ - --blacklist.force_validator_permit true \ - --hf_repo_id pcarlson-foundry-digital/localnet \ + --hf_repo_id foundryservices/bittensor-sn28-base-lstm \ --model mining_models/base_lstm_new.h5 diff --git a/README.md b/README.md index 13ad705f..7dc05e1a 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@
    -| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 272
    **Mainnet UID:** 28 | +| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 93
    **Mainnet UID:** 28 | | - | - |
    diff --git a/docs/miners.md b/docs/miners.md index f4e9447b..c946801e 100644 --- a/docs/miners.md +++ b/docs/miners.md @@ -10,7 +10,7 @@
    -| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 272
    **Mainnet UID:** 28 | +| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 93
    **Mainnet UID:** 28 | | - | - |
    @@ -87,15 +87,6 @@ logging_level = info # options = [info, debug, trace] #### Ports In the Makefile, we have default ports set to `8091` for validator and `8092` for miner. Please change as-needed. -#### Models -In the Makefile, ensure that the `--model` flag points to the local location of the model you would like validators to evaluate. By default, the Makefile is populated with the base miner model: -`--model mining_models/base_lstm_new.h5` - -The `--hf_repo_id` flag will determine which hugging face repository your miner models and data will be uploaded to. This repository must be public in order to ensure validator access. A hugging face repository will be created at the provided path under your hugging face user assuming you provide a valid username and valid `MINER_HF_ACCESS_TOKEN` in your `.env` file. - -#### Data -The data your model utilizes will be automatically uploaded to hugging face, in the same repository as your model, defined here: `--hf_repo_id`. The data will be encrypted initially. Once the model is evaluated by validators, the data will be decrypted and published on hugging face. - ## Deploying a Miner We highly recommend that you run your miners on testnet before deploying on mainnet. @@ -105,9 +96,9 @@ We highly recommend that you run your miners on testnet before deploying on main ### Base miner 1. Run the command: - ```shell - make miner - ``` + ```shell + make miner + ``` ### Custom Miner @@ -117,6 +108,6 @@ We highly recommend that you run your miners on testnet before deploying on main 3. Edit the command in the Makefile. 1. Add values for `hf_repo_id` and so forth. 4. Run the Command: - ``` - make miner - ``` + ``` + make miner + ``` diff --git a/docs/validators.md b/docs/validators.md index 4e4437b1..1c7005f3 100644 --- a/docs/validators.md +++ b/docs/validators.md @@ -2,7 +2,7 @@
    -| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 272
    **Mainnet UID:** 28 | +| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 93
    **Mainnet UID:** 28 | | - | - |
    diff --git a/poetry.lock b/poetry.lock index 52fa0946..214223ae 100644 --- a/poetry.lock +++ b/poetry.lock @@ -24,102 +24,87 @@ files = [ [[package]] name = "aiohttp" -version = "3.10.11" +version = "3.11.11" description = "Async http client/server framework (asyncio)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "aiohttp-3.10.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5077b1a5f40ffa3ba1f40d537d3bec4383988ee51fbba6b74aa8fb1bc466599e"}, - {file = "aiohttp-3.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d6a14a4d93b5b3c2891fca94fa9d41b2322a68194422bef0dd5ec1e57d7d298"}, - {file = "aiohttp-3.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffbfde2443696345e23a3c597049b1dd43049bb65337837574205e7368472177"}, - {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20b3d9e416774d41813bc02fdc0663379c01817b0874b932b81c7f777f67b217"}, - {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b943011b45ee6bf74b22245c6faab736363678e910504dd7531a58c76c9015a"}, - {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48bc1d924490f0d0b3658fe5c4b081a4d56ebb58af80a6729d4bd13ea569797a"}, - {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e12eb3f4b1f72aaaf6acd27d045753b18101524f72ae071ae1c91c1cd44ef115"}, - {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f14ebc419a568c2eff3c1ed35f634435c24ead2fe19c07426af41e7adb68713a"}, - {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:72b191cdf35a518bfc7ca87d770d30941decc5aaf897ec8b484eb5cc8c7706f3"}, - {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5ab2328a61fdc86424ee540d0aeb8b73bbcad7351fb7cf7a6546fc0bcffa0038"}, - {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:aa93063d4af05c49276cf14e419550a3f45258b6b9d1f16403e777f1addf4519"}, - {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:30283f9d0ce420363c24c5c2421e71a738a2155f10adbb1a11a4d4d6d2715cfc"}, - {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e5358addc8044ee49143c546d2182c15b4ac3a60be01c3209374ace05af5733d"}, - {file = "aiohttp-3.10.11-cp310-cp310-win32.whl", hash = "sha256:e1ffa713d3ea7cdcd4aea9cddccab41edf6882fa9552940344c44e59652e1120"}, - {file = "aiohttp-3.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:778cbd01f18ff78b5dd23c77eb82987ee4ba23408cbed233009fd570dda7e674"}, - {file = "aiohttp-3.10.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:80ff08556c7f59a7972b1e8919f62e9c069c33566a6d28586771711e0eea4f07"}, - {file = "aiohttp-3.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c8f96e9ee19f04c4914e4e7a42a60861066d3e1abf05c726f38d9d0a466e695"}, - {file = "aiohttp-3.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fb8601394d537da9221947b5d6e62b064c9a43e88a1ecd7414d21a1a6fba9c24"}, - {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea224cf7bc2d8856d6971cea73b1d50c9c51d36971faf1abc169a0d5f85a382"}, - {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db9503f79e12d5d80b3efd4d01312853565c05367493379df76d2674af881caa"}, - {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0f449a50cc33f0384f633894d8d3cd020e3ccef81879c6e6245c3c375c448625"}, - {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82052be3e6d9e0c123499127782a01a2b224b8af8c62ab46b3f6197035ad94e9"}, - {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20063c7acf1eec550c8eb098deb5ed9e1bb0521613b03bb93644b810986027ac"}, - {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:489cced07a4c11488f47aab1f00d0c572506883f877af100a38f1fedaa884c3a"}, - {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ea9b3bab329aeaa603ed3bf605f1e2a6f36496ad7e0e1aa42025f368ee2dc07b"}, - {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ca117819d8ad113413016cb29774b3f6d99ad23c220069789fc050267b786c16"}, - {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2dfb612dcbe70fb7cdcf3499e8d483079b89749c857a8f6e80263b021745c730"}, - {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9b615d3da0d60e7d53c62e22b4fd1c70f4ae5993a44687b011ea3a2e49051b8"}, - {file = "aiohttp-3.10.11-cp311-cp311-win32.whl", hash = "sha256:29103f9099b6068bbdf44d6a3d090e0a0b2be6d3c9f16a070dd9d0d910ec08f9"}, - {file = "aiohttp-3.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:236b28ceb79532da85d59aa9b9bf873b364e27a0acb2ceaba475dc61cffb6f3f"}, - {file = "aiohttp-3.10.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7480519f70e32bfb101d71fb9a1f330fbd291655a4c1c922232a48c458c52710"}, - {file = "aiohttp-3.10.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f65267266c9aeb2287a6622ee2bb39490292552f9fbf851baabc04c9f84e048d"}, - {file = "aiohttp-3.10.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7400a93d629a0608dc1d6c55f1e3d6e07f7375745aaa8bd7f085571e4d1cee97"}, - {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f34b97e4b11b8d4eb2c3a4f975be626cc8af99ff479da7de49ac2c6d02d35725"}, - {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e7b825da878464a252ccff2958838f9caa82f32a8dbc334eb9b34a026e2c636"}, - {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9f92a344c50b9667827da308473005f34767b6a2a60d9acff56ae94f895f385"}, - {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc6f1ab987a27b83c5268a17218463c2ec08dbb754195113867a27b166cd6087"}, - {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1dc0f4ca54842173d03322793ebcf2c8cc2d34ae91cc762478e295d8e361e03f"}, - {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7ce6a51469bfaacff146e59e7fb61c9c23006495d11cc24c514a455032bcfa03"}, - {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:aad3cd91d484d065ede16f3cf15408254e2469e3f613b241a1db552c5eb7ab7d"}, - {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f4df4b8ca97f658c880fb4b90b1d1ec528315d4030af1ec763247ebfd33d8b9a"}, - {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2e4e18a0a2d03531edbc06c366954e40a3f8d2a88d2b936bbe78a0c75a3aab3e"}, - {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6ce66780fa1a20e45bc753cda2a149daa6dbf1561fc1289fa0c308391c7bc0a4"}, - {file = "aiohttp-3.10.11-cp312-cp312-win32.whl", hash = "sha256:a919c8957695ea4c0e7a3e8d16494e3477b86f33067478f43106921c2fef15bb"}, - {file = "aiohttp-3.10.11-cp312-cp312-win_amd64.whl", hash = "sha256:b5e29706e6389a2283a91611c91bf24f218962717c8f3b4e528ef529d112ee27"}, - {file = "aiohttp-3.10.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:703938e22434d7d14ec22f9f310559331f455018389222eed132808cd8f44127"}, - {file = "aiohttp-3.10.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9bc50b63648840854e00084c2b43035a62e033cb9b06d8c22b409d56eb098413"}, - {file = "aiohttp-3.10.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f0463bf8b0754bc744e1feb61590706823795041e63edf30118a6f0bf577461"}, - {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6c6dec398ac5a87cb3a407b068e1106b20ef001c344e34154616183fe684288"}, - {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcaf2d79104d53d4dcf934f7ce76d3d155302d07dae24dff6c9fffd217568067"}, - {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25fd5470922091b5a9aeeb7e75be609e16b4fba81cdeaf12981393fb240dd10e"}, - {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbde2ca67230923a42161b1f408c3992ae6e0be782dca0c44cb3206bf330dee1"}, - {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:249c8ff8d26a8b41a0f12f9df804e7c685ca35a207e2410adbd3e924217b9006"}, - {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:878ca6a931ee8c486a8f7b432b65431d095c522cbeb34892bee5be97b3481d0f"}, - {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8663f7777ce775f0413324be0d96d9730959b2ca73d9b7e2c2c90539139cbdd6"}, - {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6cd3f10b01f0c31481fba8d302b61603a2acb37b9d30e1d14e0f5a58b7b18a31"}, - {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e8d8aad9402d3aa02fdc5ca2fe68bcb9fdfe1f77b40b10410a94c7f408b664d"}, - {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:38e3c4f80196b4f6c3a85d134a534a56f52da9cb8d8e7af1b79a32eefee73a00"}, - {file = "aiohttp-3.10.11-cp313-cp313-win32.whl", hash = "sha256:fc31820cfc3b2863c6e95e14fcf815dc7afe52480b4dc03393c4873bb5599f71"}, - {file = "aiohttp-3.10.11-cp313-cp313-win_amd64.whl", hash = "sha256:4996ff1345704ffdd6d75fb06ed175938c133425af616142e7187f28dc75f14e"}, - {file = "aiohttp-3.10.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:74baf1a7d948b3d640badeac333af581a367ab916b37e44cf90a0334157cdfd2"}, - {file = "aiohttp-3.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:473aebc3b871646e1940c05268d451f2543a1d209f47035b594b9d4e91ce8339"}, - {file = "aiohttp-3.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c2f746a6968c54ab2186574e15c3f14f3e7f67aef12b761e043b33b89c5b5f95"}, - {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d110cabad8360ffa0dec8f6ec60e43286e9d251e77db4763a87dcfe55b4adb92"}, - {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0099c7d5d7afff4202a0c670e5b723f7718810000b4abcbc96b064129e64bc7"}, - {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0316e624b754dbbf8c872b62fe6dcb395ef20c70e59890dfa0de9eafccd2849d"}, - {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a5f7ab8baf13314e6b2485965cbacb94afff1e93466ac4d06a47a81c50f9cca"}, - {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c891011e76041e6508cbfc469dd1a8ea09bc24e87e4c204e05f150c4c455a5fa"}, - {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9208299251370ee815473270c52cd3f7069ee9ed348d941d574d1457d2c73e8b"}, - {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:459f0f32c8356e8125f45eeff0ecf2b1cb6db1551304972702f34cd9e6c44658"}, - {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:14cdc8c1810bbd4b4b9f142eeee23cda528ae4e57ea0923551a9af4820980e39"}, - {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:971aa438a29701d4b34e4943e91b5e984c3ae6ccbf80dd9efaffb01bd0b243a9"}, - {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9a309c5de392dfe0f32ee57fa43ed8fc6ddf9985425e84bd51ed66bb16bce3a7"}, - {file = "aiohttp-3.10.11-cp38-cp38-win32.whl", hash = "sha256:9ec1628180241d906a0840b38f162a3215114b14541f1a8711c368a8739a9be4"}, - {file = "aiohttp-3.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:9c6e0ffd52c929f985c7258f83185d17c76d4275ad22e90aa29f38e211aacbec"}, - {file = "aiohttp-3.10.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cdc493a2e5d8dc79b2df5bec9558425bcd39aff59fc949810cbd0832e294b106"}, - {file = "aiohttp-3.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3e70f24e7d0405be2348da9d5a7836936bf3a9b4fd210f8c37e8d48bc32eca6"}, - {file = "aiohttp-3.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:968b8fb2a5eee2770eda9c7b5581587ef9b96fbdf8dcabc6b446d35ccc69df01"}, - {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deef4362af9493d1382ef86732ee2e4cbc0d7c005947bd54ad1a9a16dd59298e"}, - {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:686b03196976e327412a1b094f4120778c7c4b9cff9bce8d2fdfeca386b89829"}, - {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3bf6d027d9d1d34e1c2e1645f18a6498c98d634f8e373395221121f1c258ace8"}, - {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:099fd126bf960f96d34a760e747a629c27fb3634da5d05c7ef4d35ef4ea519fc"}, - {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c73c4d3dae0b4644bc21e3de546530531d6cdc88659cdeb6579cd627d3c206aa"}, - {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0c5580f3c51eea91559db3facd45d72e7ec970b04528b4709b1f9c2555bd6d0b"}, - {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fdf6429f0caabfd8a30c4e2eaecb547b3c340e4730ebfe25139779b9815ba138"}, - {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d97187de3c276263db3564bb9d9fad9e15b51ea10a371ffa5947a5ba93ad6777"}, - {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:0acafb350cfb2eba70eb5d271f55e08bd4502ec35e964e18ad3e7d34d71f7261"}, - {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c13ed0c779911c7998a58e7848954bd4d63df3e3575f591e321b19a2aec8df9f"}, - {file = "aiohttp-3.10.11-cp39-cp39-win32.whl", hash = "sha256:22b7c540c55909140f63ab4f54ec2c20d2635c0289cdd8006da46f3327f971b9"}, - {file = "aiohttp-3.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:7b26b1551e481012575dab8e3727b16fe7dd27eb2711d2e63ced7368756268fb"}, - {file = "aiohttp-3.10.11.tar.gz", hash = "sha256:9dc2b8f3dcab2e39e0fa309c8da50c3b55e6f34ab25f1a71d3288f24924d33a7"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c"}, + {file = "aiohttp-3.11.11-cp310-cp310-win32.whl", hash = "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745"}, + {file = "aiohttp-3.11.11-cp310-cp310-win_amd64.whl", hash = "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773"}, + {file = "aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62"}, + {file = "aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e"}, + {file = "aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600"}, + {file = "aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5"}, + {file = "aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d"}, + {file = "aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226"}, + {file = "aiohttp-3.11.11-cp39-cp39-win32.whl", hash = "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3"}, + {file = "aiohttp-3.11.11-cp39-cp39-win_amd64.whl", hash = "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1"}, + {file = "aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e"}, ] [package.dependencies] @@ -129,7 +114,8 @@ async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.12.0,<2.0" +propcache = ">=0.2.0" +yarl = ">=1.17.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -159,6 +145,57 @@ files = [ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] +[[package]] +name = "ansible" +version = "8.5.0" +description = "Radically simple IT automation" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ansible-8.5.0-py3-none-any.whl", hash = "sha256:2749032e26b0dbc9a694528b85fd89e7f950b8c7b53606f17dd997f23ac7cc88"}, + {file = "ansible-8.5.0.tar.gz", hash = "sha256:327c509bdaf5cdb2489d85c09d2c107e9432f9874c8bb5c0702a731160915f2d"}, +] + +[package.dependencies] +ansible-core = ">=2.15.5,<2.16.0" + +[[package]] +name = "ansible-core" +version = "2.15.13" +description = "Radically simple IT automation" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ansible_core-2.15.13-py3-none-any.whl", hash = "sha256:e7f50bbb61beae792f5ecb86eff82149d3948d078361d70aedb01d76bc483c30"}, + {file = "ansible_core-2.15.13.tar.gz", hash = "sha256:f542e702ee31fb049732143aeee6b36311ca48b7d13960a0685afffa0d742d7f"}, +] + +[package.dependencies] +cryptography = "*" +importlib-resources = {version = ">=5.0,<5.1", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0.0" +packaging = "*" +PyYAML = ">=5.1" +resolvelib = ">=0.5.3,<1.1.0" + +[[package]] +name = "ansible-vault" +version = "2.1.0" +description = "R/W an ansible-vault yaml file" +optional = false +python-versions = "*" +files = [ + {file = "ansible-vault-2.1.0.tar.gz", hash = "sha256:5ce8fdb5470f1449b76bf07ae2abc56480dad48356ae405c85b686efb64dbd5e"}, +] + +[package.dependencies] +ansible = "*" +setuptools = "*" + +[package.extras] +dev = ["black", "flake8", "isort[pyproject]", "pytest"] +release = ["twine"] + [[package]] name = "anyio" version = "4.7.0" @@ -207,17 +244,6 @@ files = [ six = ">=1.6.1,<2.0" wheel = ">=0.23.0,<1.0" -[[package]] -name = "async-property" -version = "0.2.2" -description = "Python decorator for async properties." -optional = false -python-versions = "*" -files = [ - {file = "async_property-0.2.2-py2.py3-none-any.whl", hash = "sha256:8924d792b5843994537f8ed411165700b27b2bd966cefc4daeefc1253442a9d7"}, - {file = "async_property-0.2.2.tar.gz", hash = "sha256:17d9bd6ca67e27915a75d92549df64b5c7174e9dc806b30a3934dc4ff0506380"}, -] - [[package]] name = "async-timeout" version = "5.0.1" @@ -296,32 +322,37 @@ lxml = ["lxml"] [[package]] name = "bittensor" -version = "8.5.1" +version = "7.4.0" description = "bittensor" optional = false python-versions = ">=3.9" files = [ - {file = "bittensor-8.5.1-py3-none-any.whl", hash = "sha256:8dbf9c389d10fd043dab5da163377a43ec2ae1b1715e819a3602e07d36304f94"}, - {file = "bittensor-8.5.1.tar.gz", hash = "sha256:f1bb033ba1e2641881d37f9d8cfebdcb7145ae20975861863710bdd17941cce4"}, + {file = "bittensor-7.4.0-py3-none-any.whl", hash = "sha256:fefa7336f2a7f0dc1edea53a5b1296f95503d9e1cc01cb00a445e6c7afc10d1c"}, + {file = "bittensor-7.4.0.tar.gz", hash = "sha256:235b3f5bb3d93f098a41a4f63d7676bd548debb0bb58f02a104704c0beb20ea2"}, ] [package.dependencies] aiohttp = ">=3.9,<4.0" -async-property = "0.2.2" -bittensor-cli = "*" -bittensor-commit-reveal = ">=0.1.0" -bittensor-wallet = ">=2.1.3" -bt-decode = "0.4.0" +ansible = ">=8.5.0,<8.6.0" +ansible-vault = ">=2.1,<3.0" +backoff = "*" +certifi = ">=2024.7.4,<2024.8.0" colorama = ">=0.4.6,<0.5.0" +cryptography = ">=42.0.5,<42.1.0" +ddt = ">=1.6.0,<1.7.0" +eth-utils = "<2.3.0" fastapi = ">=0.110.1,<0.111.0" +fuzzywuzzy = ">=0.18.0" msgpack-numpy-opentensor = ">=0.5.0,<0.6.0" munch = ">=2.5.0,<2.6.0" nest-asyncio = "*" netaddr = "*" -numpy = ">=2.0.1,<2.1.0" +numpy = ">=1.26,<2.0" packaging = "*" +password-strength = "*" pycryptodome = ">=3.18.0,<4.0.0" pydantic = ">=2.3,<3" +PyNaCl = ">=1.3,<2.0" python-Levenshtein = "*" python-statemachine = ">=2.1,<3.0" pyyaml = "*" @@ -330,123 +361,17 @@ retry = "*" rich = "*" scalecodec = "1.2.11" setuptools = ">=70.0.0,<70.1.0" +shtab = ">=1.6.5,<1.7.0" substrate-interface = ">=1.7.9,<1.8.0" +termcolor = "*" +tqdm = "*" uvicorn = "*" -websockets = ">=14.1" wheel = "*" [package.extras] -dev = ["aioresponses (==0.7.6)", "coveralls (==3.3.1)", "ddt (==1.6.0)", "factory-boy (==3.3.0)", "flake8 (==7.0.0)", "freezegun (==1.5.0)", "httpx (==0.27.0)", "hypothesis (==6.81.1)", "mypy (==1.8.0)", "pytest (==7.2.0)", "pytest-asyncio (==0.23.7)", "pytest-cov (==4.0.0)", "pytest-mock (==3.12.0)", "pytest-rerunfailures (==10.2)", "pytest-split (==0.8.0)", "pytest-xdist (==3.0.2)", "ruff (==0.4.7)", "torch (>=1.13.1)", "types-retry (==0.9.9.4)"] +dev = ["aioresponses (==0.7.6)", "black (==24.3.0)", "coveralls (==3.3.1)", "ddt (==1.6.0)", "factory-boy (==3.3.0)", "flake8 (==7.0.0)", "freezegun (==1.5.0)", "httpx (==0.27.0)", "hypothesis (==6.81.1)", "mypy (==1.8.0)", "pytest (==7.2.0)", "pytest-asyncio (==0.23.7)", "pytest-cov (==4.0.0)", "pytest-mock (==3.12.0)", "pytest-rerunfailures (==10.2)", "pytest-split (==0.8.0)", "pytest-xdist (==3.0.2)", "ruff (==0.4.7)", "torch (>=1.13.1)", "types-retry (==0.9.9.4)"] torch = ["torch (>=1.13.1)"] -[[package]] -name = "bittensor-cli" -version = "8.4.2" -description = "Bittensor CLI" -optional = false -python-versions = ">=3.9" -files = [ - {file = "bittensor-cli-8.4.2.tar.gz", hash = "sha256:43efc081ed2ecf4357bf5c5322ccd6f7d1a5110eb842cf138c75adb3f21686fd"}, - {file = "bittensor_cli-8.4.2-py3-none-any.whl", hash = "sha256:e7fc5ff510f039fa0cb9c0c701a56c4eb2b644befb019b1cd0fac29546bfb764"}, -] - -[package.dependencies] -aiohttp = ">=3.10.2,<3.11.0" -async-property = "0.2.2" -backoff = ">=2.2.1,<2.3.0" -bittensor-wallet = ">=2.1.3" -bt-decode = "0.4.0" -fuzzywuzzy = ">=0.18.0,<0.19.0" -GitPython = ">=3.0.0" -Jinja2 = "*" -netaddr = ">=1.3.0,<1.4.0" -numpy = ">=2.0.1" -pycryptodome = "*" -pytest = "*" -python-Levenshtein = "*" -PyYAML = ">=6.0.1,<6.1.0" -rich = ">=13.7,<14.0" -scalecodec = "1.2.11" -substrate-interface = ">=1.7.9,<1.8.0" -typer = ">=0.12,<1.0" -websockets = ">=14.1" -wheel = "*" - -[package.extras] -cuda = ["cubit (>=1.1.0)", "torch"] - -[[package]] -name = "bittensor-commit-reveal" -version = "0.1.0" -description = "" -optional = false -python-versions = ">=3.9" -files = [ - {file = "bittensor_commit_reveal-0.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e628b052ebdbd6893eb996a0d03b4c5e0823e42ee410ff5066018700a35539a"}, - {file = "bittensor_commit_reveal-0.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:245a7e0defb79f6a45c243f72739ee5c58840cba51342d28322c6d7a73f475b9"}, - {file = "bittensor_commit_reveal-0.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2bb23935ac60a981bfb3d83397b83e858c0b69a11806969cf56486f5ebc90943"}, - {file = "bittensor_commit_reveal-0.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4917b215c24b10bd80c84db921113b9cd1346ca7dcaca75e286905ede81a3b18"}, - {file = "bittensor_commit_reveal-0.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c46cee3e5fa5fc9e6f6a444793062855f40495c1a00b52df6508e4449ac5e89f"}, - {file = "bittensor_commit_reveal-0.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d56407b879dcf82bdde5eaefede43c8891e122fefc03a32c77a063dfc52e0c8"}, - {file = "bittensor_commit_reveal-0.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8509250549b6f5c475a9150e941b28fc66e82f30b27fe078fd80fa840943bb7b"}, - {file = "bittensor_commit_reveal-0.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bed04f82f162121747cfd7f51bb5d625dda0bf763a0699054565f255d219a9c2"}, - {file = "bittensor_commit_reveal-0.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25af2d9c82cacc4278095460493430d36070cb2843c0aa54b1c563788d0742eb"}, - {file = "bittensor_commit_reveal-0.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8f530793274698aaf4ac7cc8f24e915749d8156df8302c9e1e16446177b429d"}, - {file = "bittensor_commit_reveal-0.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e52955d652b61f091310e2b9b232d26b9e586a928e3b414a09a1b6615e9cc7a0"}, - {file = "bittensor_commit_reveal-0.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7be8c8f79dea2e137f5add6ee4711447c4f5d43668be26616ab7c1cacf317e07"}, - {file = "bittensor_commit_reveal-0.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b88ecb6a0989c2200486e29419a8e7d3b3f7918bdbde4ec04dbb4464abdee08f"}, - {file = "bittensor_commit_reveal-0.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac015f9eefa9dbddd2875cd7214e3a0bc2e394a2915772e655bdcc5c0af67de"}, - {file = "bittensor_commit_reveal-0.1.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18062ccab9bd8c66eee741bab9c047ec302eede563b16d4a960bcef6ef4ab368"}, - {file = "bittensor_commit_reveal-0.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957eff5b5b760dd8267d5f3c23c1aab4155505aa15bc06e044ffca483979f3d1"}, - {file = "bittensor_commit_reveal-0.1.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df0ef502f07804bff843a7e6318f95b9a9ca5bcc9c75e501040202b38d09d8b5"}, - {file = "bittensor_commit_reveal-0.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8706ae43e3455913d210c7ab5fc0110595e45b8fa3964441e2842fc7975aec3"}, - {file = "bittensor_commit_reveal-0.1.0.tar.gz", hash = "sha256:1c8bb8d77f6279988902c5c28361cc460167829c63ffa8d788209f8810933211"}, -] - -[package.extras] -dev = ["maturin (==1.7.0)"] - -[[package]] -name = "bittensor-wallet" -version = "2.1.3" -description = "" -optional = false -python-versions = ">=3.9" -files = [ - {file = "bittensor_wallet-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07462933ace69992079013ff7497c5f67e94b5d1adbada4ff08c5b18ebc18afe"}, - {file = "bittensor_wallet-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23110aca2d8f3e58c0b7c7bb58a74a66227aea85b30e4fa3eb616f5a13a0f659"}, - {file = "bittensor_wallet-2.1.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a5199c84e9d33ccec451294f89d9354b61568a0b623ceee995f588ccdc14ea5c"}, - {file = "bittensor_wallet-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a34e524f21e8c7bd8edfd54db530480b81f48d2334a0a11b86ea22d9e349137c"}, - {file = "bittensor_wallet-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45a1556e02304e1e8e91059cc11bb8346fa2334ac039f79bb1e6f630fa26657f"}, - {file = "bittensor_wallet-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9399c753c37dbe63430c5aff4fba0a038e0349dde0061d623506a24e3b4d2cec"}, - {file = "bittensor_wallet-2.1.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1e2f0d03a21a0c54b1f8cd59f34941d7a60df490e9aab7d7776b03f290de6074"}, - {file = "bittensor_wallet-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24c446b0af4c9ffc3ac122f97a1de25b283c877aa49892748ad06a8a61a74e13"}, - {file = "bittensor_wallet-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eafd9c82720644b3eeac2f68deaa9cec4cf175836b16c89206d98ce22590e8e"}, - {file = "bittensor_wallet-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f5122b05d8eede2bfc2eb242214b75ecab08f0da5d4f7547ed01ad253349e019"}, - {file = "bittensor_wallet-2.1.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:88020b18aa2f91b336a6f04354b7acb124701f9678d74e41f5ffb64a7e1e5731"}, - {file = "bittensor_wallet-2.1.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb7dd2ed4c12e617574b7302a6c20fb8e915477ce2942627f624293b5de9a003"}, - {file = "bittensor_wallet-2.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de47dea7d283e83449465f9780d4dde608fe09da45d6ef8c795806e49ccf4fd2"}, - {file = "bittensor_wallet-2.1.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e35adc5303b2186df889e07c79bf0bc074df382df49e6c216a8feb27f00453a4"}, - {file = "bittensor_wallet-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ffd5bd02ca772151aca8d1883d3536718d170e9fd095593d6e7860b6bd4ac5b"}, - {file = "bittensor_wallet-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:75ec884ee9ea4117cae3d18f90044b76daa47463294b94f56260c700ee95e7e5"}, - {file = "bittensor_wallet-2.1.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e1ee5be2b8b4c8fa36bc1750da723152dd7c96c4e606121146913adf83cf667"}, - {file = "bittensor_wallet-2.1.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b879438249fc70dc2f7b8b579566c526dde68c2baa31d12ee3c4fcd4087f7b9"}, - {file = "bittensor_wallet-2.1.3.tar.gz", hash = "sha256:41927d7e5d68fff1494cef5abd861ede0afc684dff366824b0806cfa3ce13af0"}, -] - -[package.dependencies] -cryptography = ">=43.0.1,<43.1.0" -eth-utils = "<2.3.0" -munch = ">=2.5.0,<2.6.0" -password-strength = "*" -py-bip39-bindings = "0.1.11" -rich = "*" -substrate-interface = ">=1.7.9,<1.8.0" -termcolor = "*" - -[package.extras] -dev = ["aioresponses (==0.7.6)", "ansible-vault (>=2.1,<3.0)", "coveralls (==3.3.1)", "ddt (==1.6.0)", "factory-boy (==3.3.0)", "flake8 (==7.0.0)", "freezegun (==1.5.0)", "httpx (==0.27.0)", "hypothesis (==6.81.1)", "maturin (==1.7.0)", "mypy (==1.8.0)", "py-bip39-bindings (==0.1.11)", "pytest (==7.2.0)", "pytest-asyncio (==0.23.7)", "pytest-cov (==4.0.0)", "pytest-mock (==3.12.0)", "pytest-rerunfailures (==10.2)", "pytest-split (==0.8.0)", "pytest-xdist (==3.0.2)", "ruff (==0.4.7)", "types-retry (==0.9.9.4)"] - [[package]] name = "black" version = "24.10.0" @@ -493,122 +418,15 @@ d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] -[[package]] -name = "bt-decode" -version = "0.4.0" -description = "A wrapper around the scale-codec crate for fast scale-decoding of Bittensor data structures." -optional = false -python-versions = ">=3.9" -files = [ - {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c176595c23f3d9a632b8a4fe71f8ed74e05be0ff4d447719eab3de686699c6b"}, - {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4a5232cc226d7c537303691dbb27c5c734cabcf51e6c74d641d1721a2d3a119c"}, - {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93dfa1c342a6fb3cbd199b46f511951174503c8405854de484390776ff94228a"}, - {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17f6f94d3dee3d9c9909e936b57bc87acef29de9b1b8d4157efd806bc7ff3eee"}, - {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba2d5f8ef69dde9880db38e45beb4ed965868d660f8de68d8cc7838d6b244295"}, - {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8f76a6949edbb7bc9a095f1a732974db04ec39c671e188ee001998901b6cd460"}, - {file = "bt_decode-0.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6df00582855bc84c1cbb4f7f63900097b456a43fd92fd397466c85943c5ba9f2"}, - {file = "bt_decode-0.4.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:67547de47eb41026f3ec106f2681c45e34fc5d610dd462cbcca9885bf7581af5"}, - {file = "bt_decode-0.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fb100ff9d8688c1e5dd98f7aa721279f267408cf7079d8f2ca9ea1abd6c0edfc"}, - {file = "bt_decode-0.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:66b599c2af3a7a3f40af22fa3e6304bde56237242120cb37253e4a465dfd419c"}, - {file = "bt_decode-0.4.0-cp310-cp310-win32.whl", hash = "sha256:0635af47f0abd4a1c1d9566fb101c4b851c2499a8f8b53e37a496efcd69409da"}, - {file = "bt_decode-0.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:01421093b5e97751624de0113fb3da7fb50a1d70c883887555e73abff081ffcc"}, - {file = "bt_decode-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:e2dd446b5956c3c772cdcbfe08fe0d483e68dc07b1606cde5d39c689dffd736c"}, - {file = "bt_decode-0.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcbb0fb758460c5fe7e5276b4406dd15d22ff544d309dd4ebb8fc998ce30d51f"}, - {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:816f45a75dc78d6beafaf7cc02ab51d73a3dd1c91d4ba0e6b43aae3c637d793d"}, - {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:39d44102ea27a23644c262d98378ac0ac650e481508f5d6989b8b4e3fd638faf"}, - {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:82e959521c60bc48276a91a01bd97726820128a4f4670ae043da35ca11823ca3"}, - {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bdea70a4b83e46432999f7743d130dbd49ccf1974c87c87153f7ad3733f5ccea"}, - {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99b6cc694fe05037c1dca02111d25b2357fd460bea8d8ce9b2432e3ed1d049c"}, - {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:645e82838b2e8d7b03686f5cee44e880c56bed3a9dbf2a530c818d1a63544967"}, - {file = "bt_decode-0.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cb32f5c5fda6cada107e3d82b5d760c87cd49075f28105de0900e495ee211659"}, - {file = "bt_decode-0.4.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:d2ecb71c8b40f3a4abd9c8fda54febffaa298eceafc12a47e9c0cf93e4ccbb8b"}, - {file = "bt_decode-0.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9b7691207021f023485d5adff6758bc0f938f80cf7e1ca05d291189e869217b5"}, - {file = "bt_decode-0.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:912957e7373014acf4203f3a701f4b820d9d7f5bee1f710298d7346f12bcff59"}, - {file = "bt_decode-0.4.0-cp311-cp311-win32.whl", hash = "sha256:fb47926e13f39663e62b4105b436abc84b913cb27edd621308f441cb405956ac"}, - {file = "bt_decode-0.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:001995ff6a20438c5542b13ae0af6458845381ccfd0ef484ae5f7e012c6fb383"}, - {file = "bt_decode-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ee9731ecf76ba4f60e10378b16d15bea826b41183ab208e32a9a7fd86d3b7c21"}, - {file = "bt_decode-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6e0ebd9e6f6e710fce9432d448a6add5b266f19af5ec518a2faf19ddd19ce3dc"}, - {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd898558c915dd9374a1860c1aee944cd6acb25f8e0f33f58d18eb989c49fab"}, - {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f87500550b030c3d265ab6847ef25f1e4f756b455605f1977329a665e41b330"}, - {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59fa64d5eff9fcc00f536e3ef74932f40aeff1335bd75a469bce90c1762451ae"}, - {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2be0732720588d047b00eb87e234dd83ebbdb717da8d704b8930b9ab580a6c3"}, - {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b4107e8b75966c5be0822a5f0525b568c94dbc1faa8d928090fa48daa329b45"}, - {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:46e09e7c557fe753c20226ec4db887a4a1b520d36dc4d01eb5d2bd2e2846970e"}, - {file = "bt_decode-0.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e817fe5e805bc393b266909709660dc14bd34a671712da0087e164a760b928b4"}, - {file = "bt_decode-0.4.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:59f9a61789003c345b423f1728ee0d774f89cc41be0ab2af0f2ad6e2653084b5"}, - {file = "bt_decode-0.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:905715452ecf4ce204aa937ee8266ea539fc085377f92bd9506ec76dcd874347"}, - {file = "bt_decode-0.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2e85f5f12e6bb00253e194372d90e60f129d613f0ddedae659d3b9a3049a69cf"}, - {file = "bt_decode-0.4.0-cp312-cp312-win32.whl", hash = "sha256:ed4c3c4383c9903f371502c0d62ce88ecd2c531044e04deaeb60c827ae45ad8e"}, - {file = "bt_decode-0.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:68beccbb00f129b75d189d2ffc48fd430bf4eab8a456aab79615b17eec82437d"}, - {file = "bt_decode-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:88de7129c3323c36cd6cce28844fb475556a865ec6fc87934ec5deeb95ff2d86"}, - {file = "bt_decode-0.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:056e6245a2119b391306542134651df54df29569136be892411073fc10840c8e"}, - {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:faa76d0b8fcb0f9ae2107e8c6ae84ea670de81c0adda4967a52d4b7d1de8c605"}, - {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7a3ff15bfe86d482e642dfaa6e5581b65815e7663f337af7502b422fea2fdcc2"}, - {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa7687c01c516f84274a2e71ba717898eef095e08ec7125823f7a4e230bd46fe"}, - {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d3cf8cfff714600db01c6cd144906fe0a8be85293711e279b8089f6ccaffd71"}, - {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:983972ecc83bd0507e72ae316281960b7e26e31386525c7905f7cdb8fa3e7de1"}, - {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:32e3950b120b8b59ae5ab70005ba9b5c7560a0e222e805f47878cb259a32ed39"}, - {file = "bt_decode-0.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66d906ac225e3cd169dde1e0af21e8d73e8ea7dea3f7e9afcdec501bced3d83a"}, - {file = "bt_decode-0.4.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:58bf09b004dc182748e285b5bc15ac6305af4ab9c318f995c443ba33bb61fbb6"}, - {file = "bt_decode-0.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c202f22152b3186cbc1c319250d6b0ecfe87cf9a4e8e90b19cc9f83786acdf1a"}, - {file = "bt_decode-0.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b6dd31b0947b7b15a36f7f9bfdb8ae30ffe3f3f97e0dc4d60bf79b9baf57f4e5"}, - {file = "bt_decode-0.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebb3b72146e7feb08e235d78457b597697708149d7410f184098b73c5ab38aa"}, - {file = "bt_decode-0.4.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9571680e6b74fab00cbd10dc255594692a9cdf615e33170d5a32112c1da8e3e4"}, - {file = "bt_decode-0.4.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dec8af1719ced86da6f7b1dcf70e1d480cfb86e2cf7530692d3e66ad1e16067d"}, - {file = "bt_decode-0.4.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46d2308e13615951f89ff7ba05364a2e3747626b29fd4ee39c085ea56cb5fe"}, - {file = "bt_decode-0.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0df0436d736544587002e0fa4fe3887b28cec8de4a9036c1ea776c560e966b8d"}, - {file = "bt_decode-0.4.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:579aba5010a078831af2025cd03df9d429fa35008ec46bc1561e6147e2c9769e"}, - {file = "bt_decode-0.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:039e880688d4c5f2ee090980649811b700593e21eccee520b294c07b85008bce"}, - {file = "bt_decode-0.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1a45173a6f0e48b28b190bfb250b6683984d115d70a6d2ff5102a2421d581de6"}, - {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4680c70defaa3bd1313a19808f3f87bad0fc3a2fff50ee9cadcb5983cc955a29"}, - {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ad241020b27648aae002d51ed78011ed4392057b9042409334dd8e7de3c79925"}, - {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:555d69a324809fc2fd8ba42dfa5838d99e21c359b593b4c7a1abefef13010ab0"}, - {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:811180a24a8bca2662610c378db18824ea5d27ce34851216ec4bc072f23fb3d3"}, - {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ba2eca99c4a80c3b3dba563b6b1ea0015d50b92d50c85605834bf3cd46316b"}, - {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e7db5b96c9d9be14484818b2d048f115eb3c76d91a68242a43fd26dd4d73da29"}, - {file = "bt_decode-0.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:db9af85ca279781a91538a5f2600d5267eddab47ee0073ef045080a83f4ff3e6"}, - {file = "bt_decode-0.4.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:3625d23dccba53542842eab5eab5a17362a35b999c85aa675f690106f342b010"}, - {file = "bt_decode-0.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0a824aafdc2fffb5958c9ea221d9b6da5ce240c99704a20f7a50231cd9e66dd3"}, - {file = "bt_decode-0.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:084f3f97cd176f30baa415cd29a6ad1e35abdb0ff2ed6af238d5a1af921a3265"}, - {file = "bt_decode-0.4.0-cp39-cp39-win32.whl", hash = "sha256:dad1c2e4d8b4e45d2f5ccbf6bbad8c249a411d8df43fb036e2c3da56148a9f0b"}, - {file = "bt_decode-0.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:c7aa9acbd4c49543b0aa503367777e0290fd056ca1f8fa6e2c867739141d545c"}, - {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49cbf7ef7174d57b89c8e72d54749176da7f01926d963846042af7c141fc7c88"}, - {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7e85d5dfb4aaefa9dba9ed86b9dfc2efff35322053da2f774942a9da6d50486"}, - {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a061a29489eb9680a01085f87e575e7e69fbfdc2c533d361ab84486d65470986"}, - {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6def48997eac2b9aafde742c4c2a7d159623824e7f9d36bbfa95f12ba6354d5"}, - {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a5eee81c7a20bd2739f5867354afc38372b0307211a4c9a580bb99369f84835"}, - {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8914f5bd5bfe16e79fe6f8f94766d22635f1f4bef1567c545c22ecdf4f150313"}, - {file = "bt_decode-0.4.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3b268f170bcf85e229078f3af589b977c56ed9b696fe9e1198c5d4c9607406f1"}, - {file = "bt_decode-0.4.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:f3c54b14d914bf20669bbeedb97da18b3379c6d7f801404227519416cceda614"}, - {file = "bt_decode-0.4.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a7733ff7bcded3211e3b64fb38a1c917543045a092153999ede98333af766d3c"}, - {file = "bt_decode-0.4.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e1036e0db9f75fb2c2c690bddd2a02d0e94347c13d906eb5dbbf22202f3fa46f"}, - {file = "bt_decode-0.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9eaaee96683fc1694da1eb4ae732b166ac53c2606b35a4269050044bd20cb2e"}, - {file = "bt_decode-0.4.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f432b9feceb7179f85b5e92fd4d7fe74b62aaac1d66e7a64c54f80b63d3480f"}, - {file = "bt_decode-0.4.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0bf214c3a88841643f29b5d3e82fbd4cf57145ea6408509fe5d6247be024fcaf"}, - {file = "bt_decode-0.4.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d69253f642a5f432206bc82aa7d3dbea1387c29b16211c838f71e4ca041bdc5"}, - {file = "bt_decode-0.4.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:94b87373da3f96701878f60aa7953051999c58c3c8d88c392c879eb2daa40dad"}, - {file = "bt_decode-0.4.0-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:50a6cc797aaf802061b1808c8a599e4416dd18c4afdc498c8b81a24da6039083"}, - {file = "bt_decode-0.4.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:d22ee4640808452e98a7b2919a6e70b8f338cd3922547895093ce0ff6cc37f97"}, - {file = "bt_decode-0.4.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5f28274ba30e5d606535701affde5b71927d9cd2159206f237cdc75410d450d6"}, - {file = "bt_decode-0.4.0.tar.gz", hash = "sha256:5c7e6286a4f8b9b704f6a0c263ce0e8854fb95d94da5dff6e8835be6de04d508"}, -] - -[package.dependencies] -toml = "0.10.0" - -[package.extras] -dev = ["black (==23.7.0)", "maturin", "ruff (==0.4.7)"] -test = ["bittensor (==8.2.0)", "ddt (==1.6.0)", "pytest (==7.2.0)", "pytest-asyncio (==0.23.7)", "pytest-mock (==3.12.0)", "pytest-rerunfailures (==10.2)", "pytest-split (==0.8.0)", "pytest-xdist (==3.0.2)"] - [[package]] name = "certifi" -version = "2024.12.14" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, - {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -703,114 +521,127 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.4.1" +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" -files = [ - {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, - {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, - {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, +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.8" +version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, - {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -829,38 +660,43 @@ files = [ [[package]] name = "cryptography" -version = "43.0.3" +version = "42.0.8" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, - {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, - {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, - {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, - {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, - {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, - {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, - {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, - {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, - {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, - {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, ] [package.dependencies] @@ -873,7 +709,7 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -991,6 +827,17 @@ toolz = ">=0.8.0" [package.extras] cython = ["cython"] +[[package]] +name = "ddt" +version = "1.6.0" +description = "Data-Driven/Decorated Tests" +optional = false +python-versions = "*" +files = [ + {file = "ddt-1.6.0-py2.py3-none-any.whl", hash = "sha256:e3c93b961a108b4f4d5a6c7f2263513d928baf3bb5b32af8e1c804bfb041141d"}, + {file = "ddt-1.6.0.tar.gz", hash = "sha256:f71b348731b8c78c3100bffbd951a769fbd439088d1fdbb3841eee019af80acd"}, +] + [[package]] name = "decorator" version = "5.1.1" @@ -1128,13 +975,13 @@ test = ["hypothesis (>=4.43.0)", "mypy (==0.971)", "pytest (>=7.0.0)", "pytest-x [[package]] name = "eval-type-backport" -version = "0.2.2" +version = "0.2.0" description = "Like `typing._eval_type`, but lets older Python versions use newer typing features." optional = false python-versions = ">=3.8" files = [ - {file = "eval_type_backport-0.2.2-py3-none-any.whl", hash = "sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a"}, - {file = "eval_type_backport-0.2.2.tar.gz", hash = "sha256:f0576b4cf01ebb5bd358d02314d31846af5e07678387486e2c798af0e7d849c1"}, + {file = "eval_type_backport-0.2.0-py3-none-any.whl", hash = "sha256:ac2f73d30d40c5a30a80b8739a789d6bb5e49fdffa66d7912667e2015d9c9933"}, + {file = "eval_type_backport-0.2.0.tar.gz", hash = "sha256:68796cfbc7371ebf923f03bdf7bef415f3ec098aeced24e054b253a0e78f7b37"}, ] [package.extras] @@ -1229,13 +1076,13 @@ pyflakes = ">=3.2.0,<3.3.0" [[package]] name = "flatbuffers" -version = "24.12.23" +version = "24.3.25" description = "The FlatBuffers serialization format for Python" optional = false python-versions = "*" files = [ - {file = "flatbuffers-24.12.23-py2.py3-none-any.whl", hash = "sha256:c418e0d48890f4142b92fd3e343e73a48f194e1f80075ddcc5793779b3585444"}, - {file = "flatbuffers-24.12.23.tar.gz", hash = "sha256:2910b0bc6ae9b6db78dd2b18d0b7a0709ba240fb5585f286a3a2b30785c22dac"}, + {file = "flatbuffers-24.3.25-py2.py3-none-any.whl", hash = "sha256:8dbdec58f935f3765e4f7f3cf635ac3a77f83568138d6a2311f524ec96364812"}, + {file = "flatbuffers-24.3.25.tar.gz", hash = "sha256:de2ec5b203f21441716617f38443e0a8ebf3d25bf0d9c0bb0ce68fa00ad546a4"}, ] [[package]] @@ -1389,13 +1236,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.12.0" +version = "2024.10.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2"}, - {file = "fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f"}, + {file = "fsspec-2024.10.0-py3-none-any.whl", hash = "sha256:03b9a6785766a4de40368b88906366755e2819e758b83705c88cd7cb5fe81871"}, + {file = "fsspec-2024.10.0.tar.gz", hash = "sha256:eda2d8a4116d4f2429db8550f2457da57279247dd930bb12f821b58391359493"}, ] [package.extras] @@ -1671,13 +1518,13 @@ typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "t [[package]] name = "identify" -version = "2.6.4" +version = "2.6.3" description = "File identification library for Python" optional = false python-versions = ">=3.9" files = [ - {file = "identify-2.6.4-py2.py3-none-any.whl", hash = "sha256:993b0f01b97e0568c179bb9196391ff391bfb88a99099dbf5ce392b68f42d0af"}, - {file = "identify-2.6.4.tar.gz", hash = "sha256:285a7d27e397652e8cafe537a6cc97dd470a970f48fb2e9d979aa38eae5513ac"}, + {file = "identify-2.6.3-py2.py3-none-any.whl", hash = "sha256:9edba65473324c2ea9684b1f944fe3191db3345e50b6d04571d10ed164f8d7bd"}, + {file = "identify-2.6.3.tar.gz", hash = "sha256:62f5dae9b5fef52c84cc188514e9ea4f3f636b1d8799ab5ebc475471f9e47a02"}, ] [package.extras] @@ -1720,6 +1567,21 @@ perf = ["ipython"] test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] type = ["pytest-mypy"] +[[package]] +name = "importlib-resources" +version = "5.0.7" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.6" +files = [ + {file = "importlib_resources-5.0.7-py3-none-any.whl", hash = "sha256:2238159eb743bd85304a16e0536048b3e991c531d1cd51c4a834d1ccf2829057"}, + {file = "importlib_resources-5.0.7.tar.gz", hash = "sha256:4df460394562b4581bb4e4087ad9447bd433148fba44241754ec3152499f1d1b"}, +] + +[package.extras] +docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] +testing = ["pytest (>=3.5,!=3.7.3)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler", "pytest-flake8", "pytest-mypy"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -1747,13 +1609,13 @@ colors = ["colorama (>=0.4.6)"] [[package]] name = "jinja2" -version = "3.1.5" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, - {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -2528,55 +2390,49 @@ yaml = ["PyYAML (>=5.1.0)"] [[package]] name = "mypy" -version = "1.14.1" +version = "1.13.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, - {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, - {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d"}, - {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b"}, - {file = "mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427"}, - {file = "mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f"}, - {file = "mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c"}, - {file = "mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1"}, - {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8"}, - {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f"}, - {file = "mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1"}, - {file = "mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae"}, - {file = "mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14"}, - {file = "mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9"}, - {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11"}, - {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e"}, - {file = "mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89"}, - {file = "mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b"}, - {file = "mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255"}, - {file = "mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34"}, - {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a"}, - {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9"}, - {file = "mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd"}, - {file = "mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107"}, - {file = "mypy-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7084fb8f1128c76cd9cf68fe5971b37072598e7c31b2f9f95586b65c741a9d31"}, - {file = "mypy-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f845a00b4f420f693f870eaee5f3e2692fa84cc8514496114649cfa8fd5e2c6"}, - {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44bf464499f0e3a2d14d58b54674dee25c031703b2ffc35064bd0df2e0fac319"}, - {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c99f27732c0b7dc847adb21c9d47ce57eb48fa33a17bc6d7d5c5e9f9e7ae5bac"}, - {file = "mypy-1.14.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bce23c7377b43602baa0bd22ea3265c49b9ff0b76eb315d6c34721af4cdf1d9b"}, - {file = "mypy-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:8edc07eeade7ebc771ff9cf6b211b9a7d93687ff892150cb5692e4f4272b0837"}, - {file = "mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35"}, - {file = "mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc"}, - {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9"}, - {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb"}, - {file = "mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60"}, - {file = "mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c"}, - {file = "mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1"}, - {file = "mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6"}, + {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, + {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, + {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, + {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, + {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, + {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, + {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, + {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, + {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, + {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, + {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, + {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, + {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, + {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, + {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, + {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, + {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, + {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, + {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, + {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, + {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, + {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, ] [package.dependencies] -mypy_extensions = ">=1.0.0" +mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing_extensions = ">=4.6.0" +typing-extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -2663,56 +2519,47 @@ files = [ [[package]] name = "numpy" -version = "2.0.2" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, - {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, - {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, - {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, - {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, - {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, - {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, - {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, - {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, - {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, - {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, - {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, - {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, - {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, - {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, - {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, - {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, - {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, - {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, - {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, - {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, - {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, - {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, - {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, - {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, - {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, - {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, - {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, - {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, - {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, - {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, - {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, - {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, + {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]] @@ -3088,13 +2935,13 @@ xml = ["lxml (>=4.9.2)"] [[package]] name = "pandas-market-calendars" -version = "4.5.0" +version = "4.4.2" description = "Market and exchange trading calendars for pandas" optional = false python-versions = ">=3.8" files = [ - {file = "pandas_market_calendars-4.5.0-py3-none-any.whl", hash = "sha256:ed38d6d4d8ca02d3e6c1fc996fdbac9677906d85b88e1c2f45b1200f6e20231a"}, - {file = "pandas_market_calendars-4.5.0.tar.gz", hash = "sha256:3a09285594861ffb3d4a6700854ea4574dcab290b4ab78eeec55e33992294643"}, + {file = "pandas_market_calendars-4.4.2-py3-none-any.whl", hash = "sha256:52a0fea562113d511f3f1ae372e2a86e4a37147dacec9644094ff6f88aee8d53"}, + {file = "pandas_market_calendars-4.4.2.tar.gz", hash = "sha256:4261a2c065565de1cd3646982b2e206e1069714b8140878dd6eba972546dfbcb"}, ] [package.dependencies] @@ -3318,32 +3165,32 @@ files = [ [[package]] name = "psutil" -version = "6.1.1" +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.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8"}, - {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777"}, - {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8df0178ba8a9e5bc84fed9cfa61d54601b371fbec5c8eebad27575f1e105c0d4"}, - {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:1924e659d6c19c647e763e78670a05dbb7feaf44a0e9c94bf9e14dfc6ba50468"}, - {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:018aeae2af92d943fdf1da6b58665124897cfc94faa2ca92098838f83e1b1bca"}, - {file = "psutil-6.1.1-cp27-none-win32.whl", hash = "sha256:6d4281f5bbca041e2292be3380ec56a9413b790579b8e593b1784499d0005dac"}, - {file = "psutil-6.1.1-cp27-none-win_amd64.whl", hash = "sha256:c777eb75bb33c47377c9af68f30e9f11bc78e0f07fbf907be4a5d70b2fe5f030"}, - {file = "psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8"}, - {file = "psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377"}, - {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003"}, - {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160"}, - {file = "psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3"}, - {file = "psutil-6.1.1-cp36-cp36m-win32.whl", hash = "sha256:384636b1a64b47814437d1173be1427a7c83681b17a450bfc309a1953e329603"}, - {file = "psutil-6.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8be07491f6ebe1a693f17d4f11e69d0dc1811fa082736500f649f79df7735303"}, - {file = "psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53"}, - {file = "psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649"}, - {file = "psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5"}, + {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 = ["abi3audit", "black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] +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]] @@ -3359,70 +3206,105 @@ files = [ [[package]] name = "py-bip39-bindings" -version = "0.1.11" +version = "0.2.0" description = "Python bindings for tiny-bip39 RUST crate" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "py_bip39_bindings-0.1.11-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:324a7363f8b49201ebe1cc72d970017ec5139f8a5ddf605fa2774904eb7f08a1"}, - {file = "py_bip39_bindings-0.1.11-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:77173b83c7ade4ca3c91fae0da9c9b1bc5f4c6819baa2276feacd5abec6005fa"}, - {file = "py_bip39_bindings-0.1.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84e5177fb3d3b9607f5d7d526a89f91b35687fcc34b643fc96cd168a0ae025cb"}, - {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ecd1cfb17f0b1bb56f0b1de5c533ff9830a60b5d657846b8cf500ff9fca8b3"}, - {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3408dc0809fca5691f9c02c8292d62590d90de4f02a4b2dcab35817fa857a71"}, - {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_28_armv7l.whl", hash = "sha256:d6f0eda277c6d0ef28cc83fd3f59a0f745394ea1e2807f2fea49186084b3d47d"}, - {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:963357db40dc7a816d55097a85929cae18c6174c5bedf0410f6e72181270b2b1"}, - {file = "py_bip39_bindings-0.1.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:be06dc751be86cbd72cd71e318979d3ab27cee12fd84d1e5e4e84575c5c9355d"}, - {file = "py_bip39_bindings-0.1.11-cp310-none-win32.whl", hash = "sha256:b4e05b06831874fa8715bdb128ea776674ad708858a4b3b1a27e5710859b086d"}, - {file = "py_bip39_bindings-0.1.11-cp310-none-win_amd64.whl", hash = "sha256:e01a03e858a648d294bcf063368bf09027efa282f5192abddaf7af69c5e2a574"}, - {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:27cce22727e28705a660464689ade6d2cdad4e622bead5bde2ffa53c4f605ee5"}, - {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:cdf35d031587296dcbdb22dbc67f2eaf5b5df9d5036b77fbeb93affbb9eec8d3"}, - {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2fd5b926686207752d5f2e2ff164a9489b3613239d0967362f10c2fbd64eb018"}, - {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba84c38962bffdaea0e499245731d669cc21d1280f81ace8ff60ed3550024570"}, - {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9024ec3c4a3db005b355f9a00602cede290dec5e9c7cf7dd06a26f620b0cf99"}, - {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_28_armv7l.whl", hash = "sha256:ce028c8aef51dec2a85f298461b2988cca28740bf3cc23472c3469d3f853714e"}, - {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:51882cd0fa7529173b3543c089c24c775f1876ddf48f10e60f2ed07ad2af5cae"}, - {file = "py_bip39_bindings-0.1.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ee776f3b33b2d71fee48679951f117e3d1f052449ec2fcb184f3c64a4c77e4f"}, - {file = "py_bip39_bindings-0.1.11-cp311-none-win32.whl", hash = "sha256:d8b722e49562810f94eb61c9efa172f327537c74c37da3e86b161f7f444c51bf"}, - {file = "py_bip39_bindings-0.1.11-cp311-none-win_amd64.whl", hash = "sha256:be934052497f07605768e2c7184e4f4269b3e2e77930131dfc9bdbb791e6fdf4"}, - {file = "py_bip39_bindings-0.1.11-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:afa9c5762cfaec01141f478a9c3132de01ec3890ff2e5a4013c79d3ba3aff8bb"}, - {file = "py_bip39_bindings-0.1.11-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a3af7c1f955c6bbd613c6b38d022f7c73896acaf0ecc972ac0dee4b952e14568"}, - {file = "py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6aed3e86f105a36676e8dd0c8bc3f611a81b7ba4309b22a77fdc0f63b260e094"}, - {file = "py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d202f051cf063abae3acd0b74454d9d7b1dbeaf466ef7cb47a34ccedac845b62"}, - {file = "py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae120b5542fecf97aa3fdb6a526bac1004cb641bc9cc0d0030c6735dc2156072"}, - {file = "py_bip39_bindings-0.1.11-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:baf896aabb3bec42803015e010c121c8a3210b20184f37aaa6e400ae8e877e60"}, - {file = "py_bip39_bindings-0.1.11-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e4d45324c598197dbddac10a0298197ca2587fa7b09d1450697517988a29d515"}, - {file = "py_bip39_bindings-0.1.11-cp312-none-win32.whl", hash = "sha256:92abce265b0f2d8c5830441aff06b7b4f9426088a3de39624b12f3f9ff9fc2eb"}, - {file = "py_bip39_bindings-0.1.11-cp312-none-win_amd64.whl", hash = "sha256:6794187229eb0b04d0770f0fba936f0c5c598f552848a398ed5af9a61638cacb"}, - {file = "py_bip39_bindings-0.1.11-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:76fc141ed154ccef9c36d5e2eb615565f2e272a43ed56edbdda538840b597187"}, - {file = "py_bip39_bindings-0.1.11-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:3837f7040e732f7be49da5f595f147de2304e92a67267b12d5aa08a9bb02dd4b"}, - {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82de90eabe531095d4e4721ea1546873f0161c101c30b43dcf0a7bbd9cdcce69"}, - {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19794bafd088cfb50f99b04f3710c895756fe25ec342eaea0b5c579512493b61"}, - {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_28_armv7l.whl", hash = "sha256:8b9aa564a0081c360776b2230472475bd2971ddbe8f99ed7d8676c0ab3b2e0e4"}, - {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f55ab4fc519b8a9b80b28e02756788b9da037a2484e42282497eb9a253e5a58"}, - {file = "py_bip39_bindings-0.1.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:cd1b874bc812866804a40242cdb1303de9caeb0ed261852dfbb5cbce94db31a4"}, - {file = "py_bip39_bindings-0.1.11-cp37-none-win32.whl", hash = "sha256:aa643eae0ebc185e50fcbc088210930f2cb4b30145dfd18a2b031451ce3edb03"}, - {file = "py_bip39_bindings-0.1.11-cp37-none-win_amd64.whl", hash = "sha256:e68673dbe4d2d99f64e493ac1369ac39b0bd9266dddefe476802d853f9637906"}, - {file = "py_bip39_bindings-0.1.11-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:b1bece61da3c8ed37b86ac19051bab4cb599318066cdcf6ca9d795bdf7553525"}, - {file = "py_bip39_bindings-0.1.11-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5cc8a25d058f8f7741af38015b56177a1fbd442d7a2d463860c76fb86ff33211"}, - {file = "py_bip39_bindings-0.1.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ac1d37c0266c40f592a53b282c392f40bc23c117ca092a46e419c9d141a3dc89"}, - {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd63afb8451a0ee91658144f1fa9d1b5ed908ca458e713864e775e47bb806414"}, - {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa30b9b4b01cc703801924be51e802f7ae778abea433f4e3908fc470e2a517ef"}, - {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_28_armv7l.whl", hash = "sha256:f826af5e54e250272af9203ce85bf53064fe514df8222836c3ff43f23ccd55fe"}, - {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:08ba04fbad6d795c0bc59bbdf05a2bae9de929f34101fa149501e83fc4e52d6f"}, - {file = "py_bip39_bindings-0.1.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1f9ba82d427353bd6e7521b03583e0e72d745e7d6bf0b1505555a1032b6fd656"}, - {file = "py_bip39_bindings-0.1.11-cp38-none-win32.whl", hash = "sha256:86df39df8c573be8ff92e613d833045919e1351446898d683cc9a49ebeb25a87"}, - {file = "py_bip39_bindings-0.1.11-cp38-none-win_amd64.whl", hash = "sha256:e26cde6585ab95042fef48f6740a4f1a7962f2a571e73f1f12bfc4daee786c9a"}, - {file = "py_bip39_bindings-0.1.11-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:3bb22e4f2430bc28d93599c70a4d6ce9fc3e88db3f20b24ca17902f796be6ae9"}, - {file = "py_bip39_bindings-0.1.11-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:75de7c7e76581244c3893fb624e44d84dadcceddd73f221ab74a9cb3c04b416b"}, - {file = "py_bip39_bindings-0.1.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7e1a364081460498caa7d8238c54ae78b009d331afcb4f037d659b02639b969e"}, - {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3112f408f2d58be9ea3189903e5f2d944a0d882fa35b91b7bb88a195a16a8c1"}, - {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b921f36a4ef7a3bccb2635f2a5f91647a63ebaa1a4962a24fa236e5a32834cf"}, - {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_28_armv7l.whl", hash = "sha256:77accd187ef9a87e1d32f279b45a6e23123816b933a7e3d8c4a2fe61f6bd1d2e"}, - {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fd74fd810cc1076dd0c2944490d4acb1a109837cc9cfd58b29605ea81b4034f5"}, - {file = "py_bip39_bindings-0.1.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153f310e55795509b8b004590dbc0cff58d65e8f032c1558021fc0898121a465"}, - {file = "py_bip39_bindings-0.1.11-cp39-none-win32.whl", hash = "sha256:b769bcc358c806ca1a5983e57eb94ee33ec3a8ef69fa01aa6b28960fa3e0ab5a"}, - {file = "py_bip39_bindings-0.1.11-cp39-none-win_amd64.whl", hash = "sha256:3d8a802d504c928d97e951489e942f39c9bfeec2a7305a6f0f3d5d38e152db9e"}, - {file = "py_bip39_bindings-0.1.11.tar.gz", hash = "sha256:ebc128ccf3a0750d758557e094802f0975c3760a939f8a8b76392d7dbe6b52a1"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a9379172311aa9cdca13176fa541a7a8d5c99bb36360a35075b1687ca2a68f8"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f423282376ef9f080d52b213aa5800b78ba4a5c0da174679fe1989e632fd1def"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c61f08ee3a934932fb395a01b5f8f22e530e6c57a097fab40571ea635e28098"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8254c1b630aea2d8d3010f7dae4ed8f55f0ecc166122314b76c91541aeeb4df0"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e68c0db919ebba87666a947efafa92e41beeaf19b254ce3c3787085ab0c5829"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d36d468abc23d31bf19e3642b384fe28c7600c96239d4436f033d744a9137079"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f5ac37b6c6f3e32397925949f9c738e677c0b6ac7d3aa01d813724d86ce9045e"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8a1f2353c7fdbec4ea6f0a6a088cde076523b3bfce193786e096c4831ec723bb"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cb05d97ed2d018a08715ff06051c8de75c75b44eb73a428aaa204b56ce69d8f4"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-win32.whl", hash = "sha256:588ec726717b3ceaabff9b10d357a3a042a9a6cc075e3a9e14a3d7ba226c5ddf"}, + {file = "py_bip39_bindings-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:4e5e2af6c4b6a3640648fb28c8655b4a3275cee9a5160de8ec8db5ab295b7ec9"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2af7c8dedaa1076002872eda378153e053e4c9f5ce39570da3c65ce7306f4439"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:08e03bc728aa599e3cfac9395787618308c8b8e6f35a9ee0b11b73dcde72e3fc"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f052e5740d500e5a6a24c97e026ce152bbee58b56f2944ed455788f65658884"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd441833b21a5da2ccfebbdf800892e41282b24fc782eabae2a576e3d74d67f8"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f39ac5d74640d1d48c80404e549be9dc5a8931383e7f94ee388e4d972b571f42"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55ee7185bb1b5fb5ec4abcdea1ad89256dc7ee7e9a69843390a98068832169d6"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:42a00be8009d3c396bc9719fc743b85cb928cf163b081ad6ead8fc7c9c2fefdb"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ccc54690103b537f6650a8053f905e56772ae0aeb7e456c062a290357953f292"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:59a954b4e22e3cb3da441a94576002eaaba0b9ad75956ebb871f9b8e8bd7044a"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:54ac4841e7f018811b0ffa4baae5bce82347f448b99c13b030fb9a0c263efc3d"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2d1cdceebf62c804d53ff676f14fcadf43eeac7e8b10af2058f9387b9417094d"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-win32.whl", hash = "sha256:be0786e712fb32efc55f06270c3da970e667dcec7f116b3defba802e6913e834"}, + {file = "py_bip39_bindings-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:82593f31fb59f5b42ffdd4b177e0472ec32b178321063a93f6d609d672f0a087"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c763de71a7c83fcea7d6058a516e8ee3fd0f7111b6b02173381c35f48d96b090"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c61f65286fe314c28a4cf78f92bd549dbcc8f2dad99034ec7b47a688b2695cae"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:287301a2406e18cfb42bcc1b38cbd390ed11880cec371cd45471c00f75c3db8c"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:69c55c11228f91de55415eb31d5e5e8007b0544a48e2780e521a15a3fb713e8f"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ec5e6adb8ea6ffa22ed701d9749a184a203005538e276dcd2de183f27edebef"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831b0649d603b2e7905e09e39e36955f756abb19200beb630afc168b5c03d681"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:629399c400d605fbcb8de5ea942634ac06940e733e43753e0c23aee96fee6e45"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:15daa05fa85564f3ef7f3251ba9616cfc48f48d467cbecaf241194d0f8f62194"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:236aa7edb9ad3cade3e554743d00a620f47a228f36aa512dd0ee2fa75ea21c44"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:677ad9a382e8c2e73ca61f357a9c20a45885cd407afecc0c6e6604644c6ddfdc"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5f3b7bc29eda6ad7347caf07a91941a1c6a7c5c94212ffec7b056a9c4801911e"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-win32.whl", hash = "sha256:41f12635c5f0af0e406054d3a3ba0fad2045dfed461f43182bfa24edf11d90ca"}, + {file = "py_bip39_bindings-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:e3a4f2e05b6aaabbe3e59cebab72b57f216e118e5e3f167d93ee9b9e2257871b"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:21eed9f92eaf9746459cb7a2d0c97b98c885c51a279ec5bbf0b7ff8c26fe5bcc"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:350e83133f4445c038d39ada05add91743bbff904774b220e5b143df4ca7c4c3"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c46c3aca25f0c9840303d1fc16ad21b3bc620255e9a09fe0f739108419029245"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57bd5454a3f4cad68ebb3b5978f166cb01bf0153f39e7bfc83af99399f142374"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8039f96b52b4ab348e01459e24355b62a6ad1d6a6ab9b3fcb40cfc404640ca9f"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6919cd972bad09afacd266af560379bafc10f708c959d2353aea1584019de023"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4737db37d8800eb2de056b736058b7d3f2d7c424320d26e275d9015b05b1f562"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:98df51a42035466cab5dfb69faec63c2e666c391ff6746a8603cc9cabfcebe24"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d55c6af3cebb5c640ff12d29d7ca152d2b8188db49b0a53fc52fd2a748a7e231"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:eae5c4956613134ec5abc696121272a6ce7107af1509d8cdea3e24db1dff351b"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:071c4e67e9ae4a5ae12d781483f3a46d81d6b20be965dade39044ed0f89df34a"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7642f598e9cd7caddcc2f57f50335a16677c02bb9a7c9bb01b1814ddab85bb5"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0d0cff505237fd8c7103243f242610501afcd8a917ce484e50097189a7115c55"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fec3d7b30980978bd73103e27907ca37766762c21cfce1abcc6f9032d54274f"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:876006fa8936ad413d2f53e67246478fc94c19d38dc45f6bfd5f9861853ac999"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e6064feb105ed5c7278d19e8c4e371710ce56adcdd48e0c5e6b77f9b005201b9"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0cb7a39bd65455c4cc3feb3f8d5766644410f32ac137aeea88b119c6ebe2d58b"}, + {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:58743e95cedee157a545d060ee401639308f995badb91477d195f1d571664b65"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84f4c53eab32476e3a9dd473ad4e0093dd284e7868da886d37a0be9e67ec7509"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e219d724c39cbaaabab1d1f10975399d46ba83a228437680dc29ccb7c8b4d38d"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fda7efd3befc614966169c10a4d5f60958698c13d4d0b97f069540220b45544"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5319b6ad23e46e8521fa23c0204ba22bbc5ebc5002f8808182b07c216223b8ed"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1b1de6b2e12a7992aa91501e80724b89a4636b91b22a2288bae5c417e358466"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:bae82c4505a79ed7f621d45e9ea225e7cd5e0804ce4c8022ab7a2b92bd007d53"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:d42d44532f395c59059551fd030e91dd39cbe1b30cb7a1cf7636f9a6a6a36a94"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a29bca14abb51449bd051d59040966c6feff43b01f6b8a9669d876d7195d215f"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e7cb5aefdbc142b5c9b56b2c89c0112fd2288d52be8024cf1f1b66a4b84e3c83"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-win32.whl", hash = "sha256:e846c0eebeb0b684da4d41ac0751e510f91d7568cc9bc085cb93aa50d9b1ee6e"}, + {file = "py_bip39_bindings-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0a2024c9e9a5b9d90ab9c1fdaddd1abb7e632ef309efc4b89656fc25689c4456"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e3438f2568c1fdd8862a9946800570dbb8665b6c46412fa60745975cd82083a"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d5339d0b99d2ce9835f467ed3790399793ed4d51982881ff9c1f854649055d42"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:856b69bc125c40264bf9e749efc1b66405b27cfc4c7f96cd3c5e6a657b143859"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91cffd83189f42f2945693786104c51fa775ba8f09c532bf8c504916d6ddb565"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c72195aa802a36ad81bcc07fc23d59b83214511b1569e5cb245402a9209614e7"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a5224fc1417d35413f914bbe414b276941dd1d03466ed8a8a259dc4fa330b60c"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:86265b865bcacd3fcd30f89012cd248142d3eb6f36785c213f00d2d84d41e6fc"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:96337e30589963b6b849415e0c1dc9fe5c671f51c1f10e10e40f825460078318"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:07f2cd20581104c2bc02ccf90aaeb5e31b7dda2bbdb24afbaef69d410eb18bf0"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-win32.whl", hash = "sha256:d26f9e2007c1275a869711bae2d1f1c6f99feadc3ea8ebb0aed4b69d1290bfa9"}, + {file = "py_bip39_bindings-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3e79ad1cbf5410db23db6579111ed27aa7fac38969739040a9e3909a10d303fc"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2491fc1a1c37052cf9538118ddde51c94a0d85804a6d06fddb930114a8f41385"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5ecf247c9ea0c32c37bdde2db616cf3fff3d29a6b4c8945957f13e4c9e32c71a"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ce39808c717b13c02edca9eea4d139fc4d86c01acad99efb113b04e9639e2b9"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c5f38b01283e5973b1dfcdedc4e941c463f89879dc5d86463e77e816d240182"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fb1503c87e3d97f6802b28bd3b808ce5f0d88b7a38ed413275616d1962f0a6d"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e9ae6318f14bf8683cc11714516a04ac60095eab1aaf6ca6d1c99d508e399c64"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:7be4ac068391c80fdee956f7c4309533fcf7a4fae45dec46179af757961efefc"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e26059b46eff40ccb282966c49c475633cd7d3a1c08780fff3527d2ff247a014"}, + {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e8a63d04f68269e7e42219b30ff1e1e013f08d2fecef3f39f1588db512339509"}, + {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b85cb77708a4d1aceac8140604148c97894d3e7a3a531f8cfb82a85c574e4ac"}, + {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57a0c57a431fcd9873ae3d00b6227e39b80e63d9924d74a9f34972fd9f2e3076"}, + {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28bc089c7a7f22ac67de0e9e8308873c151cac9c5320c610392cdcb1c20e915e"}, + {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bfcec453c1069e87791ed0e1bc7168bbc3883dd40b0d7b35236e77dd0b1411c0"}, + {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:850cd2b2341a5438ae23b53054f1130f377813417f1fbe56c8424224dad0a408"}, + {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:424a2df31bcd3c9649598fc1ea443267db724754f9ec19ac3bd2c42542643043"}, + {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:06fe0f8bb2bd28266bf5182320b3f0cef94b103e03e81999f67cae194b7ea097"}, + {file = "py_bip39_bindings-0.2.0.tar.gz", hash = "sha256:38eac2c2be53085b8c2a215ebf12abcdaefee07bc8e00d7649b6b27399612b83"}, ] [[package]] @@ -4321,6 +4203,23 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "resolvelib" +version = "1.0.1" +description = "Resolve abstract dependencies into concrete ones" +optional = false +python-versions = "*" +files = [ + {file = "resolvelib-1.0.1-py2.py3-none-any.whl", hash = "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf"}, + {file = "resolvelib-1.0.1.tar.gz", hash = "sha256:04ce76cbd63fded2078ce224785da6ecd42b9564b1390793f64ddecbe997b309"}, +] + +[package.extras] +examples = ["html5lib", "packaging", "pygraphviz", "requests"] +lint = ["black", "flake8", "isort", "mypy", "types-requests"] +release = ["build", "towncrier", "twine"] +test = ["commentjson", "packaging", "pytest"] + [[package]] name = "retry" version = "0.9.2" @@ -4357,13 +4256,13 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "ruamel-yaml" -version = "0.18.7" +version = "0.18.6" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" optional = false python-versions = ">=3.7" files = [ - {file = "ruamel.yaml-0.18.7-py3-none-any.whl", hash = "sha256:adef56d72a97bc2a6a78952ef398c4054f248fba5698ddc3ab07434e7fc47983"}, - {file = "ruamel.yaml-0.18.7.tar.gz", hash = "sha256:270638acec6659f7bb30f4ea40083c9a0d0d5afdcef5e63d666f11209091531a"}, + {file = "ruamel.yaml-0.18.6-py3-none-any.whl", hash = "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636"}, + {file = "ruamel.yaml-0.18.6.tar.gz", hash = "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b"}, ] [package.dependencies] @@ -4837,16 +4736,19 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] -name = "shellingham" -version = "1.5.4" -description = "Tool to Detect Surrounding Shell" +name = "shtab" +version = "1.6.5" +description = "Automagic shell tab completion for Python CLI applications" optional = false python-versions = ">=3.7" files = [ - {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, - {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, + {file = "shtab-1.6.5-py3-none-any.whl", hash = "sha256:3c7be25ab65a324ed41e9c2964f2146236a5da6e6a247355cfea56f65050f220"}, + {file = "shtab-1.6.5.tar.gz", hash = "sha256:cf4ab120183e84cce041abeb6f620f9560739741dfc31dd466315550c08be9ec"}, ] +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout"] + [[package]] name = "six" version = "1.17.0" @@ -5173,13 +5075,13 @@ testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] [[package]] name = "toml" -version = "0.10.0" +version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" optional = false -python-versions = "*" +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ - {file = "toml-0.10.0-py2.py3-none-any.whl", hash = "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e"}, - {file = "toml-0.10.0.tar.gz", hash = "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c"}, + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] [[package]] @@ -5397,23 +5299,6 @@ build = ["cmake (>=3.20)", "lit"] tests = ["autopep8", "flake8", "isort", "llnl-hatchet", "numpy", "pytest", "scipy (>=1.7.1)"] tutorials = ["matplotlib", "pandas", "tabulate"] -[[package]] -name = "typer" -version = "0.15.1" -description = "Typer, build great CLIs. Easy to code. Based on Python type hints." -optional = false -python-versions = ">=3.7" -files = [ - {file = "typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847"}, - {file = "typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a"}, -] - -[package.dependencies] -click = ">=8.0.0" -rich = ">=10.11.0" -shellingham = ">=1.3.0" -typing-extensions = ">=3.7.4.3" - [[package]] name = "typing-extensions" version = "4.12.2" @@ -5438,13 +5323,13 @@ files = [ [[package]] name = "urllib3" -version = "2.3.0" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, - {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -5571,84 +5456,6 @@ docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] -[[package]] -name = "websockets" -version = "14.1" -description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -optional = false -python-versions = ">=3.9" -files = [ - {file = "websockets-14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a0adf84bc2e7c86e8a202537b4fd50e6f7f0e4a6b6bf64d7ccb96c4cd3330b29"}, - {file = "websockets-14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90b5d9dfbb6d07a84ed3e696012610b6da074d97453bd01e0e30744b472c8179"}, - {file = "websockets-14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2177ee3901075167f01c5e335a6685e71b162a54a89a56001f1c3e9e3d2ad250"}, - {file = "websockets-14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f14a96a0034a27f9d47fd9788913924c89612225878f8078bb9d55f859272b0"}, - {file = "websockets-14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f874ba705deea77bcf64a9da42c1f5fc2466d8f14daf410bc7d4ceae0a9fcb0"}, - {file = "websockets-14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9607b9a442392e690a57909c362811184ea429585a71061cd5d3c2b98065c199"}, - {file = "websockets-14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bea45f19b7ca000380fbd4e02552be86343080120d074b87f25593ce1700ad58"}, - {file = "websockets-14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:219c8187b3ceeadbf2afcf0f25a4918d02da7b944d703b97d12fb01510869078"}, - {file = "websockets-14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad2ab2547761d79926effe63de21479dfaf29834c50f98c4bf5b5480b5838434"}, - {file = "websockets-14.1-cp310-cp310-win32.whl", hash = "sha256:1288369a6a84e81b90da5dbed48610cd7e5d60af62df9851ed1d1d23a9069f10"}, - {file = "websockets-14.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0744623852f1497d825a49a99bfbec9bea4f3f946df6eb9d8a2f0c37a2fec2e"}, - {file = "websockets-14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:449d77d636f8d9c17952628cc7e3b8faf6e92a17ec581ec0c0256300717e1512"}, - {file = "websockets-14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a35f704be14768cea9790d921c2c1cc4fc52700410b1c10948511039be824aac"}, - {file = "websockets-14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b1f3628a0510bd58968c0f60447e7a692933589b791a6b572fcef374053ca280"}, - {file = "websockets-14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c3deac3748ec73ef24fc7be0b68220d14d47d6647d2f85b2771cb35ea847aa1"}, - {file = "websockets-14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7048eb4415d46368ef29d32133134c513f507fff7d953c18c91104738a68c3b3"}, - {file = "websockets-14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cf0ad281c979306a6a34242b371e90e891bce504509fb6bb5246bbbf31e7b6"}, - {file = "websockets-14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc1fc87428c1d18b643479caa7b15db7d544652e5bf610513d4a3478dbe823d0"}, - {file = "websockets-14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f95ba34d71e2fa0c5d225bde3b3bdb152e957150100e75c86bc7f3964c450d89"}, - {file = "websockets-14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9481a6de29105d73cf4515f2bef8eb71e17ac184c19d0b9918a3701c6c9c4f23"}, - {file = "websockets-14.1-cp311-cp311-win32.whl", hash = "sha256:368a05465f49c5949e27afd6fbe0a77ce53082185bbb2ac096a3a8afaf4de52e"}, - {file = "websockets-14.1-cp311-cp311-win_amd64.whl", hash = "sha256:6d24fc337fc055c9e83414c94e1ee0dee902a486d19d2a7f0929e49d7d604b09"}, - {file = "websockets-14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed907449fe5e021933e46a3e65d651f641975a768d0649fee59f10c2985529ed"}, - {file = "websockets-14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87e31011b5c14a33b29f17eb48932e63e1dcd3fa31d72209848652310d3d1f0d"}, - {file = "websockets-14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc6ccf7d54c02ae47a48ddf9414c54d48af9c01076a2e1023e3b486b6e72c707"}, - {file = "websockets-14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9777564c0a72a1d457f0848977a1cbe15cfa75fa2f67ce267441e465717dcf1a"}, - {file = "websockets-14.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a655bde548ca98f55b43711b0ceefd2a88a71af6350b0c168aa77562104f3f45"}, - {file = "websockets-14.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfff83ca578cada2d19e665e9c8368e1598d4e787422a460ec70e531dbdd58"}, - {file = "websockets-14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6a6c9bcf7cdc0fd41cc7b7944447982e8acfd9f0d560ea6d6845428ed0562058"}, - {file = "websockets-14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4b6caec8576e760f2c7dd878ba817653144d5f369200b6ddf9771d64385b84d4"}, - {file = "websockets-14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb6d38971c800ff02e4a6afd791bbe3b923a9a57ca9aeab7314c21c84bf9ff05"}, - {file = "websockets-14.1-cp312-cp312-win32.whl", hash = "sha256:1d045cbe1358d76b24d5e20e7b1878efe578d9897a25c24e6006eef788c0fdf0"}, - {file = "websockets-14.1-cp312-cp312-win_amd64.whl", hash = "sha256:90f4c7a069c733d95c308380aae314f2cb45bd8a904fb03eb36d1a4983a4993f"}, - {file = "websockets-14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3630b670d5057cd9e08b9c4dab6493670e8e762a24c2c94ef312783870736ab9"}, - {file = "websockets-14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36ebd71db3b89e1f7b1a5deaa341a654852c3518ea7a8ddfdf69cc66acc2db1b"}, - {file = "websockets-14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5b918d288958dc3fa1c5a0b9aa3256cb2b2b84c54407f4813c45d52267600cd3"}, - {file = "websockets-14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00fe5da3f037041da1ee0cf8e308374e236883f9842c7c465aa65098b1c9af59"}, - {file = "websockets-14.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8149a0f5a72ca36720981418eeffeb5c2729ea55fa179091c81a0910a114a5d2"}, - {file = "websockets-14.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77569d19a13015e840b81550922056acabc25e3f52782625bc6843cfa034e1da"}, - {file = "websockets-14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cf5201a04550136ef870aa60ad3d29d2a59e452a7f96b94193bee6d73b8ad9a9"}, - {file = "websockets-14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:88cf9163ef674b5be5736a584c999e98daf3aabac6e536e43286eb74c126b9c7"}, - {file = "websockets-14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:836bef7ae338a072e9d1863502026f01b14027250a4545672673057997d5c05a"}, - {file = "websockets-14.1-cp313-cp313-win32.whl", hash = "sha256:0d4290d559d68288da9f444089fd82490c8d2744309113fc26e2da6e48b65da6"}, - {file = "websockets-14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8621a07991add373c3c5c2cf89e1d277e49dc82ed72c75e3afc74bd0acc446f0"}, - {file = "websockets-14.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01bb2d4f0a6d04538d3c5dfd27c0643269656c28045a53439cbf1c004f90897a"}, - {file = "websockets-14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:414ffe86f4d6f434a8c3b7913655a1a5383b617f9bf38720e7c0799fac3ab1c6"}, - {file = "websockets-14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fda642151d5affdee8a430bd85496f2e2517be3a2b9d2484d633d5712b15c56"}, - {file = "websockets-14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd7c11968bc3860d5c78577f0dbc535257ccec41750675d58d8dc66aa47fe52c"}, - {file = "websockets-14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a032855dc7db987dff813583d04f4950d14326665d7e714d584560b140ae6b8b"}, - {file = "websockets-14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7e7ea2f782408c32d86b87a0d2c1fd8871b0399dd762364c731d86c86069a78"}, - {file = "websockets-14.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:39450e6215f7d9f6f7bc2a6da21d79374729f5d052333da4d5825af8a97e6735"}, - {file = "websockets-14.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ceada5be22fa5a5a4cdeec74e761c2ee7db287208f54c718f2df4b7e200b8d4a"}, - {file = "websockets-14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3fc753451d471cff90b8f467a1fc0ae64031cf2d81b7b34e1811b7e2691bc4bc"}, - {file = "websockets-14.1-cp39-cp39-win32.whl", hash = "sha256:14839f54786987ccd9d03ed7f334baec0f02272e7ec4f6e9d427ff584aeea8b4"}, - {file = "websockets-14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d9fd19ecc3a4d5ae82ddbfb30962cf6d874ff943e56e0c81f5169be2fda62979"}, - {file = "websockets-14.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5dc25a9dbd1a7f61eca4b7cb04e74ae4b963d658f9e4f9aad9cd00b688692c8"}, - {file = "websockets-14.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:04a97aca96ca2acedf0d1f332c861c5a4486fdcba7bcef35873820f940c4231e"}, - {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df174ece723b228d3e8734a6f2a6febbd413ddec39b3dc592f5a4aa0aff28098"}, - {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:034feb9f4286476f273b9a245fb15f02c34d9586a5bc936aff108c3ba1b21beb"}, - {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c308dabd2b380807ab64b62985eaccf923a78ebc572bd485375b9ca2b7dc7"}, - {file = "websockets-14.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a42d3ecbb2db5080fc578314439b1d79eef71d323dc661aa616fb492436af5d"}, - {file = "websockets-14.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ddaa4a390af911da6f680be8be4ff5aaf31c4c834c1a9147bc21cbcbca2d4370"}, - {file = "websockets-14.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4c805c6034206143fbabd2d259ec5e757f8b29d0a2f0bf3d2fe5d1f60147a4a"}, - {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:205f672a6c2c671a86d33f6d47c9b35781a998728d2c7c2a3e1cf3333fcb62b7"}, - {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef440054124728cc49b01c33469de06755e5a7a4e83ef61934ad95fc327fbb0"}, - {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7591d6f440af7f73c4bd9404f3772bfee064e639d2b6cc8c94076e71b2471c1"}, - {file = "websockets-14.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:25225cc79cfebc95ba1d24cd3ab86aaa35bcd315d12fa4358939bd55e9bd74a5"}, - {file = "websockets-14.1-py3-none-any.whl", hash = "sha256:4d4fc827a20abe6d544a119896f6b78ee13fe81cbfef416f3f2ddf09a03f0e2e"}, - {file = "websockets-14.1.tar.gz", hash = "sha256:398b10c77d471c0aab20a845e7a60076b6390bfdaac7a6d2edb0d2c59d75e8d8"}, -] - [[package]] name = "werkzeug" version = "3.1.3" @@ -6046,4 +5853,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">3.9.1,<3.12" -content-hash = "fcd3b4f3f8017a3713c7dba2390a8b383b357eb4740f013b73e42e582c88a7f5" +content-hash = "e31107374c14b5a2c82dfed31c60fbe028de4dac175ce19b917e3960cf9ef53c" diff --git a/pyproject.toml b/pyproject.toml index 9aa64a42..24742db8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,12 +13,12 @@ readme = "README.md" python = ">3.9.1,<3.12" # Bittensor Version Strict -bittensor = "8.5.1" +bittensor = "7.4.0" # Bittensor Dependencies We Also Need setuptools = "~70.0.0" pydantic = "^2.3.0" -numpy = ">=2.0.1,<2.1.0" +numpy = "^1.26" # Subnet Specific Dependencies torch = "^2.5.1" @@ -35,7 +35,7 @@ pandas-market-calendars = "^4.4.2" python-dotenv = "^1.0.1" scikit-learn = "^1.6.0" wandb = "^0.19.1" -cryptography = ">=43.0.1,<43.1.0" +cryptography = ">=42.0.5,<42.1.0" [tool.poetry.group.dev.dependencies] pre-commit-hooks = "5.0.0" diff --git a/snp_oracle/neurons/validator.py b/snp_oracle/neurons/validator.py index 29fa3a2e..ee0a3f48 100644 --- a/snp_oracle/neurons/validator.py +++ b/snp_oracle/neurons/validator.py @@ -129,27 +129,17 @@ def print_info(self): metagraph = self.metagraph self.uid = self.metagraph.hotkeys.index(self.wallet.hotkey.ss58_address) - # Get all values in one go to avoid multiple concurrent requests - try: - current_block = self.block # Single websocket call - stake = float(metagraph.S[self.uid]) - vtrust = float(metagraph.Tv[self.uid]) - dividend = float(metagraph.D[self.uid]) - emission = float(metagraph.E[self.uid]) - - log = ( - "Validator | " - f"Step:{self.step} | " - f"UID:{self.uid} | " - f"Block:{current_block} | " - f"Stake:{stake:.4f} | " - f"VTrust:{vtrust:.4f} | " - f"Dividend:{dividend:.4f} | " - f"Emission:{emission:.4f}" - ) - bt.logging.info(log) - except Exception as e: - bt.logging.error(f"Error getting validator info: {e}") + log = ( + "Validator | " + f"Step:{self.step} | " + f"UID:{self.uid} | " + f"Block:{self.block} | " + f"Stake:{metagraph.S[self.uid]} | " + f"VTrust:{metagraph.Tv[self.uid]} | " + f"Dividend:{metagraph.D[self.uid]} | " + f"Emission:{metagraph.E[self.uid]}" + ) + bt.logging.info(log) # The main function parses the configuration and runs the validator. diff --git a/snp_oracle/predictionnet/base/miner.py b/snp_oracle/predictionnet/base/miner.py index 3c284489..ea506b33 100644 --- a/snp_oracle/predictionnet/base/miner.py +++ b/snp_oracle/predictionnet/base/miner.py @@ -4,6 +4,7 @@ import traceback import bittensor as bt +from bittensor.constants import V_7_2_0 from substrateinterface import Keypair from snp_oracle.predictionnet.base.neuron import BaseNeuron @@ -171,71 +172,59 @@ def _to_seconds(self, nano: int) -> int: return nano / 1_000_000_000 async def verify(self, synapse: Challenge) -> None: - """ - Verifies the authenticity and validity of incoming requests. - - Args: - synapse: The Challenge object containing request details and credentials - - Raises: - Exception: If verification fails due to missing nonce, invalid timestamps, - duplicate nonces, or signature mismatch - """ + # needs to replace the base miner verify logic bt.logging.debug(f"checking nonce: {synapse.dendrite}") - - # Skip verification if no dendrite info - if synapse.dendrite is None: - return - - # Build keypair and verify signature - keypair = Keypair(ss58_address=synapse.dendrite.hotkey) - - # Check for missing nonce - if synapse.dendrite.nonce is None: - raise Exception("Missing Nonce") - - # Build unique endpoint identifier - endpoint_key = f"{synapse.dendrite.hotkey}:{synapse.dendrite.uuid}" - - # Check timestamp validity - cur_time = time.time_ns() - allowed_delta = self.config.timeout * 1_000_000_000 # nanoseconds - latest_allowed_nonce = synapse.dendrite.nonce + allowed_delta - - # Log timing details for debugging - bt.logging.debug(f"synapse.dendrite.nonce: {synapse.dendrite.nonce}") - bt.logging.debug(f"latest_allowed_nonce: {latest_allowed_nonce}") - bt.logging.debug(f"cur time: {cur_time}") - bt.logging.debug(f"delta: {self._to_seconds(cur_time - synapse.dendrite.nonce)}") - - # Verify nonce timing - if self.nonces.get(endpoint_key) is None and synapse.dendrite.nonce > latest_allowed_nonce: - raise Exception( - f"Nonce is too old. Allowed delta in seconds: {self._to_seconds(allowed_delta)}, " - f"got delta: {self._to_seconds(cur_time - synapse.dendrite.nonce)}" - ) - - # Verify nonce order - if self.nonces.get(endpoint_key) is not None and synapse.dendrite.nonce <= self.nonces[endpoint_key]: - raise Exception( - f"Nonce is too small, already have a newer nonce in the nonce store, " - f"got: {synapse.dendrite.nonce}, already have: {self.nonces[endpoint_key]}" - ) - - # Build and verify signature message - message = ( - f"{synapse.dendrite.nonce}." - f"{synapse.dendrite.hotkey}." - f"{self.wallet.hotkey.ss58_address}." - f"{synapse.dendrite.uuid}." - f"{synapse.computed_body_hash}" - ) - - if not keypair.verify(message, synapse.dendrite.signature): - raise Exception( - f"Signature mismatch with {message} and {synapse.dendrite.signature}, " - f"from hotkey {synapse.dendrite.hotkey}" - ) - - # Store nonce after successful verification - self.nonces[endpoint_key] = synapse.dendrite.nonce # type: ignore + # Build the keypair from the dendrite_hotkey + if synapse.dendrite is not None: + keypair = Keypair(ss58_address=synapse.dendrite.hotkey) + + # Build the signature messages. + message = f"{synapse.dendrite.nonce}.{synapse.dendrite.hotkey}.{self.wallet.hotkey.ss58_address}.{synapse.dendrite.uuid}.{synapse.computed_body_hash}" + + # Build the unique endpoint key. + endpoint_key = f"{synapse.dendrite.hotkey}:{synapse.dendrite.uuid}" + + # Requests must have nonces to be safe from replays + if synapse.dendrite.nonce is None: + raise Exception("Missing Nonce") + if synapse.dendrite.version is not None and synapse.dendrite.version >= V_7_2_0: + bt.logging.debug("Using custom synapse verification logic") + # If we don't have a nonce stored, ensure that the nonce falls within + # a reasonable delta. + cur_time = time.time_ns() + + allowed_delta = self.config.timeout * 1_000_000_000 # nanoseconds + + latest_allowed_nonce = synapse.dendrite.nonce + allowed_delta + + bt.logging.debug(f"synapse.dendrite.nonce: {synapse.dendrite.nonce}") + bt.logging.debug(f"latest_allowed_nonce: {latest_allowed_nonce}") + bt.logging.debug(f"cur time: {cur_time}") + bt.logging.debug(f"delta: {self._to_seconds(cur_time - synapse.dendrite.nonce)}") + + if self.nonces.get(endpoint_key) is None and synapse.dendrite.nonce > latest_allowed_nonce: + raise Exception( + f"Nonce is too old. Allowed delta in seconds: {self._to_seconds(allowed_delta)}, got delta: {self._to_seconds(cur_time - synapse.dendrite.nonce)}" + ) + if self.nonces.get(endpoint_key) is not None and synapse.dendrite.nonce <= self.nonces[endpoint_key]: + raise Exception( + f"Nonce is too small, already have a newer nonce in the nonce store, got: {synapse.dendrite.nonce}, already have: {self.nonces[endpoint_key]}" + ) + else: + bt.logging.warning(f"Using synapse verification logic for version < 7.2.0: {synapse.dendrite.version}") + if ( + endpoint_key in self.nonces.keys() + and self.nonces[endpoint_key] is not None + and synapse.dendrite.nonce <= self.nonces[endpoint_key] + ): + raise Exception( + f"Nonce is too small, already have a newer nonce in the nonce store, got: {synapse.dendrite.nonce}, already have: {self.nonces[endpoint_key]}" + ) + + if not keypair.verify(message, synapse.dendrite.signature): + raise Exception( + f"Signature mismatch with {message} and {synapse.dendrite.signature}, from hotkey {synapse.dendrite.hotkey}" + ) + + # Success + self.nonces[endpoint_key] = synapse.dendrite.nonce # type: ignore From 326122e27e812bf366ecc3624aa50d8e4d2db59c Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 13:56:57 -0500 Subject: [PATCH 192/201] I lied --- docs/miners.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/docs/miners.md b/docs/miners.md index c946801e..f7e68a54 100644 --- a/docs/miners.md +++ b/docs/miners.md @@ -87,6 +87,15 @@ logging_level = info # options = [info, debug, trace] #### Ports In the Makefile, we have default ports set to `8091` for validator and `8092` for miner. Please change as-needed. +#### Models +In the Makefile, ensure that the `--model` flag points to the local location of the model you would like validators to evaluate. By default, the Makefile is populated with the base miner model: +`--model mining_models/base_lstm_new.h5` + +The `--hf_repo_id` flag will determine which hugging face repository your miner models and data will be uploaded to. This repository must be public in order to ensure validator access. A hugging face repository will be created at the provided path under your hugging face user assuming you provide a valid username and valid `MINER_HF_ACCESS_TOKEN` in your `.env` file. + +#### Data +The data your model utilizes will be automatically uploaded to hugging face, in the same repository as your model, defined here: `--hf_repo_id`. The data will be encrypted initially. Once the model is evaluated by validators, the data will be decrypted and published on hugging face. + ## Deploying a Miner We highly recommend that you run your miners on testnet before deploying on mainnet. @@ -96,9 +105,9 @@ We highly recommend that you run your miners on testnet before deploying on main ### Base miner 1. Run the command: - ```shell - make miner - ``` + ```shell + make miner + ``` ### Custom Miner @@ -108,6 +117,6 @@ We highly recommend that you run your miners on testnet before deploying on main 3. Edit the command in the Makefile. 1. Add values for `hf_repo_id` and so forth. 4. Run the Command: - ``` - make miner - ``` + ``` + make miner + ``` From b1cfab2ed2ba31f41ccf757a69cf2d247882783c Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 14:31:17 -0500 Subject: [PATCH 193/201] remove verify fn --- snp_oracle/predictionnet/base/miner.py | 76 -------------------------- 1 file changed, 76 deletions(-) diff --git a/snp_oracle/predictionnet/base/miner.py b/snp_oracle/predictionnet/base/miner.py index 3c284489..29801a8c 100644 --- a/snp_oracle/predictionnet/base/miner.py +++ b/snp_oracle/predictionnet/base/miner.py @@ -4,10 +4,8 @@ import traceback import bittensor as bt -from substrateinterface import Keypair from snp_oracle.predictionnet.base.neuron import BaseNeuron -from snp_oracle.predictionnet.protocol import Challenge class BaseMinerNeuron(BaseNeuron): @@ -39,7 +37,6 @@ def __init__(self, config=None): forward_fn=self.forward, blacklist_fn=self.blacklist, priority_fn=self.priority, - verify_fn=self.verify, ) bt.logging.info(f"Axon created: {self.axon}") self.nonces = {} @@ -166,76 +163,3 @@ def resync_metagraph(self): # Sync the metagraph. self.metagraph.sync(subtensor=self.subtensor) self.metagraph.last_update[self.uid] = self.block - - def _to_seconds(self, nano: int) -> int: - return nano / 1_000_000_000 - - async def verify(self, synapse: Challenge) -> None: - """ - Verifies the authenticity and validity of incoming requests. - - Args: - synapse: The Challenge object containing request details and credentials - - Raises: - Exception: If verification fails due to missing nonce, invalid timestamps, - duplicate nonces, or signature mismatch - """ - bt.logging.debug(f"checking nonce: {synapse.dendrite}") - - # Skip verification if no dendrite info - if synapse.dendrite is None: - return - - # Build keypair and verify signature - keypair = Keypair(ss58_address=synapse.dendrite.hotkey) - - # Check for missing nonce - if synapse.dendrite.nonce is None: - raise Exception("Missing Nonce") - - # Build unique endpoint identifier - endpoint_key = f"{synapse.dendrite.hotkey}:{synapse.dendrite.uuid}" - - # Check timestamp validity - cur_time = time.time_ns() - allowed_delta = self.config.timeout * 1_000_000_000 # nanoseconds - latest_allowed_nonce = synapse.dendrite.nonce + allowed_delta - - # Log timing details for debugging - bt.logging.debug(f"synapse.dendrite.nonce: {synapse.dendrite.nonce}") - bt.logging.debug(f"latest_allowed_nonce: {latest_allowed_nonce}") - bt.logging.debug(f"cur time: {cur_time}") - bt.logging.debug(f"delta: {self._to_seconds(cur_time - synapse.dendrite.nonce)}") - - # Verify nonce timing - if self.nonces.get(endpoint_key) is None and synapse.dendrite.nonce > latest_allowed_nonce: - raise Exception( - f"Nonce is too old. Allowed delta in seconds: {self._to_seconds(allowed_delta)}, " - f"got delta: {self._to_seconds(cur_time - synapse.dendrite.nonce)}" - ) - - # Verify nonce order - if self.nonces.get(endpoint_key) is not None and synapse.dendrite.nonce <= self.nonces[endpoint_key]: - raise Exception( - f"Nonce is too small, already have a newer nonce in the nonce store, " - f"got: {synapse.dendrite.nonce}, already have: {self.nonces[endpoint_key]}" - ) - - # Build and verify signature message - message = ( - f"{synapse.dendrite.nonce}." - f"{synapse.dendrite.hotkey}." - f"{self.wallet.hotkey.ss58_address}." - f"{synapse.dendrite.uuid}." - f"{synapse.computed_body_hash}" - ) - - if not keypair.verify(message, synapse.dendrite.signature): - raise Exception( - f"Signature mismatch with {message} and {synapse.dendrite.signature}, " - f"from hotkey {synapse.dendrite.hotkey}" - ) - - # Store nonce after successful verification - self.nonces[endpoint_key] = synapse.dendrite.nonce # type: ignore From b8630cf494f279cfac7dd396ef0653bed9ff2088 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 14:43:27 -0500 Subject: [PATCH 194/201] comment out instead --- snp_oracle/predictionnet/base/miner.py | 79 ++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/snp_oracle/predictionnet/base/miner.py b/snp_oracle/predictionnet/base/miner.py index 29801a8c..2ffc58c2 100644 --- a/snp_oracle/predictionnet/base/miner.py +++ b/snp_oracle/predictionnet/base/miner.py @@ -7,6 +7,11 @@ from snp_oracle.predictionnet.base.neuron import BaseNeuron +# from substrateinterface import Keypair + + +# from snp_oracle.predictionnet.protocol import Challenge + class BaseMinerNeuron(BaseNeuron): """ @@ -37,6 +42,7 @@ def __init__(self, config=None): forward_fn=self.forward, blacklist_fn=self.blacklist, priority_fn=self.priority, + verify_fn=self.verify, ) bt.logging.info(f"Axon created: {self.axon}") self.nonces = {} @@ -163,3 +169,76 @@ def resync_metagraph(self): # Sync the metagraph. self.metagraph.sync(subtensor=self.subtensor) self.metagraph.last_update[self.uid] = self.block + + # def _to_seconds(self, nano: int) -> int: + # return nano / 1_000_000_000 + + # async def verify(self, synapse: Challenge) -> None: + # """ + # Verifies the authenticity and validity of incoming requests. + + # Args: + # synapse: The Challenge object containing request details and credentials + + # Raises: + # Exception: If verification fails due to missing nonce, invalid timestamps, + # duplicate nonces, or signature mismatch + # """ + # bt.logging.debug(f"checking nonce: {synapse.dendrite}") + + # # Skip verification if no dendrite info + # if synapse.dendrite is None: + # return + + # # Build keypair and verify signature + # keypair = Keypair(ss58_address=synapse.dendrite.hotkey) + + # # Check for missing nonce + # if synapse.dendrite.nonce is None: + # raise Exception("Missing Nonce") + + # # Build unique endpoint identifier + # endpoint_key = f"{synapse.dendrite.hotkey}:{synapse.dendrite.uuid}" + + # # Check timestamp validity + # cur_time = time.time_ns() + # allowed_delta = self.config.timeout * 1_000_000_000 # nanoseconds + # latest_allowed_nonce = synapse.dendrite.nonce + allowed_delta + + # # Log timing details for debugging + # bt.logging.debug(f"synapse.dendrite.nonce: {synapse.dendrite.nonce}") + # bt.logging.debug(f"latest_allowed_nonce: {latest_allowed_nonce}") + # bt.logging.debug(f"cur time: {cur_time}") + # bt.logging.debug(f"delta: {self._to_seconds(cur_time - synapse.dendrite.nonce)}") + + # # Verify nonce timing + # if self.nonces.get(endpoint_key) is None and synapse.dendrite.nonce > latest_allowed_nonce: + # raise Exception( + # f"Nonce is too old. Allowed delta in seconds: {self._to_seconds(allowed_delta)}, " + # f"got delta: {self._to_seconds(cur_time - synapse.dendrite.nonce)}" + # ) + + # # Verify nonce order + # if self.nonces.get(endpoint_key) is not None and synapse.dendrite.nonce <= self.nonces[endpoint_key]: + # raise Exception( + # f"Nonce is too small, already have a newer nonce in the nonce store, " + # f"got: {synapse.dendrite.nonce}, already have: {self.nonces[endpoint_key]}" + # ) + + # # Build and verify signature message + # message = ( + # f"{synapse.dendrite.nonce}." + # f"{synapse.dendrite.hotkey}." + # f"{self.wallet.hotkey.ss58_address}." + # f"{synapse.dendrite.uuid}." + # f"{synapse.computed_body_hash}" + # ) + + # if not keypair.verify(message, synapse.dendrite.signature): + # raise Exception( + # f"Signature mismatch with {message} and {synapse.dendrite.signature}, " + # f"from hotkey {synapse.dendrite.hotkey}" + # ) + + # # Store nonce after successful verification + # self.nonces[endpoint_key] = synapse.dendrite.nonce # type: ignore From 3de8242f5a43f1396fa325c93ed0355c45038548 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 15:18:39 -0500 Subject: [PATCH 195/201] hotfix --- .gitignore | 4 + Makefile | 26 +- README.md | 2 +- docs/miners.md | 2 +- docs/validators.md | 2 +- poetry.lock | 1323 ++++++++++++++++++------------- pyproject.toml | 6 +- snp_oracle/neurons/validator.py | 32 +- 8 files changed, 803 insertions(+), 594 deletions(-) diff --git a/.gitignore b/.gitignore index 6d2dc13c..77f984f8 100644 --- a/.gitignore +++ b/.gitignore @@ -128,6 +128,8 @@ venv/ ENV/ env.bak/ venv.bak/ +# branch specific environments that start with issue number +.[0-9]*-* # Spyder project settings .spyderproject @@ -166,3 +168,5 @@ timestamp.txt # localnet config miner.config.local.js validator.config.local.js + +local_data/ diff --git a/Makefile b/Makefile index e2936d2a..e59ab8e9 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,13 @@ ################################################################################ # User Parameters # ################################################################################ -coldkey = default -validator_hotkey = validator -miner_hotkey = miner -netuid = $(testnet_netuid) -network = $(testnet) -logging_level = info # options= ['info', 'debug', 'trace'] +# coldkey = validator +coldkey = miner +validator_hotkey = default +miner_hotkey = default +netuid = $(localnet_netuid) +network = $(localnet) +logging_level = debug # options= ['info', 'debug', 'trace'] ################################################################################ @@ -14,10 +15,10 @@ logging_level = info # options= ['info', 'debug', 'trace'] ################################################################################ finney = wss://entrypoint-finney.opentensor.ai:443 testnet = wss://test.finney.opentensor.ai:443 -locanet = ws://127.0.0.1:9944 +localnet = ws://127.0.0.1:9945 finney_netuid = 28 -testnet_netuid = 93 +testnet_netuid = 272 localnet_netuid = 1 @@ -41,16 +42,17 @@ validator: --subtensor.chain_endpoint $(network) \ --axon.port 8091 \ --netuid $(netuid) \ - --logging.level $(logging_level) + --logging.$(logging_level) miner: - pm2 start python --name miner -- ./snp_oracle/neurons/miner.py \ + pm2 start python --name miner -- ./snp_oracle/neurons/miner.py --no-autorestart \ --wallet.name $(coldkey) \ --wallet.hotkey $(miner_hotkey) \ --subtensor.chain_endpoint $(network) \ --axon.port 8092 \ --netuid $(netuid) \ - --logging.level $(logging_level) \ + --logging.$(logging_level) \ --vpermit_tao_limit 2 \ - --hf_repo_id foundryservices/bittensor-sn28-base-lstm \ + --blacklist.force_validator_permit true \ + --hf_repo_id pcarlson-foundry-digital/localnet \ --model mining_models/base_lstm_new.h5 diff --git a/README.md b/README.md index 7dc05e1a..13ad705f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@
    -| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 93
    **Mainnet UID:** 28 | +| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 272
    **Mainnet UID:** 28 | | - | - |
    diff --git a/docs/miners.md b/docs/miners.md index f7e68a54..f4e9447b 100644 --- a/docs/miners.md +++ b/docs/miners.md @@ -10,7 +10,7 @@
    -| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 93
    **Mainnet UID:** 28 | +| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 272
    **Mainnet UID:** 28 | | - | - |
    diff --git a/docs/validators.md b/docs/validators.md index 1c7005f3..4e4437b1 100644 --- a/docs/validators.md +++ b/docs/validators.md @@ -2,7 +2,7 @@
    -| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 93
    **Mainnet UID:** 28 | +| This repository is the official codebase
    for Bittensor Subnet 28 (SN28) v1.0.0+,
    which was released on February 20th 2024. | **Testnet UID:** 272
    **Mainnet UID:** 28 | | - | - |
    diff --git a/poetry.lock b/poetry.lock index 214223ae..52fa0946 100644 --- a/poetry.lock +++ b/poetry.lock @@ -24,87 +24,102 @@ files = [ [[package]] name = "aiohttp" -version = "3.11.11" +version = "3.10.11" description = "Async http client/server framework (asyncio)" optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" files = [ - {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8"}, - {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5"}, - {file = "aiohttp-3.11.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c"}, - {file = "aiohttp-3.11.11-cp310-cp310-win32.whl", hash = "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745"}, - {file = "aiohttp-3.11.11-cp310-cp310-win_amd64.whl", hash = "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9"}, - {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76"}, - {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538"}, - {file = "aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773"}, - {file = "aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62"}, - {file = "aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac"}, - {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886"}, - {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2"}, - {file = "aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e"}, - {file = "aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600"}, - {file = "aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d"}, - {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9"}, - {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194"}, - {file = "aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5"}, - {file = "aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d"}, - {file = "aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99"}, - {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e"}, - {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add"}, - {file = "aiohttp-3.11.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226"}, - {file = "aiohttp-3.11.11-cp39-cp39-win32.whl", hash = "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3"}, - {file = "aiohttp-3.11.11-cp39-cp39-win_amd64.whl", hash = "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1"}, - {file = "aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e"}, + {file = "aiohttp-3.10.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5077b1a5f40ffa3ba1f40d537d3bec4383988ee51fbba6b74aa8fb1bc466599e"}, + {file = "aiohttp-3.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d6a14a4d93b5b3c2891fca94fa9d41b2322a68194422bef0dd5ec1e57d7d298"}, + {file = "aiohttp-3.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffbfde2443696345e23a3c597049b1dd43049bb65337837574205e7368472177"}, + {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20b3d9e416774d41813bc02fdc0663379c01817b0874b932b81c7f777f67b217"}, + {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b943011b45ee6bf74b22245c6faab736363678e910504dd7531a58c76c9015a"}, + {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48bc1d924490f0d0b3658fe5c4b081a4d56ebb58af80a6729d4bd13ea569797a"}, + {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e12eb3f4b1f72aaaf6acd27d045753b18101524f72ae071ae1c91c1cd44ef115"}, + {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f14ebc419a568c2eff3c1ed35f634435c24ead2fe19c07426af41e7adb68713a"}, + {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:72b191cdf35a518bfc7ca87d770d30941decc5aaf897ec8b484eb5cc8c7706f3"}, + {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5ab2328a61fdc86424ee540d0aeb8b73bbcad7351fb7cf7a6546fc0bcffa0038"}, + {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:aa93063d4af05c49276cf14e419550a3f45258b6b9d1f16403e777f1addf4519"}, + {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:30283f9d0ce420363c24c5c2421e71a738a2155f10adbb1a11a4d4d6d2715cfc"}, + {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e5358addc8044ee49143c546d2182c15b4ac3a60be01c3209374ace05af5733d"}, + {file = "aiohttp-3.10.11-cp310-cp310-win32.whl", hash = "sha256:e1ffa713d3ea7cdcd4aea9cddccab41edf6882fa9552940344c44e59652e1120"}, + {file = "aiohttp-3.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:778cbd01f18ff78b5dd23c77eb82987ee4ba23408cbed233009fd570dda7e674"}, + {file = "aiohttp-3.10.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:80ff08556c7f59a7972b1e8919f62e9c069c33566a6d28586771711e0eea4f07"}, + {file = "aiohttp-3.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c8f96e9ee19f04c4914e4e7a42a60861066d3e1abf05c726f38d9d0a466e695"}, + {file = "aiohttp-3.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fb8601394d537da9221947b5d6e62b064c9a43e88a1ecd7414d21a1a6fba9c24"}, + {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea224cf7bc2d8856d6971cea73b1d50c9c51d36971faf1abc169a0d5f85a382"}, + {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db9503f79e12d5d80b3efd4d01312853565c05367493379df76d2674af881caa"}, + {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0f449a50cc33f0384f633894d8d3cd020e3ccef81879c6e6245c3c375c448625"}, + {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82052be3e6d9e0c123499127782a01a2b224b8af8c62ab46b3f6197035ad94e9"}, + {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20063c7acf1eec550c8eb098deb5ed9e1bb0521613b03bb93644b810986027ac"}, + {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:489cced07a4c11488f47aab1f00d0c572506883f877af100a38f1fedaa884c3a"}, + {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ea9b3bab329aeaa603ed3bf605f1e2a6f36496ad7e0e1aa42025f368ee2dc07b"}, + {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ca117819d8ad113413016cb29774b3f6d99ad23c220069789fc050267b786c16"}, + {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2dfb612dcbe70fb7cdcf3499e8d483079b89749c857a8f6e80263b021745c730"}, + {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9b615d3da0d60e7d53c62e22b4fd1c70f4ae5993a44687b011ea3a2e49051b8"}, + {file = "aiohttp-3.10.11-cp311-cp311-win32.whl", hash = "sha256:29103f9099b6068bbdf44d6a3d090e0a0b2be6d3c9f16a070dd9d0d910ec08f9"}, + {file = "aiohttp-3.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:236b28ceb79532da85d59aa9b9bf873b364e27a0acb2ceaba475dc61cffb6f3f"}, + {file = "aiohttp-3.10.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7480519f70e32bfb101d71fb9a1f330fbd291655a4c1c922232a48c458c52710"}, + {file = "aiohttp-3.10.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f65267266c9aeb2287a6622ee2bb39490292552f9fbf851baabc04c9f84e048d"}, + {file = "aiohttp-3.10.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7400a93d629a0608dc1d6c55f1e3d6e07f7375745aaa8bd7f085571e4d1cee97"}, + {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f34b97e4b11b8d4eb2c3a4f975be626cc8af99ff479da7de49ac2c6d02d35725"}, + {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e7b825da878464a252ccff2958838f9caa82f32a8dbc334eb9b34a026e2c636"}, + {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9f92a344c50b9667827da308473005f34767b6a2a60d9acff56ae94f895f385"}, + {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc6f1ab987a27b83c5268a17218463c2ec08dbb754195113867a27b166cd6087"}, + {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1dc0f4ca54842173d03322793ebcf2c8cc2d34ae91cc762478e295d8e361e03f"}, + {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7ce6a51469bfaacff146e59e7fb61c9c23006495d11cc24c514a455032bcfa03"}, + {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:aad3cd91d484d065ede16f3cf15408254e2469e3f613b241a1db552c5eb7ab7d"}, + {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f4df4b8ca97f658c880fb4b90b1d1ec528315d4030af1ec763247ebfd33d8b9a"}, + {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2e4e18a0a2d03531edbc06c366954e40a3f8d2a88d2b936bbe78a0c75a3aab3e"}, + {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6ce66780fa1a20e45bc753cda2a149daa6dbf1561fc1289fa0c308391c7bc0a4"}, + {file = "aiohttp-3.10.11-cp312-cp312-win32.whl", hash = "sha256:a919c8957695ea4c0e7a3e8d16494e3477b86f33067478f43106921c2fef15bb"}, + {file = "aiohttp-3.10.11-cp312-cp312-win_amd64.whl", hash = "sha256:b5e29706e6389a2283a91611c91bf24f218962717c8f3b4e528ef529d112ee27"}, + {file = "aiohttp-3.10.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:703938e22434d7d14ec22f9f310559331f455018389222eed132808cd8f44127"}, + {file = "aiohttp-3.10.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9bc50b63648840854e00084c2b43035a62e033cb9b06d8c22b409d56eb098413"}, + {file = "aiohttp-3.10.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f0463bf8b0754bc744e1feb61590706823795041e63edf30118a6f0bf577461"}, + {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6c6dec398ac5a87cb3a407b068e1106b20ef001c344e34154616183fe684288"}, + {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcaf2d79104d53d4dcf934f7ce76d3d155302d07dae24dff6c9fffd217568067"}, + {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25fd5470922091b5a9aeeb7e75be609e16b4fba81cdeaf12981393fb240dd10e"}, + {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbde2ca67230923a42161b1f408c3992ae6e0be782dca0c44cb3206bf330dee1"}, + {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:249c8ff8d26a8b41a0f12f9df804e7c685ca35a207e2410adbd3e924217b9006"}, + {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:878ca6a931ee8c486a8f7b432b65431d095c522cbeb34892bee5be97b3481d0f"}, + {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8663f7777ce775f0413324be0d96d9730959b2ca73d9b7e2c2c90539139cbdd6"}, + {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6cd3f10b01f0c31481fba8d302b61603a2acb37b9d30e1d14e0f5a58b7b18a31"}, + {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e8d8aad9402d3aa02fdc5ca2fe68bcb9fdfe1f77b40b10410a94c7f408b664d"}, + {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:38e3c4f80196b4f6c3a85d134a534a56f52da9cb8d8e7af1b79a32eefee73a00"}, + {file = "aiohttp-3.10.11-cp313-cp313-win32.whl", hash = "sha256:fc31820cfc3b2863c6e95e14fcf815dc7afe52480b4dc03393c4873bb5599f71"}, + {file = "aiohttp-3.10.11-cp313-cp313-win_amd64.whl", hash = "sha256:4996ff1345704ffdd6d75fb06ed175938c133425af616142e7187f28dc75f14e"}, + {file = "aiohttp-3.10.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:74baf1a7d948b3d640badeac333af581a367ab916b37e44cf90a0334157cdfd2"}, + {file = "aiohttp-3.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:473aebc3b871646e1940c05268d451f2543a1d209f47035b594b9d4e91ce8339"}, + {file = "aiohttp-3.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c2f746a6968c54ab2186574e15c3f14f3e7f67aef12b761e043b33b89c5b5f95"}, + {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d110cabad8360ffa0dec8f6ec60e43286e9d251e77db4763a87dcfe55b4adb92"}, + {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0099c7d5d7afff4202a0c670e5b723f7718810000b4abcbc96b064129e64bc7"}, + {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0316e624b754dbbf8c872b62fe6dcb395ef20c70e59890dfa0de9eafccd2849d"}, + {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a5f7ab8baf13314e6b2485965cbacb94afff1e93466ac4d06a47a81c50f9cca"}, + {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c891011e76041e6508cbfc469dd1a8ea09bc24e87e4c204e05f150c4c455a5fa"}, + {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9208299251370ee815473270c52cd3f7069ee9ed348d941d574d1457d2c73e8b"}, + {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:459f0f32c8356e8125f45eeff0ecf2b1cb6db1551304972702f34cd9e6c44658"}, + {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:14cdc8c1810bbd4b4b9f142eeee23cda528ae4e57ea0923551a9af4820980e39"}, + {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:971aa438a29701d4b34e4943e91b5e984c3ae6ccbf80dd9efaffb01bd0b243a9"}, + {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9a309c5de392dfe0f32ee57fa43ed8fc6ddf9985425e84bd51ed66bb16bce3a7"}, + {file = "aiohttp-3.10.11-cp38-cp38-win32.whl", hash = "sha256:9ec1628180241d906a0840b38f162a3215114b14541f1a8711c368a8739a9be4"}, + {file = "aiohttp-3.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:9c6e0ffd52c929f985c7258f83185d17c76d4275ad22e90aa29f38e211aacbec"}, + {file = "aiohttp-3.10.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cdc493a2e5d8dc79b2df5bec9558425bcd39aff59fc949810cbd0832e294b106"}, + {file = "aiohttp-3.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3e70f24e7d0405be2348da9d5a7836936bf3a9b4fd210f8c37e8d48bc32eca6"}, + {file = "aiohttp-3.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:968b8fb2a5eee2770eda9c7b5581587ef9b96fbdf8dcabc6b446d35ccc69df01"}, + {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deef4362af9493d1382ef86732ee2e4cbc0d7c005947bd54ad1a9a16dd59298e"}, + {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:686b03196976e327412a1b094f4120778c7c4b9cff9bce8d2fdfeca386b89829"}, + {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3bf6d027d9d1d34e1c2e1645f18a6498c98d634f8e373395221121f1c258ace8"}, + {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:099fd126bf960f96d34a760e747a629c27fb3634da5d05c7ef4d35ef4ea519fc"}, + {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c73c4d3dae0b4644bc21e3de546530531d6cdc88659cdeb6579cd627d3c206aa"}, + {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0c5580f3c51eea91559db3facd45d72e7ec970b04528b4709b1f9c2555bd6d0b"}, + {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fdf6429f0caabfd8a30c4e2eaecb547b3c340e4730ebfe25139779b9815ba138"}, + {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d97187de3c276263db3564bb9d9fad9e15b51ea10a371ffa5947a5ba93ad6777"}, + {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:0acafb350cfb2eba70eb5d271f55e08bd4502ec35e964e18ad3e7d34d71f7261"}, + {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c13ed0c779911c7998a58e7848954bd4d63df3e3575f591e321b19a2aec8df9f"}, + {file = "aiohttp-3.10.11-cp39-cp39-win32.whl", hash = "sha256:22b7c540c55909140f63ab4f54ec2c20d2635c0289cdd8006da46f3327f971b9"}, + {file = "aiohttp-3.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:7b26b1551e481012575dab8e3727b16fe7dd27eb2711d2e63ced7368756268fb"}, + {file = "aiohttp-3.10.11.tar.gz", hash = "sha256:9dc2b8f3dcab2e39e0fa309c8da50c3b55e6f34ab25f1a71d3288f24924d33a7"}, ] [package.dependencies] @@ -114,8 +129,7 @@ async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -propcache = ">=0.2.0" -yarl = ">=1.17.0,<2.0" +yarl = ">=1.12.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -145,57 +159,6 @@ files = [ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] -[[package]] -name = "ansible" -version = "8.5.0" -description = "Radically simple IT automation" -optional = false -python-versions = ">=3.9" -files = [ - {file = "ansible-8.5.0-py3-none-any.whl", hash = "sha256:2749032e26b0dbc9a694528b85fd89e7f950b8c7b53606f17dd997f23ac7cc88"}, - {file = "ansible-8.5.0.tar.gz", hash = "sha256:327c509bdaf5cdb2489d85c09d2c107e9432f9874c8bb5c0702a731160915f2d"}, -] - -[package.dependencies] -ansible-core = ">=2.15.5,<2.16.0" - -[[package]] -name = "ansible-core" -version = "2.15.13" -description = "Radically simple IT automation" -optional = false -python-versions = ">=3.9" -files = [ - {file = "ansible_core-2.15.13-py3-none-any.whl", hash = "sha256:e7f50bbb61beae792f5ecb86eff82149d3948d078361d70aedb01d76bc483c30"}, - {file = "ansible_core-2.15.13.tar.gz", hash = "sha256:f542e702ee31fb049732143aeee6b36311ca48b7d13960a0685afffa0d742d7f"}, -] - -[package.dependencies] -cryptography = "*" -importlib-resources = {version = ">=5.0,<5.1", markers = "python_version < \"3.10\""} -jinja2 = ">=3.0.0" -packaging = "*" -PyYAML = ">=5.1" -resolvelib = ">=0.5.3,<1.1.0" - -[[package]] -name = "ansible-vault" -version = "2.1.0" -description = "R/W an ansible-vault yaml file" -optional = false -python-versions = "*" -files = [ - {file = "ansible-vault-2.1.0.tar.gz", hash = "sha256:5ce8fdb5470f1449b76bf07ae2abc56480dad48356ae405c85b686efb64dbd5e"}, -] - -[package.dependencies] -ansible = "*" -setuptools = "*" - -[package.extras] -dev = ["black", "flake8", "isort[pyproject]", "pytest"] -release = ["twine"] - [[package]] name = "anyio" version = "4.7.0" @@ -244,6 +207,17 @@ files = [ six = ">=1.6.1,<2.0" wheel = ">=0.23.0,<1.0" +[[package]] +name = "async-property" +version = "0.2.2" +description = "Python decorator for async properties." +optional = false +python-versions = "*" +files = [ + {file = "async_property-0.2.2-py2.py3-none-any.whl", hash = "sha256:8924d792b5843994537f8ed411165700b27b2bd966cefc4daeefc1253442a9d7"}, + {file = "async_property-0.2.2.tar.gz", hash = "sha256:17d9bd6ca67e27915a75d92549df64b5c7174e9dc806b30a3934dc4ff0506380"}, +] + [[package]] name = "async-timeout" version = "5.0.1" @@ -322,37 +296,32 @@ lxml = ["lxml"] [[package]] name = "bittensor" -version = "7.4.0" +version = "8.5.1" description = "bittensor" optional = false python-versions = ">=3.9" files = [ - {file = "bittensor-7.4.0-py3-none-any.whl", hash = "sha256:fefa7336f2a7f0dc1edea53a5b1296f95503d9e1cc01cb00a445e6c7afc10d1c"}, - {file = "bittensor-7.4.0.tar.gz", hash = "sha256:235b3f5bb3d93f098a41a4f63d7676bd548debb0bb58f02a104704c0beb20ea2"}, + {file = "bittensor-8.5.1-py3-none-any.whl", hash = "sha256:8dbf9c389d10fd043dab5da163377a43ec2ae1b1715e819a3602e07d36304f94"}, + {file = "bittensor-8.5.1.tar.gz", hash = "sha256:f1bb033ba1e2641881d37f9d8cfebdcb7145ae20975861863710bdd17941cce4"}, ] [package.dependencies] aiohttp = ">=3.9,<4.0" -ansible = ">=8.5.0,<8.6.0" -ansible-vault = ">=2.1,<3.0" -backoff = "*" -certifi = ">=2024.7.4,<2024.8.0" +async-property = "0.2.2" +bittensor-cli = "*" +bittensor-commit-reveal = ">=0.1.0" +bittensor-wallet = ">=2.1.3" +bt-decode = "0.4.0" colorama = ">=0.4.6,<0.5.0" -cryptography = ">=42.0.5,<42.1.0" -ddt = ">=1.6.0,<1.7.0" -eth-utils = "<2.3.0" fastapi = ">=0.110.1,<0.111.0" -fuzzywuzzy = ">=0.18.0" msgpack-numpy-opentensor = ">=0.5.0,<0.6.0" munch = ">=2.5.0,<2.6.0" nest-asyncio = "*" netaddr = "*" -numpy = ">=1.26,<2.0" +numpy = ">=2.0.1,<2.1.0" packaging = "*" -password-strength = "*" pycryptodome = ">=3.18.0,<4.0.0" pydantic = ">=2.3,<3" -PyNaCl = ">=1.3,<2.0" python-Levenshtein = "*" python-statemachine = ">=2.1,<3.0" pyyaml = "*" @@ -361,17 +330,123 @@ retry = "*" rich = "*" scalecodec = "1.2.11" setuptools = ">=70.0.0,<70.1.0" -shtab = ">=1.6.5,<1.7.0" substrate-interface = ">=1.7.9,<1.8.0" -termcolor = "*" -tqdm = "*" uvicorn = "*" +websockets = ">=14.1" wheel = "*" [package.extras] -dev = ["aioresponses (==0.7.6)", "black (==24.3.0)", "coveralls (==3.3.1)", "ddt (==1.6.0)", "factory-boy (==3.3.0)", "flake8 (==7.0.0)", "freezegun (==1.5.0)", "httpx (==0.27.0)", "hypothesis (==6.81.1)", "mypy (==1.8.0)", "pytest (==7.2.0)", "pytest-asyncio (==0.23.7)", "pytest-cov (==4.0.0)", "pytest-mock (==3.12.0)", "pytest-rerunfailures (==10.2)", "pytest-split (==0.8.0)", "pytest-xdist (==3.0.2)", "ruff (==0.4.7)", "torch (>=1.13.1)", "types-retry (==0.9.9.4)"] +dev = ["aioresponses (==0.7.6)", "coveralls (==3.3.1)", "ddt (==1.6.0)", "factory-boy (==3.3.0)", "flake8 (==7.0.0)", "freezegun (==1.5.0)", "httpx (==0.27.0)", "hypothesis (==6.81.1)", "mypy (==1.8.0)", "pytest (==7.2.0)", "pytest-asyncio (==0.23.7)", "pytest-cov (==4.0.0)", "pytest-mock (==3.12.0)", "pytest-rerunfailures (==10.2)", "pytest-split (==0.8.0)", "pytest-xdist (==3.0.2)", "ruff (==0.4.7)", "torch (>=1.13.1)", "types-retry (==0.9.9.4)"] torch = ["torch (>=1.13.1)"] +[[package]] +name = "bittensor-cli" +version = "8.4.2" +description = "Bittensor CLI" +optional = false +python-versions = ">=3.9" +files = [ + {file = "bittensor-cli-8.4.2.tar.gz", hash = "sha256:43efc081ed2ecf4357bf5c5322ccd6f7d1a5110eb842cf138c75adb3f21686fd"}, + {file = "bittensor_cli-8.4.2-py3-none-any.whl", hash = "sha256:e7fc5ff510f039fa0cb9c0c701a56c4eb2b644befb019b1cd0fac29546bfb764"}, +] + +[package.dependencies] +aiohttp = ">=3.10.2,<3.11.0" +async-property = "0.2.2" +backoff = ">=2.2.1,<2.3.0" +bittensor-wallet = ">=2.1.3" +bt-decode = "0.4.0" +fuzzywuzzy = ">=0.18.0,<0.19.0" +GitPython = ">=3.0.0" +Jinja2 = "*" +netaddr = ">=1.3.0,<1.4.0" +numpy = ">=2.0.1" +pycryptodome = "*" +pytest = "*" +python-Levenshtein = "*" +PyYAML = ">=6.0.1,<6.1.0" +rich = ">=13.7,<14.0" +scalecodec = "1.2.11" +substrate-interface = ">=1.7.9,<1.8.0" +typer = ">=0.12,<1.0" +websockets = ">=14.1" +wheel = "*" + +[package.extras] +cuda = ["cubit (>=1.1.0)", "torch"] + +[[package]] +name = "bittensor-commit-reveal" +version = "0.1.0" +description = "" +optional = false +python-versions = ">=3.9" +files = [ + {file = "bittensor_commit_reveal-0.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e628b052ebdbd6893eb996a0d03b4c5e0823e42ee410ff5066018700a35539a"}, + {file = "bittensor_commit_reveal-0.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:245a7e0defb79f6a45c243f72739ee5c58840cba51342d28322c6d7a73f475b9"}, + {file = "bittensor_commit_reveal-0.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2bb23935ac60a981bfb3d83397b83e858c0b69a11806969cf56486f5ebc90943"}, + {file = "bittensor_commit_reveal-0.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4917b215c24b10bd80c84db921113b9cd1346ca7dcaca75e286905ede81a3b18"}, + {file = "bittensor_commit_reveal-0.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c46cee3e5fa5fc9e6f6a444793062855f40495c1a00b52df6508e4449ac5e89f"}, + {file = "bittensor_commit_reveal-0.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d56407b879dcf82bdde5eaefede43c8891e122fefc03a32c77a063dfc52e0c8"}, + {file = "bittensor_commit_reveal-0.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8509250549b6f5c475a9150e941b28fc66e82f30b27fe078fd80fa840943bb7b"}, + {file = "bittensor_commit_reveal-0.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bed04f82f162121747cfd7f51bb5d625dda0bf763a0699054565f255d219a9c2"}, + {file = "bittensor_commit_reveal-0.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25af2d9c82cacc4278095460493430d36070cb2843c0aa54b1c563788d0742eb"}, + {file = "bittensor_commit_reveal-0.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8f530793274698aaf4ac7cc8f24e915749d8156df8302c9e1e16446177b429d"}, + {file = "bittensor_commit_reveal-0.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e52955d652b61f091310e2b9b232d26b9e586a928e3b414a09a1b6615e9cc7a0"}, + {file = "bittensor_commit_reveal-0.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7be8c8f79dea2e137f5add6ee4711447c4f5d43668be26616ab7c1cacf317e07"}, + {file = "bittensor_commit_reveal-0.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b88ecb6a0989c2200486e29419a8e7d3b3f7918bdbde4ec04dbb4464abdee08f"}, + {file = "bittensor_commit_reveal-0.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac015f9eefa9dbddd2875cd7214e3a0bc2e394a2915772e655bdcc5c0af67de"}, + {file = "bittensor_commit_reveal-0.1.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18062ccab9bd8c66eee741bab9c047ec302eede563b16d4a960bcef6ef4ab368"}, + {file = "bittensor_commit_reveal-0.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957eff5b5b760dd8267d5f3c23c1aab4155505aa15bc06e044ffca483979f3d1"}, + {file = "bittensor_commit_reveal-0.1.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df0ef502f07804bff843a7e6318f95b9a9ca5bcc9c75e501040202b38d09d8b5"}, + {file = "bittensor_commit_reveal-0.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8706ae43e3455913d210c7ab5fc0110595e45b8fa3964441e2842fc7975aec3"}, + {file = "bittensor_commit_reveal-0.1.0.tar.gz", hash = "sha256:1c8bb8d77f6279988902c5c28361cc460167829c63ffa8d788209f8810933211"}, +] + +[package.extras] +dev = ["maturin (==1.7.0)"] + +[[package]] +name = "bittensor-wallet" +version = "2.1.3" +description = "" +optional = false +python-versions = ">=3.9" +files = [ + {file = "bittensor_wallet-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07462933ace69992079013ff7497c5f67e94b5d1adbada4ff08c5b18ebc18afe"}, + {file = "bittensor_wallet-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23110aca2d8f3e58c0b7c7bb58a74a66227aea85b30e4fa3eb616f5a13a0f659"}, + {file = "bittensor_wallet-2.1.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a5199c84e9d33ccec451294f89d9354b61568a0b623ceee995f588ccdc14ea5c"}, + {file = "bittensor_wallet-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a34e524f21e8c7bd8edfd54db530480b81f48d2334a0a11b86ea22d9e349137c"}, + {file = "bittensor_wallet-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45a1556e02304e1e8e91059cc11bb8346fa2334ac039f79bb1e6f630fa26657f"}, + {file = "bittensor_wallet-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9399c753c37dbe63430c5aff4fba0a038e0349dde0061d623506a24e3b4d2cec"}, + {file = "bittensor_wallet-2.1.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1e2f0d03a21a0c54b1f8cd59f34941d7a60df490e9aab7d7776b03f290de6074"}, + {file = "bittensor_wallet-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24c446b0af4c9ffc3ac122f97a1de25b283c877aa49892748ad06a8a61a74e13"}, + {file = "bittensor_wallet-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eafd9c82720644b3eeac2f68deaa9cec4cf175836b16c89206d98ce22590e8e"}, + {file = "bittensor_wallet-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f5122b05d8eede2bfc2eb242214b75ecab08f0da5d4f7547ed01ad253349e019"}, + {file = "bittensor_wallet-2.1.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:88020b18aa2f91b336a6f04354b7acb124701f9678d74e41f5ffb64a7e1e5731"}, + {file = "bittensor_wallet-2.1.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb7dd2ed4c12e617574b7302a6c20fb8e915477ce2942627f624293b5de9a003"}, + {file = "bittensor_wallet-2.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de47dea7d283e83449465f9780d4dde608fe09da45d6ef8c795806e49ccf4fd2"}, + {file = "bittensor_wallet-2.1.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e35adc5303b2186df889e07c79bf0bc074df382df49e6c216a8feb27f00453a4"}, + {file = "bittensor_wallet-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ffd5bd02ca772151aca8d1883d3536718d170e9fd095593d6e7860b6bd4ac5b"}, + {file = "bittensor_wallet-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:75ec884ee9ea4117cae3d18f90044b76daa47463294b94f56260c700ee95e7e5"}, + {file = "bittensor_wallet-2.1.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e1ee5be2b8b4c8fa36bc1750da723152dd7c96c4e606121146913adf83cf667"}, + {file = "bittensor_wallet-2.1.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b879438249fc70dc2f7b8b579566c526dde68c2baa31d12ee3c4fcd4087f7b9"}, + {file = "bittensor_wallet-2.1.3.tar.gz", hash = "sha256:41927d7e5d68fff1494cef5abd861ede0afc684dff366824b0806cfa3ce13af0"}, +] + +[package.dependencies] +cryptography = ">=43.0.1,<43.1.0" +eth-utils = "<2.3.0" +munch = ">=2.5.0,<2.6.0" +password-strength = "*" +py-bip39-bindings = "0.1.11" +rich = "*" +substrate-interface = ">=1.7.9,<1.8.0" +termcolor = "*" + +[package.extras] +dev = ["aioresponses (==0.7.6)", "ansible-vault (>=2.1,<3.0)", "coveralls (==3.3.1)", "ddt (==1.6.0)", "factory-boy (==3.3.0)", "flake8 (==7.0.0)", "freezegun (==1.5.0)", "httpx (==0.27.0)", "hypothesis (==6.81.1)", "maturin (==1.7.0)", "mypy (==1.8.0)", "py-bip39-bindings (==0.1.11)", "pytest (==7.2.0)", "pytest-asyncio (==0.23.7)", "pytest-cov (==4.0.0)", "pytest-mock (==3.12.0)", "pytest-rerunfailures (==10.2)", "pytest-split (==0.8.0)", "pytest-xdist (==3.0.2)", "ruff (==0.4.7)", "types-retry (==0.9.9.4)"] + [[package]] name = "black" version = "24.10.0" @@ -418,15 +493,122 @@ d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "bt-decode" +version = "0.4.0" +description = "A wrapper around the scale-codec crate for fast scale-decoding of Bittensor data structures." +optional = false +python-versions = ">=3.9" +files = [ + {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c176595c23f3d9a632b8a4fe71f8ed74e05be0ff4d447719eab3de686699c6b"}, + {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4a5232cc226d7c537303691dbb27c5c734cabcf51e6c74d641d1721a2d3a119c"}, + {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93dfa1c342a6fb3cbd199b46f511951174503c8405854de484390776ff94228a"}, + {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17f6f94d3dee3d9c9909e936b57bc87acef29de9b1b8d4157efd806bc7ff3eee"}, + {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba2d5f8ef69dde9880db38e45beb4ed965868d660f8de68d8cc7838d6b244295"}, + {file = "bt_decode-0.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8f76a6949edbb7bc9a095f1a732974db04ec39c671e188ee001998901b6cd460"}, + {file = "bt_decode-0.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6df00582855bc84c1cbb4f7f63900097b456a43fd92fd397466c85943c5ba9f2"}, + {file = "bt_decode-0.4.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:67547de47eb41026f3ec106f2681c45e34fc5d610dd462cbcca9885bf7581af5"}, + {file = "bt_decode-0.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fb100ff9d8688c1e5dd98f7aa721279f267408cf7079d8f2ca9ea1abd6c0edfc"}, + {file = "bt_decode-0.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:66b599c2af3a7a3f40af22fa3e6304bde56237242120cb37253e4a465dfd419c"}, + {file = "bt_decode-0.4.0-cp310-cp310-win32.whl", hash = "sha256:0635af47f0abd4a1c1d9566fb101c4b851c2499a8f8b53e37a496efcd69409da"}, + {file = "bt_decode-0.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:01421093b5e97751624de0113fb3da7fb50a1d70c883887555e73abff081ffcc"}, + {file = "bt_decode-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:e2dd446b5956c3c772cdcbfe08fe0d483e68dc07b1606cde5d39c689dffd736c"}, + {file = "bt_decode-0.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcbb0fb758460c5fe7e5276b4406dd15d22ff544d309dd4ebb8fc998ce30d51f"}, + {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:816f45a75dc78d6beafaf7cc02ab51d73a3dd1c91d4ba0e6b43aae3c637d793d"}, + {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:39d44102ea27a23644c262d98378ac0ac650e481508f5d6989b8b4e3fd638faf"}, + {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:82e959521c60bc48276a91a01bd97726820128a4f4670ae043da35ca11823ca3"}, + {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bdea70a4b83e46432999f7743d130dbd49ccf1974c87c87153f7ad3733f5ccea"}, + {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99b6cc694fe05037c1dca02111d25b2357fd460bea8d8ce9b2432e3ed1d049c"}, + {file = "bt_decode-0.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:645e82838b2e8d7b03686f5cee44e880c56bed3a9dbf2a530c818d1a63544967"}, + {file = "bt_decode-0.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cb32f5c5fda6cada107e3d82b5d760c87cd49075f28105de0900e495ee211659"}, + {file = "bt_decode-0.4.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:d2ecb71c8b40f3a4abd9c8fda54febffaa298eceafc12a47e9c0cf93e4ccbb8b"}, + {file = "bt_decode-0.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9b7691207021f023485d5adff6758bc0f938f80cf7e1ca05d291189e869217b5"}, + {file = "bt_decode-0.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:912957e7373014acf4203f3a701f4b820d9d7f5bee1f710298d7346f12bcff59"}, + {file = "bt_decode-0.4.0-cp311-cp311-win32.whl", hash = "sha256:fb47926e13f39663e62b4105b436abc84b913cb27edd621308f441cb405956ac"}, + {file = "bt_decode-0.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:001995ff6a20438c5542b13ae0af6458845381ccfd0ef484ae5f7e012c6fb383"}, + {file = "bt_decode-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ee9731ecf76ba4f60e10378b16d15bea826b41183ab208e32a9a7fd86d3b7c21"}, + {file = "bt_decode-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6e0ebd9e6f6e710fce9432d448a6add5b266f19af5ec518a2faf19ddd19ce3dc"}, + {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd898558c915dd9374a1860c1aee944cd6acb25f8e0f33f58d18eb989c49fab"}, + {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f87500550b030c3d265ab6847ef25f1e4f756b455605f1977329a665e41b330"}, + {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59fa64d5eff9fcc00f536e3ef74932f40aeff1335bd75a469bce90c1762451ae"}, + {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2be0732720588d047b00eb87e234dd83ebbdb717da8d704b8930b9ab580a6c3"}, + {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b4107e8b75966c5be0822a5f0525b568c94dbc1faa8d928090fa48daa329b45"}, + {file = "bt_decode-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:46e09e7c557fe753c20226ec4db887a4a1b520d36dc4d01eb5d2bd2e2846970e"}, + {file = "bt_decode-0.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e817fe5e805bc393b266909709660dc14bd34a671712da0087e164a760b928b4"}, + {file = "bt_decode-0.4.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:59f9a61789003c345b423f1728ee0d774f89cc41be0ab2af0f2ad6e2653084b5"}, + {file = "bt_decode-0.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:905715452ecf4ce204aa937ee8266ea539fc085377f92bd9506ec76dcd874347"}, + {file = "bt_decode-0.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2e85f5f12e6bb00253e194372d90e60f129d613f0ddedae659d3b9a3049a69cf"}, + {file = "bt_decode-0.4.0-cp312-cp312-win32.whl", hash = "sha256:ed4c3c4383c9903f371502c0d62ce88ecd2c531044e04deaeb60c827ae45ad8e"}, + {file = "bt_decode-0.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:68beccbb00f129b75d189d2ffc48fd430bf4eab8a456aab79615b17eec82437d"}, + {file = "bt_decode-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:88de7129c3323c36cd6cce28844fb475556a865ec6fc87934ec5deeb95ff2d86"}, + {file = "bt_decode-0.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:056e6245a2119b391306542134651df54df29569136be892411073fc10840c8e"}, + {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:faa76d0b8fcb0f9ae2107e8c6ae84ea670de81c0adda4967a52d4b7d1de8c605"}, + {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7a3ff15bfe86d482e642dfaa6e5581b65815e7663f337af7502b422fea2fdcc2"}, + {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa7687c01c516f84274a2e71ba717898eef095e08ec7125823f7a4e230bd46fe"}, + {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d3cf8cfff714600db01c6cd144906fe0a8be85293711e279b8089f6ccaffd71"}, + {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:983972ecc83bd0507e72ae316281960b7e26e31386525c7905f7cdb8fa3e7de1"}, + {file = "bt_decode-0.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:32e3950b120b8b59ae5ab70005ba9b5c7560a0e222e805f47878cb259a32ed39"}, + {file = "bt_decode-0.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66d906ac225e3cd169dde1e0af21e8d73e8ea7dea3f7e9afcdec501bced3d83a"}, + {file = "bt_decode-0.4.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:58bf09b004dc182748e285b5bc15ac6305af4ab9c318f995c443ba33bb61fbb6"}, + {file = "bt_decode-0.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c202f22152b3186cbc1c319250d6b0ecfe87cf9a4e8e90b19cc9f83786acdf1a"}, + {file = "bt_decode-0.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b6dd31b0947b7b15a36f7f9bfdb8ae30ffe3f3f97e0dc4d60bf79b9baf57f4e5"}, + {file = "bt_decode-0.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebb3b72146e7feb08e235d78457b597697708149d7410f184098b73c5ab38aa"}, + {file = "bt_decode-0.4.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9571680e6b74fab00cbd10dc255594692a9cdf615e33170d5a32112c1da8e3e4"}, + {file = "bt_decode-0.4.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dec8af1719ced86da6f7b1dcf70e1d480cfb86e2cf7530692d3e66ad1e16067d"}, + {file = "bt_decode-0.4.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46d2308e13615951f89ff7ba05364a2e3747626b29fd4ee39c085ea56cb5fe"}, + {file = "bt_decode-0.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0df0436d736544587002e0fa4fe3887b28cec8de4a9036c1ea776c560e966b8d"}, + {file = "bt_decode-0.4.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:579aba5010a078831af2025cd03df9d429fa35008ec46bc1561e6147e2c9769e"}, + {file = "bt_decode-0.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:039e880688d4c5f2ee090980649811b700593e21eccee520b294c07b85008bce"}, + {file = "bt_decode-0.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1a45173a6f0e48b28b190bfb250b6683984d115d70a6d2ff5102a2421d581de6"}, + {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4680c70defaa3bd1313a19808f3f87bad0fc3a2fff50ee9cadcb5983cc955a29"}, + {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ad241020b27648aae002d51ed78011ed4392057b9042409334dd8e7de3c79925"}, + {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:555d69a324809fc2fd8ba42dfa5838d99e21c359b593b4c7a1abefef13010ab0"}, + {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:811180a24a8bca2662610c378db18824ea5d27ce34851216ec4bc072f23fb3d3"}, + {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ba2eca99c4a80c3b3dba563b6b1ea0015d50b92d50c85605834bf3cd46316b"}, + {file = "bt_decode-0.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e7db5b96c9d9be14484818b2d048f115eb3c76d91a68242a43fd26dd4d73da29"}, + {file = "bt_decode-0.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:db9af85ca279781a91538a5f2600d5267eddab47ee0073ef045080a83f4ff3e6"}, + {file = "bt_decode-0.4.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:3625d23dccba53542842eab5eab5a17362a35b999c85aa675f690106f342b010"}, + {file = "bt_decode-0.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0a824aafdc2fffb5958c9ea221d9b6da5ce240c99704a20f7a50231cd9e66dd3"}, + {file = "bt_decode-0.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:084f3f97cd176f30baa415cd29a6ad1e35abdb0ff2ed6af238d5a1af921a3265"}, + {file = "bt_decode-0.4.0-cp39-cp39-win32.whl", hash = "sha256:dad1c2e4d8b4e45d2f5ccbf6bbad8c249a411d8df43fb036e2c3da56148a9f0b"}, + {file = "bt_decode-0.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:c7aa9acbd4c49543b0aa503367777e0290fd056ca1f8fa6e2c867739141d545c"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49cbf7ef7174d57b89c8e72d54749176da7f01926d963846042af7c141fc7c88"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7e85d5dfb4aaefa9dba9ed86b9dfc2efff35322053da2f774942a9da6d50486"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a061a29489eb9680a01085f87e575e7e69fbfdc2c533d361ab84486d65470986"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6def48997eac2b9aafde742c4c2a7d159623824e7f9d36bbfa95f12ba6354d5"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a5eee81c7a20bd2739f5867354afc38372b0307211a4c9a580bb99369f84835"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8914f5bd5bfe16e79fe6f8f94766d22635f1f4bef1567c545c22ecdf4f150313"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3b268f170bcf85e229078f3af589b977c56ed9b696fe9e1198c5d4c9607406f1"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:f3c54b14d914bf20669bbeedb97da18b3379c6d7f801404227519416cceda614"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a7733ff7bcded3211e3b64fb38a1c917543045a092153999ede98333af766d3c"}, + {file = "bt_decode-0.4.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e1036e0db9f75fb2c2c690bddd2a02d0e94347c13d906eb5dbbf22202f3fa46f"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9eaaee96683fc1694da1eb4ae732b166ac53c2606b35a4269050044bd20cb2e"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f432b9feceb7179f85b5e92fd4d7fe74b62aaac1d66e7a64c54f80b63d3480f"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0bf214c3a88841643f29b5d3e82fbd4cf57145ea6408509fe5d6247be024fcaf"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d69253f642a5f432206bc82aa7d3dbea1387c29b16211c838f71e4ca041bdc5"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:94b87373da3f96701878f60aa7953051999c58c3c8d88c392c879eb2daa40dad"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:50a6cc797aaf802061b1808c8a599e4416dd18c4afdc498c8b81a24da6039083"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:d22ee4640808452e98a7b2919a6e70b8f338cd3922547895093ce0ff6cc37f97"}, + {file = "bt_decode-0.4.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5f28274ba30e5d606535701affde5b71927d9cd2159206f237cdc75410d450d6"}, + {file = "bt_decode-0.4.0.tar.gz", hash = "sha256:5c7e6286a4f8b9b704f6a0c263ce0e8854fb95d94da5dff6e8835be6de04d508"}, +] + +[package.dependencies] +toml = "0.10.0" + +[package.extras] +dev = ["black (==23.7.0)", "maturin", "ruff (==0.4.7)"] +test = ["bittensor (==8.2.0)", "ddt (==1.6.0)", "pytest (==7.2.0)", "pytest-asyncio (==0.23.7)", "pytest-mock (==3.12.0)", "pytest-rerunfailures (==10.2)", "pytest-split (==0.8.0)", "pytest-xdist (==3.0.2)"] + [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, ] [[package]] @@ -521,127 +703,114 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.4.0" +version = "3.4.1" 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"}, +python-versions = ">=3.7" +files = [ + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, ] [[package]] name = "click" -version = "8.1.7" +version = "8.1.8" 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"}, + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, ] [package.dependencies] @@ -660,43 +829,38 @@ files = [ [[package]] name = "cryptography" -version = "42.0.8" +version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, - {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, - {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, - {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, - {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, - {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, - {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] [package.dependencies] @@ -709,7 +873,7 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -827,17 +991,6 @@ toolz = ">=0.8.0" [package.extras] cython = ["cython"] -[[package]] -name = "ddt" -version = "1.6.0" -description = "Data-Driven/Decorated Tests" -optional = false -python-versions = "*" -files = [ - {file = "ddt-1.6.0-py2.py3-none-any.whl", hash = "sha256:e3c93b961a108b4f4d5a6c7f2263513d928baf3bb5b32af8e1c804bfb041141d"}, - {file = "ddt-1.6.0.tar.gz", hash = "sha256:f71b348731b8c78c3100bffbd951a769fbd439088d1fdbb3841eee019af80acd"}, -] - [[package]] name = "decorator" version = "5.1.1" @@ -975,13 +1128,13 @@ test = ["hypothesis (>=4.43.0)", "mypy (==0.971)", "pytest (>=7.0.0)", "pytest-x [[package]] name = "eval-type-backport" -version = "0.2.0" +version = "0.2.2" description = "Like `typing._eval_type`, but lets older Python versions use newer typing features." optional = false python-versions = ">=3.8" files = [ - {file = "eval_type_backport-0.2.0-py3-none-any.whl", hash = "sha256:ac2f73d30d40c5a30a80b8739a789d6bb5e49fdffa66d7912667e2015d9c9933"}, - {file = "eval_type_backport-0.2.0.tar.gz", hash = "sha256:68796cfbc7371ebf923f03bdf7bef415f3ec098aeced24e054b253a0e78f7b37"}, + {file = "eval_type_backport-0.2.2-py3-none-any.whl", hash = "sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a"}, + {file = "eval_type_backport-0.2.2.tar.gz", hash = "sha256:f0576b4cf01ebb5bd358d02314d31846af5e07678387486e2c798af0e7d849c1"}, ] [package.extras] @@ -1076,13 +1229,13 @@ pyflakes = ">=3.2.0,<3.3.0" [[package]] name = "flatbuffers" -version = "24.3.25" +version = "24.12.23" description = "The FlatBuffers serialization format for Python" optional = false python-versions = "*" files = [ - {file = "flatbuffers-24.3.25-py2.py3-none-any.whl", hash = "sha256:8dbdec58f935f3765e4f7f3cf635ac3a77f83568138d6a2311f524ec96364812"}, - {file = "flatbuffers-24.3.25.tar.gz", hash = "sha256:de2ec5b203f21441716617f38443e0a8ebf3d25bf0d9c0bb0ce68fa00ad546a4"}, + {file = "flatbuffers-24.12.23-py2.py3-none-any.whl", hash = "sha256:c418e0d48890f4142b92fd3e343e73a48f194e1f80075ddcc5793779b3585444"}, + {file = "flatbuffers-24.12.23.tar.gz", hash = "sha256:2910b0bc6ae9b6db78dd2b18d0b7a0709ba240fb5585f286a3a2b30785c22dac"}, ] [[package]] @@ -1236,13 +1389,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.10.0" +version = "2024.12.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.10.0-py3-none-any.whl", hash = "sha256:03b9a6785766a4de40368b88906366755e2819e758b83705c88cd7cb5fe81871"}, - {file = "fsspec-2024.10.0.tar.gz", hash = "sha256:eda2d8a4116d4f2429db8550f2457da57279247dd930bb12f821b58391359493"}, + {file = "fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2"}, + {file = "fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f"}, ] [package.extras] @@ -1518,13 +1671,13 @@ typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "t [[package]] name = "identify" -version = "2.6.3" +version = "2.6.4" description = "File identification library for Python" optional = false python-versions = ">=3.9" files = [ - {file = "identify-2.6.3-py2.py3-none-any.whl", hash = "sha256:9edba65473324c2ea9684b1f944fe3191db3345e50b6d04571d10ed164f8d7bd"}, - {file = "identify-2.6.3.tar.gz", hash = "sha256:62f5dae9b5fef52c84cc188514e9ea4f3f636b1d8799ab5ebc475471f9e47a02"}, + {file = "identify-2.6.4-py2.py3-none-any.whl", hash = "sha256:993b0f01b97e0568c179bb9196391ff391bfb88a99099dbf5ce392b68f42d0af"}, + {file = "identify-2.6.4.tar.gz", hash = "sha256:285a7d27e397652e8cafe537a6cc97dd470a970f48fb2e9d979aa38eae5513ac"}, ] [package.extras] @@ -1567,21 +1720,6 @@ perf = ["ipython"] test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] type = ["pytest-mypy"] -[[package]] -name = "importlib-resources" -version = "5.0.7" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.6" -files = [ - {file = "importlib_resources-5.0.7-py3-none-any.whl", hash = "sha256:2238159eb743bd85304a16e0536048b3e991c531d1cd51c4a834d1ccf2829057"}, - {file = "importlib_resources-5.0.7.tar.gz", hash = "sha256:4df460394562b4581bb4e4087ad9447bd433148fba44241754ec3152499f1d1b"}, -] - -[package.extras] -docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler", "pytest-flake8", "pytest-mypy"] - [[package]] name = "iniconfig" version = "2.0.0" @@ -1609,13 +1747,13 @@ colors = ["colorama (>=0.4.6)"] [[package]] name = "jinja2" -version = "3.1.4" +version = "3.1.5" 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"}, + {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, + {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, ] [package.dependencies] @@ -2390,49 +2528,55 @@ yaml = ["PyYAML (>=5.1.0)"] [[package]] name = "mypy" -version = "1.13.0" +version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, - {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, - {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, - {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, - {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, - {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, - {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, - {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, - {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, - {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, - {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, - {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, - {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, - {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, - {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, - {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, - {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, - {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, - {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, - {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, - {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, - {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b"}, + {file = "mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427"}, + {file = "mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f"}, + {file = "mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1"}, + {file = "mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e"}, + {file = "mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89"}, + {file = "mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9"}, + {file = "mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd"}, + {file = "mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7084fb8f1128c76cd9cf68fe5971b37072598e7c31b2f9f95586b65c741a9d31"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f845a00b4f420f693f870eaee5f3e2692fa84cc8514496114649cfa8fd5e2c6"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44bf464499f0e3a2d14d58b54674dee25c031703b2ffc35064bd0df2e0fac319"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c99f27732c0b7dc847adb21c9d47ce57eb48fa33a17bc6d7d5c5e9f9e7ae5bac"}, + {file = "mypy-1.14.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bce23c7377b43602baa0bd22ea3265c49b9ff0b76eb315d6c34721af4cdf1d9b"}, + {file = "mypy-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:8edc07eeade7ebc771ff9cf6b211b9a7d93687ff892150cb5692e4f4272b0837"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb"}, + {file = "mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60"}, + {file = "mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c"}, + {file = "mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1"}, + {file = "mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6"}, ] [package.dependencies] -mypy-extensions = ">=1.0.0" +mypy_extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.6.0" +typing_extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -2519,47 +2663,56 @@ files = [ [[package]] name = "numpy" -version = "1.26.4" +version = "2.0.2" 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"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, + {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, + {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, + {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, + {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, + {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, + {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, + {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, + {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, + {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, ] [[package]] @@ -2935,13 +3088,13 @@ xml = ["lxml (>=4.9.2)"] [[package]] name = "pandas-market-calendars" -version = "4.4.2" +version = "4.5.0" description = "Market and exchange trading calendars for pandas" optional = false python-versions = ">=3.8" files = [ - {file = "pandas_market_calendars-4.4.2-py3-none-any.whl", hash = "sha256:52a0fea562113d511f3f1ae372e2a86e4a37147dacec9644094ff6f88aee8d53"}, - {file = "pandas_market_calendars-4.4.2.tar.gz", hash = "sha256:4261a2c065565de1cd3646982b2e206e1069714b8140878dd6eba972546dfbcb"}, + {file = "pandas_market_calendars-4.5.0-py3-none-any.whl", hash = "sha256:ed38d6d4d8ca02d3e6c1fc996fdbac9677906d85b88e1c2f45b1200f6e20231a"}, + {file = "pandas_market_calendars-4.5.0.tar.gz", hash = "sha256:3a09285594861ffb3d4a6700854ea4574dcab290b4ab78eeec55e33992294643"}, ] [package.dependencies] @@ -3165,32 +3318,32 @@ files = [ [[package]] name = "psutil" -version = "6.1.0" +version = "6.1.1" 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"}, + {file = "psutil-6.1.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8"}, + {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777"}, + {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8df0178ba8a9e5bc84fed9cfa61d54601b371fbec5c8eebad27575f1e105c0d4"}, + {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:1924e659d6c19c647e763e78670a05dbb7feaf44a0e9c94bf9e14dfc6ba50468"}, + {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:018aeae2af92d943fdf1da6b58665124897cfc94faa2ca92098838f83e1b1bca"}, + {file = "psutil-6.1.1-cp27-none-win32.whl", hash = "sha256:6d4281f5bbca041e2292be3380ec56a9413b790579b8e593b1784499d0005dac"}, + {file = "psutil-6.1.1-cp27-none-win_amd64.whl", hash = "sha256:c777eb75bb33c47377c9af68f30e9f11bc78e0f07fbf907be4a5d70b2fe5f030"}, + {file = "psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8"}, + {file = "psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3"}, + {file = "psutil-6.1.1-cp36-cp36m-win32.whl", hash = "sha256:384636b1a64b47814437d1173be1427a7c83681b17a450bfc309a1953e329603"}, + {file = "psutil-6.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8be07491f6ebe1a693f17d4f11e69d0dc1811fa082736500f649f79df7735303"}, + {file = "psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53"}, + {file = "psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649"}, + {file = "psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5"}, ] [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"] +dev = ["abi3audit", "black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] test = ["pytest", "pytest-xdist", "setuptools"] [[package]] @@ -3206,105 +3359,70 @@ files = [ [[package]] name = "py-bip39-bindings" -version = "0.2.0" +version = "0.1.11" description = "Python bindings for tiny-bip39 RUST crate" optional = false -python-versions = ">=3.8" +python-versions = "*" files = [ - {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a9379172311aa9cdca13176fa541a7a8d5c99bb36360a35075b1687ca2a68f8"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f423282376ef9f080d52b213aa5800b78ba4a5c0da174679fe1989e632fd1def"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c61f08ee3a934932fb395a01b5f8f22e530e6c57a097fab40571ea635e28098"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8254c1b630aea2d8d3010f7dae4ed8f55f0ecc166122314b76c91541aeeb4df0"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e68c0db919ebba87666a947efafa92e41beeaf19b254ce3c3787085ab0c5829"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d36d468abc23d31bf19e3642b384fe28c7600c96239d4436f033d744a9137079"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f5ac37b6c6f3e32397925949f9c738e677c0b6ac7d3aa01d813724d86ce9045e"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8a1f2353c7fdbec4ea6f0a6a088cde076523b3bfce193786e096c4831ec723bb"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cb05d97ed2d018a08715ff06051c8de75c75b44eb73a428aaa204b56ce69d8f4"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-win32.whl", hash = "sha256:588ec726717b3ceaabff9b10d357a3a042a9a6cc075e3a9e14a3d7ba226c5ddf"}, - {file = "py_bip39_bindings-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:4e5e2af6c4b6a3640648fb28c8655b4a3275cee9a5160de8ec8db5ab295b7ec9"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2af7c8dedaa1076002872eda378153e053e4c9f5ce39570da3c65ce7306f4439"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:08e03bc728aa599e3cfac9395787618308c8b8e6f35a9ee0b11b73dcde72e3fc"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f052e5740d500e5a6a24c97e026ce152bbee58b56f2944ed455788f65658884"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd441833b21a5da2ccfebbdf800892e41282b24fc782eabae2a576e3d74d67f8"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f39ac5d74640d1d48c80404e549be9dc5a8931383e7f94ee388e4d972b571f42"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55ee7185bb1b5fb5ec4abcdea1ad89256dc7ee7e9a69843390a98068832169d6"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:42a00be8009d3c396bc9719fc743b85cb928cf163b081ad6ead8fc7c9c2fefdb"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ccc54690103b537f6650a8053f905e56772ae0aeb7e456c062a290357953f292"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:59a954b4e22e3cb3da441a94576002eaaba0b9ad75956ebb871f9b8e8bd7044a"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:54ac4841e7f018811b0ffa4baae5bce82347f448b99c13b030fb9a0c263efc3d"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2d1cdceebf62c804d53ff676f14fcadf43eeac7e8b10af2058f9387b9417094d"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-win32.whl", hash = "sha256:be0786e712fb32efc55f06270c3da970e667dcec7f116b3defba802e6913e834"}, - {file = "py_bip39_bindings-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:82593f31fb59f5b42ffdd4b177e0472ec32b178321063a93f6d609d672f0a087"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c763de71a7c83fcea7d6058a516e8ee3fd0f7111b6b02173381c35f48d96b090"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c61f65286fe314c28a4cf78f92bd549dbcc8f2dad99034ec7b47a688b2695cae"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:287301a2406e18cfb42bcc1b38cbd390ed11880cec371cd45471c00f75c3db8c"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:69c55c11228f91de55415eb31d5e5e8007b0544a48e2780e521a15a3fb713e8f"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ec5e6adb8ea6ffa22ed701d9749a184a203005538e276dcd2de183f27edebef"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831b0649d603b2e7905e09e39e36955f756abb19200beb630afc168b5c03d681"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:629399c400d605fbcb8de5ea942634ac06940e733e43753e0c23aee96fee6e45"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:15daa05fa85564f3ef7f3251ba9616cfc48f48d467cbecaf241194d0f8f62194"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:236aa7edb9ad3cade3e554743d00a620f47a228f36aa512dd0ee2fa75ea21c44"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:677ad9a382e8c2e73ca61f357a9c20a45885cd407afecc0c6e6604644c6ddfdc"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5f3b7bc29eda6ad7347caf07a91941a1c6a7c5c94212ffec7b056a9c4801911e"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-win32.whl", hash = "sha256:41f12635c5f0af0e406054d3a3ba0fad2045dfed461f43182bfa24edf11d90ca"}, - {file = "py_bip39_bindings-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:e3a4f2e05b6aaabbe3e59cebab72b57f216e118e5e3f167d93ee9b9e2257871b"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:21eed9f92eaf9746459cb7a2d0c97b98c885c51a279ec5bbf0b7ff8c26fe5bcc"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:350e83133f4445c038d39ada05add91743bbff904774b220e5b143df4ca7c4c3"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c46c3aca25f0c9840303d1fc16ad21b3bc620255e9a09fe0f739108419029245"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57bd5454a3f4cad68ebb3b5978f166cb01bf0153f39e7bfc83af99399f142374"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8039f96b52b4ab348e01459e24355b62a6ad1d6a6ab9b3fcb40cfc404640ca9f"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6919cd972bad09afacd266af560379bafc10f708c959d2353aea1584019de023"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4737db37d8800eb2de056b736058b7d3f2d7c424320d26e275d9015b05b1f562"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:98df51a42035466cab5dfb69faec63c2e666c391ff6746a8603cc9cabfcebe24"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d55c6af3cebb5c640ff12d29d7ca152d2b8188db49b0a53fc52fd2a748a7e231"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:eae5c4956613134ec5abc696121272a6ce7107af1509d8cdea3e24db1dff351b"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:071c4e67e9ae4a5ae12d781483f3a46d81d6b20be965dade39044ed0f89df34a"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7642f598e9cd7caddcc2f57f50335a16677c02bb9a7c9bb01b1814ddab85bb5"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0d0cff505237fd8c7103243f242610501afcd8a917ce484e50097189a7115c55"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fec3d7b30980978bd73103e27907ca37766762c21cfce1abcc6f9032d54274f"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:876006fa8936ad413d2f53e67246478fc94c19d38dc45f6bfd5f9861853ac999"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e6064feb105ed5c7278d19e8c4e371710ce56adcdd48e0c5e6b77f9b005201b9"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0cb7a39bd65455c4cc3feb3f8d5766644410f32ac137aeea88b119c6ebe2d58b"}, - {file = "py_bip39_bindings-0.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:58743e95cedee157a545d060ee401639308f995badb91477d195f1d571664b65"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84f4c53eab32476e3a9dd473ad4e0093dd284e7868da886d37a0be9e67ec7509"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e219d724c39cbaaabab1d1f10975399d46ba83a228437680dc29ccb7c8b4d38d"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fda7efd3befc614966169c10a4d5f60958698c13d4d0b97f069540220b45544"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5319b6ad23e46e8521fa23c0204ba22bbc5ebc5002f8808182b07c216223b8ed"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1b1de6b2e12a7992aa91501e80724b89a4636b91b22a2288bae5c417e358466"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:bae82c4505a79ed7f621d45e9ea225e7cd5e0804ce4c8022ab7a2b92bd007d53"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:d42d44532f395c59059551fd030e91dd39cbe1b30cb7a1cf7636f9a6a6a36a94"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a29bca14abb51449bd051d59040966c6feff43b01f6b8a9669d876d7195d215f"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e7cb5aefdbc142b5c9b56b2c89c0112fd2288d52be8024cf1f1b66a4b84e3c83"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-win32.whl", hash = "sha256:e846c0eebeb0b684da4d41ac0751e510f91d7568cc9bc085cb93aa50d9b1ee6e"}, - {file = "py_bip39_bindings-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0a2024c9e9a5b9d90ab9c1fdaddd1abb7e632ef309efc4b89656fc25689c4456"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e3438f2568c1fdd8862a9946800570dbb8665b6c46412fa60745975cd82083a"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d5339d0b99d2ce9835f467ed3790399793ed4d51982881ff9c1f854649055d42"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:856b69bc125c40264bf9e749efc1b66405b27cfc4c7f96cd3c5e6a657b143859"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91cffd83189f42f2945693786104c51fa775ba8f09c532bf8c504916d6ddb565"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c72195aa802a36ad81bcc07fc23d59b83214511b1569e5cb245402a9209614e7"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a5224fc1417d35413f914bbe414b276941dd1d03466ed8a8a259dc4fa330b60c"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:86265b865bcacd3fcd30f89012cd248142d3eb6f36785c213f00d2d84d41e6fc"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:96337e30589963b6b849415e0c1dc9fe5c671f51c1f10e10e40f825460078318"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:07f2cd20581104c2bc02ccf90aaeb5e31b7dda2bbdb24afbaef69d410eb18bf0"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-win32.whl", hash = "sha256:d26f9e2007c1275a869711bae2d1f1c6f99feadc3ea8ebb0aed4b69d1290bfa9"}, - {file = "py_bip39_bindings-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3e79ad1cbf5410db23db6579111ed27aa7fac38969739040a9e3909a10d303fc"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2491fc1a1c37052cf9538118ddde51c94a0d85804a6d06fddb930114a8f41385"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5ecf247c9ea0c32c37bdde2db616cf3fff3d29a6b4c8945957f13e4c9e32c71a"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ce39808c717b13c02edca9eea4d139fc4d86c01acad99efb113b04e9639e2b9"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c5f38b01283e5973b1dfcdedc4e941c463f89879dc5d86463e77e816d240182"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fb1503c87e3d97f6802b28bd3b808ce5f0d88b7a38ed413275616d1962f0a6d"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e9ae6318f14bf8683cc11714516a04ac60095eab1aaf6ca6d1c99d508e399c64"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:7be4ac068391c80fdee956f7c4309533fcf7a4fae45dec46179af757961efefc"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e26059b46eff40ccb282966c49c475633cd7d3a1c08780fff3527d2ff247a014"}, - {file = "py_bip39_bindings-0.2.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e8a63d04f68269e7e42219b30ff1e1e013f08d2fecef3f39f1588db512339509"}, - {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b85cb77708a4d1aceac8140604148c97894d3e7a3a531f8cfb82a85c574e4ac"}, - {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57a0c57a431fcd9873ae3d00b6227e39b80e63d9924d74a9f34972fd9f2e3076"}, - {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28bc089c7a7f22ac67de0e9e8308873c151cac9c5320c610392cdcb1c20e915e"}, - {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bfcec453c1069e87791ed0e1bc7168bbc3883dd40b0d7b35236e77dd0b1411c0"}, - {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:850cd2b2341a5438ae23b53054f1130f377813417f1fbe56c8424224dad0a408"}, - {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:424a2df31bcd3c9649598fc1ea443267db724754f9ec19ac3bd2c42542643043"}, - {file = "py_bip39_bindings-0.2.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:06fe0f8bb2bd28266bf5182320b3f0cef94b103e03e81999f67cae194b7ea097"}, - {file = "py_bip39_bindings-0.2.0.tar.gz", hash = "sha256:38eac2c2be53085b8c2a215ebf12abcdaefee07bc8e00d7649b6b27399612b83"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:324a7363f8b49201ebe1cc72d970017ec5139f8a5ddf605fa2774904eb7f08a1"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:77173b83c7ade4ca3c91fae0da9c9b1bc5f4c6819baa2276feacd5abec6005fa"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84e5177fb3d3b9607f5d7d526a89f91b35687fcc34b643fc96cd168a0ae025cb"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ecd1cfb17f0b1bb56f0b1de5c533ff9830a60b5d657846b8cf500ff9fca8b3"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3408dc0809fca5691f9c02c8292d62590d90de4f02a4b2dcab35817fa857a71"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_28_armv7l.whl", hash = "sha256:d6f0eda277c6d0ef28cc83fd3f59a0f745394ea1e2807f2fea49186084b3d47d"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:963357db40dc7a816d55097a85929cae18c6174c5bedf0410f6e72181270b2b1"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:be06dc751be86cbd72cd71e318979d3ab27cee12fd84d1e5e4e84575c5c9355d"}, + {file = "py_bip39_bindings-0.1.11-cp310-none-win32.whl", hash = "sha256:b4e05b06831874fa8715bdb128ea776674ad708858a4b3b1a27e5710859b086d"}, + {file = "py_bip39_bindings-0.1.11-cp310-none-win_amd64.whl", hash = "sha256:e01a03e858a648d294bcf063368bf09027efa282f5192abddaf7af69c5e2a574"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:27cce22727e28705a660464689ade6d2cdad4e622bead5bde2ffa53c4f605ee5"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:cdf35d031587296dcbdb22dbc67f2eaf5b5df9d5036b77fbeb93affbb9eec8d3"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2fd5b926686207752d5f2e2ff164a9489b3613239d0967362f10c2fbd64eb018"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba84c38962bffdaea0e499245731d669cc21d1280f81ace8ff60ed3550024570"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9024ec3c4a3db005b355f9a00602cede290dec5e9c7cf7dd06a26f620b0cf99"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_28_armv7l.whl", hash = "sha256:ce028c8aef51dec2a85f298461b2988cca28740bf3cc23472c3469d3f853714e"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:51882cd0fa7529173b3543c089c24c775f1876ddf48f10e60f2ed07ad2af5cae"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ee776f3b33b2d71fee48679951f117e3d1f052449ec2fcb184f3c64a4c77e4f"}, + {file = "py_bip39_bindings-0.1.11-cp311-none-win32.whl", hash = "sha256:d8b722e49562810f94eb61c9efa172f327537c74c37da3e86b161f7f444c51bf"}, + {file = "py_bip39_bindings-0.1.11-cp311-none-win_amd64.whl", hash = "sha256:be934052497f07605768e2c7184e4f4269b3e2e77930131dfc9bdbb791e6fdf4"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:afa9c5762cfaec01141f478a9c3132de01ec3890ff2e5a4013c79d3ba3aff8bb"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a3af7c1f955c6bbd613c6b38d022f7c73896acaf0ecc972ac0dee4b952e14568"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6aed3e86f105a36676e8dd0c8bc3f611a81b7ba4309b22a77fdc0f63b260e094"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d202f051cf063abae3acd0b74454d9d7b1dbeaf466ef7cb47a34ccedac845b62"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae120b5542fecf97aa3fdb6a526bac1004cb641bc9cc0d0030c6735dc2156072"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:baf896aabb3bec42803015e010c121c8a3210b20184f37aaa6e400ae8e877e60"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e4d45324c598197dbddac10a0298197ca2587fa7b09d1450697517988a29d515"}, + {file = "py_bip39_bindings-0.1.11-cp312-none-win32.whl", hash = "sha256:92abce265b0f2d8c5830441aff06b7b4f9426088a3de39624b12f3f9ff9fc2eb"}, + {file = "py_bip39_bindings-0.1.11-cp312-none-win_amd64.whl", hash = "sha256:6794187229eb0b04d0770f0fba936f0c5c598f552848a398ed5af9a61638cacb"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:76fc141ed154ccef9c36d5e2eb615565f2e272a43ed56edbdda538840b597187"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:3837f7040e732f7be49da5f595f147de2304e92a67267b12d5aa08a9bb02dd4b"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82de90eabe531095d4e4721ea1546873f0161c101c30b43dcf0a7bbd9cdcce69"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19794bafd088cfb50f99b04f3710c895756fe25ec342eaea0b5c579512493b61"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_28_armv7l.whl", hash = "sha256:8b9aa564a0081c360776b2230472475bd2971ddbe8f99ed7d8676c0ab3b2e0e4"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f55ab4fc519b8a9b80b28e02756788b9da037a2484e42282497eb9a253e5a58"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:cd1b874bc812866804a40242cdb1303de9caeb0ed261852dfbb5cbce94db31a4"}, + {file = "py_bip39_bindings-0.1.11-cp37-none-win32.whl", hash = "sha256:aa643eae0ebc185e50fcbc088210930f2cb4b30145dfd18a2b031451ce3edb03"}, + {file = "py_bip39_bindings-0.1.11-cp37-none-win_amd64.whl", hash = "sha256:e68673dbe4d2d99f64e493ac1369ac39b0bd9266dddefe476802d853f9637906"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:b1bece61da3c8ed37b86ac19051bab4cb599318066cdcf6ca9d795bdf7553525"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5cc8a25d058f8f7741af38015b56177a1fbd442d7a2d463860c76fb86ff33211"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ac1d37c0266c40f592a53b282c392f40bc23c117ca092a46e419c9d141a3dc89"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd63afb8451a0ee91658144f1fa9d1b5ed908ca458e713864e775e47bb806414"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa30b9b4b01cc703801924be51e802f7ae778abea433f4e3908fc470e2a517ef"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_28_armv7l.whl", hash = "sha256:f826af5e54e250272af9203ce85bf53064fe514df8222836c3ff43f23ccd55fe"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:08ba04fbad6d795c0bc59bbdf05a2bae9de929f34101fa149501e83fc4e52d6f"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1f9ba82d427353bd6e7521b03583e0e72d745e7d6bf0b1505555a1032b6fd656"}, + {file = "py_bip39_bindings-0.1.11-cp38-none-win32.whl", hash = "sha256:86df39df8c573be8ff92e613d833045919e1351446898d683cc9a49ebeb25a87"}, + {file = "py_bip39_bindings-0.1.11-cp38-none-win_amd64.whl", hash = "sha256:e26cde6585ab95042fef48f6740a4f1a7962f2a571e73f1f12bfc4daee786c9a"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:3bb22e4f2430bc28d93599c70a4d6ce9fc3e88db3f20b24ca17902f796be6ae9"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:75de7c7e76581244c3893fb624e44d84dadcceddd73f221ab74a9cb3c04b416b"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7e1a364081460498caa7d8238c54ae78b009d331afcb4f037d659b02639b969e"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3112f408f2d58be9ea3189903e5f2d944a0d882fa35b91b7bb88a195a16a8c1"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b921f36a4ef7a3bccb2635f2a5f91647a63ebaa1a4962a24fa236e5a32834cf"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_28_armv7l.whl", hash = "sha256:77accd187ef9a87e1d32f279b45a6e23123816b933a7e3d8c4a2fe61f6bd1d2e"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fd74fd810cc1076dd0c2944490d4acb1a109837cc9cfd58b29605ea81b4034f5"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153f310e55795509b8b004590dbc0cff58d65e8f032c1558021fc0898121a465"}, + {file = "py_bip39_bindings-0.1.11-cp39-none-win32.whl", hash = "sha256:b769bcc358c806ca1a5983e57eb94ee33ec3a8ef69fa01aa6b28960fa3e0ab5a"}, + {file = "py_bip39_bindings-0.1.11-cp39-none-win_amd64.whl", hash = "sha256:3d8a802d504c928d97e951489e942f39c9bfeec2a7305a6f0f3d5d38e152db9e"}, + {file = "py_bip39_bindings-0.1.11.tar.gz", hash = "sha256:ebc128ccf3a0750d758557e094802f0975c3760a939f8a8b76392d7dbe6b52a1"}, ] [[package]] @@ -4203,23 +4321,6 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] -[[package]] -name = "resolvelib" -version = "1.0.1" -description = "Resolve abstract dependencies into concrete ones" -optional = false -python-versions = "*" -files = [ - {file = "resolvelib-1.0.1-py2.py3-none-any.whl", hash = "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf"}, - {file = "resolvelib-1.0.1.tar.gz", hash = "sha256:04ce76cbd63fded2078ce224785da6ecd42b9564b1390793f64ddecbe997b309"}, -] - -[package.extras] -examples = ["html5lib", "packaging", "pygraphviz", "requests"] -lint = ["black", "flake8", "isort", "mypy", "types-requests"] -release = ["build", "towncrier", "twine"] -test = ["commentjson", "packaging", "pytest"] - [[package]] name = "retry" version = "0.9.2" @@ -4256,13 +4357,13 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "ruamel-yaml" -version = "0.18.6" +version = "0.18.7" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" optional = false python-versions = ">=3.7" files = [ - {file = "ruamel.yaml-0.18.6-py3-none-any.whl", hash = "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636"}, - {file = "ruamel.yaml-0.18.6.tar.gz", hash = "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b"}, + {file = "ruamel.yaml-0.18.7-py3-none-any.whl", hash = "sha256:adef56d72a97bc2a6a78952ef398c4054f248fba5698ddc3ab07434e7fc47983"}, + {file = "ruamel.yaml-0.18.7.tar.gz", hash = "sha256:270638acec6659f7bb30f4ea40083c9a0d0d5afdcef5e63d666f11209091531a"}, ] [package.dependencies] @@ -4736,19 +4837,16 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] -name = "shtab" -version = "1.6.5" -description = "Automagic shell tab completion for Python CLI applications" +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" optional = false python-versions = ">=3.7" files = [ - {file = "shtab-1.6.5-py3-none-any.whl", hash = "sha256:3c7be25ab65a324ed41e9c2964f2146236a5da6e6a247355cfea56f65050f220"}, - {file = "shtab-1.6.5.tar.gz", hash = "sha256:cf4ab120183e84cce041abeb6f620f9560739741dfc31dd466315550c08be9ec"}, + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, ] -[package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout"] - [[package]] name = "six" version = "1.17.0" @@ -5075,13 +5173,13 @@ testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] [[package]] name = "toml" -version = "0.10.2" +version = "0.10.0" description = "Python Library for Tom's Obvious, Minimal Language" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "*" files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, + {file = "toml-0.10.0-py2.py3-none-any.whl", hash = "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e"}, + {file = "toml-0.10.0.tar.gz", hash = "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c"}, ] [[package]] @@ -5299,6 +5397,23 @@ build = ["cmake (>=3.20)", "lit"] tests = ["autopep8", "flake8", "isort", "llnl-hatchet", "numpy", "pytest", "scipy (>=1.7.1)"] tutorials = ["matplotlib", "pandas", "tabulate"] +[[package]] +name = "typer" +version = "0.15.1" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.7" +files = [ + {file = "typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847"}, + {file = "typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a"}, +] + +[package.dependencies] +click = ">=8.0.0" +rich = ">=10.11.0" +shellingham = ">=1.3.0" +typing-extensions = ">=3.7.4.3" + [[package]] name = "typing-extensions" version = "4.12.2" @@ -5323,13 +5438,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.3" +version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] @@ -5456,6 +5571,84 @@ docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] +[[package]] +name = "websockets" +version = "14.1" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "websockets-14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a0adf84bc2e7c86e8a202537b4fd50e6f7f0e4a6b6bf64d7ccb96c4cd3330b29"}, + {file = "websockets-14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90b5d9dfbb6d07a84ed3e696012610b6da074d97453bd01e0e30744b472c8179"}, + {file = "websockets-14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2177ee3901075167f01c5e335a6685e71b162a54a89a56001f1c3e9e3d2ad250"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f14a96a0034a27f9d47fd9788913924c89612225878f8078bb9d55f859272b0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f874ba705deea77bcf64a9da42c1f5fc2466d8f14daf410bc7d4ceae0a9fcb0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9607b9a442392e690a57909c362811184ea429585a71061cd5d3c2b98065c199"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bea45f19b7ca000380fbd4e02552be86343080120d074b87f25593ce1700ad58"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:219c8187b3ceeadbf2afcf0f25a4918d02da7b944d703b97d12fb01510869078"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad2ab2547761d79926effe63de21479dfaf29834c50f98c4bf5b5480b5838434"}, + {file = "websockets-14.1-cp310-cp310-win32.whl", hash = "sha256:1288369a6a84e81b90da5dbed48610cd7e5d60af62df9851ed1d1d23a9069f10"}, + {file = "websockets-14.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0744623852f1497d825a49a99bfbec9bea4f3f946df6eb9d8a2f0c37a2fec2e"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:449d77d636f8d9c17952628cc7e3b8faf6e92a17ec581ec0c0256300717e1512"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a35f704be14768cea9790d921c2c1cc4fc52700410b1c10948511039be824aac"}, + {file = "websockets-14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b1f3628a0510bd58968c0f60447e7a692933589b791a6b572fcef374053ca280"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c3deac3748ec73ef24fc7be0b68220d14d47d6647d2f85b2771cb35ea847aa1"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7048eb4415d46368ef29d32133134c513f507fff7d953c18c91104738a68c3b3"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cf0ad281c979306a6a34242b371e90e891bce504509fb6bb5246bbbf31e7b6"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc1fc87428c1d18b643479caa7b15db7d544652e5bf610513d4a3478dbe823d0"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f95ba34d71e2fa0c5d225bde3b3bdb152e957150100e75c86bc7f3964c450d89"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9481a6de29105d73cf4515f2bef8eb71e17ac184c19d0b9918a3701c6c9c4f23"}, + {file = "websockets-14.1-cp311-cp311-win32.whl", hash = "sha256:368a05465f49c5949e27afd6fbe0a77ce53082185bbb2ac096a3a8afaf4de52e"}, + {file = "websockets-14.1-cp311-cp311-win_amd64.whl", hash = "sha256:6d24fc337fc055c9e83414c94e1ee0dee902a486d19d2a7f0929e49d7d604b09"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed907449fe5e021933e46a3e65d651f641975a768d0649fee59f10c2985529ed"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87e31011b5c14a33b29f17eb48932e63e1dcd3fa31d72209848652310d3d1f0d"}, + {file = "websockets-14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc6ccf7d54c02ae47a48ddf9414c54d48af9c01076a2e1023e3b486b6e72c707"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9777564c0a72a1d457f0848977a1cbe15cfa75fa2f67ce267441e465717dcf1a"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a655bde548ca98f55b43711b0ceefd2a88a71af6350b0c168aa77562104f3f45"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfff83ca578cada2d19e665e9c8368e1598d4e787422a460ec70e531dbdd58"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6a6c9bcf7cdc0fd41cc7b7944447982e8acfd9f0d560ea6d6845428ed0562058"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4b6caec8576e760f2c7dd878ba817653144d5f369200b6ddf9771d64385b84d4"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb6d38971c800ff02e4a6afd791bbe3b923a9a57ca9aeab7314c21c84bf9ff05"}, + {file = "websockets-14.1-cp312-cp312-win32.whl", hash = "sha256:1d045cbe1358d76b24d5e20e7b1878efe578d9897a25c24e6006eef788c0fdf0"}, + {file = "websockets-14.1-cp312-cp312-win_amd64.whl", hash = "sha256:90f4c7a069c733d95c308380aae314f2cb45bd8a904fb03eb36d1a4983a4993f"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3630b670d5057cd9e08b9c4dab6493670e8e762a24c2c94ef312783870736ab9"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36ebd71db3b89e1f7b1a5deaa341a654852c3518ea7a8ddfdf69cc66acc2db1b"}, + {file = "websockets-14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5b918d288958dc3fa1c5a0b9aa3256cb2b2b84c54407f4813c45d52267600cd3"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00fe5da3f037041da1ee0cf8e308374e236883f9842c7c465aa65098b1c9af59"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8149a0f5a72ca36720981418eeffeb5c2729ea55fa179091c81a0910a114a5d2"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77569d19a13015e840b81550922056acabc25e3f52782625bc6843cfa034e1da"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cf5201a04550136ef870aa60ad3d29d2a59e452a7f96b94193bee6d73b8ad9a9"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:88cf9163ef674b5be5736a584c999e98daf3aabac6e536e43286eb74c126b9c7"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:836bef7ae338a072e9d1863502026f01b14027250a4545672673057997d5c05a"}, + {file = "websockets-14.1-cp313-cp313-win32.whl", hash = "sha256:0d4290d559d68288da9f444089fd82490c8d2744309113fc26e2da6e48b65da6"}, + {file = "websockets-14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8621a07991add373c3c5c2cf89e1d277e49dc82ed72c75e3afc74bd0acc446f0"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01bb2d4f0a6d04538d3c5dfd27c0643269656c28045a53439cbf1c004f90897a"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:414ffe86f4d6f434a8c3b7913655a1a5383b617f9bf38720e7c0799fac3ab1c6"}, + {file = "websockets-14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fda642151d5affdee8a430bd85496f2e2517be3a2b9d2484d633d5712b15c56"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd7c11968bc3860d5c78577f0dbc535257ccec41750675d58d8dc66aa47fe52c"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a032855dc7db987dff813583d04f4950d14326665d7e714d584560b140ae6b8b"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7e7ea2f782408c32d86b87a0d2c1fd8871b0399dd762364c731d86c86069a78"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:39450e6215f7d9f6f7bc2a6da21d79374729f5d052333da4d5825af8a97e6735"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ceada5be22fa5a5a4cdeec74e761c2ee7db287208f54c718f2df4b7e200b8d4a"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3fc753451d471cff90b8f467a1fc0ae64031cf2d81b7b34e1811b7e2691bc4bc"}, + {file = "websockets-14.1-cp39-cp39-win32.whl", hash = "sha256:14839f54786987ccd9d03ed7f334baec0f02272e7ec4f6e9d427ff584aeea8b4"}, + {file = "websockets-14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d9fd19ecc3a4d5ae82ddbfb30962cf6d874ff943e56e0c81f5169be2fda62979"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5dc25a9dbd1a7f61eca4b7cb04e74ae4b963d658f9e4f9aad9cd00b688692c8"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:04a97aca96ca2acedf0d1f332c861c5a4486fdcba7bcef35873820f940c4231e"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df174ece723b228d3e8734a6f2a6febbd413ddec39b3dc592f5a4aa0aff28098"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:034feb9f4286476f273b9a245fb15f02c34d9586a5bc936aff108c3ba1b21beb"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c308dabd2b380807ab64b62985eaccf923a78ebc572bd485375b9ca2b7dc7"}, + {file = "websockets-14.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a42d3ecbb2db5080fc578314439b1d79eef71d323dc661aa616fb492436af5d"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ddaa4a390af911da6f680be8be4ff5aaf31c4c834c1a9147bc21cbcbca2d4370"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4c805c6034206143fbabd2d259ec5e757f8b29d0a2f0bf3d2fe5d1f60147a4a"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:205f672a6c2c671a86d33f6d47c9b35781a998728d2c7c2a3e1cf3333fcb62b7"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef440054124728cc49b01c33469de06755e5a7a4e83ef61934ad95fc327fbb0"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7591d6f440af7f73c4bd9404f3772bfee064e639d2b6cc8c94076e71b2471c1"}, + {file = "websockets-14.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:25225cc79cfebc95ba1d24cd3ab86aaa35bcd315d12fa4358939bd55e9bd74a5"}, + {file = "websockets-14.1-py3-none-any.whl", hash = "sha256:4d4fc827a20abe6d544a119896f6b78ee13fe81cbfef416f3f2ddf09a03f0e2e"}, + {file = "websockets-14.1.tar.gz", hash = "sha256:398b10c77d471c0aab20a845e7a60076b6390bfdaac7a6d2edb0d2c59d75e8d8"}, +] + [[package]] name = "werkzeug" version = "3.1.3" @@ -5853,4 +6046,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">3.9.1,<3.12" -content-hash = "e31107374c14b5a2c82dfed31c60fbe028de4dac175ce19b917e3960cf9ef53c" +content-hash = "fcd3b4f3f8017a3713c7dba2390a8b383b357eb4740f013b73e42e582c88a7f5" diff --git a/pyproject.toml b/pyproject.toml index 24742db8..9aa64a42 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,12 +13,12 @@ readme = "README.md" python = ">3.9.1,<3.12" # Bittensor Version Strict -bittensor = "7.4.0" +bittensor = "8.5.1" # Bittensor Dependencies We Also Need setuptools = "~70.0.0" pydantic = "^2.3.0" -numpy = "^1.26" +numpy = ">=2.0.1,<2.1.0" # Subnet Specific Dependencies torch = "^2.5.1" @@ -35,7 +35,7 @@ pandas-market-calendars = "^4.4.2" python-dotenv = "^1.0.1" scikit-learn = "^1.6.0" wandb = "^0.19.1" -cryptography = ">=42.0.5,<42.1.0" +cryptography = ">=43.0.1,<43.1.0" [tool.poetry.group.dev.dependencies] pre-commit-hooks = "5.0.0" diff --git a/snp_oracle/neurons/validator.py b/snp_oracle/neurons/validator.py index ee0a3f48..29fa3a2e 100644 --- a/snp_oracle/neurons/validator.py +++ b/snp_oracle/neurons/validator.py @@ -129,17 +129,27 @@ def print_info(self): metagraph = self.metagraph self.uid = self.metagraph.hotkeys.index(self.wallet.hotkey.ss58_address) - log = ( - "Validator | " - f"Step:{self.step} | " - f"UID:{self.uid} | " - f"Block:{self.block} | " - f"Stake:{metagraph.S[self.uid]} | " - f"VTrust:{metagraph.Tv[self.uid]} | " - f"Dividend:{metagraph.D[self.uid]} | " - f"Emission:{metagraph.E[self.uid]}" - ) - bt.logging.info(log) + # Get all values in one go to avoid multiple concurrent requests + try: + current_block = self.block # Single websocket call + stake = float(metagraph.S[self.uid]) + vtrust = float(metagraph.Tv[self.uid]) + dividend = float(metagraph.D[self.uid]) + emission = float(metagraph.E[self.uid]) + + log = ( + "Validator | " + f"Step:{self.step} | " + f"UID:{self.uid} | " + f"Block:{current_block} | " + f"Stake:{stake:.4f} | " + f"VTrust:{vtrust:.4f} | " + f"Dividend:{dividend:.4f} | " + f"Emission:{emission:.4f}" + ) + bt.logging.info(log) + except Exception as e: + bt.logging.error(f"Error getting validator info: {e}") # The main function parses the configuration and runs the validator. From 69f6cd192308ed1f2b1ce395fa2bbc92a3a244c3 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 15:20:37 -0500 Subject: [PATCH 196/201] fix --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index e59ab8e9..8c024aaf 100644 --- a/Makefile +++ b/Makefile @@ -45,7 +45,7 @@ validator: --logging.$(logging_level) miner: - pm2 start python --name miner -- ./snp_oracle/neurons/miner.py --no-autorestart \ + pm2 start python --name miner -- ./snp_oracle/neurons/miner.py \ --wallet.name $(coldkey) \ --wallet.hotkey $(miner_hotkey) \ --subtensor.chain_endpoint $(network) \ @@ -54,5 +54,5 @@ miner: --logging.$(logging_level) \ --vpermit_tao_limit 2 \ --blacklist.force_validator_permit true \ - --hf_repo_id pcarlson-foundry-digital/localnet \ + --hf_repo_id foundryservices/mining_models \ --model mining_models/base_lstm_new.h5 From 3603df8d5bf6f916a479cfe4e1c1d9ca32aba34c Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Wed, 8 Jan 2025 15:47:52 -0500 Subject: [PATCH 197/201] comment out --- snp_oracle/predictionnet/base/miner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snp_oracle/predictionnet/base/miner.py b/snp_oracle/predictionnet/base/miner.py index 2ffc58c2..a4fa5fa5 100644 --- a/snp_oracle/predictionnet/base/miner.py +++ b/snp_oracle/predictionnet/base/miner.py @@ -42,7 +42,7 @@ def __init__(self, config=None): forward_fn=self.forward, blacklist_fn=self.blacklist, priority_fn=self.priority, - verify_fn=self.verify, + # verify_fn=self.verify, ) bt.logging.info(f"Axon created: {self.axon}") self.nonces = {} From 098ffdd25f1e6081f087d4c5710d27a5888cf3b9 Mon Sep 17 00:00:00 2001 From: pcarlson-foundry-digital Date: Thu, 9 Jan 2025 09:01:53 -0500 Subject: [PATCH 198/201] ensure hotkeys match function works --- snp_oracle/predictionnet/utils/huggingface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/snp_oracle/predictionnet/utils/huggingface.py b/snp_oracle/predictionnet/utils/huggingface.py index c7b280d5..c992368d 100644 --- a/snp_oracle/predictionnet/utils/huggingface.py +++ b/snp_oracle/predictionnet/utils/huggingface.py @@ -49,10 +49,10 @@ def update_collection(self, responses: List[Challenge]) -> None: def hotkeys_match(self, synapse, hotkey) -> bool: if synapse.model is None: return False - model_hotkey = synapse.model.split(".")[0] + model_hotkey = synapse.model.split("/")[0] return hotkey == model_hotkey def get_model_timestamp(self, repo_id, model): - commits = self.api.list_repo_commits(repo_id=f"{repo_id}/{model}", repo_type="model") + commits = self.api.list_repo_commits(repo_id=f"{repo_id}", repo_type="model") initial_commit = commits[-1] return initial_commit.created_at From 9b79d5f6833f13bf8b98e9b36a46bf5dab99aece Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 10 Jan 2025 10:51:19 -0500 Subject: [PATCH 199/201] Put todays date in release notes --- docs/Release Notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Release Notes.md b/docs/Release Notes.md index c3a8fdce..d78c8e7f 100644 --- a/docs/Release Notes.md +++ b/docs/Release Notes.md @@ -3,7 +3,7 @@ Release Notes 3.0.0 ----- -Released on Testnet December 20th 2024 +Released on January 10th 2025 - Require open sourcing on HuggingFace - Leverage Poetry for dependency management - Enhance README instructions From 0f4afe5e18b2e804961fb350e1c1eb4affa2fc0c Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 10 Jan 2025 11:05:25 -0500 Subject: [PATCH 200/201] Link to registration fee schedule in readme --- docs/miners.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/miners.md b/docs/miners.md index f4e9447b..6a3db448 100644 --- a/docs/miners.md +++ b/docs/miners.md @@ -97,7 +97,7 @@ The `--hf_repo_id` flag will determine which hugging face repository your miner The data your model utilizes will be automatically uploaded to hugging face, in the same repository as your model, defined here: `--hf_repo_id`. The data will be encrypted initially. Once the model is evaluated by validators, the data will be decrypted and published on hugging face. ## Deploying a Miner -We highly recommend that you run your miners on testnet before deploying on mainnet. +We highly recommend that you run your miners on testnet before deploying on mainnet. Be sure to reference our [Registration Fee Schedule](https://github.com/foundryservices/snpOracle/wiki/Registration-Fee-Schedule) to decide when to register your miner. **IMPORTANT** > Make sure you have activated your virtual environment before running your miner. From 988cca1f7b08fb8db17dd1fd969f6499f32db355 Mon Sep 17 00:00:00 2001 From: Matthew Trudeau Date: Fri, 10 Jan 2025 11:08:48 -0500 Subject: [PATCH 201/201] Add CR3 to release notes --- docs/Release Notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Release Notes.md b/docs/Release Notes.md index d78c8e7f..83e3e28e 100644 --- a/docs/Release Notes.md +++ b/docs/Release Notes.md @@ -5,6 +5,7 @@ Release Notes ----- Released on January 10th 2025 - Require open sourcing on HuggingFace +- Update to Bittensor v8.5.1 and leverage CR3 - Leverage Poetry for dependency management - Enhance README instructions